diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index b948e560d..88692396f 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -10,7 +10,7 @@ on: jobs: analyze: name: Analyze - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 permissions: actions: read contents: read diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index f4d77cd3f..4673dfca1 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -8,7 +8,7 @@ jobs: e2e_tests: name: 'E2E Tests' timeout-minutes: 60 - runs-on: ubuntu-22.04 + runs-on: warp-ubuntu-2204-x64-16x steps: - uses: actions/checkout@v4 diff --git a/apps/documentation/package.json b/apps/documentation/package.json index c5f5bee5a..fc06f6547 100644 --- a/apps/documentation/package.json +++ b/apps/documentation/package.json @@ -27,6 +27,6 @@ "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", - "typescript": "^5" + "typescript": "5.6.2" } } \ No newline at end of file diff --git a/apps/documentation/pages/developers/embedding/_meta.json b/apps/documentation/pages/developers/embedding/_meta.json index 5b9b54921..96806de3e 100644 --- a/apps/documentation/pages/developers/embedding/_meta.json +++ b/apps/documentation/pages/developers/embedding/_meta.json @@ -5,5 +5,6 @@ "svelte": "Svelte Integration", "solid": "Solid Integration", "preact": "Preact Integration", + "angular": "Angular Integration", "css-variables": "CSS Variables" -} \ No newline at end of file +} diff --git a/apps/documentation/pages/developers/embedding/angular.mdx b/apps/documentation/pages/developers/embedding/angular.mdx new file mode 100644 index 000000000..5bd169b20 --- /dev/null +++ b/apps/documentation/pages/developers/embedding/angular.mdx @@ -0,0 +1,90 @@ +--- +title: Angular Integration +description: Learn how to use our embedding SDK within your Angular application. +--- + +# Angular Integration + +Our Angular SDK provides a simple way to embed a signing experience within your Angular application. It supports both direct link templates and signing tokens. + +## Installation + +To install the SDK, run the following command: + +```bash +npm install @documenso/embed-angular +``` + +## Usage + +To embed a signing experience, you'll need to provide the token for the document you want to embed. This can be done in a few different ways, depending on your use case. + +### Direct Link Template + +If you have a direct link template, you can simply provide the token for the template to the `EmbedDirectTemplate` component. + +```typescript +import { Component } from '@angular/core'; +import { EmbedDirectTemplate } from '@documenso/embed-angular'; + +@Component({ + selector: 'app-embedding', + template: ` + + `, + standalone: true, + imports: [EmbedDirectTemplate], +}) +export class EmbeddingComponent { + token = 'YOUR_TOKEN_HERE'; // Replace with the actual token +} +``` + +#### Props + +| Prop | Type | Description | +| ------------------- | ------------------- | ------------------------------------------------------------------------------------------ | +| token | string | The token for the document you want to embed | +| host | string (optional) | The host to be used for the signing experience, relevant for self-hosters | +| name | string (optional) | The name the signer that will be used by default for signing | +| lockName | boolean (optional) | Whether or not the name field should be locked disallowing modifications | +| email | string (optional) | The email the signer that will be used by default for signing | +| lockEmail | boolean (optional) | Whether or not the email field should be locked disallowing modifications | +| onDocumentReady | function (optional) | A callback function that will be called when the document is loaded and ready to be signed | +| onDocumentCompleted | function (optional) | A callback function that will be called when the document has been completed | +| onDocumentError | function (optional) | A callback function that will be called when an error occurs with the document | +| onFieldSigned | function (optional) | A callback function that will be called when a field is signed | +| onFieldUnsigned | function (optional) | A callback function that will be called when a field is unsigned | + +### Signing Token + +If you have a signing token, you can provide it to the `EmbedSignDocument` component. + +```typescript +import { Component } from '@angular/core'; +import { EmbedSignDocument } from '@documenso/embed-angular'; + +@Component({ + selector: 'app-embedding', + template: ` + + `, + standalone: true, + imports: [EmbedSignDocument], +}) +export class EmbeddingComponent { + token = 'YOUR_TOKEN_HERE'; // Replace with the actual token +} +``` + +#### Props + +| Prop | Type | Description | +| ------------------- | ------------------- | ------------------------------------------------------------------------------------------ | +| token | string | The token for the document you want to embed | +| host | string (optional) | The host to be used for the signing experience, relevant for self-hosters | +| name | string (optional) | The name the signer that will be used by default for signing | +| lockName | boolean (optional) | Whether or not the name field should be locked disallowing modifications | +| onDocumentReady | function (optional) | A callback function that will be called when the document is loaded and ready to be signed | +| onDocumentCompleted | function (optional) | A callback function that will be called when the document has been completed | +| onDocumentError | function (optional) | A callback function that will be called when an error occurs with the document | diff --git a/apps/documentation/pages/developers/embedding/index.mdx b/apps/documentation/pages/developers/embedding/index.mdx index 1675f4cbb..27d6f6f8f 100644 --- a/apps/documentation/pages/developers/embedding/index.mdx +++ b/apps/documentation/pages/developers/embedding/index.mdx @@ -5,7 +5,7 @@ description: Learn how to use embedding to bring signing to your own website or # Embedding -Our embedding feature lets you integrate our document signing experience into your own application or website. Whether you're building with React, Preact, Vue, Svelte, Solid, or using generalized web components, this guide will help you get started with embedding Documenso. +Our embedding feature lets you integrate our document signing experience into your own application or website. Whether you're building with React, Preact, Vue, Svelte, Solid, Angular, or using generalized web components, this guide will help you get started with embedding Documenso. ## Availability @@ -73,13 +73,14 @@ These customization options are available for both Direct Templates and Signing We support embedding across a range of popular JavaScript frameworks, including: -| Framework | Package | -| --------- | -------------------------------------------------------------------------------- | -| React | [@documenso/embed-react](https://www.npmjs.com/package/@documenso/embed-react) | -| Preact | [@documenso/embed-preact](https://www.npmjs.com/package/@documenso/embed-preact) | -| Vue | [@documenso/embed-vue](https://www.npmjs.com/package/@documenso/embed-vue) | -| Svelte | [@documenso/embed-svelte](https://www.npmjs.com/package/@documenso/embed-svelte) | -| Solid | [@documenso/embed-solid](https://www.npmjs.com/package/@documenso/embed-solid) | +| Framework | Package | +| --------- | ---------------------------------------------------------------------------------- | +| React | [@documenso/embed-react](https://www.npmjs.com/package/@documenso/embed-react) | +| Preact | [@documenso/embed-preact](https://www.npmjs.com/package/@documenso/embed-preact) | +| Vue | [@documenso/embed-vue](https://www.npmjs.com/package/@documenso/embed-vue) | +| Svelte | [@documenso/embed-svelte](https://www.npmjs.com/package/@documenso/embed-svelte) | +| Solid | [@documenso/embed-solid](https://www.npmjs.com/package/@documenso/embed-solid) | +| Angular | [@documenso/embed-angular](https://www.npmjs.com/package/@documenso/embed-angular) | Additionally, we provide **web components** for more generalized use. However, please note that web components are still in their early stages and haven't been extensively tested. @@ -127,7 +128,7 @@ This will show a dialog which will ask you to configure which recipient should b ## Embedding with Signing Tokens -To embed the signing process for an ordinary document, you’ll need a **document signing token** for the recipient. This token provides the necessary access to load the document and facilitate the signing process securely. +To embed the signing process for an ordinary document, you'll need a **document signing token** for the recipient. This token provides the necessary access to load the document and facilitate the signing process securely. #### Instructions @@ -164,6 +165,7 @@ Once you've obtained the appropriate tokens, you can integrate the signing exper - [Vue](/developers/embedding/vue) - [Svelte](/developers/embedding/svelte) - [Solid](/developers/embedding/solid) +- [Angular](/developers/embedding/angular) If you're using **web components**, the integration process is slightly different. Keep in mind that web components are currently less tested but can still provide flexibility for general use cases. @@ -174,4 +176,5 @@ If you're using **web components**, the integration process is slightly differen - [Svelte Integration](/developers/embedding/svelte) - [Solid Integration](/developers/embedding/solid) - [Preact Integration](/developers/embedding/preact) +- [Angular Integration](/developers/embedding/angular) - [CSS Variables](/developers/embedding/css-variables) diff --git a/apps/documentation/pages/developers/webhooks.mdx b/apps/documentation/pages/developers/webhooks.mdx index 3ce2e7ee9..1155e32c8 100644 --- a/apps/documentation/pages/developers/webhooks.mdx +++ b/apps/documentation/pages/developers/webhooks.mdx @@ -21,6 +21,7 @@ Documenso supports Webhooks and allows you to subscribe to the following events: - `document.signed` - `document.completed` - `document.rejected` +- `document.cancelled` ## Create a webhook subscription @@ -37,7 +38,7 @@ Clicking on the "**Create Webhook**" button opens a modal to create a new webhoo To create a new webhook subscription, you need to provide the following information: - Enter the webhook URL that will receive the event payload. -- Select the event(s) you want to subscribe to: `document.created`, `document.sent`, `document.opened`, `document.signed`, `document.completed`, `document.rejected`. +- Select the event(s) you want to subscribe to: `document.created`, `document.sent`, `document.opened`, `document.signed`, `document.completed`, `document.rejected`, `document.cancelled`. - Optionally, you can provide a secret key that will be used to sign the payload. This key will be included in the `X-Documenso-Secret` header of the request. ![A screenshot of the Create Webhook modal that shows the URL input field and the event checkboxes](/webhook-images/webhooks-page-create-webhook-modal.webp) @@ -528,6 +529,96 @@ Example payload for the `document.rejected` event: } ``` +Example payload for the `document.rejected` event: + +```json +{ + "event": "DOCUMENT_CANCELLED", + "payload": { + "id": 7, + "externalId": null, + "userId": 3, + "authOptions": null, + "formValues": null, + "visibility": "EVERYONE", + "title": "documenso.pdf", + "status": "PENDING", + "documentDataId": "cm6exvn93006hi02ru90a265a", + "createdAt": "2025-01-27T11:02:14.393Z", + "updatedAt": "2025-01-27T11:03:16.387Z", + "completedAt": null, + "deletedAt": null, + "teamId": null, + "templateId": null, + "source": "DOCUMENT", + "documentMeta": { + "id": "cm6exvn96006ji02rqvzjvwoy", + "subject": "", + "message": "", + "timezone": "Etc/UTC", + "password": null, + "dateFormat": "yyyy-MM-dd hh:mm a", + "redirectUrl": "", + "signingOrder": "PARALLEL", + "typedSignatureEnabled": true, + "language": "en", + "distributionMethod": "EMAIL", + "emailSettings": { + "documentDeleted": true, + "documentPending": true, + "recipientSigned": true, + "recipientRemoved": true, + "documentCompleted": true, + "ownerDocumentCompleted": true, + "recipientSigningRequest": true + } + }, + "recipients": [ + { + "id": 7, + "documentId": 7, + "templateId": null, + "email": "mybirihix@mailinator.com", + "name": "Zorita Baird", + "token": "XkKx1HCs6Znm2UBJA2j6o", + "documentDeletedAt": null, + "expired": null, + "signedAt": null, + "authOptions": { "accessAuth": null, "actionAuth": null }, + "signingOrder": 1, + "rejectionReason": null, + "role": "SIGNER", + "readStatus": "NOT_OPENED", + "signingStatus": "NOT_SIGNED", + "sendStatus": "SENT" + } + ], + "Recipient": [ + { + "id": 7, + "documentId": 7, + "templateId": null, + "email": "signer@documenso.com", + "name": "Signer", + "token": "XkKx1HCs6Znm2UBJA2j6o", + "documentDeletedAt": null, + "expired": null, + "signedAt": null, + "authOptions": { "accessAuth": null, "actionAuth": null }, + "signingOrder": 1, + "rejectionReason": null, + "role": "SIGNER", + "readStatus": "NOT_OPENED", + "signingStatus": "NOT_SIGNED", + "sendStatus": "SENT" + } + ] + }, + "createdAt": "2025-01-27T11:03:27.730Z", + "webhookEndpoint": "https://mywebhooksite.com/mywebhook" +} +``` + ## Availability Webhooks are available to individual users and teams. diff --git a/apps/openpage-api/package.json b/apps/openpage-api/package.json index 349bc356f..1a8816acb 100644 --- a/apps/openpage-api/package.json +++ b/apps/openpage-api/package.json @@ -16,8 +16,8 @@ "next": "14.2.6" }, "devDependencies": { - "@types/node": "20.16.5", + "@types/node": "^20", "@types/react": "18.3.5", - "typescript": "5.5.4" + "typescript": "5.6.2" } -} +} \ No newline at end of file diff --git a/apps/web/package.json b/apps/web/package.json index d950596fc..9f5053e1e 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@documenso/web", - "version": "1.9.0-rc.6", + "version": "1.9.0-rc.11", "private": true, "license": "AGPL-3.0", "scripts": { @@ -26,7 +26,6 @@ "@lingui/react": "^4.11.3", "@simplewebauthn/browser": "^9.0.1", "@simplewebauthn/server": "^9.0.3", - "@tanstack/react-query": "^4.29.5", "colord": "^2.9.3", "cookie-es": "^1.0.0", "formidable": "^2.1.1", @@ -55,7 +54,7 @@ "recharts": "^2.7.2", "remeda": "^2.17.3", "sharp": "0.32.6", - "trpc-openapi": "^1.2.0", + "trpc-to-openapi": "2.0.4", "ts-pattern": "^5.0.5", "ua-parser-js": "^1.0.37", "uqr": "^0.1.2", @@ -68,11 +67,11 @@ "@simplewebauthn/types": "^9.0.1", "@types/formidable": "^2.0.6", "@types/luxon": "^3.3.1", - "@types/node": "20.1.0", + "@types/node": "^20", "@types/papaparse": "^5.3.14", "@types/react": "^18", "@types/react-dom": "^18", "@types/ua-parser-js": "^0.7.39", - "typescript": "5.2.2" + "typescript": "5.6.2" } } diff --git a/apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx b/apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx index 330f31eb1..214cacd38 100644 --- a/apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx +++ b/apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx @@ -28,7 +28,7 @@ export const AdminActions = ({ className, document, recipients }: AdminActionsPr const { _ } = useLingui(); const { toast } = useToast(); - const { mutate: resealDocument, isLoading: isResealDocumentLoading } = + const { mutate: resealDocument, isPending: isResealDocumentLoading } = trpc.admin.resealDocument.useMutation({ onSuccess: () => { toast({ diff --git a/apps/web/src/app/(dashboard)/admin/documents/[id]/page.tsx b/apps/web/src/app/(dashboard)/admin/documents/[id]/page.tsx index c7a729805..524dd1f1e 100644 --- a/apps/web/src/app/(dashboard)/admin/documents/[id]/page.tsx +++ b/apps/web/src/app/(dashboard)/admin/documents/[id]/page.tsx @@ -59,7 +59,7 @@ export default async function AdminDocumentDetailsPage({ params }: AdminDocument Admin Actions - +

@@ -68,7 +68,7 @@ export default async function AdminDocumentDetailsPage({ params }: AdminDocument
- {document.Recipient.map((recipient) => ( + {document.recipients.map((recipient) => ( ; }; @@ -89,13 +89,13 @@ export const RecipientItem = ({ recipient }: RecipientItemProps) => { accessorKey: 'signature', cell: ({ row }) => (
- {row.original.Signature?.typedSignature && ( - {row.original.Signature.typedSignature} + {row.original.signature?.typedSignature && ( + {row.original.signature.typedSignature} )} - {row.original.Signature?.signatureImageAsBase64 && ( + {row.original.signature?.signatureImageAsBase64 && ( Signature @@ -103,7 +103,7 @@ export const RecipientItem = ({ recipient }: RecipientItemProps) => {
), }, - ] satisfies DataTableColumnDef<(typeof recipient)['Field'][number]>[]; + ] satisfies DataTableColumnDef<(typeof recipient)['fields'][number]>[]; }, []); const onUpdateRecipientFormSubmit = async ({ name, email }: TAdminUpdateRecipientFormSchema) => { @@ -190,7 +190,7 @@ export const RecipientItem = ({ recipient }: RecipientItemProps) => { Fields

- + ); }; diff --git a/apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx b/apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx index 337796959..bf142133f 100644 --- a/apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx +++ b/apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx @@ -8,7 +8,6 @@ import { Trans, msg } from '@lingui/macro'; import { useLingui } from '@lingui/react'; import type { Document } from '@documenso/prisma/client'; -import { TRPCClientError } from '@documenso/trpc/client'; import { trpc } from '@documenso/trpc/react'; import { Alert, AlertDescription, AlertTitle } from '@documenso/ui/primitives/alert'; import { Button } from '@documenso/ui/primitives/button'; @@ -36,7 +35,7 @@ export const SuperDeleteDocumentDialog = ({ document }: SuperDeleteDocumentDialo const [reason, setReason] = useState(''); - const { mutateAsync: deleteDocument, isLoading: isDeletingDocument } = + const { mutateAsync: deleteDocument, isPending: isDeletingDocument } = trpc.admin.deleteDocument.useMutation(); const handleDeleteDocument = async () => { @@ -55,21 +54,12 @@ export const SuperDeleteDocumentDialog = ({ document }: SuperDeleteDocumentDialo router.push('/admin/documents'); } catch (err) { - if (err instanceof TRPCClientError && err.data?.code === 'BAD_REQUEST') { - toast({ - title: _(msg`An error occurred`), - description: err.message, - variant: 'destructive', - }); - } else { - toast({ - title: _(msg`An unknown error occurred`), - variant: 'destructive', - description: - err.message ?? - 'We encountered an unknown error while attempting to delete your document. Please try again later.', - }); - } + toast({ + title: _(msg`An unknown error occurred`), + variant: 'destructive', + description: + 'We encountered an unknown error while attempting to delete your document. Please try again later.', + }); } }; @@ -77,7 +67,7 @@ export const SuperDeleteDocumentDialog = ({ document }: SuperDeleteDocumentDialo
diff --git a/apps/web/src/app/(dashboard)/admin/documents/document-results.tsx b/apps/web/src/app/(dashboard)/admin/documents/document-results.tsx index 3f51ce69e..98854f296 100644 --- a/apps/web/src/app/(dashboard)/admin/documents/document-results.tsx +++ b/apps/web/src/app/(dashboard)/admin/documents/document-results.tsx @@ -37,7 +37,7 @@ export const AdminDocumentResults = () => { const page = searchParams?.get?.('page') ? Number(searchParams.get('page')) : undefined; const perPage = searchParams?.get?.('perPage') ? Number(searchParams.get('perPage')) : undefined; - const { data: findDocumentsData, isLoading: isFindDocumentsLoading } = + const { data: findDocumentsData, isPending: isFindDocumentsLoading } = trpc.admin.findDocuments.useQuery( { query: debouncedTerm, @@ -45,7 +45,7 @@ export const AdminDocumentResults = () => { perPage: perPage || 20, }, { - keepPreviousData: true, + placeholderData: (previousData) => previousData, }, ); @@ -86,14 +86,14 @@ export const AdminDocumentResults = () => { header: _(msg`Owner`), accessorKey: 'owner', cell: ({ row }) => { - const avatarFallbackText = row.original.User.name - ? extractInitials(row.original.User.name) - : row.original.User.email.slice(0, 1).toUpperCase(); + const avatarFallbackText = row.original.user.name + ? extractInitials(row.original.user.name) + : row.original.user.email.slice(0, 1).toUpperCase(); return ( - + {avatarFallbackText} @@ -110,8 +110,8 @@ export const AdminDocumentResults = () => {
- {row.original.User.name} - {row.original.User.email} + {row.original.user.name} + {row.original.user.email}
diff --git a/apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx b/apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx index 596f0051d..84855b15f 100644 --- a/apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx +++ b/apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx @@ -4,7 +4,7 @@ import { useEffect, useMemo, useState, useTransition } from 'react'; import { msg } from '@lingui/macro'; import { useLingui } from '@lingui/react'; -import { ChevronDownIcon as CaretSortIcon, Loader } from 'lucide-react'; +import { ChevronDownIcon, ChevronUpIcon, ChevronsUpDown, Loader } from 'lucide-react'; import { useDebouncedValue } from '@documenso/lib/client-only/hooks/use-debounced-value'; import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; @@ -54,7 +54,15 @@ export const LeaderboardTable = ({ onClick={() => handleColumnSort('name')} > {_(msg`Name`)} - + {sortBy === 'name' ? ( + sortOrder === 'asc' ? ( + + ) : ( + + ) + ) : ( + + )}
), accessorKey: 'name', @@ -80,7 +88,15 @@ export const LeaderboardTable = ({ onClick={() => handleColumnSort('signingVolume')} > {_(msg`Signing Volume`)} - + {sortBy === 'signingVolume' ? ( + sortOrder === 'asc' ? ( + + ) : ( + + ) + ) : ( + + )}
), accessorKey: 'signingVolume', @@ -94,7 +110,15 @@ export const LeaderboardTable = ({ onClick={() => handleColumnSort('createdAt')} > {_(msg`Created`)} - + {sortBy === 'createdAt' ? ( + sortOrder === 'asc' ? ( + + ) : ( + + ) + ) : ( + + )}
); }, @@ -102,7 +126,7 @@ export const LeaderboardTable = ({ cell: ({ row }) => i18n.date(row.original.createdAt), }, ] satisfies DataTableColumnDef[]; - }, [sortOrder]); + }, [sortOrder, sortBy]); useEffect(() => { startTransition(() => { @@ -133,6 +157,9 @@ export const LeaderboardTable = ({ const handleColumnSort = (column: 'name' | 'createdAt' | 'signingVolume') => { startTransition(() => { updateSearchParams({ + search: debouncedSearchString, + page, + perPage, sortBy: column, sortOrder: sortBy === column && sortOrder === 'asc' ? 'desc' : 'asc', }); diff --git a/apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx b/apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx index d68eed63b..6903f5e17 100644 --- a/apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx +++ b/apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx @@ -13,7 +13,6 @@ import { SITE_SETTINGS_BANNER_ID, ZSiteSettingsBannerSchema, } from '@documenso/lib/server-only/site-settings/schemas/banner'; -import { TRPCClientError } from '@documenso/trpc/client'; import { trpc as trpcReact } from '@documenso/trpc/react'; import { Button } from '@documenso/ui/primitives/button'; import { ColorPicker } from '@documenso/ui/primitives/color-picker'; @@ -59,7 +58,7 @@ export function BannerForm({ banner }: BannerFormProps) { const enabled = form.watch('enabled'); - const { mutateAsync: updateSiteSetting, isLoading: isUpdateSiteSettingLoading } = + const { mutateAsync: updateSiteSetting, isPending: isUpdateSiteSettingLoading } = trpcReact.admin.updateSiteSetting.useMutation(); const onBannerUpdate = async ({ id, enabled, data }: TBannerFormSchema) => { @@ -78,21 +77,13 @@ export function BannerForm({ banner }: BannerFormProps) { router.refresh(); } catch (err) { - if (err instanceof TRPCClientError && err.data?.code === 'BAD_REQUEST') { - toast({ - title: _(msg`An error occurred`), - description: err.message, - variant: 'destructive', - }); - } else { - toast({ - title: _(msg`An unknown error occurred`), - variant: 'destructive', - description: _( - msg`We encountered an unknown error while attempting to update the banner. Please try again later.`, - ), - }); - } + toast({ + title: _(msg`An unknown error occurred`), + variant: 'destructive', + description: _( + msg`We encountered an unknown error while attempting to update the banner. Please try again later.`, + ), + }); } }; diff --git a/apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx b/apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx index 560172c77..1f45002f2 100644 --- a/apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx +++ b/apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx @@ -6,9 +6,10 @@ import { useRouter } from 'next/navigation'; import { Trans, msg } from '@lingui/macro'; import { useLingui } from '@lingui/react'; +import { match } from 'ts-pattern'; +import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; import type { User } from '@documenso/prisma/client'; -import { TRPCClientError } from '@documenso/trpc/client'; import { trpc } from '@documenso/trpc/react'; import { Alert, AlertDescription, AlertTitle } from '@documenso/ui/primitives/alert'; import { Button } from '@documenso/ui/primitives/button'; @@ -37,7 +38,7 @@ export const DeleteUserDialog = ({ className, user }: DeleteUserDialogProps) => const [email, setEmail] = useState(''); - const { mutateAsync: deleteUser, isLoading: isDeletingUser } = + const { mutateAsync: deleteUser, isPending: isDeletingUser } = trpc.admin.deleteUser.useMutation(); const onDeleteAccount = async () => { @@ -54,23 +55,19 @@ export const DeleteUserDialog = ({ className, user }: DeleteUserDialogProps) => router.push('/admin/users'); } catch (err) { - if (err instanceof TRPCClientError && err.data?.code === 'BAD_REQUEST') { - toast({ - title: _(msg`An error occurred`), - description: err.message, - variant: 'destructive', - }); - } else { - toast({ - title: _(msg`An unknown error occurred`), - variant: 'destructive', - description: - err.message ?? - _( - msg`We encountered an unknown error while attempting to delete your account. Please try again later.`, - ), - }); - } + const error = AppError.parseError(err); + + const errorMessage = match(error.code) + .with(AppErrorCode.NOT_FOUND, () => msg`User not found.`) + .with(AppErrorCode.UNAUTHORIZED, () => msg`You are not authorized to delete this user.`) + .otherwise(() => msg`An error occurred while deleting the user.`); + + toast({ + title: _(msg`Error`), + description: _(errorMessage), + variant: 'destructive', + duration: 7500, + }); } }; diff --git a/apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx b/apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx index aac003c82..1b09d8432 100644 --- a/apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx +++ b/apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx @@ -34,7 +34,7 @@ export const DisableUserDialog = ({ className, userToDisable }: DisableUserDialo const [email, setEmail] = useState(''); - const { mutateAsync: disableUser, isLoading: isDisablingUser } = + const { mutateAsync: disableUser, isPending: isDisablingUser } = trpc.admin.disableUser.useMutation(); const onDisableAccount = async () => { diff --git a/apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx b/apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx index cdb5ed2de..c9df59591 100644 --- a/apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx +++ b/apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx @@ -34,7 +34,7 @@ export const EnableUserDialog = ({ className, userToEnable }: EnableUserDialogPr const [email, setEmail] = useState(''); - const { mutateAsync: enableUser, isLoading: isEnablingUser } = + const { mutateAsync: enableUser, isPending: isEnablingUser } = trpc.admin.enableUser.useMutation(); const onEnableAccount = async () => { diff --git a/apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx b/apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx index da811c5a1..97a204e91 100644 --- a/apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx +++ b/apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx @@ -22,8 +22,8 @@ type UserData = { name: string | null; email: string; roles: Role[]; - Subscription?: SubscriptionLite[] | null; - Document: DocumentLite[]; + subscriptions?: SubscriptionLite[] | null; + documents: DocumentLite[]; }; type SubscriptionLite = Pick< @@ -81,7 +81,7 @@ export const UsersDataTable = ({ header: _(msg`Subscription`), accessorKey: 'subscription', cell: ({ row }) => { - const foundIndividualSubscription = (row.original.Subscription ?? []).find((sub) => + const foundIndividualSubscription = (row.original.subscriptions ?? []).find((sub) => individualPriceIds.includes(sub.priceId), ); @@ -92,7 +92,7 @@ export const UsersDataTable = ({ header: _(msg`Documents`), accessorKey: 'documents', cell: ({ row }) => { - return
{row.original.Document.length}
; + return
{row.original.documents?.length}
; }, }, { diff --git a/apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx b/apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx index 800cc23c2..a477d75c6 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx @@ -18,14 +18,14 @@ import { useToast } from '@documenso/ui/primitives/use-toast'; export type DocumentPageViewButtonProps = { document: Document & { - User: Pick; - Recipient: Recipient[]; + user: Pick; + recipients: Recipient[]; team: Pick | null; }; team?: Pick; }; -export const DocumentPageViewButton = ({ document, team }: DocumentPageViewButtonProps) => { +export const DocumentPageViewButton = ({ document }: DocumentPageViewButtonProps) => { const { data: session } = useSession(); const { toast } = useToast(); const { _ } = useLingui(); @@ -34,7 +34,7 @@ export const DocumentPageViewButton = ({ document, team }: DocumentPageViewButto return null; } - const recipient = document.Recipient.find((recipient) => recipient.email === session.user.email); + const recipient = document.recipients.find((recipient) => recipient.email === session.user.email); const isRecipient = !!recipient; const isPending = document.status === DocumentStatus.PENDING; @@ -46,10 +46,16 @@ export const DocumentPageViewButton = ({ document, team }: DocumentPageViewButto const onDownloadClick = async () => { try { - const documentWithData = await trpcClient.document.getDocumentById.query({ - documentId: document.id, - teamId: team?.id, - }); + const documentWithData = await trpcClient.document.getDocumentById.query( + { + documentId: document.id, + }, + { + context: { + teamId: document.team?.id?.toString(), + }, + }, + ); const documentData = documentWithData?.documentData; diff --git a/apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx b/apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx index 9f66dcbb6..5075f342c 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx @@ -41,8 +41,8 @@ import { DuplicateDocumentDialog } from '../duplicate-document-dialog'; export type DocumentPageViewDropdownProps = { document: Document & { - User: Pick; - Recipient: Recipient[]; + user: Pick; + recipients: Recipient[]; team: Pick | null; }; team?: Pick & { teamEmail: TeamEmail | null }; @@ -60,9 +60,9 @@ export const DocumentPageViewDropdown = ({ document, team }: DocumentPageViewDro return null; } - const recipient = document.Recipient.find((recipient) => recipient.email === session.user.email); + const recipient = document.recipients.find((recipient) => recipient.email === session.user.email); - const isOwner = document.User.id === session.user.id; + const isOwner = document.user.id === session.user.id; const isDraft = document.status === DocumentStatus.DRAFT; const isPending = document.status === DocumentStatus.PENDING; const isDeleted = document.deletedAt !== null; @@ -74,10 +74,16 @@ export const DocumentPageViewDropdown = ({ document, team }: DocumentPageViewDro const onDownloadClick = async () => { try { - const documentWithData = await trpcClient.document.getDocumentById.query({ - documentId: document.id, - teamId: team?.id, - }); + const documentWithData = await trpcClient.document.getDocumentById.query( + { + documentId: document.id, + }, + { + context: { + teamId: team?.id?.toString(), + }, + }, + ); const documentData = documentWithData?.documentData; @@ -95,7 +101,7 @@ export const DocumentPageViewDropdown = ({ document, team }: DocumentPageViewDro } }; - const nonSignedRecipients = document.Recipient.filter((item) => item.signingStatus !== 'SIGNED'); + const nonSignedRecipients = document.recipients.filter((item) => item.signingStatus !== 'SIGNED'); return ( @@ -150,7 +156,7 @@ export const DocumentPageViewDropdown = ({ document, team }: DocumentPageViewDro {canManageDocument && ( ; - Recipient: Recipient[]; + user: Pick; + recipients: Recipient[]; }; }; @@ -29,7 +29,8 @@ export const DocumentPageViewInformation = ({ return [ { description: msg`Uploaded by`, - value: userId === document.userId ? _(msg`You`) : document.User.name ?? document.User.email, + value: + userId === document.userId ? _(msg`You`) : (document.user.name ?? document.user.email), }, { description: msg`Created`, diff --git a/apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx b/apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx index c9a3f8a0b..ea8ccee15 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx @@ -28,7 +28,7 @@ import { useToast } from '@documenso/ui/primitives/use-toast'; export type DocumentPageViewRecipientsProps = { document: Document & { - Recipient: Recipient[]; + recipients: Recipient[]; }; documentRootPath: string; }; @@ -40,7 +40,7 @@ export const DocumentPageViewRecipients = ({ const { _ } = useLingui(); const { toast } = useToast(); - const recipients = document.Recipient; + const recipients = document.recipients; return (
diff --git a/apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx b/apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx index bc890057c..7892e6eba 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx @@ -71,7 +71,7 @@ export const DocumentPageView = async ({ params, team }: DocumentPageViewProps) const documentVisibility = document?.visibility; const currentTeamMemberRole = team?.currentTeamMember?.role; - const isRecipient = document?.Recipient.find((recipient) => recipient.email === user.email); + const isRecipient = document?.recipients.find((recipient) => recipient.email === user.email); let canAccessDocument = true; if (team && !isRecipient && document?.userId !== user.id) { @@ -125,12 +125,13 @@ export const DocumentPageView = async ({ params, team }: DocumentPageViewProps) getFieldsForDocument({ documentId, userId: user.id, + teamId: team?.id, }), ]); const documentWithRecipients = { ...document, - Recipient: recipients, + recipients, }; return ( diff --git a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx index 01a483d86..7977aa2c6 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx @@ -12,7 +12,7 @@ import { DO_NOT_INVALIDATE_QUERY_ON_MUTATION, SKIP_QUERY_BATCH_META, } from '@documenso/lib/constants/trpc'; -import type { TGetDocumentWithDetailsByIdResponse } from '@documenso/lib/server-only/document/get-document-with-details-by-id'; +import type { TDocument } from '@documenso/lib/types/document'; import { DocumentDistributionMethod, DocumentStatus } from '@documenso/prisma/client'; import { trpc } from '@documenso/trpc/react'; import { cn } from '@documenso/ui/lib/utils'; @@ -35,7 +35,7 @@ import { useOptionalCurrentTeam } from '~/providers/team'; export type EditDocumentFormProps = { className?: string; - initialDocument: TGetDocumentWithDetailsByIdResponse; + initialDocument: TDocument; documentRootPath: string; isDocumentEnterprise: boolean; }; @@ -64,7 +64,6 @@ export const EditDocumentForm = ({ trpc.document.getDocumentWithDetailsById.useQuery( { documentId: initialDocument.id, - teamId: team?.id, }, { initialData: initialDocument, @@ -72,15 +71,14 @@ export const EditDocumentForm = ({ }, ); - const { Recipient: recipients, Field: fields } = document; + const { recipients, fields } = document; - const { mutateAsync: setSettingsForDocument } = trpc.document.setSettingsForDocument.useMutation({ + const { mutateAsync: updateDocument } = trpc.document.setSettingsForDocument.useMutation({ ...DO_NOT_INVALIDATE_QUERY_ON_MUTATION, onSuccess: (newData) => { utils.document.getDocumentWithDetailsById.setData( { documentId: initialDocument.id, - teamId: team?.id, }, (oldData) => ({ ...(oldData || initialDocument), ...newData }), ); @@ -94,7 +92,6 @@ export const EditDocumentForm = ({ utils.document.getDocumentWithDetailsById.setData( { documentId: initialDocument.id, - teamId: team?.id, }, (oldData) => ({ ...(oldData || initialDocument), ...newData, id: Number(newData.id) }), ); @@ -107,40 +104,20 @@ export const EditDocumentForm = ({ utils.document.getDocumentWithDetailsById.setData( { documentId: initialDocument.id, - teamId: team?.id, }, - (oldData) => ({ ...(oldData || initialDocument), Field: newFields }), + (oldData) => ({ ...(oldData || initialDocument), fields: newFields }), ); }, }); - const { mutateAsync: updateTypedSignature } = - trpc.document.updateTypedSignatureSettings.useMutation({ - ...DO_NOT_INVALIDATE_QUERY_ON_MUTATION, - onSuccess: (newData) => { - utils.document.getDocumentWithDetailsById.setData( - { - documentId: initialDocument.id, - teamId: team?.id, - }, - (oldData) => ({ - ...(oldData || initialDocument), - ...newData, - id: Number(newData.id), - }), - ); - }, - }); - - const { mutateAsync: addSigners } = trpc.recipient.addSigners.useMutation({ + const { mutateAsync: setRecipients } = trpc.recipient.setDocumentRecipients.useMutation({ ...DO_NOT_INVALIDATE_QUERY_ON_MUTATION, onSuccess: ({ recipients: newRecipients }) => { utils.document.getDocumentWithDetailsById.setData( { documentId: initialDocument.id, - teamId: team?.id, }, - (oldData) => ({ ...(oldData || initialDocument), Recipient: newRecipients }), + (oldData) => ({ ...(oldData || initialDocument), recipients: newRecipients }), ); }, }); @@ -151,7 +128,6 @@ export const EditDocumentForm = ({ utils.document.getDocumentWithDetailsById.setData( { documentId: initialDocument.id, - teamId: team?.id, }, (oldData) => ({ ...(oldData || initialDocument), ...newData }), ); @@ -205,9 +181,8 @@ export const EditDocumentForm = ({ try { const { timezone, dateFormat, redirectUrl, language } = data.meta; - await setSettingsForDocument({ + await updateDocument({ documentId: document.id, - teamId: team?.id, data: { title: data.title, externalId: data.externalId || null, @@ -246,10 +221,9 @@ export const EditDocumentForm = ({ signingOrder: data.signingOrder, }), - addSigners({ + setRecipients({ documentId: document.id, - teamId: team?.id, - signers: data.signers.map((signer) => ({ + recipients: data.signers.map((signer) => ({ ...signer, // Explicitly set to null to indicate we want to remove auth if required. actionAuth: signer.actionAuth || null, @@ -279,9 +253,12 @@ export const EditDocumentForm = ({ fields: data.fields, }); - await updateTypedSignature({ + await updateDocument({ documentId: document.id, - typedSignatureEnabled: data.typedSignatureEnabled, + + meta: { + typedSignatureEnabled: data.typedSignatureEnabled, + }, }); // Clear all field data from localStorage @@ -313,7 +290,6 @@ export const EditDocumentForm = ({ try { await sendDocument({ documentId: document.id, - teamId: team?.id, meta: { subject, message, diff --git a/apps/web/src/app/(dashboard)/documents/[id]/edit/document-edit-page-view.tsx b/apps/web/src/app/(dashboard)/documents/[id]/edit/document-edit-page-view.tsx index e76b7b405..70e3323e2 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/edit/document-edit-page-view.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/edit/document-edit-page-view.tsx @@ -52,7 +52,7 @@ export const DocumentEditPageView = async ({ params, team }: DocumentEditPageVie const documentVisibility = document?.visibility; const currentTeamMemberRole = team?.currentTeamMember?.role; - const isRecipient = document?.Recipient.find((recipient) => recipient.email === user.email); + const isRecipient = document?.recipients.find((recipient) => recipient.email === user.email); let canAccessDocument = true; if (!isRecipient && document?.userId !== user.id) { @@ -78,7 +78,7 @@ export const DocumentEditPageView = async ({ params, team }: DocumentEditPageVie redirect(`${documentRootPath}/${documentId}`); } - const { documentMeta, Recipient: recipients } = document; + const { documentMeta, recipients } = document; if (documentMeta?.password) { const key = DOCUMENSO_ENCRYPTION_KEY; diff --git a/apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx b/apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx index eae15526f..45097b594 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx @@ -37,17 +37,16 @@ export const DocumentLogsDataTable = ({ documentId }: DocumentLogsDataTableProps const parsedSearchParams = ZUrlSearchParamsSchema.parse(Object.fromEntries(searchParams ?? [])); - const { data, isLoading, isInitialLoading, isLoadingError } = - trpc.document.findDocumentAuditLogs.useQuery( - { - documentId, - page: parsedSearchParams.page, - perPage: parsedSearchParams.perPage, - }, - { - keepPreviousData: true, - }, - ); + const { data, isLoading, isLoadingError } = trpc.document.findDocumentAuditLogs.useQuery( + { + documentId, + page: parsedSearchParams.page, + perPage: parsedSearchParams.perPage, + }, + { + placeholderData: (previousData) => previousData, + }, + ); const onPaginationChange = (page: number, perPage: number) => { updateSearchParams({ @@ -132,7 +131,7 @@ export const DocumentLogsDataTable = ({ documentId }: DocumentLogsDataTableProps enable: isLoadingError, }} skeleton={{ - enable: isLoading && isInitialLoading, + enable: isLoading, rows: 3, component: ( <> diff --git a/apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-page-view.tsx b/apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-page-view.tsx index b53cffe13..877dad583 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-page-view.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-page-view.tsx @@ -77,9 +77,9 @@ export const DocumentLogsPageView = async ({ params, team }: DocumentLogsPageVie }, { description: msg`Created by`, - value: document.User.name - ? `${document.User.name} (${document.User.email})` - : document.User.email, + value: document.user.name + ? `${document.user.name} (${document.user.email})` + : document.user.email, }, { description: msg`Date created`, diff --git a/apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx b/apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx index 70b81238c..d6be5318c 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx @@ -15,20 +15,16 @@ export type DownloadAuditLogButtonProps = { documentId: number; }; -export const DownloadAuditLogButton = ({ - className, - teamId, - documentId, -}: DownloadAuditLogButtonProps) => { +export const DownloadAuditLogButton = ({ className, documentId }: DownloadAuditLogButtonProps) => { const { toast } = useToast(); const { _ } = useLingui(); - const { mutateAsync: downloadAuditLogs, isLoading } = + const { mutateAsync: downloadAuditLogs, isPending } = trpc.document.downloadAuditLogs.useMutation(); const onDownloadAuditLogsClick = async () => { try { - const { url } = await downloadAuditLogs({ teamId, documentId }); + const { url } = await downloadAuditLogs({ documentId }); const iframe = Object.assign(document.createElement('iframe'), { src: url, @@ -74,10 +70,10 @@ export const DownloadAuditLogButton = ({ return ( ); diff --git a/apps/web/src/app/(dashboard)/documents/[id]/logs/download-certificate-button.tsx b/apps/web/src/app/(dashboard)/documents/[id]/logs/download-certificate-button.tsx index 7cc262d3d..18eff7258 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/logs/download-certificate-button.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/logs/download-certificate-button.tsx @@ -26,12 +26,12 @@ export const DownloadCertificateButton = ({ const { toast } = useToast(); const { _ } = useLingui(); - const { mutateAsync: downloadCertificate, isLoading } = + const { mutateAsync: downloadCertificate, isPending } = trpc.document.downloadCertificate.useMutation(); const onDownloadCertificatesClick = async () => { try { - const { url } = await downloadCertificate({ documentId, teamId }); + const { url } = await downloadCertificate({ documentId }); const iframe = Object.assign(document.createElement('iframe'), { src: url, @@ -77,12 +77,12 @@ export const DownloadCertificateButton = ({ return ( ); diff --git a/apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx b/apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx index 01b532887..f45a3262f 100644 --- a/apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx @@ -91,7 +91,7 @@ export const ResendDocumentActionItem = ({ const onFormSubmit = async ({ recipients }: TResendDocumentFormSchema) => { try { - await resendDocument({ documentId: document.id, recipients, teamId: team?.id }); + await resendDocument({ documentId: document.id, recipients }); toast({ title: _(msg`Document re-sent`), diff --git a/apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx b/apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx index 45be9b24e..1194dfd01 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx @@ -12,15 +12,14 @@ import { downloadPDF } from '@documenso/lib/client-only/download-pdf'; import { formatDocumentsPath } from '@documenso/lib/utils/teams'; import type { Document, Recipient, Team, User } from '@documenso/prisma/client'; import { DocumentStatus, RecipientRole, SigningStatus } from '@documenso/prisma/client'; -import type { DocumentWithData } from '@documenso/prisma/types/document-with-data'; import { trpc as trpcClient } from '@documenso/trpc/client'; import { Button } from '@documenso/ui/primitives/button'; import { useToast } from '@documenso/ui/primitives/use-toast'; export type DataTableActionButtonProps = { row: Document & { - User: Pick; - Recipient: Recipient[]; + user: Pick; + recipients: Recipient[]; team: Pick | null; }; team?: Pick; @@ -35,9 +34,9 @@ export const DataTableActionButton = ({ row, team }: DataTableActionButtonProps) return null; } - const recipient = row.Recipient.find((recipient) => recipient.email === session.user.email); + const recipient = row.recipients.find((recipient) => recipient.email === session.user.email); - const isOwner = row.User.id === session.user.id; + const isOwner = row.user.id === session.user.id; const isRecipient = !!recipient; const isDraft = row.status === DocumentStatus.DRAFT; const isPending = row.status === DocumentStatus.PENDING; @@ -50,18 +49,20 @@ export const DataTableActionButton = ({ row, team }: DataTableActionButtonProps) const onDownloadClick = async () => { try { - let document: DocumentWithData | null = null; - - if (!recipient) { - document = await trpcClient.document.getDocumentById.query({ - documentId: row.id, - teamId: team?.id, - }); - } else { - document = await trpcClient.document.getDocumentByToken.query({ - token: recipient.token, - }); - } + const document = !recipient + ? await trpcClient.document.getDocumentById.query( + { + documentId: row.id, + }, + { + context: { + teamId: team?.id?.toString(), + }, + }, + ) + : await trpcClient.document.getDocumentByToken.query({ + token: recipient.token, + }); const documentData = document?.documentData; diff --git a/apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx b/apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx index 237ba009e..567d8dcd8 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx @@ -23,9 +23,8 @@ import { useSession } from 'next-auth/react'; import { downloadPDF } from '@documenso/lib/client-only/download-pdf'; import { formatDocumentsPath } from '@documenso/lib/utils/teams'; -import { DocumentStatus, RecipientRole } from '@documenso/prisma/client'; import type { Document, Recipient, Team, User } from '@documenso/prisma/client'; -import type { DocumentWithData } from '@documenso/prisma/types/document-with-data'; +import { DocumentStatus, RecipientRole } from '@documenso/prisma/client'; import { trpc as trpcClient } from '@documenso/trpc/client'; import { DocumentShareButton } from '@documenso/ui/components/document/document-share-button'; import { @@ -46,8 +45,8 @@ import { MoveDocumentDialog } from './move-document-dialog'; export type DataTableActionDropdownProps = { row: Document & { - User: Pick; - Recipient: Recipient[]; + user: Pick; + recipients: Recipient[]; team: Pick | null; }; team?: Pick & { teamEmail?: string }; @@ -66,9 +65,9 @@ export const DataTableActionDropdown = ({ row, team }: DataTableActionDropdownPr return null; } - const recipient = row.Recipient.find((recipient) => recipient.email === session.user.email); + const recipient = row.recipients.find((recipient) => recipient.email === session.user.email); - const isOwner = row.User.id === session.user.id; + const isOwner = row.user.id === session.user.id; // const isRecipient = !!recipient; const isDraft = row.status === DocumentStatus.DRAFT; const isPending = row.status === DocumentStatus.PENDING; @@ -81,18 +80,13 @@ export const DataTableActionDropdown = ({ row, team }: DataTableActionDropdownPr const onDownloadClick = async () => { try { - let document: DocumentWithData | null = null; - - if (!recipient) { - document = await trpcClient.document.getDocumentById.query({ - documentId: row.id, - teamId: team?.id, - }); - } else { - document = await trpcClient.document.getDocumentByToken.query({ - token: recipient.token, - }); - } + const document = !recipient + ? await trpcClient.document.getDocumentById.query({ + documentId: row.id, + }) + : await trpcClient.document.getDocumentByToken.query({ + token: recipient.token, + }); const documentData = document?.documentData; @@ -110,7 +104,7 @@ export const DataTableActionDropdown = ({ row, team }: DataTableActionDropdownPr } }; - const nonSignedRecipients = row.Recipient.filter((item) => item.signingStatus !== 'SIGNED'); + const nonSignedRecipients = row.recipients.filter((item) => item.signingStatus !== 'SIGNED'); return ( @@ -195,7 +189,7 @@ export const DataTableActionDropdown = ({ row, team }: DataTableActionDropdownPr {canManageDocument && ( e.preventDefault()}>
@@ -239,14 +233,12 @@ export const DataTableActionDropdown = ({ row, team }: DataTableActionDropdownPr onOpenChange={setMoveDialogOpen} /> - {isDuplicateDialogOpen && ( - - )} + ); }; diff --git a/apps/web/src/app/(dashboard)/documents/data-table-sender-filter.tsx b/apps/web/src/app/(dashboard)/documents/data-table-sender-filter.tsx index b580a7ede..8003c20b8 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table-sender-filter.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table-sender-filter.tsx @@ -25,7 +25,7 @@ export const DataTableSenderFilter = ({ teamId }: DataTableSenderFilterProps) => const senderIds = parseToIntegerArray(searchParams?.get('senderIds') ?? ''); - const { data, isInitialLoading } = trpc.team.getTeamMembers.useQuery({ + const { data, isLoading } = trpc.team.getTeamMembers.useQuery({ teamId, }); @@ -61,7 +61,7 @@ export const DataTableSenderFilter = ({ teamId }: DataTableSenderFilterProps) => } enableClearAllButton={true} inputPlaceholder={msg`Search`} - loading={!isMounted || isInitialLoading} + loading={!isMounted || isLoading} options={comboBoxOptions} selectedValues={senderIds} onChange={onChange} diff --git a/apps/web/src/app/(dashboard)/documents/data-table-title.tsx b/apps/web/src/app/(dashboard)/documents/data-table-title.tsx index dc2ba154d..39af81195 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table-title.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table-title.tsx @@ -10,9 +10,9 @@ import type { Document, Recipient, Team, User } from '@documenso/prisma/client'; export type DataTableTitleProps = { row: Document & { - User: Pick; + user: Pick; team: Pick | null; - Recipient: Recipient[]; + recipients: Recipient[]; }; teamUrl?: string; }; @@ -24,9 +24,9 @@ export const DataTableTitle = ({ row, teamUrl }: DataTableTitleProps) => { return null; } - const recipient = row.Recipient.find((recipient) => recipient.email === session.user.email); + const recipient = row.recipients.find((recipient) => recipient.email === session.user.email); - const isOwner = row.User.id === session.user.id; + const isOwner = row.user.id === session.user.id; const isRecipient = !!recipient; const isCurrentTeamDocument = teamUrl && row.team?.url === teamUrl; diff --git a/apps/web/src/app/(dashboard)/documents/data-table.tsx b/apps/web/src/app/(dashboard)/documents/data-table.tsx index 895a4158b..4051b7d1d 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table.tsx @@ -9,9 +9,9 @@ import { DateTime } from 'luxon'; import { useSession } from 'next-auth/react'; import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; -import type { TFindDocumentsResponse } from '@documenso/lib/server-only/document/find-documents'; import type { Team } from '@documenso/prisma/client'; import { ExtendedDocumentStatus } from '@documenso/prisma/types/extended-document-status'; +import type { TFindDocumentsResponse } from '@documenso/trpc/server/document-router/schema'; import type { DataTableColumnDef } from '@documenso/ui/primitives/data-table'; import { DataTable } from '@documenso/ui/primitives/data-table'; import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; @@ -57,14 +57,14 @@ export const DocumentsDataTable = ({ { id: 'sender', header: _(msg`Sender`), - cell: ({ row }) => row.original.User.name ?? row.original.User.email, + cell: ({ row }) => row.original.user.name ?? row.original.user.email, }, { header: _(msg`Recipient`), accessorKey: 'recipient', cell: ({ row }) => ( ), diff --git a/apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx b/apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx index f8ab254e1..50c0b83eb 100644 --- a/apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx +++ b/apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx @@ -38,7 +38,6 @@ export const DeleteDocumentDialog = ({ onOpenChange, status, documentTitle, - teamId, canManageDocument, }: DeleteDocumentDialogProps) => { const router = useRouter(); @@ -52,7 +51,7 @@ export const DeleteDocumentDialog = ({ const [inputValue, setInputValue] = useState(''); const [isDeleteEnabled, setIsDeleteEnabled] = useState(status === DocumentStatus.DRAFT); - const { mutateAsync: deleteDocument, isLoading } = trpcReact.document.deleteDocument.useMutation({ + const { mutateAsync: deleteDocument, isPending } = trpcReact.document.deleteDocument.useMutation({ onSuccess: () => { router.refresh(); void refreshLimits(); @@ -76,7 +75,7 @@ export const DeleteDocumentDialog = ({ const onDelete = async () => { try { - await deleteDocument({ documentId: id, teamId }); + await deleteDocument({ documentId: id }); } catch { toast({ title: _(msg`Something went wrong`), @@ -93,7 +92,7 @@ export const DeleteDocumentDialog = ({ }; return ( - !isLoading && onOpenChange(value)}> + !isPending && onOpenChange(value)}> @@ -194,7 +193,7 @@ export const DeleteDocumentDialog = ({ - diff --git a/apps/web/src/app/(dashboard)/documents/upload-document.tsx b/apps/web/src/app/(dashboard)/documents/upload-document.tsx index daca2443b..c8fc800a0 100644 --- a/apps/web/src/app/(dashboard)/documents/upload-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/upload-document.tsx @@ -8,16 +8,16 @@ import { Trans, msg } from '@lingui/macro'; import { useLingui } from '@lingui/react'; import { Loader } from 'lucide-react'; import { useSession } from 'next-auth/react'; +import { match } from 'ts-pattern'; import { useLimits } from '@documenso/ee/server-only/limits/provider/client'; import { useAnalytics } from '@documenso/lib/client-only/hooks/use-analytics'; import { APP_DOCUMENT_UPLOAD_SIZE_LIMIT } from '@documenso/lib/constants/app'; import { DEFAULT_DOCUMENT_TIME_ZONE, TIME_ZONES } from '@documenso/lib/constants/time-zones'; -import { AppError } from '@documenso/lib/errors/app-error'; +import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; import { createDocumentData } from '@documenso/lib/server-only/document-data/create-document-data'; import { putPdfFile } from '@documenso/lib/universal/upload/put-file'; import { formatDocumentsPath } from '@documenso/lib/utils/teams'; -import { TRPCClientError } from '@documenso/trpc/client'; import { trpc } from '@documenso/trpc/react'; import { cn } from '@documenso/ui/lib/utils'; import { DocumentDropzone } from '@documenso/ui/primitives/document-dropzone'; @@ -76,7 +76,6 @@ export const UploadDocument = ({ className, team }: UploadDocumentProps) => { const { id } = await createDocument({ title: file.name, documentDataId, - teamId: team?.id, timezone: userTimezone, }); @@ -100,25 +99,20 @@ export const UploadDocument = ({ className, team }: UploadDocumentProps) => { console.error(err); - if (error.code === 'INVALID_DOCUMENT_FILE') { - toast({ - title: _(msg`Invalid file`), - description: _(msg`You cannot upload encrypted PDFs`), - variant: 'destructive', - }); - } else if (err instanceof TRPCClientError) { - toast({ - title: _(msg`Error`), - description: err.message, - variant: 'destructive', - }); - } else { - toast({ - title: _(msg`Error`), - description: _(msg`An error occurred while uploading your document.`), - variant: 'destructive', - }); - } + const errorMessage = match(error.code) + .with('INVALID_DOCUMENT_FILE', () => msg`You cannot upload encrypted PDFs`) + .with( + AppErrorCode.LIMIT_EXCEEDED, + () => msg`You have reached your document limit for this month. Please upgrade your plan.`, + ) + .otherwise(() => msg`An error occurred while uploading your document.`); + + toast({ + title: _(msg`Error`), + description: _(errorMessage), + variant: 'destructive', + duration: 7500, + }); } finally { setIsLoading(false); } diff --git a/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx b/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx index d0a13830c..2bb37e57b 100644 --- a/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx +++ b/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx @@ -36,7 +36,7 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp const [enteredEmail, setEnteredEmail] = useState(''); - const { mutateAsync: deleteAccount, isLoading: isDeletingAccount } = + const { mutateAsync: deleteAccount, isPending: isDeletingAccount } = trpc.profile.deleteAccount.useMutation(); const onDeleteAccount = async () => { diff --git a/apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx b/apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx index 9dae25fcb..0795c29ca 100644 --- a/apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx +++ b/apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx @@ -5,7 +5,6 @@ import { useEffect, useMemo, useState } from 'react'; import { Trans, msg } from '@lingui/macro'; import { useLingui } from '@lingui/react'; -import type { FindTemplateRow } from '@documenso/lib/server-only/template/find-templates'; import type { Team, TeamProfile, @@ -15,6 +14,7 @@ import type { } from '@documenso/prisma/client'; import { TemplateType } from '@documenso/prisma/client'; import { trpc } from '@documenso/trpc/react'; +import type { FindTemplateRow } from '@documenso/trpc/server/template-router/schema'; import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; import { Switch } from '@documenso/ui/primitives/switch'; @@ -61,13 +61,12 @@ export const PublicProfilePageView = ({ user, team, profile }: PublicProfilePage const { data } = trpc.template.findTemplates.useQuery({ perPage: 100, - teamId: team?.id, }); - const { mutateAsync: updateUserProfile, isLoading: isUpdatingUserProfile } = + const { mutateAsync: updateUserProfile, isPending: isUpdatingUserProfile } = trpc.profile.updatePublicProfile.useMutation(); - const { mutateAsync: updateTeamProfile, isLoading: isUpdatingTeamProfile } = + const { mutateAsync: updateTeamProfile, isPending: isUpdatingTeamProfile } = trpc.team.updateTeamPublicProfile.useMutation(); const isUpdating = isUpdatingUserProfile || isUpdatingTeamProfile; diff --git a/apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx b/apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx index 127fd5c6d..b8f3034b8 100644 --- a/apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx +++ b/apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx @@ -7,11 +7,11 @@ import { useLingui } from '@lingui/react'; import { EditIcon, FileIcon, LinkIcon, MoreHorizontalIcon, Trash2Icon } from 'lucide-react'; import { useCopyToClipboard } from '@documenso/lib/client-only/hooks/use-copy-to-clipboard'; -import type { FindTemplateRow } from '@documenso/lib/server-only/template/find-templates'; import { formatDirectTemplatePath } from '@documenso/lib/utils/templates'; import type { TemplateDirectLink } from '@documenso/prisma/client'; import { TemplateType } from '@documenso/prisma/client'; import { trpc } from '@documenso/trpc/react'; +import type { FindTemplateRow } from '@documenso/trpc/server/template-router/schema'; import { DropdownMenu, DropdownMenuContent, @@ -23,15 +23,12 @@ import { Skeleton } from '@documenso/ui/primitives/skeleton'; import { useToast } from '@documenso/ui/primitives/use-toast'; import { ManagePublicTemplateDialog } from '~/components/templates/manage-public-template-dialog'; -import { useOptionalCurrentTeam } from '~/providers/team'; type DirectTemplate = FindTemplateRow & { directLink: Pick; }; export const PublicTemplatesDataTable = () => { - const team = useOptionalCurrentTeam(); - const { _ } = useLingui(); const { toast } = useToast(); @@ -42,12 +39,10 @@ export const PublicTemplatesDataTable = () => { templateId: number; } | null>(null); - const { data, isInitialLoading, isLoadingError, refetch } = trpc.template.findTemplates.useQuery( + const { data, isLoading, isLoadingError, refetch } = trpc.template.findTemplates.useQuery( + {}, { - teamId: team?.id, - }, - { - keepPreviousData: true, + placeholderData: (previousData) => previousData, }, ); @@ -85,7 +80,7 @@ export const PublicTemplatesDataTable = () => { {/* Loading and error handling states. */} {publicDirectTemplates.length === 0 && ( <> - {isInitialLoading && + {isLoading && Array(3) .fill(0) .map((_, index) => ( @@ -120,7 +115,7 @@ export const PublicTemplatesDataTable = () => {
)} - {!isInitialLoading && ( + {!isLoading && (
No public profile templates found { const parsedSearchParams = ZUrlSearchParamsSchema.parse(Object.fromEntries(searchParams ?? [])); - const { data, isLoading, isInitialLoading, isLoadingError } = - trpc.profile.findUserSecurityAuditLogs.useQuery( - { - page: parsedSearchParams.page, - perPage: parsedSearchParams.perPage, - }, - { - keepPreviousData: true, - }, - ); + const { data, isLoading, isLoadingError } = trpc.profile.findUserSecurityAuditLogs.useQuery( + { + page: parsedSearchParams.page, + perPage: parsedSearchParams.perPage, + }, + { + placeholderData: (previousData) => previousData, + }, + ); const onPaginationChange = (page: number, perPage: number) => { updateSearchParams({ @@ -134,7 +133,7 @@ export const UserSecurityActivityDataTable = () => { enable: isLoadingError, }} skeleton={{ - enable: isLoading && isInitialLoading, + enable: isLoading, rows: 3, component: ( <> diff --git a/apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx b/apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx index 5c52532c9..44b87ae2f 100644 --- a/apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx +++ b/apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx @@ -65,7 +65,7 @@ export const CreatePasskeyDialog = ({ trigger, onSuccess, ...props }: CreatePass }, }); - const { mutateAsync: createPasskeyRegistrationOptions, isLoading } = + const { mutateAsync: createPasskeyRegistrationOptions, isPending } = trpc.auth.createPasskeyRegistrationOptions.useMutation(); const { mutateAsync: createPasskey } = trpc.auth.createPasskey.useMutation(); @@ -141,7 +141,7 @@ export const CreatePasskeyDialog = ({ trigger, onSuccess, ...props }: CreatePass > e.stopPropagation()} asChild={true}> {trigger ?? ( - diff --git a/apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx b/apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx index 4c720076a..72142da41 100644 --- a/apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx +++ b/apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx @@ -60,7 +60,7 @@ export const UserPasskeysDataTableActions = ({ }, }); - const { mutateAsync: updatePasskey, isLoading: isUpdatingPasskey } = + const { mutateAsync: updatePasskey, isPending: isUpdatingPasskey } = trpc.auth.updatePasskey.useMutation({ onSuccess: () => { toast({ @@ -80,7 +80,7 @@ export const UserPasskeysDataTableActions = ({ }, }); - const { mutateAsync: deletePasskey, isLoading: isDeletingPasskey } = + const { mutateAsync: deletePasskey, isPending: isDeletingPasskey } = trpc.auth.deletePasskey.useMutation({ onSuccess: () => { toast({ diff --git a/apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table.tsx b/apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table.tsx index 9a19a9767..169630f20 100644 --- a/apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table.tsx +++ b/apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table.tsx @@ -29,13 +29,13 @@ export const UserPasskeysDataTable = () => { const parsedSearchParams = ZUrlSearchParamsSchema.parse(Object.fromEntries(searchParams ?? [])); - const { data, isLoading, isInitialLoading, isLoadingError } = trpc.auth.findPasskeys.useQuery( + const { data, isLoading, isLoadingError } = trpc.auth.findPasskeys.useQuery( { page: parsedSearchParams.page, perPage: parsedSearchParams.perPage, }, { - keepPreviousData: true, + placeholderData: (previousData) => previousData, }, ); @@ -100,7 +100,7 @@ export const UserPasskeysDataTable = () => { enable: isLoadingError, }} skeleton={{ - enable: isLoading && isInitialLoading, + enable: isLoading, rows: 3, component: ( <> diff --git a/apps/web/src/app/(dashboard)/settings/teams/accept-team-invitation-button.tsx b/apps/web/src/app/(dashboard)/settings/teams/accept-team-invitation-button.tsx index cca5448f3..7d737026b 100644 --- a/apps/web/src/app/(dashboard)/settings/teams/accept-team-invitation-button.tsx +++ b/apps/web/src/app/(dashboard)/settings/teams/accept-team-invitation-button.tsx @@ -17,7 +17,7 @@ export const AcceptTeamInvitationButton = ({ teamId }: AcceptTeamInvitationButto const { mutateAsync: acceptTeamInvitation, - isLoading, + isPending, isSuccess, } = trpc.team.acceptTeamInvitation.useMutation({ onSuccess: () => { @@ -40,8 +40,8 @@ export const AcceptTeamInvitationButton = ({ teamId }: AcceptTeamInvitationButto return ( diff --git a/apps/web/src/app/(dashboard)/settings/teams/decline-team-invitation-button.tsx b/apps/web/src/app/(dashboard)/settings/teams/decline-team-invitation-button.tsx index b1f8ecb43..02c5c38aa 100644 --- a/apps/web/src/app/(dashboard)/settings/teams/decline-team-invitation-button.tsx +++ b/apps/web/src/app/(dashboard)/settings/teams/decline-team-invitation-button.tsx @@ -17,7 +17,7 @@ export const DeclineTeamInvitationButton = ({ teamId }: DeclineTeamInvitationBut const { mutateAsync: declineTeamInvitation, - isLoading, + isPending, isSuccess, } = trpc.team.declineTeamInvitation.useMutation({ onSuccess: () => { @@ -40,8 +40,8 @@ export const DeclineTeamInvitationButton = ({ teamId }: DeclineTeamInvitationBut return (
+ } + /> + setDeleteDialogOpen(true)} diff --git a/apps/web/src/app/(dashboard)/templates/data-table-templates.tsx b/apps/web/src/app/(dashboard)/templates/data-table-templates.tsx index 65213c777..d198cdab5 100644 --- a/apps/web/src/app/(dashboard)/templates/data-table-templates.tsx +++ b/apps/web/src/app/(dashboard)/templates/data-table-templates.tsx @@ -10,7 +10,7 @@ import { AlertTriangle, Globe2Icon, InfoIcon, Link2Icon, Loader, LockIcon } from import { useLimits } from '@documenso/ee/server-only/limits/provider/client'; import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; -import type { FindTemplateRow } from '@documenso/lib/server-only/template/find-templates'; +import type { FindTemplateRow } from '@documenso/trpc/server/template-router/schema'; import { Alert, AlertDescription, AlertTitle } from '@documenso/ui/primitives/alert'; import type { DataTableColumnDef } from '@documenso/ui/primitives/data-table'; import { DataTable } from '@documenso/ui/primitives/data-table'; @@ -146,7 +146,7 @@ export const TemplatesDataTable = ({ templateId={row.original.id} templateSigningOrder={row.original.templateMeta?.signingOrder} documentDistributionMethod={row.original.templateMeta?.distributionMethod} - recipients={row.original.Recipient} + recipients={row.original.recipients} documentRootPath={documentRootPath} /> diff --git a/apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx b/apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx index 586668207..f5a4750b4 100644 --- a/apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx +++ b/apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx @@ -22,18 +22,13 @@ type DeleteTemplateDialogProps = { onOpenChange: (_open: boolean) => void; }; -export const DeleteTemplateDialog = ({ - id, - teamId, - open, - onOpenChange, -}: DeleteTemplateDialogProps) => { +export const DeleteTemplateDialog = ({ id, open, onOpenChange }: DeleteTemplateDialogProps) => { const router = useRouter(); const { _ } = useLingui(); const { toast } = useToast(); - const { mutateAsync: deleteTemplate, isLoading } = trpcReact.template.deleteTemplate.useMutation({ + const { mutateAsync: deleteTemplate, isPending } = trpcReact.template.deleteTemplate.useMutation({ onSuccess: () => { router.refresh(); @@ -56,7 +51,7 @@ export const DeleteTemplateDialog = ({ }); return ( - !isLoading && onOpenChange(value)}> + !isPending && onOpenChange(value)}> @@ -75,7 +70,7 @@ export const DeleteTemplateDialog = ({ diff --git a/apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx b/apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx index 3225834de..34beee309 100644 --- a/apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx +++ b/apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx @@ -24,7 +24,6 @@ type DuplicateTemplateDialogProps = { export const DuplicateTemplateDialog = ({ id, - teamId, open, onOpenChange, }: DuplicateTemplateDialogProps) => { @@ -33,7 +32,7 @@ export const DuplicateTemplateDialog = ({ const { _ } = useLingui(); const { toast } = useToast(); - const { mutateAsync: duplicateTemplate, isLoading } = + const { mutateAsync: duplicateTemplate, isPending } = trpcReact.template.duplicateTemplate.useMutation({ onSuccess: () => { router.refresh(); @@ -56,7 +55,7 @@ export const DuplicateTemplateDialog = ({ }); return ( - !isLoading && onOpenChange(value)}> + !isPending && onOpenChange(value)}> @@ -71,7 +70,7 @@ export const DuplicateTemplateDialog = ({ - diff --git a/apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx b/apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx index 3ce5e0789..f6e31c3e0 100644 --- a/apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx +++ b/apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx @@ -31,7 +31,7 @@ type NewTemplateDialogProps = { templateRootPath: string; }; -export const NewTemplateDialog = ({ teamId, templateRootPath }: NewTemplateDialogProps) => { +export const NewTemplateDialog = ({ templateRootPath }: NewTemplateDialogProps) => { const router = useRouter(); const { data: session } = useSession(); @@ -58,7 +58,6 @@ export const NewTemplateDialog = ({ teamId, templateRootPath }: NewTemplateDialo }); const { id } = await createTemplate({ - teamId, title: file.name, templateDocumentDataId, }); diff --git a/apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx b/apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx index 90cd2c5d4..f603f20be 100644 --- a/apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx +++ b/apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx @@ -46,12 +46,10 @@ import { import { Tooltip, TooltipContent, TooltipTrigger } from '@documenso/ui/primitives/tooltip'; import { useToast } from '@documenso/ui/primitives/use-toast'; -import { useOptionalCurrentTeam } from '~/providers/team'; - type TemplateDirectLinkDialogProps = { template: Template & { directLink?: Pick | null; - Recipient: Recipient[]; + recipients: Recipient[]; }; open: boolean; onOpenChange: (_open: boolean) => void; @@ -68,8 +66,6 @@ export const TemplateDirectLinkDialog = ({ const { quota, remaining } = useLimits(); const { _ } = useLingui(); - const team = useOptionalCurrentTeam(); - const [, copy] = useCopyToClipboard(); const router = useRouter(); @@ -81,13 +77,13 @@ export const TemplateDirectLinkDialog = ({ ); const validDirectTemplateRecipients = useMemo( - () => template.Recipient.filter((recipient) => recipient.role !== RecipientRole.CC), - [template.Recipient], + () => template.recipients.filter((recipient) => recipient.role !== RecipientRole.CC), + [template.recipients], ); const { mutateAsync: createTemplateDirectLink, - isLoading: isCreatingTemplateDirectLink, + isPending: isCreatingTemplateDirectLink, reset: resetCreateTemplateDirectLink, } = trpcReact.template.createTemplateDirectLink.useMutation({ onSuccess: (data) => { @@ -108,7 +104,7 @@ export const TemplateDirectLinkDialog = ({ }, }); - const { mutateAsync: toggleTemplateDirectLink, isLoading: isTogglingTemplateAccess } = + const { mutateAsync: toggleTemplateDirectLink, isPending: isTogglingTemplateAccess } = trpcReact.template.toggleTemplateDirectLink.useMutation({ onSuccess: (data) => { const enabledDescription = msg`Direct link signing has been enabled`; @@ -131,7 +127,7 @@ export const TemplateDirectLinkDialog = ({ }, }); - const { mutateAsync: deleteTemplateDirectLink, isLoading: isDeletingTemplateDirectLink } = + const { mutateAsync: deleteTemplateDirectLink, isPending: isDeletingTemplateDirectLink } = trpcReact.template.deleteTemplateDirectLink.useMutation({ onSuccess: () => { onOpenChange(false); @@ -174,7 +170,6 @@ export const TemplateDirectLinkDialog = ({ await createTemplateDirectLink({ templateId: template.id, - teamId: team?.id, directRecipientId: recipientId, }); }; @@ -327,7 +322,7 @@ export const TemplateDirectLinkDialog = ({ {/* Prevent creating placeholder direct template recipient if the email already exists. */} - {!template.Recipient.some( + {!template.recipients.some( (recipient) => recipient.email === DIRECT_TEMPLATE_RECIPIENT_EMAIL, ) && ( @@ -345,7 +340,6 @@ export const TemplateDirectLinkDialog = ({ onClick={async () => createTemplateDirectLink({ templateId: template.id, - teamId: team?.id, }) } > diff --git a/apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx b/apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx index 811a39e55..6c7508327 100644 --- a/apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx +++ b/apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx @@ -47,8 +47,6 @@ import { Tooltip, TooltipContent, TooltipTrigger } from '@documenso/ui/primitive import type { Toast } from '@documenso/ui/primitives/use-toast'; import { useToast } from '@documenso/ui/primitives/use-toast'; -import { useOptionalCurrentTeam } from '~/providers/team'; - const ZAddRecipientsForNewDocumentSchema = z .object({ distributeDocument: z.boolean(), @@ -120,8 +118,6 @@ export function UseTemplateDialog({ const [open, setOpen] = useState(false); - const team = useOptionalCurrentTeam(); - const form = useForm({ resolver: zodResolver(ZAddRecipientsForNewDocumentSchema), defaultValues: { @@ -163,7 +159,6 @@ export function UseTemplateDialog({ const { id } = await createDocumentFromTemplate({ templateId, - teamId: team?.id, recipients: data.recipients, distributeDocument: data.distributeDocument, customDocumentDataId, diff --git a/apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx b/apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx index f8e510e65..d420ab456 100644 --- a/apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx +++ b/apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx @@ -66,6 +66,7 @@ export default async function AuditLog({ searchParams }: AuditLogProps) { const { data: auditLogs } = await findDocumentAuditLogs({ documentId: documentId, userId: document.userId, + teamId: document.teamId || undefined, perPage: 100_000, }); @@ -103,7 +104,7 @@ export default async function AuditLog({ searchParams }: AuditLogProps) { {_(msg`Owner`)} - {document.User.name} ({document.User.email}) + {document.user.name} ({document.user.email})

@@ -139,7 +140,7 @@ export default async function AuditLog({ searchParams }: AuditLogProps) {

{_(msg`Recipients`)}

    - {document.Recipient.map((recipient) => ( + {document.recipients.map((recipient) => (
  • [{_(RECIPIENT_ROLES_DESCRIPTION[recipient.role].roleName)}] diff --git a/apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx b/apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx index bb47e1708..9137e3290 100644 --- a/apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx +++ b/apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx @@ -88,7 +88,7 @@ export default async function SigningCertificate({ searchParams }: SigningCertif }); const isOwner = (email: string) => { - return email.toLowerCase() === document.User.email.toLowerCase(); + return email.toLowerCase() === document.user.email.toLowerCase(); }; const getDevice = (userAgent?: string | null) => { @@ -106,7 +106,7 @@ export default async function SigningCertificate({ searchParams }: SigningCertif }; const getAuthenticationLevel = (recipientId: number) => { - const recipient = document.Recipient.find((recipient) => recipient.id === recipientId); + const recipient = document.recipients.find((recipient) => recipient.id === recipientId); if (!recipient) { return 'Unknown'; @@ -159,9 +159,11 @@ export default async function SigningCertificate({ searchParams }: SigningCertif }; const getRecipientSignatureField = (recipientId: number) => { - return document.Recipient.find((recipient) => recipient.id === recipientId)?.Field.find( - (field) => field.type === FieldType.SIGNATURE || field.type === FieldType.FREE_SIGNATURE, - ); + return document.recipients + .find((recipient) => recipient.id === recipientId) + ?.fields.find( + (field) => field.type === FieldType.SIGNATURE || field.type === FieldType.FREE_SIGNATURE, + ); }; return ( @@ -183,7 +185,7 @@ export default async function SigningCertificate({ searchParams }: SigningCertif - {document.Recipient.map((recipient, i) => { + {document.recipients.map((recipient, i) => { const logs = getRecipientAuditLogs(recipient.id); const signature = getRecipientSignatureField(recipient.id); @@ -211,17 +213,17 @@ export default async function SigningCertificate({ searchParams }: SigningCertif boxShadow: `0px 0px 0px 4.88px rgba(122, 196, 85, 0.1), 0px 0px 0px 1.22px rgba(122, 196, 85, 0.6), 0px 0px 0px 0.61px rgba(122, 196, 85, 1)`, }} > - {signature.Signature?.signatureImageAsBase64 && ( + {signature.signature?.signatureImageAsBase64 && ( Signature )} - {signature.Signature?.typedSignature && ( + {signature.signature?.typedSignature && (

    - {signature.Signature?.typedSignature} + {signature.signature?.typedSignature}

    )} diff --git a/apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx b/apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx index 3e4a56c1e..f9b7019f3 100644 --- a/apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx +++ b/apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx @@ -7,8 +7,9 @@ import { useSession } from 'next-auth/react'; import { useForm } from 'react-hook-form'; import { z } from 'zod'; -import type { Field, Recipient } from '@documenso/prisma/client'; -import type { TemplateWithDetails } from '@documenso/prisma/types/template'; +import type { TTemplate } from '@documenso/lib/types/template'; +import type { Recipient } from '@documenso/prisma/client'; +import type { Field } from '@documenso/prisma/client'; import { DocumentFlowFormContainerActions, DocumentFlowFormContainerContent, @@ -40,8 +41,8 @@ export type TConfigureDirectTemplateFormSchema = z.infer; - directTemplateRecipient: Recipient & { Field: Field[] }; + template: Omit; + directTemplateRecipient: Recipient & { fields: Field[] }; initialEmail?: string; onSubmit: (_data: TConfigureDirectTemplateFormSchema) => void; }; @@ -57,10 +58,10 @@ export const ConfigureDirectTemplateFormPartial = ({ const { _ } = useLingui(); const { data: session } = useSession(); - const { Recipient } = template; + const { recipients } = template; const { derivedRecipientAccessAuth } = useRequiredDocumentAuthContext(); - const recipientsWithBlankDirectRecipientEmail = Recipient.map((recipient) => { + const recipientsWithBlankDirectRecipientEmail = recipients.map((recipient) => { if (recipient.id === directTemplateRecipient.id) { return { ...recipient, @@ -74,7 +75,7 @@ export const ConfigureDirectTemplateFormPartial = ({ const form = useForm({ resolver: zodResolver( ZConfigureDirectTemplateFormSchema.superRefine((items, ctx) => { - if (template.Recipient.map((recipient) => recipient.email).includes(items.email)) { + if (template.recipients.map((recipient) => recipient.email).includes(items.email)) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: _(msg`Email cannot already exist in the template`), @@ -96,7 +97,7 @@ export const ConfigureDirectTemplateFormPartial = ({ {isDocumentPdfLoaded && - directTemplateRecipient.Field.map((field, index) => ( + directTemplateRecipient.fields.map((field, index) => ( ; + template: Omit; directTemplateToken: string; - directTemplateRecipient: Recipient & { Field: Field[] }; + directTemplateRecipient: Recipient & { fields: Field[] }; }; type DirectTemplateStep = 'configure' | 'sign'; @@ -164,7 +164,7 @@ export const DirectTemplatePageView = ({ diff --git a/apps/web/src/app/(recipient)/d/[token]/page.tsx b/apps/web/src/app/(recipient)/d/[token]/page.tsx index dfbbd4595..333e93649 100644 --- a/apps/web/src/app/(recipient)/d/[token]/page.tsx +++ b/apps/web/src/app/(recipient)/d/[token]/page.tsx @@ -41,7 +41,7 @@ export default async function TemplatesDirectPage({ params }: TemplatesDirectPag notFound(); } - const directTemplateRecipient = template.Recipient.find( + const directTemplateRecipient = template.recipients.find( (recipient) => recipient.id === template.directLink?.directTemplateRecipientId, ); @@ -81,7 +81,7 @@ export default async function TemplatesDirectPage({ params }: TemplatesDirectPag

    - +

    diff --git a/apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx b/apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx index 72e648fff..9e379ab41 100644 --- a/apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx +++ b/apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx @@ -14,10 +14,10 @@ import { ZRadioFieldMeta, ZTextFieldMeta, } from '@documenso/lib/types/field-meta'; +import type { TTemplate } from '@documenso/lib/types/template'; import { sortFieldsByPosition, validateFieldsInserted } from '@documenso/lib/utils/fields'; import type { Field, Recipient, Signature } from '@documenso/prisma/client'; import { FieldType } from '@documenso/prisma/client'; -import type { TemplateWithDetails } from '@documenso/prisma/types/template'; import type { TRemovedSignedFieldWithTokenMutationSchema, TSignFieldWithTokenMutationSchema, @@ -55,13 +55,13 @@ export type SignDirectTemplateFormProps = { flowStep: DocumentFlowStep; directRecipient: Recipient; directRecipientFields: Field[]; - template: Omit; + template: Omit; onSubmit: (_data: DirectTemplateLocalField[]) => Promise; }; export type DirectTemplateLocalField = Field & { signedValue?: TSignFieldWithTokenMutationSchema; - Signature?: Signature; + signature?: Signature; }; export const SignDirectTemplateForm = ({ @@ -95,7 +95,7 @@ export const SignDirectTemplateForm = ({ }; if (field.type === FieldType.SIGNATURE) { - tempField.Signature = { + tempField.signature = { id: 1, created: new Date(), recipientId: 1, @@ -127,7 +127,7 @@ export const SignDirectTemplateForm = ({ customText: '', inserted: false, signedValue: undefined, - Signature: undefined, + signature: undefined, }; }), ); diff --git a/apps/web/src/app/(share)/share/[slug]/opengraph/route.tsx b/apps/web/src/app/(share)/share/[slug]/opengraph/route.tsx index 27f39a6b1..cfdd60b03 100644 --- a/apps/web/src/app/(share)/share/[slug]/opengraph/route.tsx +++ b/apps/web/src/app/(share)/share/[slug]/opengraph/route.tsx @@ -52,15 +52,15 @@ export async function GET(_request: Request, { params: { slug } }: SharePageOpen const isRecipient = 'Signature' in recipientOrSender; const signatureImage = match(recipientOrSender) - .with({ Signature: P.array(P._) }, (recipient) => { - return recipient.Signature?.[0]?.signatureImageAsBase64 || null; + .with({ signatures: P.array(P._) }, (recipient) => { + return recipient.signatures?.[0]?.signatureImageAsBase64 || null; }) .otherwise((sender) => { return sender.signature || null; }); const signatureName = match(recipientOrSender) - .with({ Signature: P.array(P._) }, (recipient) => { + .with({ signatures: P.array(P._) }, (recipient) => { return recipient.name || recipient.email; }) .otherwise((sender) => { diff --git a/apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx b/apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx index b5a04819a..2bf96afdd 100644 --- a/apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx @@ -81,12 +81,12 @@ export const CheckboxField = ({ ); }, [checkedValues, validationSign, checkboxValidationLength]); - const { mutateAsync: signFieldWithToken, isLoading: isSignFieldWithTokenLoading } = + const { mutateAsync: signFieldWithToken, isPending: isSignFieldWithTokenLoading } = trpc.field.signFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); const { mutateAsync: removeSignedFieldWithToken, - isLoading: isRemoveSignedFieldWithTokenLoading, + isPending: isRemoveSignedFieldWithTokenLoading, } = trpc.field.removeSignedFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); const isLoading = isSignFieldWithTokenLoading || isRemoveSignedFieldWithTokenLoading || isPending; diff --git a/apps/web/src/app/(signing)/sign/[token]/date-field.tsx b/apps/web/src/app/(signing)/sign/[token]/date-field.tsx index 5b573d6f6..9d03ee690 100644 --- a/apps/web/src/app/(signing)/sign/[token]/date-field.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/date-field.tsx @@ -16,6 +16,7 @@ import { DEFAULT_DOCUMENT_TIME_ZONE } from '@documenso/lib/constants/time-zones' import { DO_NOT_INVALIDATE_QUERY_ON_MUTATION } from '@documenso/lib/constants/trpc'; import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; import type { TRecipientActionAuth } from '@documenso/lib/types/document-auth'; +import { ZDateFieldMeta } from '@documenso/lib/types/field-meta'; import type { Recipient } from '@documenso/prisma/client'; import type { FieldWithSignature } from '@documenso/prisma/types/field-with-signature'; import { trpc } from '@documenso/trpc/react'; @@ -23,6 +24,7 @@ import type { TRemovedSignedFieldWithTokenMutationSchema, TSignFieldWithTokenMutationSchema, } from '@documenso/trpc/server/field-router/schema'; +import { cn } from '@documenso/ui/lib/utils'; import { useToast } from '@documenso/ui/primitives/use-toast'; import { SigningFieldContainer } from './signing-field-container'; @@ -51,14 +53,17 @@ export const DateField = ({ const [isPending, startTransition] = useTransition(); - const { mutateAsync: signFieldWithToken, isLoading: isSignFieldWithTokenLoading } = + const { mutateAsync: signFieldWithToken, isPending: isSignFieldWithTokenLoading } = trpc.field.signFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); const { mutateAsync: removeSignedFieldWithToken, - isLoading: isRemoveSignedFieldWithTokenLoading, + isPending: isRemoveSignedFieldWithTokenLoading, } = trpc.field.removeSignedFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); + const safeFieldMeta = ZDateFieldMeta.safeParse(field.fieldMeta); + const parsedFieldMeta = safeFieldMeta.success ? safeFieldMeta.data : null; + const isLoading = isSignFieldWithTokenLoading || isRemoveSignedFieldWithTokenLoading || isPending; const localDateString = convertToLocalSystemFormat(field.customText, dateFormat, timezone); @@ -150,9 +155,21 @@ export const DateField = ({ )} {field.inserted && ( -

    - {localDateString} -

    +
    +

    + {localDateString} +

    +
    )} ); diff --git a/apps/web/src/app/(signing)/sign/[token]/document-auth-provider.tsx b/apps/web/src/app/(signing)/sign/[token]/document-auth-provider.tsx index c5c32f414..90e5adcc2 100644 --- a/apps/web/src/app/(signing)/sign/[token]/document-auth-provider.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/document-auth-provider.tsx @@ -106,7 +106,7 @@ export const DocumentAuthProvider = ({ perPage: MAXIMUM_PASSKEYS, }, { - keepPreviousData: true, + placeholderData: (previousData) => previousData, enabled: derivedRecipientActionAuth === DocumentAuth.PASSKEY, }, ); diff --git a/apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx b/apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx index eef159ec6..5f4e1a444 100644 --- a/apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx @@ -58,12 +58,12 @@ export const DropdownField = ({ const defaultValue = parsedFieldMeta?.defaultValue; const [localChoice, setLocalChoice] = useState(parsedFieldMeta.defaultValue ?? ''); - const { mutateAsync: signFieldWithToken, isLoading: isSignFieldWithTokenLoading } = + const { mutateAsync: signFieldWithToken, isPending: isSignFieldWithTokenLoading } = trpc.field.signFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); const { mutateAsync: removeSignedFieldWithToken, - isLoading: isRemoveSignedFieldWithTokenLoading, + isPending: isRemoveSignedFieldWithTokenLoading, } = trpc.field.removeSignedFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); const isLoading = isSignFieldWithTokenLoading || isRemoveSignedFieldWithTokenLoading || isPending; diff --git a/apps/web/src/app/(signing)/sign/[token]/email-field.tsx b/apps/web/src/app/(signing)/sign/[token]/email-field.tsx index 0cb11a739..f3d664e23 100644 --- a/apps/web/src/app/(signing)/sign/[token]/email-field.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/email-field.tsx @@ -11,6 +11,7 @@ import { Loader } from 'lucide-react'; import { DO_NOT_INVALIDATE_QUERY_ON_MUTATION } from '@documenso/lib/constants/trpc'; import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; import type { TRecipientActionAuth } from '@documenso/lib/types/document-auth'; +import { ZEmailFieldMeta } from '@documenso/lib/types/field-meta'; import type { Recipient } from '@documenso/prisma/client'; import type { FieldWithSignature } from '@documenso/prisma/types/field-with-signature'; import { trpc } from '@documenso/trpc/react'; @@ -18,6 +19,7 @@ import type { TRemovedSignedFieldWithTokenMutationSchema, TSignFieldWithTokenMutationSchema, } from '@documenso/trpc/server/field-router/schema'; +import { cn } from '@documenso/ui/lib/utils'; import { useToast } from '@documenso/ui/primitives/use-toast'; import { useRequiredSigningContext } from './provider'; @@ -40,14 +42,17 @@ export const EmailField = ({ field, recipient, onSignField, onUnsignField }: Ema const [isPending, startTransition] = useTransition(); - const { mutateAsync: signFieldWithToken, isLoading: isSignFieldWithTokenLoading } = + const { mutateAsync: signFieldWithToken, isPending: isSignFieldWithTokenLoading } = trpc.field.signFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); const { mutateAsync: removeSignedFieldWithToken, - isLoading: isRemoveSignedFieldWithTokenLoading, + isPending: isRemoveSignedFieldWithTokenLoading, } = trpc.field.removeSignedFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); + const safeFieldMeta = ZEmailFieldMeta.safeParse(field.fieldMeta); + const parsedFieldMeta = safeFieldMeta.success ? safeFieldMeta.data : null; + const isLoading = isSignFieldWithTokenLoading || isRemoveSignedFieldWithTokenLoading || isPending; const onSign = async (authOptions?: TRecipientActionAuth) => { @@ -128,9 +133,21 @@ export const EmailField = ({ field, recipient, onSignField, onUnsignField }: Ema )} {field.inserted && ( -

    - {field.customText} -

    +
    +

    + {field.customText} +

    +
    )} ); diff --git a/apps/web/src/app/(signing)/sign/[token]/initials-field.tsx b/apps/web/src/app/(signing)/sign/[token]/initials-field.tsx index 595393ef2..b63418076 100644 --- a/apps/web/src/app/(signing)/sign/[token]/initials-field.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/initials-field.tsx @@ -46,12 +46,12 @@ export const InitialsField = ({ const [isPending, startTransition] = useTransition(); - const { mutateAsync: signFieldWithToken, isLoading: isSignFieldWithTokenLoading } = + const { mutateAsync: signFieldWithToken, isPending: isSignFieldWithTokenLoading } = trpc.field.signFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); const { mutateAsync: removeSignedFieldWithToken, - isLoading: isRemoveSignedFieldWithTokenLoading, + isPending: isRemoveSignedFieldWithTokenLoading, } = trpc.field.removeSignedFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); const isLoading = isSignFieldWithTokenLoading || isRemoveSignedFieldWithTokenLoading || isPending; diff --git a/apps/web/src/app/(signing)/sign/[token]/name-field.tsx b/apps/web/src/app/(signing)/sign/[token]/name-field.tsx index ce39af972..1a0756d60 100644 --- a/apps/web/src/app/(signing)/sign/[token]/name-field.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/name-field.tsx @@ -11,6 +11,7 @@ import { Loader } from 'lucide-react'; import { DO_NOT_INVALIDATE_QUERY_ON_MUTATION } from '@documenso/lib/constants/trpc'; import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; import type { TRecipientActionAuth } from '@documenso/lib/types/document-auth'; +import { ZNameFieldMeta } from '@documenso/lib/types/field-meta'; import { type Recipient } from '@documenso/prisma/client'; import type { FieldWithSignature } from '@documenso/prisma/types/field-with-signature'; import { trpc } from '@documenso/trpc/react'; @@ -18,6 +19,7 @@ import type { TRemovedSignedFieldWithTokenMutationSchema, TSignFieldWithTokenMutationSchema, } from '@documenso/trpc/server/field-router/schema'; +import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; import { Dialog, DialogContent, DialogFooter, DialogTitle } from '@documenso/ui/primitives/dialog'; import { Input } from '@documenso/ui/primitives/input'; @@ -48,14 +50,17 @@ export const NameField = ({ field, recipient, onSignField, onUnsignField }: Name const [isPending, startTransition] = useTransition(); - const { mutateAsync: signFieldWithToken, isLoading: isSignFieldWithTokenLoading } = + const { mutateAsync: signFieldWithToken, isPending: isSignFieldWithTokenLoading } = trpc.field.signFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); const { mutateAsync: removeSignedFieldWithToken, - isLoading: isRemoveSignedFieldWithTokenLoading, + isPending: isRemoveSignedFieldWithTokenLoading, } = trpc.field.removeSignedFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); + const safeFieldMeta = ZNameFieldMeta.safeParse(field.fieldMeta); + const parsedFieldMeta = safeFieldMeta.success ? safeFieldMeta.data : null; + const isLoading = isSignFieldWithTokenLoading || isRemoveSignedFieldWithTokenLoading || isPending; const [showFullNameModal, setShowFullNameModal] = useState(false); @@ -172,9 +177,21 @@ export const NameField = ({ field, recipient, onSignField, onUnsignField }: Name )} {field.inserted && ( -

    - {field.customText} -

    +
    +

    + {field.customText} +

    +
    )} diff --git a/apps/web/src/app/(signing)/sign/[token]/number-field.tsx b/apps/web/src/app/(signing)/sign/[token]/number-field.tsx index 9461900c9..07846468c 100644 --- a/apps/web/src/app/(signing)/sign/[token]/number-field.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/number-field.tsx @@ -52,8 +52,19 @@ export const NumberField = ({ field, recipient, onSignField, onUnsignField }: Nu const [isPending, startTransition] = useTransition(); const [showRadioModal, setShowRadioModal] = useState(false); - const parsedFieldMeta = field.fieldMeta ? ZNumberFieldMeta.parse(field.fieldMeta) : null; - const isReadOnly = parsedFieldMeta?.readOnly; + const { mutateAsync: signFieldWithToken, isPending: isSignFieldWithTokenLoading } = + trpc.field.signFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); + + const { + mutateAsync: removeSignedFieldWithToken, + isPending: isRemoveSignedFieldWithTokenLoading, + } = trpc.field.removeSignedFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); + + const safeFieldMeta = ZNumberFieldMeta.safeParse(field.fieldMeta); + const parsedFieldMeta = safeFieldMeta.success ? safeFieldMeta.data : null; + + const isLoading = isSignFieldWithTokenLoading || isRemoveSignedFieldWithTokenLoading || isPending; + const defaultValue = parsedFieldMeta?.value; const [localNumber, setLocalNumber] = useState( parsedFieldMeta?.value ? String(parsedFieldMeta.value) : '0', @@ -71,16 +82,6 @@ export const NumberField = ({ field, recipient, onSignField, onUnsignField }: Nu const { executeActionAuthProcedure } = useRequiredDocumentAuthContext(); - const { mutateAsync: signFieldWithToken, isLoading: isSignFieldWithTokenLoading } = - trpc.field.signFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); - - const { - mutateAsync: removeSignedFieldWithToken, - isLoading: isRemoveSignedFieldWithTokenLoading, - } = trpc.field.removeSignedFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); - - const isLoading = isSignFieldWithTokenLoading || isRemoveSignedFieldWithTokenLoading || isPending; - const handleNumberChange = (e: React.ChangeEvent) => { const text = e.target.value; setLocalNumber(text); @@ -208,7 +209,7 @@ export const NumberField = ({ field, recipient, onSignField, onUnsignField }: Nu useEffect(() => { if ( (!field.inserted && defaultValue && localNumber) || - (!field.inserted && isReadOnly && defaultValue) + (!field.inserted && parsedFieldMeta?.readOnly && defaultValue) ) { void executeActionAuthProcedure({ onReauthFormSubmit: async (authOptions) => await onSign(authOptions), @@ -260,9 +261,21 @@ export const NumberField = ({ field, recipient, onSignField, onUnsignField }: Nu )} {field.inserted && ( -

    - {field.customText} -

    +
    +

    + {field.customText} +

    +
    )} diff --git a/apps/web/src/app/(signing)/sign/[token]/radio-field.tsx b/apps/web/src/app/(signing)/sign/[token]/radio-field.tsx index 8adacbda8..398181ec1 100644 --- a/apps/web/src/app/(signing)/sign/[token]/radio-field.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/radio-field.tsx @@ -52,12 +52,12 @@ export const RadioField = ({ field, recipient, onSignField, onUnsignField }: Rad const { executeActionAuthProcedure } = useRequiredDocumentAuthContext(); - const { mutateAsync: signFieldWithToken, isLoading: isSignFieldWithTokenLoading } = + const { mutateAsync: signFieldWithToken, isPending: isSignFieldWithTokenLoading } = trpc.field.signFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); const { mutateAsync: removeSignedFieldWithToken, - isLoading: isRemoveSignedFieldWithTokenLoading, + isPending: isRemoveSignedFieldWithTokenLoading, } = trpc.field.removeSignedFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); const isLoading = isSignFieldWithTokenLoading || isRemoveSignedFieldWithTokenLoading || isPending; diff --git a/apps/web/src/app/(signing)/sign/[token]/signature-field.tsx b/apps/web/src/app/(signing)/sign/[token]/signature-field.tsx index f67964a7e..bba784975 100644 --- a/apps/web/src/app/(signing)/sign/[token]/signature-field.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/signature-field.tsx @@ -66,15 +66,15 @@ export const SignatureField = ({ const [isPending, startTransition] = useTransition(); - const { mutateAsync: signFieldWithToken, isLoading: isSignFieldWithTokenLoading } = + const { mutateAsync: signFieldWithToken, isPending: isSignFieldWithTokenLoading } = trpc.field.signFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); const { mutateAsync: removeSignedFieldWithToken, - isLoading: isRemoveSignedFieldWithTokenLoading, + isPending: isRemoveSignedFieldWithTokenLoading, } = trpc.field.removeSignedFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); - const { Signature: signature } = field; + const { signature } = field; const isLoading = isSignFieldWithTokenLoading || isRemoveSignedFieldWithTokenLoading || isPending; diff --git a/apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx b/apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx index 5e4d47ec4..019f3e9c3 100644 --- a/apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx @@ -56,8 +56,8 @@ export const SigningPageView = ({ const shouldUseTeamDetails = document.teamId && document.team?.teamGlobalSettings?.includeSenderDetails === false; - let senderName = document.User.name ?? ''; - let senderEmail = `(${document.User.email})`; + let senderName = document.user.name ?? ''; + let senderEmail = `(${document.user.email})`; if (shouldUseTeamDetails) { senderName = document.team?.name ?? ''; diff --git a/apps/web/src/app/(signing)/sign/[token]/text-field.tsx b/apps/web/src/app/(signing)/sign/[token]/text-field.tsx index fc722f8d0..3f2229e0c 100644 --- a/apps/web/src/app/(signing)/sign/[token]/text-field.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/text-field.tsx @@ -54,15 +54,16 @@ export const TextField = ({ field, recipient, onSignField, onUnsignField }: Text const [isPending, startTransition] = useTransition(); - const { mutateAsync: signFieldWithToken, isLoading: isSignFieldWithTokenLoading } = + const { mutateAsync: signFieldWithToken, isPending: isSignFieldWithTokenLoading } = trpc.field.signFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); const { mutateAsync: removeSignedFieldWithToken, - isLoading: isRemoveSignedFieldWithTokenLoading, + isPending: isRemoveSignedFieldWithTokenLoading, } = trpc.field.removeSignedFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); - const parsedFieldMeta = field.fieldMeta ? ZTextFieldMeta.parse(field.fieldMeta) : null; + const safeFieldMeta = ZTextFieldMeta.safeParse(field.fieldMeta); + const parsedFieldMeta = safeFieldMeta.success ? safeFieldMeta.data : null; const isLoading = isSignFieldWithTokenLoading || isRemoveSignedFieldWithTokenLoading || isPending; const shouldAutoSignField = @@ -261,11 +262,23 @@ export const TextField = ({ field, recipient, onSignField, onUnsignField }: Text )} {field.inserted && ( -

    - {field.customText.length < 20 - ? field.customText - : field.customText.substring(0, 15) + '...'} -

    +
    +

    + {field.customText.length < 20 + ? field.customText + : field.customText.substring(0, 15) + '...'} +

    +
    )} @@ -281,6 +294,10 @@ export const TextField = ({ field, recipient, onSignField, onUnsignField }: Text className={cn('mt-2 w-full rounded-md', { 'border-2 border-red-300 ring-2 ring-red-200 ring-offset-2 ring-offset-red-200 focus-visible:border-red-400 focus-visible:ring-4 focus-visible:ring-red-200 focus-visible:ring-offset-2 focus-visible:ring-offset-red-200': userInputHasErrors, + 'text-left': parsedFieldMeta?.textAlign === 'left', + 'text-center': + !parsedFieldMeta?.textAlign || parsedFieldMeta?.textAlign === 'center', + 'text-right': parsedFieldMeta?.textAlign === 'right', })} value={localText} onChange={handleTextChange} diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx index 48c989b7c..d29b8abfb 100644 --- a/apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx +++ b/apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx @@ -38,7 +38,7 @@ export const LayoutBillingBanner = ({ const [isOpen, setIsOpen] = useState(false); - const { mutateAsync: createBillingPortal, isLoading } = + const { mutateAsync: createBillingPortal, isPending } = trpc.team.createBillingPortal.useMutation(); const handleCreatePortal = async () => { @@ -92,7 +92,7 @@ export const LayoutBillingBanner = ({ 'text-destructive-foreground hover:bg-destructive-foreground hover:text-white': subscription.status === SubscriptionStatus.INACTIVE, })} - disabled={isLoading} + disabled={isPending} onClick={() => setIsOpen(true)} size="sm" > @@ -101,7 +101,7 @@ export const LayoutBillingBanner = ({ - !isLoading && setIsOpen(value)}> + !isPending && setIsOpen(value)}> Payment overdue @@ -128,7 +128,7 @@ export const LayoutBillingBanner = ({ {canExecuteTeamAction('MANAGE_BILLING', userRole) && ( - diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/layout.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/layout.tsx index f5d2a48d1..47a9bda70 100644 --- a/apps/web/src/app/(teams)/t/[teamUrl]/layout.tsx +++ b/apps/web/src/app/(teams)/t/[teamUrl]/layout.tsx @@ -8,6 +8,7 @@ import { getServerComponentSession } from '@documenso/lib/next-auth/get-server-c import { getTeamByUrl } from '@documenso/lib/server-only/team/get-team'; import { getTeams } from '@documenso/lib/server-only/team/get-teams'; import { SubscriptionStatus } from '@documenso/prisma/client'; +import { TrpcProvider } from '@documenso/trpc/react'; import { Header } from '~/components/(dashboard)/layout/header'; import { RefreshOnFocus } from '~/components/(dashboard)/refresh-on-focus/refresh-on-focus'; @@ -47,6 +48,10 @@ export default async function AuthenticatedTeamsLayout({ const team = getTeamPromise.value; const teams = getTeamsPromise.status === 'fulfilled' ? getTeamsPromise.value : []; + const trpcHeaders = { + 'x-team-Id': team.id.toString(), + }; + return ( @@ -61,7 +66,9 @@ export default async function AuthenticatedTeamsLayout({
    -
    {children}
    + +
    {children}
    +
    diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx index d97539cfe..c1ae53a12 100644 --- a/apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx +++ b/apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx @@ -25,7 +25,7 @@ export const TeamEmailDropdown = ({ team }: TeamsSettingsPageProps) => { const { _ } = useLingui(); const { toast } = useToast(); - const { mutateAsync: resendEmailVerification, isLoading: isResendingEmailVerification } = + const { mutateAsync: resendEmailVerification, isPending: isResendingEmailVerification } = trpc.team.resendTeamEmailVerification.useMutation({ onSuccess: () => { toast({ diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx index 8f02b00e2..ccfea8983 100644 --- a/apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx +++ b/apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx @@ -36,7 +36,7 @@ export const TeamTransferStatus = ({ const isExpired = transferVerification && isTokenExpired(transferVerification.expiresAt); - const { mutateAsync: deleteTeamTransferRequest, isLoading } = + const { mutateAsync: deleteTeamTransferRequest, isPending } = trpc.team.deleteTeamTransferRequest.useMutation({ onSuccess: () => { if (!isExpired) { @@ -112,7 +112,7 @@ export const TeamTransferStatus = ({ {canExecuteTeamAction('DELETE_TEAM_TRANSFER_REQUEST', currentUserTeamRole) && ( diff --git a/apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx b/apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx index 450464a99..23c23f751 100644 --- a/apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx +++ b/apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx @@ -64,7 +64,7 @@ export const AddTeamEmailDialog = ({ teamId, trigger, ...props }: AddTeamEmailDi }, }); - const { mutateAsync: createTeamEmailVerification, isLoading } = + const { mutateAsync: createTeamEmailVerification, isPending } = trpc.team.createTeamEmailVerification.useMutation(); const onFormSubmit = async ({ name, email }: TCreateTeamEmailFormSchema) => { @@ -120,7 +120,7 @@ export const AddTeamEmailDialog = ({ teamId, trigger, ...props }: AddTeamEmailDi > e.stopPropagation()} asChild={true}> {trigger ?? ( - diff --git a/apps/web/src/components/(teams)/dialogs/create-team-checkout-dialog.tsx b/apps/web/src/components/(teams)/dialogs/create-team-checkout-dialog.tsx index c27f3f85d..9a66c7073 100644 --- a/apps/web/src/components/(teams)/dialogs/create-team-checkout-dialog.tsx +++ b/apps/web/src/components/(teams)/dialogs/create-team-checkout-dialog.tsx @@ -39,7 +39,7 @@ export const CreateTeamCheckoutDialog = ({ const { data, isLoading } = trpc.team.getTeamPrices.useQuery(); - const { mutateAsync: createCheckout, isLoading: isCreatingCheckout } = + const { mutateAsync: createCheckout, isPending: isCreatingCheckout } = trpc.team.createTeamPendingCheckout.useMutation({ onSuccess: (checkoutUrl) => { window.open(checkoutUrl, '_blank'); diff --git a/apps/web/src/components/(teams)/dialogs/delete-team-member-dialog.tsx b/apps/web/src/components/(teams)/dialogs/delete-team-member-dialog.tsx index be1e1f0e0..0036f7386 100644 --- a/apps/web/src/components/(teams)/dialogs/delete-team-member-dialog.tsx +++ b/apps/web/src/components/(teams)/dialogs/delete-team-member-dialog.tsx @@ -42,7 +42,7 @@ export const DeleteTeamMemberDialog = ({ const { _ } = useLingui(); const { toast } = useToast(); - const { mutateAsync: deleteTeamMembers, isLoading: isDeletingTeamMember } = + const { mutateAsync: deleteTeamMembers, isPending: isDeletingTeamMember } = trpc.team.deleteTeamMembers.useMutation({ onSuccess: () => { toast({ diff --git a/apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx b/apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx index d44f607ee..3689d5e92 100644 --- a/apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx +++ b/apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx @@ -43,7 +43,7 @@ export const LeaveTeamDialog = ({ const { _ } = useLingui(); const { toast } = useToast(); - const { mutateAsync: leaveTeam, isLoading: isLeavingTeam } = trpc.team.leaveTeam.useMutation({ + const { mutateAsync: leaveTeam, isPending: isLeavingTeam } = trpc.team.leaveTeam.useMutation({ onSuccess: () => { toast({ title: _(msg`Success`), diff --git a/apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx b/apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx index 7e11b408b..0496f923a 100644 --- a/apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx +++ b/apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx @@ -50,7 +50,7 @@ export const RemoveTeamEmailDialog = ({ trigger, teamName, team }: RemoveTeamEma const router = useRouter(); - const { mutateAsync: deleteTeamEmail, isLoading: isDeletingTeamEmail } = + const { mutateAsync: deleteTeamEmail, isPending: isDeletingTeamEmail } = trpc.team.deleteTeamEmail.useMutation({ onSuccess: () => { toast({ @@ -69,7 +69,7 @@ export const RemoveTeamEmailDialog = ({ trigger, teamName, team }: RemoveTeamEma }, }); - const { mutateAsync: deleteTeamEmailVerification, isLoading: isDeletingTeamEmailVerification } = + const { mutateAsync: deleteTeamEmailVerification, isPending: isDeletingTeamEmailVerification } = trpc.team.deleteTeamEmailVerification.useMutation({ onSuccess: () => { toast({ diff --git a/apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx b/apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx index 206977afe..d9984aace 100644 --- a/apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx +++ b/apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx @@ -32,14 +32,14 @@ export const CurrentUserTeamsDataTable = () => { const parsedSearchParams = ZUrlSearchParamsSchema.parse(Object.fromEntries(searchParams ?? [])); - const { data, isLoading, isInitialLoading, isLoadingError } = trpc.team.findTeams.useQuery( + const { data, isLoading, isLoadingError } = trpc.team.findTeams.useQuery( { query: parsedSearchParams.query, page: parsedSearchParams.page, perPage: parsedSearchParams.perPage, }, { - keepPreviousData: true, + placeholderData: (previousData) => previousData, }, ); @@ -134,7 +134,7 @@ export const CurrentUserTeamsDataTable = () => { enable: isLoadingError, }} skeleton={{ - enable: isLoading && isInitialLoading, + enable: isLoading, rows: 3, component: ( <> diff --git a/apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx b/apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx index 010899bc2..57c77dbe0 100644 --- a/apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx +++ b/apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx @@ -20,7 +20,7 @@ export const PendingUserTeamsDataTableActions = ({ const { _ } = useLingui(); const { toast } = useToast(); - const { mutateAsync: deleteTeamPending, isLoading: deletingTeam } = + const { mutateAsync: deleteTeamPending, isPending: deletingTeam } = trpc.team.deleteTeamPending.useMutation({ onSuccess: () => { toast({ diff --git a/apps/web/src/components/(teams)/tables/pending-user-teams-data-table.tsx b/apps/web/src/components/(teams)/tables/pending-user-teams-data-table.tsx index a889c1838..b656308f7 100644 --- a/apps/web/src/components/(teams)/tables/pending-user-teams-data-table.tsx +++ b/apps/web/src/components/(teams)/tables/pending-user-teams-data-table.tsx @@ -31,14 +31,14 @@ export const PendingUserTeamsDataTable = () => { const [checkoutPendingTeamId, setCheckoutPendingTeamId] = useState(null); - const { data, isLoading, isInitialLoading, isLoadingError } = trpc.team.findTeamsPending.useQuery( + const { data, isLoading, isLoadingError } = trpc.team.findTeamsPending.useQuery( { query: parsedSearchParams.query, page: parsedSearchParams.page, perPage: parsedSearchParams.perPage, }, { - keepPreviousData: true, + placeholderData: (previousData) => previousData, }, ); @@ -112,7 +112,7 @@ export const PendingUserTeamsDataTable = () => { enable: isLoadingError, }} skeleton={{ - enable: isLoading && isInitialLoading, + enable: isLoading, rows: 3, component: ( <> diff --git a/apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx b/apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx index 000f2f219..81f5c1c49 100644 --- a/apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx +++ b/apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx @@ -24,12 +24,12 @@ export type TeamBillingInvoicesDataTableProps = { export const TeamBillingInvoicesDataTable = ({ teamId }: TeamBillingInvoicesDataTableProps) => { const { _ } = useLingui(); - const { data, isLoading, isInitialLoading, isLoadingError } = trpc.team.findTeamInvoices.useQuery( + const { data, isLoading, isLoadingError } = trpc.team.findTeamInvoices.useQuery( { teamId, }, { - keepPreviousData: true, + placeholderData: (previousData) => previousData, }, ); @@ -127,7 +127,7 @@ export const TeamBillingInvoicesDataTable = ({ teamId }: TeamBillingInvoicesData enable: isLoadingError, }} skeleton={{ - enable: isLoading && isInitialLoading, + enable: isLoading, rows: 3, component: ( <> diff --git a/apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx b/apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx index fe0843865..8a57be81c 100644 --- a/apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx +++ b/apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx @@ -40,18 +40,17 @@ export const TeamMemberInvitesDataTable = ({ teamId }: TeamMemberInvitesDataTabl const parsedSearchParams = ZUrlSearchParamsSchema.parse(Object.fromEntries(searchParams ?? [])); - const { data, isLoading, isInitialLoading, isLoadingError } = - trpc.team.findTeamMemberInvites.useQuery( - { - teamId, - query: parsedSearchParams.query, - page: parsedSearchParams.page, - perPage: parsedSearchParams.perPage, - }, - { - keepPreviousData: true, - }, - ); + const { data, isLoading, isLoadingError } = trpc.team.findTeamMemberInvites.useQuery( + { + teamId, + query: parsedSearchParams.query, + page: parsedSearchParams.page, + perPage: parsedSearchParams.perPage, + }, + { + placeholderData: (previousData) => previousData, + }, + ); const { mutateAsync: resendTeamMemberInvitation } = trpc.team.resendTeamMemberInvitation.useMutation({ @@ -182,7 +181,7 @@ export const TeamMemberInvitesDataTable = ({ teamId }: TeamMemberInvitesDataTabl enable: isLoadingError, }} skeleton={{ - enable: isLoading && isInitialLoading, + enable: isLoading, rows: 3, component: ( <> diff --git a/apps/web/src/components/(teams)/tables/team-members-data-table.tsx b/apps/web/src/components/(teams)/tables/team-members-data-table.tsx index 91997d7fa..e92efb727 100644 --- a/apps/web/src/components/(teams)/tables/team-members-data-table.tsx +++ b/apps/web/src/components/(teams)/tables/team-members-data-table.tsx @@ -52,7 +52,7 @@ export const TeamMembersDataTable = ({ const parsedSearchParams = ZUrlSearchParamsSchema.parse(Object.fromEntries(searchParams ?? [])); - const { data, isLoading, isInitialLoading, isLoadingError } = trpc.team.findTeamMembers.useQuery( + const { data, isLoading, isLoadingError } = trpc.team.findTeamMembers.useQuery( { teamId, query: parsedSearchParams.query, @@ -60,7 +60,7 @@ export const TeamMembersDataTable = ({ perPage: parsedSearchParams.perPage, }, { - keepPreviousData: true, + placeholderData: (previousData) => previousData, }, ); @@ -185,7 +185,7 @@ export const TeamMembersDataTable = ({ enable: isLoadingError, }} skeleton={{ - enable: isLoading && isInitialLoading, + enable: isLoading, rows: 3, component: ( <> diff --git a/apps/web/src/components/(teams)/tables/user-settings-teams-page-data-table.tsx b/apps/web/src/components/(teams)/tables/user-settings-teams-page-data-table.tsx index 904c8bb3f..bac1dbf44 100644 --- a/apps/web/src/components/(teams)/tables/user-settings-teams-page-data-table.tsx +++ b/apps/web/src/components/(teams)/tables/user-settings-teams-page-data-table.tsx @@ -32,7 +32,7 @@ export const UserSettingsTeamsPageDataTable = () => { const { data } = trpc.team.findTeamsPending.useQuery( {}, { - keepPreviousData: true, + placeholderData: (previousData) => previousData, }, ); diff --git a/apps/web/src/components/(teams)/team-billing-portal-button.tsx b/apps/web/src/components/(teams)/team-billing-portal-button.tsx index f5984fb2c..7ef4aad29 100644 --- a/apps/web/src/components/(teams)/team-billing-portal-button.tsx +++ b/apps/web/src/components/(teams)/team-billing-portal-button.tsx @@ -16,7 +16,7 @@ export const TeamBillingPortalButton = ({ buttonProps, teamId }: TeamBillingPort const { _ } = useLingui(); const { toast } = useToast(); - const { mutateAsync: createBillingPortal, isLoading } = + const { mutateAsync: createBillingPortal, isPending } = trpc.team.createBillingPortal.useMutation(); const handleCreatePortal = async () => { @@ -37,7 +37,7 @@ export const TeamBillingPortalButton = ({ buttonProps, teamId }: TeamBillingPort }; return ( - ); diff --git a/apps/web/src/components/document/document-history-sheet.tsx b/apps/web/src/components/document/document-history-sheet.tsx index 8ee2098b6..8bda3a424 100644 --- a/apps/web/src/components/document/document-history-sheet.tsx +++ b/apps/web/src/components/document/document-history-sheet.tsx @@ -55,7 +55,7 @@ export const DocumentHistorySheet = ({ }, { getNextPageParam: (lastPage) => lastPage.nextCursor, - keepPreviousData: true, + placeholderData: (previousData) => previousData, }, ); diff --git a/apps/web/src/components/document/document-read-only-fields.tsx b/apps/web/src/components/document/document-read-only-fields.tsx index 0b9550a8c..926ddaa9d 100644 --- a/apps/web/src/components/document/document-read-only-fields.tsx +++ b/apps/web/src/components/document/document-read-only-fields.tsx @@ -61,7 +61,7 @@ export const DocumentReadOnlyFields = ({ trigger={ - {extractInitials(field.Recipient.name || field.Recipient.email)} + {extractInitials(field.recipient.name || field.recipient.email)} } @@ -73,12 +73,12 @@ export const DocumentReadOnlyFields = ({ - {field.Recipient.signingStatus === SigningStatus.SIGNED ? ( + {field.recipient.signingStatus === SigningStatus.SIGNED ? ( <> Signed @@ -97,9 +97,9 @@ export const DocumentReadOnlyFields = ({

    - {field.Recipient.name - ? `${field.Recipient.name} (${field.Recipient.email})` - : field.Recipient.email}{' '} + {field.recipient.name + ? `${field.recipient.name} (${field.recipient.email})` + : field.recipient.email}{' '}

    - diff --git a/apps/web/src/components/forms/profile.tsx b/apps/web/src/components/forms/profile.tsx index dee901e9f..3d70cf672 100644 --- a/apps/web/src/components/forms/profile.tsx +++ b/apps/web/src/components/forms/profile.tsx @@ -9,7 +9,6 @@ import { useForm } from 'react-hook-form'; import { z } from 'zod'; import type { User } from '@documenso/prisma/client'; -import { TRPCClientError } from '@documenso/trpc/client'; import { trpc } from '@documenso/trpc/react'; import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; @@ -76,21 +75,13 @@ export const ProfileForm = ({ className, user }: ProfileFormProps) => { router.refresh(); } catch (err) { - if (err instanceof TRPCClientError && err.data?.code === 'BAD_REQUEST') { - toast({ - title: _(msg`An error occurred`), - description: err.message, - variant: 'destructive', - }); - } else { - toast({ - title: _(msg`An unknown error occurred`), - description: _( - msg`We encountered an unknown error while attempting to sign you In. Please try again later.`, - ), - variant: 'destructive', - }); - } + toast({ + title: _(msg`An unknown error occurred`), + description: _( + msg`We encountered an unknown error while attempting update your profile. Please try again later.`, + ), + variant: 'destructive', + }); } }; diff --git a/apps/web/src/components/forms/token.tsx b/apps/web/src/components/forms/token.tsx index a28aa21e0..fe2985c52 100644 --- a/apps/web/src/components/forms/token.tsx +++ b/apps/web/src/components/forms/token.tsx @@ -9,11 +9,12 @@ import { Trans, msg } from '@lingui/macro'; import { useLingui } from '@lingui/react'; import { AnimatePresence, motion } from 'framer-motion'; import { useForm } from 'react-hook-form'; +import { match } from 'ts-pattern'; import { z } from 'zod'; import { useCopyToClipboard } from '@documenso/lib/client-only/hooks/use-copy-to-clipboard'; +import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; import type { ApiToken } from '@documenso/prisma/client'; -import { TRPCClientError } from '@documenso/trpc/client'; import { trpc } from '@documenso/trpc/react'; import type { TCreateTokenMutationSchema } from '@documenso/trpc/server/api-token-router/schema'; import { ZCreateTokenMutationSchema } from '@documenso/trpc/server/api-token-router/schema'; @@ -131,23 +132,22 @@ export const ApiTokenForm = ({ className, teamId, tokens }: ApiTokenFormProps) = form.reset(); startTransition(() => router.refresh()); - } catch (error) { - if (error instanceof TRPCClientError && error.data?.code === 'BAD_REQUEST') { - toast({ - title: _(msg`An error occurred`), - description: error.message, - variant: 'destructive', - }); - } else { - toast({ - title: _(msg`An unknown error occurred`), - description: _( - msg`We encountered an unknown error while attempting create the new token. Please try again later.`, - ), - variant: 'destructive', - duration: 5000, - }); - } + } catch (err) { + const error = AppError.parseError(err); + + const errorMessage = match(error.code) + .with( + AppErrorCode.UNAUTHORIZED, + () => msg`You do not have permission to create a token for this team`, + ) + .otherwise(() => msg`Something went wrong. Please try again later.`); + + toast({ + title: _(msg`An error occurred`), + description: _(errorMessage), + variant: 'destructive', + duration: 5000, + }); } }; diff --git a/apps/web/src/components/templates/manage-public-template-dialog.tsx b/apps/web/src/components/templates/manage-public-template-dialog.tsx index bc5dbe7df..67ac27782 100644 --- a/apps/web/src/components/templates/manage-public-template-dialog.tsx +++ b/apps/web/src/components/templates/manage-public-template-dialog.tsx @@ -116,14 +116,13 @@ export const ManagePublicTemplateDialog = ({ }, }); - const { mutateAsync: updateTemplateSettings, isLoading: isUpdatingTemplateSettings } = + const { mutateAsync: updateTemplateSettings, isPending: isUpdatingTemplateSettings } = trpc.template.updateTemplate.useMutation(); const setTemplateToPrivate = async (templateId: number) => { try { await updateTemplateSettings({ templateId, - teamId: team?.id, data: { type: TemplateType.PRIVATE, }, @@ -158,7 +157,6 @@ export const ManagePublicTemplateDialog = ({ try { await updateTemplateSettings({ templateId: selectedTemplateId, - teamId: team?.id, data: { type: TemplateType.PUBLIC, publicTitle, diff --git a/apps/web/src/components/templates/template-bulk-send-dialog.tsx b/apps/web/src/components/templates/template-bulk-send-dialog.tsx new file mode 100644 index 000000000..a21b20c7c --- /dev/null +++ b/apps/web/src/components/templates/template-bulk-send-dialog.tsx @@ -0,0 +1,275 @@ +'use client'; + +import { zodResolver } from '@hookform/resolvers/zod'; +import { Trans, msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; +import { File as FileIcon, Upload, X } from 'lucide-react'; +import { useForm } from 'react-hook-form'; +import { z } from 'zod'; + +import { trpc } from '@documenso/trpc/react'; +import { Button } from '@documenso/ui/primitives/button'; +import { Checkbox } from '@documenso/ui/primitives/checkbox'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from '@documenso/ui/primitives/dialog'; +import { Form, FormControl, FormField, FormItem } from '@documenso/ui/primitives/form/form'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +import { useOptionalCurrentTeam } from '~/providers/team'; + +const ZBulkSendFormSchema = z.object({ + file: z.instanceof(File), + sendImmediately: z.boolean().default(false), +}); + +type TBulkSendFormSchema = z.infer; + +export type TemplateBulkSendDialogProps = { + templateId: number; + recipients: Array<{ email: string; name?: string | null }>; + trigger?: React.ReactNode; + onSuccess?: () => void; +}; + +export const TemplateBulkSendDialog = ({ + templateId, + recipients, + trigger, + onSuccess, +}: TemplateBulkSendDialogProps) => { + const { _ } = useLingui(); + const { toast } = useToast(); + + const team = useOptionalCurrentTeam(); + + const form = useForm({ + resolver: zodResolver(ZBulkSendFormSchema), + defaultValues: { + sendImmediately: false, + }, + }); + + const { mutateAsync: uploadBulkSend } = trpc.template.uploadBulkSend.useMutation(); + + const onDownloadTemplate = () => { + const headers = recipients.flatMap((_, index) => [ + `recipient_${index + 1}_email`, + `recipient_${index + 1}_name`, + ]); + + const exampleRow = recipients.flatMap((recipient) => [recipient.email, recipient.name || '']); + + const csv = [headers.join(','), exampleRow.join(',')].join('\n'); + const blob = new Blob([csv], { type: 'text/csv' }); + const url = window.URL.createObjectURL(blob); + + const a = Object.assign(document.createElement('a'), { + href: url, + download: 'template.csv', + }); + + a.click(); + + window.URL.revokeObjectURL(url); + }; + + const onSubmit = async (values: TBulkSendFormSchema) => { + try { + const csv = await values.file.text(); + + await uploadBulkSend({ + templateId, + teamId: team?.id, + csv: csv, + sendImmediately: values.sendImmediately, + }); + + toast({ + title: _(msg`Success`), + description: _( + msg`Your bulk send has been initiated. You will receive an email notification upon completion.`, + ), + }); + + form.reset(); + onSuccess?.(); + } catch (err) { + console.error(err); + + toast({ + title: 'Error', + description: 'Failed to upload CSV. Please check the file format and try again.', + variant: 'destructive', + }); + } + }; + + return ( + + + {trigger ?? ( + + )} + + + + + + Bulk Send Template via CSV + + + + + Upload a CSV file to create multiple documents from this template. Each row represents + one document with its recipient details. + + + + +
    + +
    +

    + CSV Structure +

    + +

    + + For each recipient, provide their email (required) and name (optional) in separate + columns. Download the template CSV below for the correct format. + +

    + +

    + Current recipients: +

    + +
      + {recipients.map((recipient, index) => ( +
    • + {recipient.name ? `${recipient.name} (${recipient.email})` : recipient.email} +
    • + ))} +
    +
    + +
    + + +

    + Pre-formatted CSV template with example data. +

    +
    + + ( + + + {!value ? ( + + ) : ( +
    +
    + + {value.name} +
    + + +
    + )} +
    + + {error &&

    {error.message}

    } + +

    + + Maximum file size: 4MB. Maximum 100 rows per upload. Blank values will use + template defaults. + +

    +
    + )} + /> + + ( + + +
    + + + +
    +
    +
    + )} + /> + + + + + + + + +
    +
    + ); +}; diff --git a/apps/web/src/pages/api/trpc/[trpc].ts b/apps/web/src/pages/api/trpc/[trpc].ts index 0e572bffc..dde0962b2 100644 --- a/apps/web/src/pages/api/trpc/[trpc].ts +++ b/apps/web/src/pages/api/trpc/[trpc].ts @@ -17,7 +17,7 @@ const logger = buildLogger(); export default trpcNext.createNextApiHandler({ router: appRouter, - createContext: async ({ req, res }) => createTrpcContext({ req, res }), + createContext: async ({ req, res }) => createTrpcContext({ req, res, requestSource: 'app' }), onError(opts) { const { error, path } = opts; diff --git a/apps/web/src/pages/api/beta/[...trpc].ts b/apps/web/src/pages/api/v2-beta/[...trpc].ts similarity index 63% rename from apps/web/src/pages/api/beta/[...trpc].ts rename to apps/web/src/pages/api/v2-beta/[...trpc].ts index edba9ae92..41d866a8f 100644 --- a/apps/web/src/pages/api/beta/[...trpc].ts +++ b/apps/web/src/pages/api/v2-beta/[...trpc].ts @@ -1,10 +1,11 @@ -import type { NextApiRequest, NextApiResponse } from 'next'; +import { createOpenApiNextHandler } from 'trpc-to-openapi'; -import { createOpenApiNextHandler } from 'trpc-openapi'; - -import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; +import { + AppError, + AppErrorCode, + genericErrorCodeToTrpcErrorCodeMap, +} from '@documenso/lib/errors/app-error'; import { buildLogger } from '@documenso/lib/utils/logger'; -import type { TRPCError } from '@documenso/trpc/server'; import { createTrpcContext } from '@documenso/trpc/server/context'; import { appRouter } from '@documenso/trpc/server/router'; @@ -12,9 +13,8 @@ const logger = buildLogger(); export default createOpenApiNextHandler({ router: appRouter, - createContext: async ({ req, res }: { req: NextApiRequest; res: NextApiResponse }) => - createTrpcContext({ req, res }), - onError: ({ error, path }: { error: TRPCError; path?: string }) => { + createContext: async ({ req, res }) => createTrpcContext({ req, res, requestSource: 'apiV2' }), + onError: ({ error, path }) => { // Always log the error for now. console.error(error.message); @@ -41,7 +41,20 @@ export default createOpenApiNextHandler({ }); } }, - responseMeta: () => {}, + // Not sure why we need to do this since we handle it in errorFormatter which runs after this. + responseMeta: (opts) => { + if (opts.errors[0]?.cause instanceof AppError) { + const appError = AppError.parseError(opts.errors[0].cause); + + const httpStatus = genericErrorCodeToTrpcErrorCodeMap[appError.code]?.status ?? 400; + + return { + status: httpStatus, + }; + } + + return {}; + }, }); const errorCodesToAlertOn = [AppErrorCode.UNKNOWN_ERROR, 'INTERNAL_SERVER_ERROR']; diff --git a/apps/web/src/pages/api/beta/open-api.json.ts b/apps/web/src/pages/api/v2-beta/openapi.json.ts similarity index 100% rename from apps/web/src/pages/api/beta/open-api.json.ts rename to apps/web/src/pages/api/v2-beta/openapi.json.ts diff --git a/docker/Dockerfile b/docker/Dockerfile index 981c78ba1..9223fb3a3 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,7 +1,10 @@ ########################### # BASE CONTAINER # ########################### -FROM node:18-alpine AS base +FROM node:22-alpine3.20 AS base + +RUN apk add --no-cache openssl + ########################### # BUILDER CONTAINER # @@ -30,7 +33,7 @@ FROM base AS installer RUN apk add --no-cache libc6-compat RUN apk add --no-cache jq # Required for node_modules/aws-crt -RUN apk add --no-cache make cmake g++ +RUN apk add --no-cache make cmake g++ openssl WORKDIR /app diff --git a/docker/start.sh b/docker/start.sh index e8d3be2e6..d6f637f7a 100755 --- a/docker/start.sh +++ b/docker/start.sh @@ -4,4 +4,4 @@ set -x npx prisma migrate deploy --schema ./packages/prisma/schema.prisma -node apps/web/server.js +HOSTNAME=0.0.0.0 node apps/web/server.js diff --git a/package-lock.json b/package-lock.json index caef64de5..53afe0dea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@documenso/root", - "version": "1.9.0-rc.6", + "version": "1.9.0-rc.11", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@documenso/root", - "version": "1.9.0-rc.6", + "version": "1.9.0-rc.11", "workspaces": [ "apps/*", "packages/*" @@ -20,6 +20,7 @@ "mupdf": "^1.0.0", "next-runtime-env": "^3.2.0", "react": "^18", + "typescript": "5.6.2", "zod": "3.24.1" }, "devDependencies": { @@ -63,7 +64,7 @@ "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", - "typescript": "^5" + "typescript": "5.6.2" } }, "apps/documentation/node_modules/next-plausible": { @@ -88,18 +89,9 @@ "next": "14.2.6" }, "devDependencies": { - "@types/node": "20.16.5", + "@types/node": "^20", "@types/react": "18.3.5", - "typescript": "5.5.4" - } - }, - "apps/openpage-api/node_modules/@types/node": { - "version": "20.16.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.5.tgz", - "integrity": "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==", - "dev": true, - "dependencies": { - "undici-types": "~6.19.2" + "typescript": "5.6.2" } }, "apps/openpage-api/node_modules/@types/react": { @@ -112,28 +104,9 @@ "csstype": "^3.0.2" } }, - "apps/openpage-api/node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "apps/openpage-api/node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true - }, "apps/web": { "name": "@documenso/web", - "version": "1.9.0-rc.6", + "version": "1.9.0-rc.11", "license": "AGPL-3.0", "dependencies": { "@documenso/api": "*", @@ -148,7 +121,6 @@ "@lingui/react": "^4.11.3", "@simplewebauthn/browser": "^9.0.1", "@simplewebauthn/server": "^9.0.3", - "@tanstack/react-query": "^4.29.5", "colord": "^2.9.3", "cookie-es": "^1.0.0", "formidable": "^2.1.1", @@ -177,7 +149,7 @@ "recharts": "^2.7.2", "remeda": "^2.17.3", "sharp": "0.32.6", - "trpc-openapi": "^1.2.0", + "trpc-to-openapi": "2.0.4", "ts-pattern": "^5.0.5", "ua-parser-js": "^1.0.37", "uqr": "^0.1.2", @@ -190,20 +162,14 @@ "@simplewebauthn/types": "^9.0.1", "@types/formidable": "^2.0.6", "@types/luxon": "^3.3.1", - "@types/node": "20.1.0", + "@types/node": "^20", "@types/papaparse": "^5.3.14", "@types/react": "^18", "@types/react-dom": "^18", "@types/ua-parser-js": "^0.7.39", - "typescript": "5.2.2" + "typescript": "5.6.2" } }, - "apps/web/node_modules/@types/node": { - "version": "20.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.0.tgz", - "integrity": "sha512-O+z53uwx64xY7D6roOi4+jApDGFg0qn6WHcxe5QeqjMaTezBO/mxdfFXIVAVVyNWKx84OmPB3L8kbVYOTeN34A==", - "dev": true - }, "apps/web/node_modules/next-axiom": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/next-axiom/-/next-axiom-1.5.1.tgz", @@ -221,19 +187,6 @@ "react": ">=18.0.0" } }, - "apps/web/node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", @@ -2402,6 +2355,17 @@ "tslib": "^2.4.0" } }, + "node_modules/@emnapi/runtime": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", + "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@emotion/is-prop-valid": { "version": "0.8.8", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", @@ -3085,6 +3049,386 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==" }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "peer": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@inquirer/figures": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.3.tgz", @@ -3191,17 +3535,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", @@ -8995,6 +9328,16 @@ "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", "license": "Apache-2.0" }, + "node_modules/@swc/helpers": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz", + "integrity": "sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@szmarczak/http-timer": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", @@ -9031,38 +9374,27 @@ } }, "node_modules/@tanstack/query-core": { - "version": "4.36.1", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.36.1.tgz", - "integrity": "sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==", + "version": "5.59.13", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.59.13.tgz", + "integrity": "sha512-Oou0bBu/P8+oYjXsJQ11j+gcpLAMpqW42UlokQYEz4dE7+hOtVO9rVuolJKgEccqzvyFzqX4/zZWY+R/v1wVsQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" } }, "node_modules/@tanstack/react-query": { - "version": "4.36.1", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-4.36.1.tgz", - "integrity": "sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw==", + "version": "5.59.15", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.59.15.tgz", + "integrity": "sha512-QbVlAkTI78wB4Mqgf2RDmgC0AOiJqer2c5k9STOOSXGv1S6ZkY37r/6UpE8DbQ2Du0ohsdoXgFNEyv+4eDoPEw==", "dependencies": { - "@tanstack/query-core": "4.36.1", - "use-sync-external-store": "^1.2.0" + "@tanstack/query-core": "5.59.13" }, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-native": "*" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } + "react": "^18 || ^19" } }, "node_modules/@tanstack/react-table": { @@ -9719,60 +10051,45 @@ } }, "node_modules/@trpc/client": { - "version": "10.44.1", - "resolved": "https://registry.npmjs.org/@trpc/client/-/client-10.44.1.tgz", - "integrity": "sha512-vTWsykNcgz1LnwePVl2fKZnhvzP9N3GaaLYPkfGINo314ZOS0OBqe9x0ytB2LLUnRVTAAZ2WoONzARd8nHiqrA==", + "version": "11.0.0-rc.648", + "resolved": "https://registry.npmjs.org/@trpc/client/-/client-11.0.0-rc.648.tgz", + "integrity": "sha512-k4FfLKvJwbosUH8KYyZkC50RJHYtIyJECi5WhRXsvaf9a6lgrTlcA+osq815zYcAHo7wEgR9E9UdSTrpLdAQFQ==", "funding": [ "https://trpc.io/sponsor" ], + "license": "MIT", "peerDependencies": { - "@trpc/server": "10.44.1" - } - }, - "node_modules/@trpc/next": { - "version": "10.44.1", - "resolved": "https://registry.npmjs.org/@trpc/next/-/next-10.44.1.tgz", - "integrity": "sha512-ez2oYUzmaQ+pGch627sRBfeEk3h+UIwNicR8WjTAM54TPcdP5W9ZyWCyO5HZTEfjHgGixYM4tCIxewdKOWY9yA==", - "funding": [ - "https://trpc.io/sponsor" - ], - "dependencies": { - "react-ssr-prepass": "^1.5.0" - }, - "peerDependencies": { - "@tanstack/react-query": "^4.18.0", - "@trpc/client": "10.44.1", - "@trpc/react-query": "10.44.1", - "@trpc/server": "10.44.1", - "next": "*", - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "@trpc/server": "11.0.0-rc.648+77b4d8920", + "typescript": ">=5.6.2" } }, "node_modules/@trpc/react-query": { - "version": "10.44.1", - "resolved": "https://registry.npmjs.org/@trpc/react-query/-/react-query-10.44.1.tgz", - "integrity": "sha512-Sgi/v0YtdunOXjBRi7om9gILGkOCFYXPzn5KqLuEHiZw5dr5w4qGHFwCeMAvndZxmwfblJrl1tk2AznmsVu8MA==", + "version": "11.0.0-rc.648", + "resolved": "https://registry.npmjs.org/@trpc/react-query/-/react-query-11.0.0-rc.648.tgz", + "integrity": "sha512-U3H6o/aN3umEA2QNDGRsaJb6M7zrffor2NQl2UaHOiLBHuXZ3ISI2fJXay7e32s1l6z5F5PGMGwTQtUedzWI2w==", "funding": [ "https://trpc.io/sponsor" ], + "license": "MIT", "peerDependencies": { - "@tanstack/react-query": "^4.18.0", - "@trpc/client": "10.44.1", - "@trpc/server": "10.44.1", - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "@tanstack/react-query": "^5.59.15", + "@trpc/client": "11.0.0-rc.648+77b4d8920", + "@trpc/server": "11.0.0-rc.648+77b4d8920", + "react": ">=18.2.0", + "react-dom": ">=18.2.0", + "typescript": ">=5.6.2" } }, "node_modules/@trpc/server": { - "version": "10.44.1", - "resolved": "https://registry.npmjs.org/@trpc/server/-/server-10.44.1.tgz", - "integrity": "sha512-mF7B+K6LjuboX8I1RZgKE5GA/fJhsJ8tKGK2UBt3Bwik7hepEPb4NJgNr7vO6BK5IYwPdBLRLTctRw6XZx0sRg==", + "version": "11.0.0-rc.648", + "resolved": "https://registry.npmjs.org/@trpc/server/-/server-11.0.0-rc.648.tgz", + "integrity": "sha512-nKW7FNM+QZrY/CVGlX3hFNIdUvbw6pwSJ+HzEF8GIeSJDKLHK7Ke1QJGI2mRW6oF9dCKMBXfuLaYY2dXfjfn7Q==", "funding": [ "https://trpc.io/sponsor" ], - "engines": { - "node": ">=18.0.0" + "license": "MIT", + "peerDependencies": { + "typescript": ">=5.6.2" } }, "node_modules/@ts-rest/core": { @@ -10008,28 +10325,6 @@ "integrity": "sha512-y0M7sqzsnHB6cvAeTCBPrCQNQiZe8U4qdzf8uBVmOWYap5MMTN/gB2iEqrIqFiYcsyvP74GnGD5tgsHttielFw==", "dev": true }, - "node_modules/@types/eslint": { - "version": "8.56.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", - "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", - "dev": true, - "peer": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -10205,7 +10500,8 @@ "node_modules/@types/node": { "version": "20.5.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.1.tgz", - "integrity": "sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==" + "integrity": "sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==", + "license": "MIT" }, "node_modules/@types/node-fetch": { "version": "2.6.11", @@ -10644,181 +10940,6 @@ "resolved": "https://registry.npmjs.org/@vvo/tzdb/-/tzdb-6.117.0.tgz", "integrity": "sha512-vZkfoag1kHqItK/zebxT0Fkt3R/zscjgD+Ib7kaAdum0Sz9psXDfVHPW1Benv91d02zPWlLIvZtjBmzX4a+6fw==" }, - "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "peer": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "peer": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "peer": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "peer": true - }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", @@ -10842,18 +10963,6 @@ "node": ">=6.5" } }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/acorn": { "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", @@ -10865,16 +10974,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "dev": true, - "peer": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -12454,16 +12553,6 @@ "node": ">=10" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.0" - } - }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -13462,17 +13551,6 @@ "simple-wcswidth": "^1.0.1" } }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", @@ -13758,6 +13836,12 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, + "node_modules/csv-parse": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.6.0.tgz", + "integrity": "sha512-l3nz3euub2QMg5ouu5U09Ew9Wf6/wQ8I++ch1loQ0ljmzhmfZYrH9fflS22i/PQEvsPvxCwxgz5q7UB8K1JO4Q==", + "license": "MIT" + }, "node_modules/cytoscape": { "version": "3.28.1", "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.28.1.tgz", @@ -14237,22 +14321,6 @@ "node": ">= 12" } }, - "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, "node_modules/dayjs": { "version": "1.11.10", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", @@ -15106,13 +15174,6 @@ "safe-array-concat": "^1.0.1" } }, - "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "dev": true, - "peer": true - }, "node_modules/es-set-tostringtag": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", @@ -16375,16 +16436,6 @@ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/evt": { "version": "2.5.7", "resolved": "https://registry.npmjs.org/evt/-/evt-2.5.7.tgz", @@ -16947,14 +16998,6 @@ } } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/from": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", @@ -17423,13 +17466,6 @@ "node": ">= 6" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "peer": true - }, "node_modules/global-dirs": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", @@ -19681,37 +19717,6 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/jiti": { "version": "1.21.6", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", @@ -20555,16 +20560,6 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.11.5" - } - }, "node_modules/local-pkg": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", @@ -21566,14 +21561,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/merge-refs": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/merge-refs/-/merge-refs-1.2.2.tgz", @@ -21647,14 +21634,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/micro": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/micro/-/micro-10.0.1.tgz", @@ -22383,17 +22362,6 @@ "node": ">=8.6" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -22863,17 +22831,11 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, "engines": { "node": ">= 0.6" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "peer": true - }, "node_modules/netmask": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", @@ -23641,52 +23603,11 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/node-mocks-http": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/node-mocks-http/-/node-mocks-http-1.16.2.tgz", - "integrity": "sha512-2Sh6YItRp1oqewZNlck3LaFp5vbyW2u51HX2p1VLxQ9U/bG90XV8JY9O7Nk+HDd6OOn/oV3nA5Tx5k4Rki0qlg==", - "dependencies": { - "accepts": "^1.3.7", - "content-disposition": "^0.5.3", - "depd": "^1.1.0", - "fresh": "^0.5.2", - "merge-descriptors": "^1.0.1", - "methods": "^1.1.2", - "mime": "^1.3.4", - "parseurl": "^1.3.3", - "range-parser": "^1.2.0", - "type-is": "^1.6.18" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@types/express": "^4.17.21 || ^5.0.0", - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - }, - "@types/node": { - "optional": true - } - } - }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, - "node_modules/nodemailer": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.7.tgz", - "integrity": "sha512-rUtR77ksqex/eZRLmQ21LKVH5nAAsVicAtAYudK7JgwenEDZ0UIQ1adUGqErz7sMkWYxWTTU1aeP2Jga6WQyJw==", - "peer": true, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/non-layered-tidy-tree-layout": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", @@ -24358,11 +24279,6 @@ } } }, - "node_modules/openapi-types": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", - "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==" - }, "node_modules/openapi3-ts": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-2.0.2.tgz", @@ -25117,14 +25033,6 @@ "url": "https://ko-fi.com/killymxi" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/partysocket": { "version": "0.0.17", "resolved": "https://registry.npmjs.org/partysocket/-/partysocket-0.0.17.tgz", @@ -26603,14 +26511,6 @@ "safe-buffer": "^5.1.0" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/raw-body": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", @@ -27508,14 +27408,6 @@ "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/react-ssr-prepass": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/react-ssr-prepass/-/react-ssr-prepass-1.5.0.tgz", - "integrity": "sha512-yFNHrlVEReVYKsLI5lF05tZoHveA5pGzjFbFJY/3pOqqjGOmMmqx83N4hIjN2n6E1AOa+eQEUxs3CgRnPmT0RQ==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/react-style-singleton": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", @@ -29290,59 +29182,6 @@ "loose-envify": "^1.1.0" } }, - "node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peer": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "peer": true - }, "node_modules/scroll-into-view-if-needed": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", @@ -29442,16 +29281,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "peer": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -30719,18 +30548,6 @@ "react-dom": ">=16.8.0 <19" } }, - "node_modules/swagger-ui-react/node_modules/@types/react": { - "version": "18.2.48", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.48.tgz", - "integrity": "sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==", - "optional": true, - "peer": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/swagger-ui-react/node_modules/randexp": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz", @@ -30980,67 +30797,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/terser": { - "version": "5.31.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", - "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "peer": true - }, "node_modules/text-decoder": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.0.tgz", @@ -31379,12 +31135,14 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/trpc-openapi": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/trpc-openapi/-/trpc-openapi-1.2.0.tgz", - "integrity": "sha512-pfYoCd/3KYXWXvUPZBKJw455OOwngKN/6SIcj7Yit19OMLJ+8yVZkEvGEeg5wUSwfsiTdRsKuvqkRPXVSwV7ew==", + "node_modules/trpc-to-openapi": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/trpc-to-openapi/-/trpc-to-openapi-2.0.4.tgz", + "integrity": "sha512-jhsTv2oOuZwyKXCSGTXPXRNE6ArT/ArdWTHgxROZRVyikUm/ImLszFzh4jV19J7OVu/6qRfmIihwE3ZY/ZdeVg==", + "license": "MIT", "workspaces": [ ".", + "examples/with-nextjs-appdir", "examples/with-nextjs", "examples/with-express", "examples/with-interop", @@ -31396,13 +31154,49 @@ "co-body": "^6.1.0", "h3": "^1.6.4", "lodash.clonedeep": "^4.5.0", - "node-mocks-http": "^1.12.2", - "openapi-types": "^12.1.1", - "zod-to-json-schema": "^3.21.1" + "openapi3-ts": "4.3.3", + "zod-openapi": "^2.19.0" + }, + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "4.6.1" }, "peerDependencies": { - "@trpc/server": "^10.0.0", - "zod": "^3.14.4" + "@trpc/server": "^11.0.0-rc.648", + "zod": "^3.23.8" + } + }, + "node_modules/trpc-to-openapi/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.6.1.tgz", + "integrity": "sha512-DNGZvZDO5YF7jN5fX8ZqmGLjZEXIJRdJEdTFMhiyXqyXubBa0WVLDWSNlQ5JR2PNgDbEV1VQowhVRUh+74D+RA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/trpc-to-openapi/node_modules/openapi3-ts": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-4.3.3.tgz", + "integrity": "sha512-LKkzBGJcZ6wdvkKGMoSvpK+0cbN5Xc3XuYkJskO+vjEQWJgs1kgtyUk0pjf8KwPuysv323Er62F5P17XQl96Qg==", + "license": "MIT", + "dependencies": { + "yaml": "^2.4.5" + } + }, + "node_modules/trpc-to-openapi/node_modules/yaml": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" } }, "node_modules/ts-api-utils": { @@ -32257,9 +32051,10 @@ } }, "node_modules/typescript": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", - "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", + "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -33440,102 +33235,6 @@ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, - "node_modules/webpack": { - "version": "5.92.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz", - "integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/webpack/node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", - "dev": true, - "peer": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/whatwg-fetch": { "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", @@ -34071,42 +33770,16 @@ "zod": "^3.20.2" } }, - "node_modules/zod-prisma-types": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/zod-prisma-types/-/zod-prisma-types-3.1.8.tgz", - "integrity": "sha512-5oe0ays3ur4u2GtuUqlhgCraKBcsuMaMI8o7VMV4YAnFeOuVid7K2zGvjI19V0ue9PeNF2ICyVREQVohaQm5dw==", - "dev": true, - "dependencies": { - "@prisma/generator-helper": "^5.14.0", - "code-block-writer": "^12.0.0", - "lodash": "^4.17.21", - "zod": "^3.23.8" + "node_modules/zod-openapi": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/zod-openapi/-/zod-openapi-2.19.0.tgz", + "integrity": "sha512-OUAAyBDPPwZ9u61i4k/LieXUzP2re8kFjqdNh2AvHjsyi/aRNz9leDAtMGcSoSzUT5xUeQoACJufBI6FzzZyxA==", + "license": "MIT", + "engines": { + "node": ">=16.11" }, - "bin": { - "zod-prisma-types": "dist/bin.js" - } - }, - "node_modules/zod-prisma-types/node_modules/@prisma/debug": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.22.0.tgz", - "integrity": "sha512-AUt44v3YJeggO2ZU5BkXI7M4hu9BF2zzH2iF2V5pyXT/lRTyWiElZ7It+bRH1EshoMRxHgpYg4VB6rCM+mG5jQ==", - "dev": true - }, - "node_modules/zod-prisma-types/node_modules/@prisma/generator-helper": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-5.22.0.tgz", - "integrity": "sha512-LwqcBQ5/QsuAaLNQZAIVIAJDJBMjHwMwn16e06IYx/3Okj/xEEfw9IvrqB2cJCl3b2mCBlh3eVH0w9WGmi4aHg==", - "dev": true, - "dependencies": { - "@prisma/debug": "5.22.0" - } - }, - "node_modules/zod-to-json-schema": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.1.tgz", - "integrity": "sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==", "peerDependencies": { - "zod": "^3.24.1" + "zod": "^3.21.4" } }, "node_modules/zwitch": { @@ -34163,24 +33836,10 @@ "@documenso/prisma": "*", "@documenso/web": "*", "@playwright/test": "^1.18.1", - "@types/node": "^20.8.2", + "@types/node": "^20", "pdf-lib": "^1.17.1" } }, - "packages/app-tests/node_modules/@types/node": { - "version": "20.8.4", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.25.1" - } - }, - "packages/app-tests/node_modules/undici-types": { - "version": "5.25.3", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", - "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", - "dev": true - }, "packages/assets": { "name": "@documenso/assets", "version": "0.1.0" @@ -34270,7 +33929,7 @@ "eslint-plugin-package-json": "^0.10.4", "eslint-plugin-react": "^7.34.0", "eslint-plugin-unused-imports": "^3.1.0", - "typescript": "5.2.2" + "typescript": "5.6.2" } }, "packages/eslint-config/node_modules/@eslint/eslintrc": { @@ -35332,18 +34991,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "packages/eslint-config/node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, "packages/eslint-config/node_modules/which-typed-array": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", @@ -35391,6 +35038,7 @@ "@trigger.dev/sdk": "^2.3.18", "@upstash/redis": "^1.20.6", "@vvo/tzdb": "^6.117.0", + "csv-parse": "^5.6.0", "inngest": "^3.19.13", "kysely": "^0.26.3", "luxon": "^3.4.0", @@ -35476,10 +35124,66 @@ "devDependencies": { "dotenv": "^16.3.1", "dotenv-cli": "^7.3.0", + "prisma-json-types-generator": "^3.2.2", "prisma-kysely": "^1.8.0", "tsx": "^4.11.0", - "typescript": "5.2.2", - "zod-prisma-types": "^3.1.8" + "typescript": "5.6.2", + "zod-prisma-types": "3.1.9" + } + }, + "packages/prisma/node_modules/@prisma/debug": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.22.0.tgz", + "integrity": "sha512-AUt44v3YJeggO2ZU5BkXI7M4hu9BF2zzH2iF2V5pyXT/lRTyWiElZ7It+bRH1EshoMRxHgpYg4VB6rCM+mG5jQ==", + "dev": true, + "license": "Apache-2.0" + }, + "packages/prisma/node_modules/@prisma/generator-helper": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-5.22.0.tgz", + "integrity": "sha512-LwqcBQ5/QsuAaLNQZAIVIAJDJBMjHwMwn16e06IYx/3Okj/xEEfw9IvrqB2cJCl3b2mCBlh3eVH0w9WGmi4aHg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "5.22.0" + } + }, + "packages/prisma/node_modules/prisma-json-types-generator": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/prisma-json-types-generator/-/prisma-json-types-generator-3.2.2.tgz", + "integrity": "sha512-kvEbJPIP5gxk65KmLs0nAvY+CxpqVMWb4OsEvXlyXZmp2IGfi5f52BUV7ezTYQNjRPZyR4QlayWJXffoqVVAfA==", + "dev": true, + "dependencies": { + "@prisma/generator-helper": "6.0.0", + "tslib": "2.8.1" + }, + "bin": { + "prisma-json-types-generator": "index.js" + }, + "engines": { + "node": ">=14.0" + }, + "funding": { + "url": "https://github.com/arthurfiorette/prisma-json-types-generator?sponsor=1" + }, + "peerDependencies": { + "prisma": "^5 || ^6", + "typescript": "^5.6.2" + } + }, + "packages/prisma/node_modules/prisma-json-types-generator/node_modules/@prisma/debug": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.0.0.tgz", + "integrity": "sha512-eUjoNThlDXdyJ1iQ2d7U6aTVwm59EwvODb5zFVNJEokNoSiQmiYWNzZIwZyDmZ+j51j42/0iTaHIJ4/aZPKFRg==", + "dev": true + }, + "packages/prisma/node_modules/prisma-json-types-generator/node_modules/@prisma/generator-helper": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-6.0.0.tgz", + "integrity": "sha512-5DkG7hspZo6U4OtqI2W0JcgtY37sr7HgT8Q0W/sjL4VoV4px6ivzK6Eif5bKM7q+S4yFUHtjUt/3s69ErfLn7A==", + "dev": true, + "dependencies": { + "@prisma/debug": "6.0.0" } }, "packages/prisma/node_modules/ts-pattern": { @@ -35487,17 +35191,29 @@ "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.0.6.tgz", "integrity": "sha512-Y+jOjihlFriWzcBjncPCf2/am+Hgz7LtsWs77pWg5vQQKLQj07oNrJryo/wK2G0ndNaoVn2ownFMeoeAuReu3Q==" }, - "packages/prisma/node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "packages/prisma/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true + }, + "packages/prisma/node_modules/zod-prisma-types": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/zod-prisma-types/-/zod-prisma-types-3.1.9.tgz", + "integrity": "sha512-3AzTtWY2E9nySwLl9QEOgHJYOAX6sKkA36dnu7DD9HhGEOHmLqWx5pects60biMW29VcP57wJZKCp7ZVmJrNtQ==", "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "license": "MIT", + "dependencies": { + "@prisma/generator-helper": "^5.14.0", + "code-block-writer": "^12.0.0", + "lodash": "^4.17.21", + "zod": "^3.23.8" }, - "engines": { - "node": ">=14.17" + "bin": { + "zod-prisma-types": "dist/bin.js" + }, + "peerDependencies": { + "prisma": "^4.x.x || ^5.x.x" } }, "packages/signing": { @@ -35535,19 +35251,190 @@ "dependencies": { "@documenso/lib": "*", "@documenso/prisma": "*", - "@tanstack/react-query": "^4.32.0", - "@trpc/client": "^10.36.0", - "@trpc/next": "^10.36.0", - "@trpc/react-query": "^10.36.0", - "@trpc/server": "^10.36.0", + "@tanstack/react-query": "5.59.15", + "@trpc/client": "11.0.0-rc.648", + "@trpc/next": "11.0.0-rc.648", + "@trpc/react-query": "11.0.0-rc.648", + "@trpc/server": "11.0.0-rc.648", "@ts-rest/core": "^3.30.5", "@ts-rest/next": "^3.30.5", "luxon": "^3.4.0", "superjson": "^1.13.1", + "trpc-to-openapi": "2.0.4", "ts-pattern": "^5.0.5", "zod": "3.24.1" } }, + "packages/trpc/node_modules/@next/env": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.0.3.tgz", + "integrity": "sha512-t9Xy32pjNOvVn2AS+Utt6VmyrshbpfUMhIjFO60gI58deSo/KgLOp31XZ4O+kY/Is8WAGYwA5gR7kOb1eORDBA==", + "license": "MIT", + "peer": true + }, + "packages/trpc/node_modules/@next/swc-darwin-arm64": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.0.3.tgz", + "integrity": "sha512-s3Q/NOorCsLYdCKvQlWU+a+GeAd3C8Rb3L1YnetsgwXzhc3UTWrtQpB/3eCjFOdGUj5QmXfRak12uocd1ZiiQw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "packages/trpc/node_modules/@next/swc-darwin-x64": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.0.3.tgz", + "integrity": "sha512-Zxl/TwyXVZPCFSf0u2BNj5sE0F2uR6iSKxWpq4Wlk/Sv9Ob6YCKByQTkV2y6BCic+fkabp9190hyrDdPA/dNrw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "packages/trpc/node_modules/@next/swc-linux-arm64-gnu": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.0.3.tgz", + "integrity": "sha512-T5+gg2EwpsY3OoaLxUIofmMb7ohAUlcNZW0fPQ6YAutaWJaxt1Z1h+8zdl4FRIOr5ABAAhXtBcpkZNwUcKI2fw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "packages/trpc/node_modules/@next/swc-linux-arm64-musl": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.0.3.tgz", + "integrity": "sha512-WkAk6R60mwDjH4lG/JBpb2xHl2/0Vj0ZRu1TIzWuOYfQ9tt9NFsIinI1Epma77JVgy81F32X/AeD+B2cBu/YQA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "packages/trpc/node_modules/@next/swc-linux-x64-gnu": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.0.3.tgz", + "integrity": "sha512-gWL/Cta1aPVqIGgDb6nxkqy06DkwJ9gAnKORdHWX1QBbSZZB+biFYPFti8aKIQL7otCE1pjyPaXpFzGeG2OS2w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "packages/trpc/node_modules/@next/swc-linux-x64-musl": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.0.3.tgz", + "integrity": "sha512-QQEMwFd8r7C0GxQS62Zcdy6GKx999I/rTO2ubdXEe+MlZk9ZiinsrjwoiBL5/57tfyjikgh6GOU2WRQVUej3UA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "packages/trpc/node_modules/@next/swc-win32-arm64-msvc": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.0.3.tgz", + "integrity": "sha512-9TEp47AAd/ms9fPNgtgnT7F3M1Hf7koIYYWCMQ9neOwjbVWJsHZxrFbI3iEDJ8rf1TDGpmHbKxXf2IFpAvheIQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "packages/trpc/node_modules/@next/swc-win32-x64-msvc": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.0.3.tgz", + "integrity": "sha512-VNAz+HN4OGgvZs6MOoVfnn41kBzT+M+tB+OK4cww6DNyWS6wKaDpaAm/qLeOUbnMh0oVx1+mg0uoYARF69dJyA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "packages/trpc/node_modules/@trpc/next": { + "version": "11.0.0-rc.648", + "resolved": "https://registry.npmjs.org/@trpc/next/-/next-11.0.0-rc.648.tgz", + "integrity": "sha512-RgsiznMCc1xpMAVhp8WtgkFO7KyvRWqlqqb2qADCgLuAIjENjGoSEL9BZWiqCKLVrmQYsC42plUUj5QbwMPFuQ==", + "funding": [ + "https://trpc.io/sponsor" + ], + "license": "MIT", + "peerDependencies": { + "@tanstack/react-query": "^5.59.15", + "@trpc/client": "11.0.0-rc.648+77b4d8920", + "@trpc/react-query": "11.0.0-rc.648+77b4d8920", + "@trpc/server": "11.0.0-rc.648+77b4d8920", + "next": "15.0.3", + "react": ">=16.8.0", + "react-dom": ">=16.8.0", + "typescript": ">=5.6.2" + }, + "peerDependenciesMeta": { + "@tanstack/react-query": { + "optional": true + }, + "@trpc/react-query": { + "optional": true + } + } + }, "packages/trpc/node_modules/@ts-rest/next": { "version": "3.30.5", "resolved": "https://registry.npmjs.org/@ts-rest/next/-/next-3.30.5.tgz", @@ -35563,6 +35450,169 @@ } } }, + "packages/trpc/node_modules/next": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/next/-/next-15.0.3.tgz", + "integrity": "sha512-ontCbCRKJUIoivAdGB34yCaOcPgYXr9AAkV/IwqFfWWTXEPUgLYkSkqBhIk9KK7gGmgjc64B+RdoeIDM13Irnw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@next/env": "15.0.3", + "@swc/counter": "0.1.3", + "@swc/helpers": "0.5.13", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "15.0.3", + "@next/swc-darwin-x64": "15.0.3", + "@next/swc-linux-arm64-gnu": "15.0.3", + "@next/swc-linux-arm64-musl": "15.0.3", + "@next/swc-linux-x64-gnu": "15.0.3", + "@next/swc-linux-x64-musl": "15.0.3", + "@next/swc-win32-arm64-msvc": "15.0.3", + "@next/swc-win32-x64-msvc": "15.0.3", + "sharp": "^0.33.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-66855b96-20241106", + "react-dom": "^18.2.0 || 19.0.0-rc-66855b96-20241106", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "packages/trpc/node_modules/next/node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "peer": true, + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "packages/trpc/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "packages/trpc/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "packages/trpc/node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, "packages/tsconfig": { "name": "@documenso/tsconfig", "version": "0.0.0", @@ -35634,7 +35684,7 @@ "@types/react": "^18", "@types/react-dom": "^18", "react": "^18", - "typescript": "5.2.2" + "typescript": "5.6.2" } }, "packages/ui/node_modules/react-pdf": { @@ -35673,19 +35723,6 @@ "engines": { "node": ">=6" } - }, - "packages/ui/node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } } } } diff --git a/package.json b/package.json index 06936737b..71cf953a3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "1.9.0-rc.6", + "version": "1.9.0-rc.11", "scripts": { "build": "turbo run build", "build:web": "turbo run build --filter=@documenso/web", @@ -71,6 +71,7 @@ "mupdf": "^1.0.0", "next-runtime-env": "^3.2.0", "react": "^18", + "typescript": "5.6.2", "zod": "3.24.1" }, "overrides": { diff --git a/packages/api/v1/implementation.ts b/packages/api/v1/implementation.ts index 76ba25878..0f13150c7 100644 --- a/packages/api/v1/implementation.ts +++ b/packages/api/v1/implementation.ts @@ -1,6 +1,5 @@ import { createNextRoute } from '@ts-rest/next'; import { match } from 'ts-pattern'; -import { z } from 'zod'; import { getServerLimits } from '@documenso/ee/server-only/limits/server'; import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app'; @@ -16,8 +15,7 @@ import { findDocuments } from '@documenso/lib/server-only/document/find-document import { getDocumentById } from '@documenso/lib/server-only/document/get-document-by-id'; import { resendDocument } from '@documenso/lib/server-only/document/resend-document'; import { sendDocument } from '@documenso/lib/server-only/document/send-document'; -import { updateDocument } from '@documenso/lib/server-only/document/update-document'; -import { updateDocumentSettings } from '@documenso/lib/server-only/document/update-document-settings'; +import { updateDocument as updateDocumentSettings } from '@documenso/lib/server-only/document/update-document'; import { deleteField } from '@documenso/lib/server-only/field/delete-field'; import { getFieldById } from '@documenso/lib/server-only/field/get-field-by-id'; import { getFieldsForDocument } from '@documenso/lib/server-only/field/get-fields-for-document'; @@ -26,11 +24,10 @@ import { insertFormValuesInPdf } from '@documenso/lib/server-only/pdf/insert-for import { deleteRecipient } from '@documenso/lib/server-only/recipient/delete-recipient'; import { getRecipientByIdV1Api } from '@documenso/lib/server-only/recipient/get-recipient-by-id-v1-api'; import { getRecipientsForDocument } from '@documenso/lib/server-only/recipient/get-recipients-for-document'; -import { setRecipientsForDocument } from '@documenso/lib/server-only/recipient/set-recipients-for-document'; +import { setDocumentRecipients } from '@documenso/lib/server-only/recipient/set-document-recipients'; import { updateRecipient } from '@documenso/lib/server-only/recipient/update-recipient'; import { createTeamMemberInvites } from '@documenso/lib/server-only/team/create-team-member-invites'; import { deleteTeamMembers } from '@documenso/lib/server-only/team/delete-team-members'; -import type { TCreateDocumentFromTemplateResponse } from '@documenso/lib/server-only/template/create-document-from-template'; import { createDocumentFromTemplate } from '@documenso/lib/server-only/template/create-document-from-template'; import { createDocumentFromTemplateLegacy } from '@documenso/lib/server-only/template/create-document-from-template-legacy'; import { deleteTemplate } from '@documenso/lib/server-only/template/delete-template'; @@ -54,6 +51,7 @@ import { } from '@documenso/lib/universal/upload/server-actions'; import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs'; import { prisma } from '@documenso/prisma'; +import type { Prisma } from '@documenso/prisma/client'; import { DocumentDataType, DocumentStatus, @@ -63,7 +61,6 @@ import { import { ApiContractV1 } from './contract'; import { authenticatedMiddleware } from './middleware/authenticated'; -import { ZTemplateWithDataSchema } from './schema'; export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { getDocuments: authenticatedMiddleware(async (args, user, team) => { @@ -98,13 +95,14 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { const recipients = await getRecipientsForDocument({ documentId: Number(documentId), - teamId: team?.id, userId: user.id, + teamId: team?.id, }); const fields = await getFieldsForDocument({ documentId: Number(documentId), userId: user.id, + teamId: team?.id, }); const parsedMetaFields = fields.map((field) => { @@ -209,7 +207,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { } }), - deleteDocument: authenticatedMiddleware(async (args, user, team) => { + deleteDocument: authenticatedMiddleware(async (args, user, team, { metadata }) => { const { id: documentId } = args.params; try { @@ -232,6 +230,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { id: document.id, userId: user.id, teamId: team?.id, + requestMetadata: metadata, }); return { @@ -248,7 +247,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { } }), - createDocument: authenticatedMiddleware(async (args, user, team) => { + createDocument: authenticatedMiddleware(async (args, user, team, { metadata }) => { const { body } = args; try { @@ -316,12 +315,13 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { teamId: team?.id, formValues: body.formValues, documentDataId: documentData.id, - requestMetadata: extractNextApiRequestMetadata(args.req), + requestMetadata: metadata, }); await upsertDocumentMeta({ documentId: document.id, userId: user.id, + teamId: team?.id, subject: body.meta.subject, message: body.meta.message, timezone, @@ -332,7 +332,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { typedSignatureEnabled: body.meta.typedSignatureEnabled, distributionMethod: body.meta.distributionMethod, emailSettings: body.meta.emailSettings, - requestMetadata: extractNextApiRequestMetadata(args.req), + requestMetadata: metadata, }); if (body.authOptions) { @@ -343,16 +343,16 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { data: { ...body.authOptions, }, - requestMetadata: extractNextApiRequestMetadata(args.req), + requestMetadata: metadata, }); } - const { recipients } = await setRecipientsForDocument({ + const { recipients } = await setDocumentRecipients({ userId: user.id, teamId: team?.id, documentId: document.id, recipients: body.recipients, - requestMetadata: extractNextApiRequestMetadata(args.req), + requestMetadata: metadata, }); return { @@ -416,11 +416,16 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { teamId: team?.id, }); - const parsed = ZTemplateWithDataSchema.parse(template); - return { status: 200, - body: parsed, + body: { + ...template, + Field: template.fields.map((field) => ({ + ...field, + fieldMeta: field.fieldMeta ? ZFieldMetaSchema.parse(field.fieldMeta) : null, + })), + Recipient: template.recipients, + }, }; } catch (err) { return AppError.toRestAPIError(err); @@ -439,12 +444,17 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { teamId: team?.id, }); - const parsed = z.array(ZTemplateWithDataSchema).parse(templates); - return { status: 200, body: { - templates: parsed, + templates: templates.map((template) => ({ + ...template, + Field: template.fields.map((field) => ({ + ...field, + fieldMeta: field.fieldMeta ? ZFieldMetaSchema.parse(field.fieldMeta) : null, + })), + Recipient: template.recipients, + })), totalPages, }, }; @@ -453,7 +463,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { } }), - createDocumentFromTemplate: authenticatedMiddleware(async (args, user, team) => { + createDocumentFromTemplate: authenticatedMiddleware(async (args, user, team, { metadata }) => { const { body, params } = args; const { remaining } = await getServerLimits({ email: user.email, teamId: team?.id }); @@ -517,8 +527,9 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { await upsertDocumentMeta({ documentId: document.id, userId: user.id, + teamId: team?.id, ...body.meta, - requestMetadata: extractNextApiRequestMetadata(args.req), + requestMetadata: metadata, }); } @@ -528,7 +539,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { userId: user.id, teamId: team?.id, data: body.authOptions, - requestMetadata: extractNextApiRequestMetadata(args.req), + requestMetadata: metadata, }); } @@ -536,7 +547,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { status: 200, body: { documentId: document.id, - recipients: document.Recipient.map((recipient) => ({ + recipients: document.recipients.map((recipient) => ({ recipientId: recipient.id, name: recipient.name, email: recipient.email, @@ -550,7 +561,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { }; }), - generateDocumentFromTemplate: authenticatedMiddleware(async (args, user, team) => { + generateDocumentFromTemplate: authenticatedMiddleware(async (args, user, team, { metadata }) => { const { body, params } = args; const { remaining } = await getServerLimits({ email: user.email, teamId: team?.id }); @@ -566,7 +577,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { const templateId = Number(params.templateId); - let document: TCreateDocumentFromTemplateResponse | null = null; + let document: Awaited> | null = null; try { document = await createDocumentFromTemplate({ @@ -579,6 +590,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { title: body.title, ...body.meta, }, + requestMetadata: metadata, }); } catch (err) { return AppError.toRestAPIError(err); @@ -621,7 +633,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { userId: user.id, teamId: team?.id, data: body.authOptions, - requestMetadata: extractNextApiRequestMetadata(args.req), + requestMetadata: metadata, }); } @@ -629,7 +641,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { status: 200, body: { documentId: document.id, - recipients: document.Recipient.map((recipient) => ({ + recipients: document.recipients.map((recipient) => ({ recipientId: recipient.id, name: recipient.name, email: recipient.email, @@ -642,7 +654,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { }; }), - sendDocument: authenticatedMiddleware(async (args, user, team) => { + sendDocument: authenticatedMiddleware(async (args, user, team, { metadata }) => { const { id: documentId } = args.params; const { sendEmail, sendCompletionEmails } = args.body; @@ -678,21 +690,22 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { await upsertDocumentMeta({ documentId: document.id, userId: user.id, + teamId: team?.id, emailSettings: { ...emailSettings, documentCompleted: sendCompletionEmails, ownerDocumentCompleted: sendCompletionEmails, }, - requestMetadata: extractNextApiRequestMetadata(args.req), + requestMetadata: metadata, }); } - const { Recipient: recipients, ...sentDocument } = await sendDocument({ + const { recipients, ...sentDocument } = await sendDocument({ documentId: document.id, userId: user.id, teamId: team?.id, sendEmail, - requestMetadata: extractNextApiRequestMetadata(args.req), + requestMetadata: metadata, }); return { @@ -716,7 +729,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { } }), - resendDocument: authenticatedMiddleware(async (args, user, team) => { + resendDocument: authenticatedMiddleware(async (args, user, team, { metadata }) => { const { id: documentId } = args.params; const { recipients } = args.body; @@ -726,7 +739,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { documentId: Number(documentId), recipients, teamId: team?.id, - requestMetadata: extractNextApiRequestMetadata(args.req), + requestMetadata: metadata, }); return { @@ -745,7 +758,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { } }), - createRecipient: authenticatedMiddleware(async (args, user, team) => { + createRecipient: authenticatedMiddleware(async (args, user, team, { metadata }) => { const { id: documentId } = args.params; const { name, email, role, authOptions, signingOrder } = args.body; @@ -791,7 +804,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { } try { - const { recipients: newRecipients } = await setRecipientsForDocument({ + const { recipients: newRecipients } = await setDocumentRecipients({ documentId: Number(documentId), userId: user.id, teamId: team?.id, @@ -809,7 +822,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { actionAuth: authOptions?.actionAuth ?? null, }, ], - requestMetadata: extractNextApiRequestMetadata(args.req), + requestMetadata: metadata, }); const newRecipient = newRecipients.find((recipient) => recipient.email === email); @@ -1040,12 +1053,12 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { .with('TEXT', () => ZTextFieldMeta.safeParse(fieldMeta)) .with('SIGNATURE', 'INITIALS', 'DATE', 'EMAIL', 'NAME', () => ({ success: true, - data: {}, + data: undefined, })) .with('FREE_SIGNATURE', () => ({ success: false, error: 'FREE_SIGNATURE is not supported', - data: {}, + data: undefined, })) .exhaustive(); @@ -1068,7 +1081,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { fieldMeta: result.data, }, include: { - Recipient: true, + recipient: true, }, }); @@ -1083,7 +1096,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { }, data: { fieldId: field.secondaryId, - fieldRecipientEmail: field.Recipient?.email ?? '', + fieldRecipientEmail: field.recipient?.email ?? '', fieldRecipientId: recipientId, fieldType: field.type, }, @@ -1102,7 +1115,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { pageWidth: Number(field.width), pageHeight: Number(field.height), customText: field.customText, - fieldMeta: ZFieldMetaSchema.parse(field.fieldMeta), + fieldMeta: field.fieldMeta ? ZFieldMetaSchema.parse(field.fieldMeta) : undefined, inserted: field.inserted, }; }), @@ -1574,3 +1587,39 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { }; }), }); + +const updateDocument = async ({ + documentId, + userId, + teamId, + data, +}: { + documentId: number; + data: Prisma.DocumentUpdateInput; + userId: number; + teamId?: number; +}) => { + return await prisma.document.update({ + where: { + id: documentId, + ...(teamId + ? { + team: { + id: teamId, + members: { + some: { + userId, + }, + }, + }, + } + : { + userId, + teamId: null, + }), + }, + data: { + ...data, + }, + }); +}; diff --git a/packages/api/v1/middleware/authenticated.ts b/packages/api/v1/middleware/authenticated.ts index 7f62706ca..b2ad28d2f 100644 --- a/packages/api/v1/middleware/authenticated.ts +++ b/packages/api/v1/middleware/authenticated.ts @@ -2,6 +2,8 @@ import type { NextApiRequest } from 'next'; import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; import { getApiTokenByToken } from '@documenso/lib/server-only/public-api/get-api-token-by-token'; +import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import { extractNextApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; import type { Team, User } from '@documenso/prisma/client'; export const authenticatedMiddleware = < @@ -13,7 +15,12 @@ export const authenticatedMiddleware = < body: unknown; }, >( - handler: (args: T, user: User, team?: Team | null) => Promise, + handler: ( + args: T, + user: User, + team: Team | null | undefined, + options: { metadata: ApiRequestMetadata }, + ) => Promise, ) => { return async (args: T) => { try { @@ -36,7 +43,18 @@ export const authenticatedMiddleware = < }); } - return await handler(args, apiToken.user, apiToken.team); + const metadata: ApiRequestMetadata = { + requestMetadata: extractNextApiRequestMetadata(args.req), + source: 'apiV1', + auth: 'api', + auditUser: { + id: apiToken.team ? null : apiToken.user.id, + email: apiToken.team ? null : apiToken.user.email, + name: apiToken.team?.name ?? apiToken.user.name, + }, + }; + + return await handler(args, apiToken.user, apiToken.team, { metadata }); } catch (err) { console.log({ err: err }); diff --git a/packages/app-tests/e2e/document-auth/action-auth.spec.ts b/packages/app-tests/e2e/document-auth/action-auth.spec.ts index 72fa0c8b6..babe361f4 100644 --- a/packages/app-tests/e2e/document-auth/action-auth.spec.ts +++ b/packages/app-tests/e2e/document-auth/action-auth.spec.ts @@ -28,7 +28,7 @@ test('[DOCUMENT_AUTH]: should allow signing when no auth setup', async ({ page } // Check that both are granted access. for (const recipient of recipients) { - const { token, Field } = recipient; + const { token, fields } = recipient; const signUrl = `/sign/${token}`; @@ -45,7 +45,7 @@ test('[DOCUMENT_AUTH]: should allow signing when no auth setup', async ({ page } await page.mouse.up(); } - for (const field of Field) { + for (const field of fields) { await page.locator(`#field-${field.id}`).getByRole('button').click(); if (field.type === FieldType.TEXT) { @@ -80,7 +80,7 @@ test('[DOCUMENT_AUTH]: should allow signing with valid global auth', async ({ pa const recipient = recipients[0]; - const { token, Field } = recipient; + const { token, fields } = recipient; const signUrl = `/sign/${token}`; @@ -102,7 +102,7 @@ test('[DOCUMENT_AUTH]: should allow signing with valid global auth', async ({ pa await page.mouse.up(); } - for (const field of Field) { + for (const field of fields) { await page.locator(`#field-${field.id}`).getByRole('button').click(); if (field.type === FieldType.TEXT) { @@ -170,12 +170,12 @@ test('[DOCUMENT_AUTH]: should deny signing fields when required for global auth' // Check that both are denied access. for (const recipient of recipients) { - const { token, Field } = recipient; + const { token, fields } = recipient; await page.goto(`/sign/${token}`); await expect(page.getByRole('heading', { name: 'Sign Document' })).toBeVisible(); - for (const field of Field) { + for (const field of fields) { if (field.type !== FieldType.SIGNATURE) { continue; } @@ -229,7 +229,7 @@ test('[DOCUMENT_AUTH]: should allow field signing when required for recipient au }); for (const recipient of recipients) { - const { token, Field } = recipient; + const { token, fields } = recipient; const { actionAuth } = ZRecipientAuthOptionsSchema.parse(recipient.authOptions); // This document has no global action auth, so only account should require auth. @@ -241,7 +241,7 @@ test('[DOCUMENT_AUTH]: should allow field signing when required for recipient au await expect(page.getByRole('heading', { name: 'Sign Document' })).toBeVisible(); if (isAuthRequired) { - for (const field of Field) { + for (const field of fields) { if (field.type !== FieldType.SIGNATURE) { continue; } @@ -271,7 +271,7 @@ test('[DOCUMENT_AUTH]: should allow field signing when required for recipient au await page.mouse.up(); } - for (const field of Field) { + for (const field of fields) { await page.locator(`#field-${field.id}`).getByRole('button').click(); if (field.type === FieldType.TEXT) { @@ -340,7 +340,7 @@ test('[DOCUMENT_AUTH]: should allow field signing when required for recipient an }); for (const recipient of recipients) { - const { token, Field } = recipient; + const { token, fields } = recipient; const { actionAuth } = ZRecipientAuthOptionsSchema.parse(recipient.authOptions); // This document HAS global action auth, so account and inherit should require auth. @@ -352,7 +352,7 @@ test('[DOCUMENT_AUTH]: should allow field signing when required for recipient an await expect(page.getByRole('heading', { name: 'Sign Document' })).toBeVisible(); if (isAuthRequired) { - for (const field of Field) { + for (const field of fields) { if (field.type !== FieldType.SIGNATURE) { continue; } @@ -382,7 +382,7 @@ test('[DOCUMENT_AUTH]: should allow field signing when required for recipient an await page.mouse.up(); } - for (const field of Field) { + for (const field of fields) { await page.locator(`#field-${field.id}`).getByRole('button').click(); if (field.type === FieldType.TEXT) { diff --git a/packages/app-tests/e2e/document-flow/settings-step.spec.ts b/packages/app-tests/e2e/document-flow/settings-step.spec.ts index 49d8de1f5..10860db21 100644 --- a/packages/app-tests/e2e/document-flow/settings-step.spec.ts +++ b/packages/app-tests/e2e/document-flow/settings-step.spec.ts @@ -151,6 +151,7 @@ test('[DOCUMENT_FLOW]: add settings', async ({ page }) => { await expect(page.getByTestId('documentActionSelectValue')).not.toBeVisible(); // Save the settings by going to the next step. + await page.getByRole('button', { name: 'Continue' }).click(); await expect(page.getByRole('heading', { name: 'Add Signers' })).toBeVisible(); diff --git a/packages/app-tests/e2e/document-flow/stepper-component.spec.ts b/packages/app-tests/e2e/document-flow/stepper-component.spec.ts index f50c40144..da4eae6d7 100644 --- a/packages/app-tests/e2e/document-flow/stepper-component.spec.ts +++ b/packages/app-tests/e2e/document-flow/stepper-component.spec.ts @@ -24,7 +24,7 @@ import { apiSignin } from '../fixtures/authentication'; const getDocumentByToken = async (token: string) => { return await prisma.document.findFirstOrThrow({ where: { - Recipient: { + recipients: { some: { token, }, @@ -357,7 +357,7 @@ test('[DOCUMENT_FLOW]: should be able to approve a document', async ({ page }) = }); for (const recipient of recipients) { - const { token, Field, role } = recipient; + const { token, fields, role } = recipient; const signUrl = `/sign/${token}`; @@ -378,7 +378,7 @@ test('[DOCUMENT_FLOW]: should be able to approve a document', async ({ page }) = await page.mouse.up(); } - for (const field of Field) { + for (const field of fields) { await page.locator(`#field-${field.id}`).getByRole('button').click(); await expect(page.locator(`#field-${field.id}`)).toHaveAttribute('data-inserted', 'true'); @@ -479,8 +479,8 @@ test('[DOCUMENT_FLOW]: should be able to sign a document with custom date', asyn fields: [FieldType.DATE], }); - const { token, Field } = recipients[0]; - const [recipientField] = Field; + const { token, fields } = recipients[0]; + const [recipientField] = fields; await page.goto(`/sign/${token}`); await page.waitForURL(`/sign/${token}`); @@ -496,7 +496,7 @@ test('[DOCUMENT_FLOW]: should be able to sign a document with custom date', asyn const field = await prisma.field.findFirst({ where: { - Recipient: { + recipient: { email: 'user1@example.com', }, documentId: Number(document.id), @@ -580,14 +580,14 @@ test('[DOCUMENT_FLOW]: should be able to create and sign a document with 3 recip const createdDocument = await prisma.document.findFirst({ where: { title: documentTitle }, - include: { Recipient: true }, + include: { recipients: true }, }); expect(createdDocument).not.toBeNull(); - expect(createdDocument?.Recipient.length).toBe(3); + expect(createdDocument?.recipients.length).toBe(3); for (let i = 0; i < 3; i++) { - const recipient = createdDocument?.Recipient.find( + const recipient = createdDocument?.recipients.find( (r) => r.email === `user${i + 1}@example.com`, ); expect(recipient).not.toBeNull(); diff --git a/packages/app-tests/e2e/documents/delete-documents.spec.ts b/packages/app-tests/e2e/documents/delete-documents.spec.ts index 8b5d4c587..db161300c 100644 --- a/packages/app-tests/e2e/documents/delete-documents.spec.ts +++ b/packages/app-tests/e2e/documents/delete-documents.spec.ts @@ -129,7 +129,7 @@ test('[DOCUMENTS]: deleting a pending document should remove it from recipients' // signout await apiSignout({ page }); - for (const recipient of pendingDocument.Recipient) { + for (const recipient of pendingDocument.recipients) { await apiSignin({ page, email: recipient.email, 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 276e79cc2..730345d42 100644 --- a/packages/app-tests/e2e/features/include-document-certificate.spec.ts +++ b/packages/app-tests/e2e/features/include-document-certificate.spec.ts @@ -45,7 +45,7 @@ test.describe('Signing Certificate Tests', () => { await page.mouse.up(); } - for (const field of recipient.Field) { + for (const field of recipient.fields) { await page.locator(`#field-${field.id}`).getByRole('button').click(); await expect(page.locator(`#field-${field.id}`)).toHaveAttribute('data-inserted', 'true'); @@ -122,7 +122,7 @@ test.describe('Signing Certificate Tests', () => { await page.mouse.up(); } - for (const field of recipient.Field) { + for (const field of recipient.fields) { await page.locator(`#field-${field.id}`).getByRole('button').click(); await expect(page.locator(`#field-${field.id}`)).toHaveAttribute('data-inserted', 'true'); @@ -199,7 +199,7 @@ test.describe('Signing Certificate Tests', () => { await page.mouse.up(); } - for (const field of recipient.Field) { + for (const field of recipient.fields) { await page.locator(`#field-${field.id}`).getByRole('button').click(); await expect(page.locator(`#field-${field.id}`)).toHaveAttribute('data-inserted', 'true'); diff --git a/packages/app-tests/e2e/templates/create-document-from-template.spec.ts b/packages/app-tests/e2e/templates/create-document-from-template.spec.ts index 16f155cb2..7e5219390 100644 --- a/packages/app-tests/e2e/templates/create-document-from-template.spec.ts +++ b/packages/app-tests/e2e/templates/create-document-from-template.spec.ts @@ -27,7 +27,7 @@ function createTempPdfFile() { '%PDF-1.4\n1 0 obj<>endobj 2 0 obj<>endobj 3 0 obj<>endobj\nxref\n0 4\n0000000000 65535 f\n0000000009 00000 n\n0000000052 00000 n\n0000000101 00000 n\ntrailer<>\nstartxref\n178\n%%EOF', ); - fs.writeFileSync(tempFilePath, pdfContent); + fs.writeFileSync(tempFilePath, new Uint8Array(pdfContent)); return tempFilePath; } @@ -124,7 +124,7 @@ test('[TEMPLATE]: should create a document from a template', async ({ page }) => id: documentId, }, include: { - Recipient: true, + recipients: true, documentMeta: true, }, }); @@ -144,8 +144,8 @@ test('[TEMPLATE]: should create a document from a template', async ({ page }) => expect(document.documentMeta?.subject).toEqual('SUBJECT'); expect(document.documentMeta?.timezone).toEqual('Etc/UTC'); - const recipientOne = document.Recipient[0]; - const recipientTwo = document.Recipient[1]; + const recipientOne = document.recipients[0]; + const recipientTwo = document.recipients[1]; const recipientOneAuth = extractDocumentAuthMethods({ documentAuth: document.authOptions, @@ -259,7 +259,7 @@ test('[TEMPLATE]: should create a team document from a team template', async ({ id: documentId, }, include: { - Recipient: true, + recipients: true, documentMeta: true, }, }); @@ -281,8 +281,8 @@ test('[TEMPLATE]: should create a team document from a team template', async ({ expect(document.documentMeta?.subject).toEqual('SUBJECT'); expect(document.documentMeta?.timezone).toEqual('Etc/UTC'); - const recipientOne = document.Recipient[0]; - const recipientTwo = document.Recipient[1]; + const recipientOne = document.recipients[0]; + const recipientTwo = document.recipients[1]; const recipientOneAuth = extractDocumentAuthMethods({ documentAuth: document.authOptions, diff --git a/packages/app-tests/e2e/templates/direct-templates.spec.ts b/packages/app-tests/e2e/templates/direct-templates.spec.ts index 05612d2e6..c8f41f4fc 100644 --- a/packages/app-tests/e2e/templates/direct-templates.spec.ts +++ b/packages/app-tests/e2e/templates/direct-templates.spec.ts @@ -260,7 +260,7 @@ test('[DIRECT_TEMPLATES]: use direct template link with 2 recipients', async ({ const secondRecipient = await seedUser(); const createTemplateOptions = { - Recipient: { + recipients: { createMany: { data: [ { diff --git a/packages/app-tests/package.json b/packages/app-tests/package.json index a5d809e39..2b0bd3468 100644 --- a/packages/app-tests/package.json +++ b/packages/app-tests/package.json @@ -13,7 +13,7 @@ "author": "", "devDependencies": { "@playwright/test": "^1.18.1", - "@types/node": "^20.8.2", + "@types/node": "^20", "@documenso/lib": "*", "@documenso/prisma": "*", "@documenso/web": "*", diff --git a/packages/app-tests/playwright.config.ts b/packages/app-tests/playwright.config.ts index 725f4bb04..e10d368fd 100644 --- a/packages/app-tests/playwright.config.ts +++ b/packages/app-tests/playwright.config.ts @@ -41,7 +41,10 @@ export default defineConfig({ projects: [ { name: 'chromium', - use: { ...devices['Desktop Chrome'] }, + use: { + ...devices['Desktop Chrome'], + viewport: { width: 1920, height: 1080 }, + }, }, // { diff --git a/packages/ee/FEATURES b/packages/ee/FEATURES index 7b1aac916..aa29a8a13 100644 --- a/packages/ee/FEATURES +++ b/packages/ee/FEATURES @@ -1,4 +1,4 @@ -This file list all features currently licensed under the Documenso Enterprise Edition (the "Commercial License”) +This file lists all features currently licensed under the Documenso Enterprise Edition (the "Commercial License”) Copyright (c) 2023 Documenso, Inc - The Stripe Billing Module diff --git a/packages/ee/server-only/limits/server.ts b/packages/ee/server-only/limits/server.ts index ad079c95d..34df6cfa8 100644 --- a/packages/ee/server-only/limits/server.ts +++ b/packages/ee/server-only/limits/server.ts @@ -43,7 +43,7 @@ const handleUserLimits = async ({ email }: HandleUserLimitsOptions) => { email, }, include: { - Subscription: true, + subscriptions: true, }, }); @@ -54,7 +54,7 @@ const handleUserLimits = async ({ email }: HandleUserLimitsOptions) => { let quota = structuredClone(FREE_PLAN_LIMITS); let remaining = structuredClone(FREE_PLAN_LIMITS); - const activeSubscriptions = user.Subscription.filter( + const activeSubscriptions = user.subscriptions.filter( ({ status }) => status === SubscriptionStatus.ACTIVE, ); diff --git a/packages/ee/server-only/stripe/transfer-team-subscription.ts b/packages/ee/server-only/stripe/transfer-team-subscription.ts index 08a85ed27..eedb73284 100644 --- a/packages/ee/server-only/stripe/transfer-team-subscription.ts +++ b/packages/ee/server-only/stripe/transfer-team-subscription.ts @@ -14,7 +14,7 @@ type TransferStripeSubscriptionOptions = { /** * The user to transfer the subscription to. */ - user: User & { Subscription: Subscription[] }; + user: User & { subscriptions: Subscription[] }; /** * The team the subscription is associated with. @@ -54,7 +54,7 @@ export const transferTeamSubscription = async ({ ]); const teamSubscriptionRequired = !subscriptionsContainsActivePlan( - user.Subscription, + user.subscriptions, teamRelatedPlanPriceIds, ); diff --git a/packages/ee/server-only/stripe/webhook/handler.ts b/packages/ee/server-only/stripe/webhook/handler.ts index 23705438a..ae03be6b1 100644 --- a/packages/ee/server-only/stripe/webhook/handler.ts +++ b/packages/ee/server-only/stripe/webhook/handler.ts @@ -10,7 +10,6 @@ import { createTeamFromPendingTeam } from '@documenso/lib/server-only/team/creat import { getFlag } from '@documenso/lib/universal/get-feature-flag'; import { prisma } from '@documenso/prisma'; -import { onEarlyAdoptersCheckout } from './on-early-adopters-checkout'; import { onSubscriptionDeleted } from './on-subscription-deleted'; import { onSubscriptionUpdated } from './on-subscription-updated'; @@ -56,10 +55,6 @@ export const stripeWebhookHandler = async ( // eslint-disable-next-line @typescript-eslint/consistent-type-assertions const session = event.data.object as Stripe.Checkout.Session; - if (session.metadata?.source === 'marketing') { - await onEarlyAdoptersCheckout({ session }); - } - const customerId = typeof session.customer === 'string' ? session.customer : session.customer?.id; diff --git a/packages/ee/server-only/stripe/webhook/on-early-adopters-checkout.ts b/packages/ee/server-only/stripe/webhook/on-early-adopters-checkout.ts deleted file mode 100644 index a2aac4f27..000000000 --- a/packages/ee/server-only/stripe/webhook/on-early-adopters-checkout.ts +++ /dev/null @@ -1,140 +0,0 @@ -import type Stripe from 'stripe'; - -import { hashSync } from '@documenso/lib/server-only/auth/hash'; -import { sealDocument } from '@documenso/lib/server-only/document/seal-document'; -import { redis } from '@documenso/lib/server-only/redis'; -import { stripe } from '@documenso/lib/server-only/stripe'; -import { alphaid, nanoid } from '@documenso/lib/universal/id'; -import { putPdfFile } from '@documenso/lib/universal/upload/put-file'; -import { prisma } from '@documenso/prisma'; -import { - DocumentSource, - DocumentStatus, - FieldType, - ReadStatus, - SendStatus, - SigningStatus, -} from '@documenso/prisma/client'; - -import { ZEarlyAdopterCheckoutMetadataSchema } from './early-adopter-checkout-metadata'; - -export type OnEarlyAdoptersCheckoutOptions = { - session: Stripe.Checkout.Session; -}; - -export const onEarlyAdoptersCheckout = async ({ session }: OnEarlyAdoptersCheckoutOptions) => { - try { - const safeMetadata = ZEarlyAdopterCheckoutMetadataSchema.safeParse(session.metadata); - - if (!safeMetadata.success) { - return; - } - - const { email, name, signatureText, signatureDataUrl: signatureDataUrlRef } = safeMetadata.data; - - const user = await prisma.user.findFirst({ - where: { - email: email.toLowerCase(), - }, - }); - - if (user) { - return; - } - - const tempPassword = nanoid(12); - - const newUser = await prisma.user.create({ - data: { - name, - email: email.toLowerCase(), - password: hashSync(tempPassword), - signature: signatureDataUrlRef, - }, - }); - - const customerId = - typeof session.customer === 'string' ? session.customer : session.customer?.id; - - if (customerId) { - await stripe.customers.update(customerId, { - metadata: { - userId: newUser.id, - }, - }); - } - - await redis.set(`user:${newUser.id}:temp-password`, tempPassword, { - // expire in 1 week - ex: 60 * 60 * 24 * 7, - }); - - const signatureDataUrl = await redis.get(`signature:${session.client_reference_id}`); - - const documentBuffer = await fetch( - new URL('@documenso/assets/documenso-supporter-pledge.pdf', import.meta.url), - ).then(async (res) => res.arrayBuffer()); - - const { id: documentDataId } = await putPdfFile({ - name: 'Documenso Supporter Pledge.pdf', - type: 'application/pdf', - arrayBuffer: async () => Promise.resolve(documentBuffer), - }); - - const document = await prisma.document.create({ - data: { - title: 'Documenso Supporter Pledge.pdf', - status: DocumentStatus.COMPLETED, - userId: newUser.id, - documentDataId, - source: DocumentSource.DOCUMENT, - }, - }); - - const recipient = await prisma.recipient.create({ - data: { - name, - email: email.toLowerCase(), - token: alphaid(), - readStatus: ReadStatus.OPENED, - sendStatus: SendStatus.SENT, - signingStatus: SigningStatus.SIGNED, - signedAt: new Date(), - documentId: document.id, - }, - }); - - await prisma.field.create({ - data: { - type: FieldType.SIGNATURE, - recipientId: recipient.id, - documentId: document.id, - page: 1, - positionX: 12.2781, - positionY: 81.5789, - height: 6.8649, - width: 29.5857, - inserted: true, - customText: '', - - Signature: { - create: { - typedSignature: signatureDataUrl ? null : signatureText || name, - signatureImageAsBase64: signatureDataUrl, - recipientId: recipient.id, - }, - }, - }, - }); - - await sealDocument({ - documentId: document.id, - sendEmail: false, - }); - } catch (error) { - // We don't want to break the checkout process if something goes wrong here. - // This is an additive experience for early adopters, breaking their ability - // join would be far worse than not having a signed pledge. - console.error('early-supporter-error', error); - } -}; diff --git a/packages/ee/server-only/util/is-document-enterprise.ts b/packages/ee/server-only/util/is-document-enterprise.ts index c49d98edb..1a2bb6cf5 100644 --- a/packages/ee/server-only/util/is-document-enterprise.ts +++ b/packages/ee/server-only/util/is-document-enterprise.ts @@ -35,12 +35,12 @@ export const isUserEnterprise = async ({ select: { owner: { include: { - Subscription: true, + subscriptions: true, }, }, }, }) - .then((team) => team.owner.Subscription); + .then((team) => team.owner.subscriptions); } else { subscriptions = await prisma.user .findFirstOrThrow({ @@ -48,10 +48,10 @@ export const isUserEnterprise = async ({ id: userId, }, select: { - Subscription: true, + subscriptions: true, }, }) - .then((user) => user.Subscription); + .then((user) => user.subscriptions); } if (subscriptions.length === 0) { diff --git a/packages/ee/server-only/util/is-document-platform.ts b/packages/ee/server-only/util/is-document-platform.ts index 3cea7a081..67d9d6acd 100644 --- a/packages/ee/server-only/util/is-document-platform.ts +++ b/packages/ee/server-only/util/is-document-platform.ts @@ -32,12 +32,12 @@ export const isDocumentPlatform = async ({ select: { owner: { include: { - Subscription: true, + subscriptions: true, }, }, }, }) - .then((team) => team.owner.Subscription); + .then((team) => team.owner.subscriptions); } else { subscriptions = await prisma.user .findFirstOrThrow({ @@ -45,10 +45,10 @@ export const isDocumentPlatform = async ({ id: userId, }, select: { - Subscription: true, + subscriptions: true, }, }) - .then((user) => user.Subscription); + .then((user) => user.subscriptions); } if (subscriptions.length === 0) { diff --git a/packages/email/template-components/template-document-invite.tsx b/packages/email/template-components/template-document-invite.tsx index 8c550fbfa..c8b4a402d 100644 --- a/packages/email/template-components/template-document-invite.tsx +++ b/packages/email/template-components/template-document-invite.tsx @@ -2,7 +2,7 @@ import { useMemo } from 'react'; import { Trans } from '@lingui/macro'; import { useLingui } from '@lingui/react'; -import { match } from 'ts-pattern'; +import { P, match } from 'ts-pattern'; import { RECIPIENT_ROLES_DESCRIPTION } from '@documenso/lib/constants/recipient-roles'; import { RecipientRole } from '@documenso/prisma/client'; @@ -40,11 +40,9 @@ export const TemplateDocumentInvite = ({ const rejectDocumentLink = useMemo(() => { const url = new URL(signDocumentLink); - url.searchParams.set('reject', 'true'); - return url.toString(); - }, []); + }, [signDocumentLink]); return ( <> @@ -52,31 +50,32 @@ export const TemplateDocumentInvite = ({
    - {selfSigner ? ( - - Please {_(actionVerb).toLowerCase()} your document -
    "{documentName}" -
    - ) : isTeamInvite ? ( - <> - {includeSenderDetails ? ( - - {inviterName} on behalf of "{teamName}" has invited you to{' '} - {_(actionVerb).toLowerCase()} - - ) : ( - - {teamName} has invited you to {_(actionVerb).toLowerCase()} - - )} -
    "{documentName}" - - ) : ( - - {inviterName} has invited you to {_(actionVerb).toLowerCase()} -
    "{documentName}" -
    - )} + {match({ selfSigner, isTeamInvite, includeSenderDetails, teamName }) + .with({ selfSigner: true }, () => ( + + Please {_(actionVerb).toLowerCase()} your document +
    "{documentName}" +
    + )) + .with({ isTeamInvite: true, includeSenderDetails: true, teamName: P.string }, () => ( + + {inviterName} on behalf of "{teamName}" has invited you to{' '} + {_(actionVerb).toLowerCase()} +
    "{documentName}" +
    + )) + .with({ isTeamInvite: true, teamName: P.string }, () => ( + + {teamName} has invited you to {_(actionVerb).toLowerCase()} +
    "{documentName}" +
    + )) + .otherwise(() => ( + + {inviterName} has invited you to {_(actionVerb).toLowerCase()} +
    "{documentName}" +
    + ))}
    diff --git a/packages/email/templates/bulk-send-complete.tsx b/packages/email/templates/bulk-send-complete.tsx new file mode 100644 index 000000000..52c8416fd --- /dev/null +++ b/packages/email/templates/bulk-send-complete.tsx @@ -0,0 +1,91 @@ +import { Trans, msg } from '@lingui/macro'; +import { useLingui } from '@lingui/react'; + +import { Body, Container, Head, Html, Preview, Section, Text } from '../components'; +import { TemplateFooter } from '../template-components/template-footer'; + +export interface BulkSendCompleteEmailProps { + userName: string; + templateName: string; + totalProcessed: number; + successCount: number; + failedCount: number; + errors: string[]; + assetBaseUrl?: string; +} + +export const BulkSendCompleteEmail = ({ + userName, + templateName, + totalProcessed, + successCount, + failedCount, + errors, +}: BulkSendCompleteEmailProps) => { + const { _ } = useLingui(); + + return ( + + + {_(msg`Bulk send operation complete for template "${templateName}"`)} + +
    + +
    + + Hi {userName}, + + + + Your bulk send operation for template "{templateName}" has completed. + + + + Summary: + + +
      +
    • + Total rows processed: {totalProcessed} +
    • +
    • + Successfully created: {successCount} +
    • +
    • + Failed: {failedCount} +
    • +
    + + {failedCount > 0 && ( +
    + + The following errors occurred: + + +
      + {errors.map((error, index) => ( +
    • + {error} +
    • + ))} +
    +
    + )} + + + + You can view the created documents in your dashboard under the "Documents created + from template" section. + + +
    +
    + + + + +
    + + + ); +}; diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index 4d25e1bd8..6049dd7c7 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -15,6 +15,6 @@ "eslint-plugin-package-json": "^0.10.4", "eslint-plugin-react": "^7.34.0", "eslint-plugin-unused-imports": "^3.1.0", - "typescript": "5.2.2" + "typescript": "5.6.2" } -} +} \ No newline at end of file diff --git a/packages/lib/client-only/hooks/use-copy-share-link.ts b/packages/lib/client-only/hooks/use-copy-share-link.ts index cff552e8f..4638e4e49 100644 --- a/packages/lib/client-only/hooks/use-copy-share-link.ts +++ b/packages/lib/client-only/hooks/use-copy-share-link.ts @@ -11,7 +11,7 @@ export type UseCopyShareLinkOptions = { export function useCopyShareLink({ onSuccess, onError }: UseCopyShareLinkOptions) { const [, copyToClipboard] = useCopyToClipboard(); - const { mutateAsync: createOrGetShareLink, isLoading: isCreatingShareLink } = + const { mutateAsync: createOrGetShareLink, isPending: isCreatingShareLink } = trpc.shareLink.createOrGetShareLink.useMutation(); /** diff --git a/packages/lib/constants/date-formats.ts b/packages/lib/constants/date-formats.ts index 6b0dd69c5..f723f2b3b 100644 --- a/packages/lib/constants/date-formats.ts +++ b/packages/lib/constants/date-formats.ts @@ -4,6 +4,19 @@ import { DEFAULT_DOCUMENT_TIME_ZONE } from './time-zones'; export const DEFAULT_DOCUMENT_DATE_FORMAT = 'yyyy-MM-dd hh:mm a'; +export const VALID_DATE_FORMAT_VALUES = [ + DEFAULT_DOCUMENT_DATE_FORMAT, + 'yyyy-MM-dd', + 'dd/MM/yyyy hh:mm a', + 'MM/dd/yyyy hh:mm a', + 'yyyy-MM-dd HH:mm', + 'yy-MM-dd hh:mm a', + 'yyyy-MM-dd HH:mm:ss', + 'MMMM dd, yyyy hh:mm a', + 'EEEE, MMMM dd, yyyy hh:mm a', + "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", +] as const; + export const DATE_FORMATS = [ { key: 'yyyy-MM-dd_hh:mm_a', @@ -55,7 +68,11 @@ export const DATE_FORMATS = [ label: 'ISO 8601', value: "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", }, -]; +] satisfies { + key: string; + label: string; + value: (typeof VALID_DATE_FORMAT_VALUES)[number]; +}[]; export const convertToLocalSystemFormat = ( customText: string, diff --git a/packages/lib/constants/i18n.ts b/packages/lib/constants/i18n.ts index b3c8a8954..f0e495e59 100644 --- a/packages/lib/constants/i18n.ts +++ b/packages/lib/constants/i18n.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; -export const SUPPORTED_LANGUAGE_CODES = ['de', 'en', 'fr', 'es'] as const; +export const SUPPORTED_LANGUAGE_CODES = ['de', 'en', 'fr', 'es', 'it', 'pl'] as const; export const ZSupportedLanguageCodeSchema = z.enum(SUPPORTED_LANGUAGE_CODES).catch('en'); @@ -46,6 +46,14 @@ export const SUPPORTED_LANGUAGES: Record = { full: 'Spanish', short: 'es', }, + it: { + full: 'Italian', + short: 'it', + }, + pl: { + short: 'pl', + full: 'Polish', + }, } satisfies Record; export const isValidLanguageCode = (code: unknown): code is SupportedLanguageCodes => diff --git a/packages/lib/errors/app-error.ts b/packages/lib/errors/app-error.ts index 548ba8388..06184a6a5 100644 --- a/packages/lib/errors/app-error.ts +++ b/packages/lib/errors/app-error.ts @@ -1,9 +1,6 @@ -import type { TRPCError } from '@trpc/server'; import { match } from 'ts-pattern'; import { z } from 'zod'; -import { TRPCClientError } from '@documenso/trpc/client'; - /** * Generic application error codes. */ @@ -24,24 +21,22 @@ export enum AppErrorCode { 'PREMIUM_PROFILE_URL' = 'PREMIUM_PROFILE_URL', } -export const genericErrorCodeToTrpcErrorCodeMap: Record< - string, - { code: TRPCError['code']; status: number } -> = { - [AppErrorCode.ALREADY_EXISTS]: { code: 'BAD_REQUEST', status: 400 }, - [AppErrorCode.EXPIRED_CODE]: { code: 'BAD_REQUEST', status: 400 }, - [AppErrorCode.INVALID_BODY]: { code: 'BAD_REQUEST', status: 400 }, - [AppErrorCode.INVALID_REQUEST]: { code: 'BAD_REQUEST', status: 400 }, - [AppErrorCode.NOT_FOUND]: { code: 'NOT_FOUND', status: 404 }, - [AppErrorCode.NOT_SETUP]: { code: 'BAD_REQUEST', status: 400 }, - [AppErrorCode.UNAUTHORIZED]: { code: 'UNAUTHORIZED', status: 401 }, - [AppErrorCode.UNKNOWN_ERROR]: { code: 'INTERNAL_SERVER_ERROR', status: 500 }, - [AppErrorCode.RETRY_EXCEPTION]: { code: 'INTERNAL_SERVER_ERROR', status: 500 }, - [AppErrorCode.SCHEMA_FAILED]: { code: 'INTERNAL_SERVER_ERROR', status: 500 }, - [AppErrorCode.TOO_MANY_REQUESTS]: { code: 'TOO_MANY_REQUESTS', status: 429 }, - [AppErrorCode.PROFILE_URL_TAKEN]: { code: 'BAD_REQUEST', status: 400 }, - [AppErrorCode.PREMIUM_PROFILE_URL]: { code: 'BAD_REQUEST', status: 400 }, -}; +export const genericErrorCodeToTrpcErrorCodeMap: Record = + { + [AppErrorCode.ALREADY_EXISTS]: { code: 'BAD_REQUEST', status: 400 }, + [AppErrorCode.EXPIRED_CODE]: { code: 'BAD_REQUEST', status: 400 }, + [AppErrorCode.INVALID_BODY]: { code: 'BAD_REQUEST', status: 400 }, + [AppErrorCode.INVALID_REQUEST]: { code: 'BAD_REQUEST', status: 400 }, + [AppErrorCode.NOT_FOUND]: { code: 'NOT_FOUND', status: 404 }, + [AppErrorCode.NOT_SETUP]: { code: 'BAD_REQUEST', status: 400 }, + [AppErrorCode.UNAUTHORIZED]: { code: 'UNAUTHORIZED', status: 401 }, + [AppErrorCode.UNKNOWN_ERROR]: { code: 'INTERNAL_SERVER_ERROR', status: 500 }, + [AppErrorCode.RETRY_EXCEPTION]: { code: 'INTERNAL_SERVER_ERROR', status: 500 }, + [AppErrorCode.SCHEMA_FAILED]: { code: 'INTERNAL_SERVER_ERROR', status: 500 }, + [AppErrorCode.TOO_MANY_REQUESTS]: { code: 'TOO_MANY_REQUESTS', status: 429 }, + [AppErrorCode.PROFILE_URL_TAKEN]: { code: 'BAD_REQUEST', status: 400 }, + [AppErrorCode.PREMIUM_PROFILE_URL]: { code: 'BAD_REQUEST', status: 400 }, + }; export const ZAppErrorJsonSchema = z.object({ code: z.string(), @@ -87,6 +82,8 @@ export class AppError extends Error { */ statusCode?: number; + name = 'AppError'; + /** * Create a new AppError. * @@ -107,17 +104,18 @@ export class AppError extends Error { * * @param error An unknown type. */ - static parseError(error: unknown): AppError { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + static parseError(error: any): AppError { if (error instanceof AppError) { return error; } // Handle TRPC errors. - if (error instanceof TRPCClientError) { + if (error?.name === 'TRPCClientError') { const parsedJsonError = AppError.parseFromJSON(error.data?.appError); const fallbackError = new AppError(AppErrorCode.UNKNOWN_ERROR, { - message: error.message, + message: error?.message, }); return parsedJsonError || fallbackError; diff --git a/packages/lib/jobs/client.ts b/packages/lib/jobs/client.ts index 988208a0d..6b0cbe693 100644 --- a/packages/lib/jobs/client.ts +++ b/packages/lib/jobs/client.ts @@ -6,6 +6,7 @@ import { SEND_SIGNING_EMAIL_JOB_DEFINITION } from './definitions/emails/send-sig import { SEND_TEAM_DELETED_EMAIL_JOB_DEFINITION } from './definitions/emails/send-team-deleted-email'; import { SEND_TEAM_MEMBER_JOINED_EMAIL_JOB_DEFINITION } from './definitions/emails/send-team-member-joined-email'; import { SEND_TEAM_MEMBER_LEFT_EMAIL_JOB_DEFINITION } from './definitions/emails/send-team-member-left-email'; +import { BULK_SEND_TEMPLATE_JOB_DEFINITION } from './definitions/internal/bulk-send-template'; import { SEAL_DOCUMENT_JOB_DEFINITION } from './definitions/internal/seal-document'; /** @@ -21,6 +22,7 @@ export const jobsClient = new JobClient([ SEAL_DOCUMENT_JOB_DEFINITION, SEND_SIGNING_REJECTION_EMAILS_JOB_DEFINITION, SEND_RECIPIENT_SIGNED_EMAIL_JOB_DEFINITION, + BULK_SEND_TEMPLATE_JOB_DEFINITION, ] as const); export const jobs = jobsClient; diff --git a/packages/lib/jobs/definitions/emails/send-bulk-complete-email.ts b/packages/lib/jobs/definitions/emails/send-bulk-complete-email.ts new file mode 100644 index 000000000..a16def8cf --- /dev/null +++ b/packages/lib/jobs/definitions/emails/send-bulk-complete-email.ts @@ -0,0 +1,39 @@ +import { z } from 'zod'; + +import { ZRequestMetadataSchema } from '../../../universal/extract-request-metadata'; +import { type JobDefinition } from '../../client/_internal/job'; + +const SEND_BULK_COMPLETE_EMAIL_JOB_DEFINITION_ID = 'send.bulk.complete.email'; + +const SEND_BULK_COMPLETE_EMAIL_JOB_DEFINITION_SCHEMA = z.object({ + userId: z.number(), + templateId: z.number(), + templateName: z.string(), + totalProcessed: z.number(), + successCount: z.number(), + failedCount: z.number(), + errors: z.array(z.string()), + requestMetadata: ZRequestMetadataSchema.optional(), +}); + +export type TSendBulkCompleteEmailJobDefinition = z.infer< + typeof SEND_BULK_COMPLETE_EMAIL_JOB_DEFINITION_SCHEMA +>; + +export const SEND_BULK_COMPLETE_EMAIL_JOB_DEFINITION = { + id: SEND_BULK_COMPLETE_EMAIL_JOB_DEFINITION_ID, + name: 'Send Bulk Complete Email', + version: '1.0.0', + trigger: { + name: SEND_BULK_COMPLETE_EMAIL_JOB_DEFINITION_ID, + schema: SEND_BULK_COMPLETE_EMAIL_JOB_DEFINITION_SCHEMA, + }, + handler: async ({ payload, io }) => { + const handler = await import('./send-bulk-complete-email.handler'); + + await handler.run({ payload, io }); + }, +} as const satisfies JobDefinition< + typeof SEND_BULK_COMPLETE_EMAIL_JOB_DEFINITION_ID, + TSendBulkCompleteEmailJobDefinition +>; diff --git a/packages/lib/jobs/definitions/emails/send-recipient-signed-email.ts b/packages/lib/jobs/definitions/emails/send-recipient-signed-email.ts index 7fff47395..5f1691ba9 100644 --- a/packages/lib/jobs/definitions/emails/send-recipient-signed-email.ts +++ b/packages/lib/jobs/definitions/emails/send-recipient-signed-email.ts @@ -36,19 +36,19 @@ export const SEND_RECIPIENT_SIGNED_EMAIL_JOB_DEFINITION = { const document = await prisma.document.findFirst({ where: { id: documentId, - Recipient: { + recipients: { some: { id: recipientId, }, }, }, include: { - Recipient: { + recipients: { where: { id: recipientId, }, }, - User: true, + user: true, documentMeta: true, team: { include: { @@ -62,7 +62,7 @@ export const SEND_RECIPIENT_SIGNED_EMAIL_JOB_DEFINITION = { throw new Error('Document not found'); } - if (document.Recipient.length === 0) { + if (document.recipients.length === 0) { throw new Error('Document has no recipients'); } @@ -74,9 +74,9 @@ export const SEND_RECIPIENT_SIGNED_EMAIL_JOB_DEFINITION = { return; } - const [recipient] = document.Recipient; + const [recipient] = document.recipients; const { email: recipientEmail, name: recipientName } = recipient; - const { User: owner } = document; + const { user: owner } = document; const recipientReference = recipientName || recipientEmail; diff --git a/packages/lib/jobs/definitions/emails/send-rejection-emails.handler.ts b/packages/lib/jobs/definitions/emails/send-rejection-emails.handler.ts index 3255a77ce..3dfea785e 100644 --- a/packages/lib/jobs/definitions/emails/send-rejection-emails.handler.ts +++ b/packages/lib/jobs/definitions/emails/send-rejection-emails.handler.ts @@ -33,7 +33,7 @@ export const run = async ({ id: documentId, }, include: { - User: true, + user: true, documentMeta: true, team: { select: { @@ -53,7 +53,7 @@ export const run = async ({ }), ]); - const { documentMeta, team, User: documentOwner } = document; + const { documentMeta, user: documentOwner } = document; const isEmailEnabled = extractDerivedDocumentEmailSettings( document.documentMeta, @@ -70,7 +70,7 @@ export const run = async ({ const recipientTemplate = createElement(DocumentRejectionConfirmedEmail, { recipientName: recipient.name, documentName: document.title, - documentOwnerName: document.User.name || document.User.email, + documentOwnerName: document.user.name || document.user.email, reason: recipient.rejectionReason || '', assetBaseUrl: NEXT_PUBLIC_WEBAPP_URL(), }); diff --git a/packages/lib/jobs/definitions/internal/bulk-send-template.handler.ts b/packages/lib/jobs/definitions/internal/bulk-send-template.handler.ts new file mode 100644 index 000000000..bce18752f --- /dev/null +++ b/packages/lib/jobs/definitions/internal/bulk-send-template.handler.ts @@ -0,0 +1,208 @@ +import { createElement } from 'react'; + +import { msg } from '@lingui/macro'; +import { parse } from 'csv-parse/sync'; +import { z } from 'zod'; + +import { mailer } from '@documenso/email/mailer'; +import { BulkSendCompleteEmail } from '@documenso/email/templates/bulk-send-complete'; +import { sendDocument } from '@documenso/lib/server-only/document/send-document'; +import { createDocumentFromTemplate } from '@documenso/lib/server-only/template/create-document-from-template'; +import { getTemplateById } from '@documenso/lib/server-only/template/get-template-by-id'; +import { prisma } from '@documenso/prisma'; +import type { TeamGlobalSettings } from '@documenso/prisma/client'; + +import { getI18nInstance } from '../../../client-only/providers/i18n.server'; +import { NEXT_PUBLIC_WEBAPP_URL } from '../../../constants/app'; +import { FROM_ADDRESS, FROM_NAME } from '../../../constants/email'; +import { AppError } from '../../../errors/app-error'; +import { renderEmailWithI18N } from '../../../utils/render-email-with-i18n'; +import { teamGlobalSettingsToBranding } from '../../../utils/team-global-settings-to-branding'; +import type { JobRunIO } from '../../client/_internal/job'; +import type { TBulkSendTemplateJobDefinition } from './bulk-send-template'; + +const ZRecipientRowSchema = z.object({ + name: z.string().optional(), + email: z.union([ + z.string().email({ message: 'Value must be a valid email or empty string' }), + z.string().max(0, { message: 'Value must be a valid email or empty string' }), + ]), +}); + +export const run = async ({ + payload, + io, +}: { + payload: TBulkSendTemplateJobDefinition; + io: JobRunIO; +}) => { + const { userId, teamId, templateId, csvContent, sendImmediately, requestMetadata } = payload; + + const template = await getTemplateById({ + id: templateId, + userId, + teamId, + }); + + if (!template) { + throw new Error('Template not found'); + } + + const rows = parse(csvContent, { columns: true, skip_empty_lines: true }); + + if (rows.length > 100) { + throw new Error('Maximum 100 rows allowed per upload'); + } + + const { recipients } = template; + + // Validate CSV structure + const csvHeaders = Object.keys(rows[0]); + const requiredHeaders = recipients.map((_, index) => `recipient_${index + 1}_email`); + + for (const header of requiredHeaders) { + if (!csvHeaders.includes(header)) { + throw new Error(`Missing required column: ${header}`); + } + } + + const user = await prisma.user.findFirstOrThrow({ + where: { + id: userId, + }, + select: { + email: true, + name: true, + }, + }); + + const results = { + success: 0, + failed: 0, + errors: Array(), + }; + + // Process each row + for (const [rowIndex, row] of rows.entries()) { + try { + for (const [recipientIndex] of recipients.entries()) { + const nameKey = `recipient_${recipientIndex + 1}_name`; + const emailKey = `recipient_${recipientIndex + 1}_email`; + + const parsed = ZRecipientRowSchema.safeParse({ + name: row[nameKey], + email: row[emailKey], + }); + + if (!parsed.success) { + throw new Error( + `Invalid recipient data provided for ${emailKey}, ${nameKey}: ${parsed.error.issues?.[0]?.message}`, + ); + } + } + + const document = await io.runTask(`create-document-${rowIndex}`, async () => { + return await createDocumentFromTemplate({ + templateId: template.id, + userId, + teamId, + recipients: recipients.map((recipient, index) => { + return { + id: recipient.id, + email: row[`recipient_${index + 1}_email`] || recipient.email, + name: row[`recipient_${index + 1}_name`] || recipient.name, + role: recipient.role, + signingOrder: recipient.signingOrder, + }; + }), + requestMetadata: { + source: 'app', + auth: 'session', + requestMetadata: requestMetadata || {}, + }, + }); + }); + + if (sendImmediately) { + await io.runTask(`send-document-${rowIndex}`, async () => { + await sendDocument({ + documentId: document.id, + userId, + teamId, + requestMetadata: { + source: 'app', + auth: 'session', + requestMetadata: requestMetadata || {}, + }, + }).catch((err) => { + console.error(err); + + throw new AppError('DOCUMENT_SEND_FAILED'); + }); + }); + } + + results.success += 1; + } catch (error) { + results.failed += 1; + + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + + results.errors.push(`Row ${rowIndex + 1}: Was unable to be processed - ${errorMessage}`); + } + } + + await io.runTask('send-completion-email', async () => { + const completionTemplate = createElement(BulkSendCompleteEmail, { + userName: user.name || user.email, + templateName: template.title, + totalProcessed: rows.length, + successCount: results.success, + failedCount: results.failed, + errors: results.errors, + assetBaseUrl: NEXT_PUBLIC_WEBAPP_URL(), + }); + + let teamGlobalSettings: TeamGlobalSettings | undefined | null; + + if (template.teamId) { + teamGlobalSettings = await prisma.teamGlobalSettings.findUnique({ + where: { + teamId: template.teamId, + }, + }); + } + + const branding = teamGlobalSettings + ? teamGlobalSettingsToBranding(teamGlobalSettings) + : undefined; + + const i18n = await getI18nInstance(teamGlobalSettings?.documentLanguage); + + const [html, text] = await Promise.all([ + renderEmailWithI18N(completionTemplate, { + lang: teamGlobalSettings?.documentLanguage, + branding, + }), + renderEmailWithI18N(completionTemplate, { + lang: teamGlobalSettings?.documentLanguage, + branding, + plainText: true, + }), + ]); + + await mailer.sendMail({ + to: { + name: user.name || '', + address: user.email, + }, + from: { + name: FROM_NAME, + address: FROM_ADDRESS, + }, + subject: i18n._(msg`Bulk Send Complete: ${template.title}`), + html, + text, + }); + }); +}; diff --git a/packages/lib/jobs/definitions/internal/bulk-send-template.ts b/packages/lib/jobs/definitions/internal/bulk-send-template.ts new file mode 100644 index 000000000..c101e3c40 --- /dev/null +++ b/packages/lib/jobs/definitions/internal/bulk-send-template.ts @@ -0,0 +1,37 @@ +import { z } from 'zod'; + +import { ZRequestMetadataSchema } from '../../../universal/extract-request-metadata'; +import { type JobDefinition } from '../../client/_internal/job'; + +const BULK_SEND_TEMPLATE_JOB_DEFINITION_ID = 'internal.bulk-send-template'; + +const BULK_SEND_TEMPLATE_JOB_DEFINITION_SCHEMA = z.object({ + userId: z.number(), + teamId: z.number().optional(), + templateId: z.number(), + csvContent: z.string(), + sendImmediately: z.boolean(), + requestMetadata: ZRequestMetadataSchema.optional(), +}); + +export type TBulkSendTemplateJobDefinition = z.infer< + typeof BULK_SEND_TEMPLATE_JOB_DEFINITION_SCHEMA +>; + +export const BULK_SEND_TEMPLATE_JOB_DEFINITION = { + id: BULK_SEND_TEMPLATE_JOB_DEFINITION_ID, + name: 'Bulk Send Template', + version: '1.0.0', + trigger: { + name: BULK_SEND_TEMPLATE_JOB_DEFINITION_ID, + schema: BULK_SEND_TEMPLATE_JOB_DEFINITION_SCHEMA, + }, + handler: async ({ payload, io }) => { + const handler = await import('./bulk-send-template.handler'); + + await handler.run({ payload, io }); + }, +} as const satisfies JobDefinition< + typeof BULK_SEND_TEMPLATE_JOB_DEFINITION_ID, + TBulkSendTemplateJobDefinition +>; diff --git a/packages/lib/jobs/definitions/internal/seal-document.handler.ts b/packages/lib/jobs/definitions/internal/seal-document.handler.ts index 0fbe983a8..914377f71 100644 --- a/packages/lib/jobs/definitions/internal/seal-document.handler.ts +++ b/packages/lib/jobs/definitions/internal/seal-document.handler.ts @@ -20,7 +20,10 @@ import { insertFieldInPDF } from '../../../server-only/pdf/insert-field-in-pdf'; import { normalizeSignatureAppearances } from '../../../server-only/pdf/normalize-signature-appearances'; import { triggerWebhook } from '../../../server-only/webhooks/trigger/trigger-webhook'; import { DOCUMENT_AUDIT_LOG_TYPE } from '../../../types/document-audit-logs'; -import { ZWebhookDocumentSchema } from '../../../types/webhook-payload'; +import { + ZWebhookDocumentSchema, + mapDocumentToWebhookDocumentPayload, +} from '../../../types/webhook-payload'; import { getFile } from '../../../universal/upload/get-file'; import { putPdfFile } from '../../../universal/upload/put-file'; import { fieldsContainUnsignedRequiredField } from '../../../utils/advanced-fields-helpers'; @@ -40,7 +43,7 @@ export const run = async ({ const document = await prisma.document.findFirstOrThrow({ where: { id: documentId, - Recipient: { + recipients: { every: { signingStatus: SigningStatus.SIGNED, }, @@ -48,7 +51,7 @@ export const run = async ({ }, include: { documentMeta: true, - Recipient: true, + recipients: true, team: { select: { teamGlobalSettings: { @@ -102,7 +105,7 @@ export const run = async ({ documentId: document.id, }, include: { - Signature: true, + signature: true, }, }); @@ -258,13 +261,13 @@ export const run = async ({ include: { documentData: true, documentMeta: true, - Recipient: true, + recipients: true, }, }); await triggerWebhook({ event: WebhookTriggerEvents.DOCUMENT_COMPLETED, - data: ZWebhookDocumentSchema.parse(updatedDocument), + data: ZWebhookDocumentSchema.parse(mapDocumentToWebhookDocumentPayload(updatedDocument)), userId: updatedDocument.userId, teamId: updatedDocument.teamId ?? undefined, }); diff --git a/packages/lib/next-auth/auth-options.ts b/packages/lib/next-auth/auth-options.ts index 3559467ef..9aa0c810e 100644 --- a/packages/lib/next-auth/auth-options.ts +++ b/packages/lib/next-auth/auth-options.ts @@ -1,6 +1,7 @@ /// import { PrismaAdapter } from '@next-auth/prisma-adapter'; import { compare } from '@node-rs/bcrypt'; +import { Prisma } from '@prisma/client'; import { verifyAuthenticationResponse } from '@simplewebauthn/server'; import { DateTime } from 'luxon'; import type { AuthOptions, Session, User } from 'next-auth'; @@ -27,8 +28,38 @@ import { extractNextAuthRequestMetadata } from '../universal/extract-request-met import { getAuthenticatorOptions } from '../utils/authenticator'; import { ErrorCode } from './error-codes'; +// Delete unrecognized fields from authorization response to comply with +// https://datatracker.ietf.org/doc/html/rfc6749#section-4.1.2 +const prismaAdapter = PrismaAdapter(prisma); + +const unsafe_linkAccount = prismaAdapter.linkAccount!; +const unsafe_accountModel = Prisma.dmmf.datamodel.models.find(({ name }) => name === 'Account'); + +if (!unsafe_accountModel) { + throw new Error('Account model not found'); +} + +// eslint-disable-next-line @typescript-eslint/promise-function-async +prismaAdapter.linkAccount = (data) => { + const availableFields = unsafe_accountModel.fields.map((field) => field.name); + + const newData = Object.keys(data).reduce( + (acc, key) => { + if (availableFields.includes(key)) { + acc[key] = data[key]; + } + + return acc; + }, + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + {} as typeof data, + ); + + return unsafe_linkAccount(newData); +}; + export const NEXT_AUTH_OPTIONS: AuthOptions = { - adapter: PrismaAdapter(prisma), + adapter: prismaAdapter, secret: process.env.NEXTAUTH_SECRET ?? 'secret', session: { strategy: 'jwt', @@ -217,7 +248,7 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { credentialId: Buffer.from(requestBodyCrediential.id, 'base64'), }, include: { - User: { + user: { select: { id: true, email: true, @@ -232,7 +263,7 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { throw new AppError(AppErrorCode.NOT_SETUP); } - const user = passkey.User; + const user = passkey.user; const { rpId, origin } = getAuthenticatorOptions(); diff --git a/packages/lib/package.json b/packages/lib/package.json index 3ab271e5b..cc74d8621 100644 --- a/packages/lib/package.json +++ b/packages/lib/package.json @@ -40,6 +40,7 @@ "@trigger.dev/sdk": "^2.3.18", "@upstash/redis": "^1.20.6", "@vvo/tzdb": "^6.117.0", + "csv-parse": "^5.6.0", "inngest": "^3.19.13", "kysely": "^0.26.3", "luxon": "^3.4.0", diff --git a/packages/lib/server-only/2fa/setup-2fa.ts b/packages/lib/server-only/2fa/setup-2fa.ts index cc08510d0..b5ae47861 100644 --- a/packages/lib/server-only/2fa/setup-2fa.ts +++ b/packages/lib/server-only/2fa/setup-2fa.ts @@ -33,7 +33,7 @@ export const setupTwoFactorAuthentication = async ({ const accountName = user.email; const uri = createTOTPKeyURI(ISSUER, accountName, secret); - const encodedSecret = base32.encode(secret); + const encodedSecret = base32.encode(new Uint8Array(secret)); await prisma.user.update({ where: { diff --git a/packages/lib/server-only/admin/get-all-documents.ts b/packages/lib/server-only/admin/get-all-documents.ts index 1037c3c80..f80967ad9 100644 --- a/packages/lib/server-only/admin/get-all-documents.ts +++ b/packages/lib/server-only/admin/get-all-documents.ts @@ -30,14 +30,14 @@ export const findDocuments = async ({ query, page = 1, perPage = 10 }: FindDocum createdAt: 'desc', }, include: { - User: { + user: { select: { id: true, name: true, email: true, }, }, - Recipient: true, + recipients: true, }, }), prisma.document.count({ diff --git a/packages/lib/server-only/admin/get-entire-document.ts b/packages/lib/server-only/admin/get-entire-document.ts index 7e40ee6df..0a31935df 100644 --- a/packages/lib/server-only/admin/get-entire-document.ts +++ b/packages/lib/server-only/admin/get-entire-document.ts @@ -12,18 +12,18 @@ export const getEntireDocument = async ({ id }: GetEntireDocumentOptions) => { include: { documentMeta: true, documentAccessToken: true, - User: { + user: { select: { id: true, name: true, email: true, }, }, - Recipient: { + recipients: { include: { - Field: { + fields: { include: { - Signature: true, + signature: true, }, }, }, diff --git a/packages/lib/server-only/admin/get-signing-volume.ts b/packages/lib/server-only/admin/get-signing-volume.ts index 819bdaeb9..964d68ea5 100644 --- a/packages/lib/server-only/admin/get-signing-volume.ts +++ b/packages/lib/server-only/admin/get-signing-volume.ts @@ -1,5 +1,5 @@ -import { prisma } from '@documenso/prisma'; -import { DocumentStatus, Prisma } from '@documenso/prisma/client'; +import { kyselyPrisma, sql } from '@documenso/prisma'; +import { DocumentStatus, SubscriptionStatus } from '@documenso/prisma/client'; export type SigningVolume = { id: number; @@ -24,92 +24,78 @@ export async function getSigningVolume({ sortBy = 'signingVolume', sortOrder = 'desc', }: GetSigningVolumeOptions) { - const whereClause = Prisma.validator()({ - status: 'ACTIVE', - OR: [ - { - User: { - OR: [ - { name: { contains: search, mode: 'insensitive' } }, - { email: { contains: search, mode: 'insensitive' } }, - ], - }, - }, - { - team: { - name: { contains: search, mode: 'insensitive' }, - }, - }, - ], - }); + const offset = Math.max(page - 1, 0) * perPage; - const [subscriptions, totalCount] = await Promise.all([ - prisma.subscription.findMany({ - where: whereClause, - include: { - User: { - select: { - name: true, - email: true, - Document: { - where: { - status: DocumentStatus.COMPLETED, - deletedAt: null, - teamId: null, - }, - }, - }, - }, - team: { - select: { - name: true, - document: { - where: { - status: DocumentStatus.COMPLETED, - deletedAt: null, - }, - }, - }, - }, - }, - orderBy: - sortBy === 'name' - ? [{ User: { name: sortOrder } }, { team: { name: sortOrder } }, { createdAt: 'desc' }] - : sortBy === 'createdAt' - ? [{ createdAt: sortOrder }] - : undefined, - skip: Math.max(page - 1, 0) * perPage, - take: perPage, - }), - prisma.subscription.count({ - where: whereClause, - }), - ]); + let findQuery = kyselyPrisma.$kysely + .selectFrom('Subscription as s') + .leftJoin('User as u', 's.userId', 'u.id') + .leftJoin('Team as t', 's.teamId', 't.id') + .leftJoin('Document as ud', (join) => + join + .onRef('u.id', '=', 'ud.userId') + .on('ud.status', '=', sql.lit(DocumentStatus.COMPLETED)) + .on('ud.deletedAt', 'is', null) + .on('ud.teamId', 'is', null), + ) + .leftJoin('Document as td', (join) => + join + .onRef('t.id', '=', 'td.teamId') + .on('td.status', '=', sql.lit(DocumentStatus.COMPLETED)) + .on('td.deletedAt', 'is', null), + ) + // @ts-expect-error - Raw SQL enum casting not properly typed by Kysely + .where(sql`s.status = ${SubscriptionStatus.ACTIVE}::"SubscriptionStatus"`) + .where((eb) => + eb.or([ + eb('u.name', 'ilike', `%${search}%`), + eb('u.email', 'ilike', `%${search}%`), + eb('t.name', 'ilike', `%${search}%`), + ]), + ) + .select([ + 's.id as id', + 's.createdAt as createdAt', + 's.planId as planId', + sql`COALESCE(u.name, t.name, u.email, 'Unknown')`.as('name'), + sql`COUNT(DISTINCT ud.id) + COUNT(DISTINCT td.id)`.as('signingVolume'), + ]) + .groupBy(['s.id', 'u.name', 't.name', 'u.email']); - const leaderboardWithVolume: SigningVolume[] = subscriptions.map((subscription) => { - const name = - subscription.User?.name || subscription.team?.name || subscription.User?.email || 'Unknown'; - const userSignedDocs = subscription.User?.Document?.length || 0; - const teamSignedDocs = subscription.team?.document?.length || 0; - return { - id: subscription.id, - name, - signingVolume: userSignedDocs + teamSignedDocs, - createdAt: subscription.createdAt, - planId: subscription.planId, - }; - }); - - if (sortBy === 'signingVolume') { - leaderboardWithVolume.sort((a, b) => { - return sortOrder === 'desc' - ? b.signingVolume - a.signingVolume - : a.signingVolume - b.signingVolume; - }); + switch (sortBy) { + case 'name': + findQuery = findQuery.orderBy('name', sortOrder); + break; + case 'createdAt': + findQuery = findQuery.orderBy('createdAt', sortOrder); + break; + case 'signingVolume': + findQuery = findQuery.orderBy('signingVolume', sortOrder); + break; + default: + findQuery = findQuery.orderBy('signingVolume', 'desc'); } + findQuery = findQuery.limit(perPage).offset(offset); + + const countQuery = kyselyPrisma.$kysely + .selectFrom('Subscription as s') + .leftJoin('User as u', 's.userId', 'u.id') + .leftJoin('Team as t', 's.teamId', 't.id') + // @ts-expect-error - Raw SQL enum casting not properly typed by Kysely + .where(sql`s.status = ${SubscriptionStatus.ACTIVE}::"SubscriptionStatus"`) + .where((eb) => + eb.or([ + eb('u.name', 'ilike', `%${search}%`), + eb('u.email', 'ilike', `%${search}%`), + eb('t.name', 'ilike', `%${search}%`), + ]), + ) + .select(({ fn }) => [fn.countAll().as('count')]); + + const [results, [{ count }]] = await Promise.all([findQuery.execute(), countQuery.execute()]); + return { - leaderboard: leaderboardWithVolume, - totalPages: Math.ceil(totalCount / perPage), + leaderboard: results, + totalPages: Math.ceil(Number(count) / perPage), }; } diff --git a/packages/lib/server-only/admin/get-users-stats.ts b/packages/lib/server-only/admin/get-users-stats.ts index 0f4a2f0b4..6dc953181 100644 --- a/packages/lib/server-only/admin/get-users-stats.ts +++ b/packages/lib/server-only/admin/get-users-stats.ts @@ -10,7 +10,7 @@ export const getUsersCount = async () => { export const getUsersWithSubscriptionsCount = async () => { return await prisma.user.count({ where: { - Subscription: { + subscriptions: { some: { status: SubscriptionStatus.ACTIVE, }, @@ -22,7 +22,7 @@ export const getUsersWithSubscriptionsCount = async () => { export const getUserWithAtLeastOneDocumentPerMonth = async () => { return await prisma.user.count({ where: { - Document: { + documents: { some: { createdAt: { gte: DateTime.now().minus({ months: 1 }).toJSDate(), @@ -36,7 +36,7 @@ export const getUserWithAtLeastOneDocumentPerMonth = async () => { export const getUserWithAtLeastOneDocumentSignedPerMonth = async () => { return await prisma.user.count({ where: { - Document: { + documents: { some: { status: { equals: DocumentStatus.COMPLETED, diff --git a/packages/lib/server-only/auth/send-confirmation-email.ts b/packages/lib/server-only/auth/send-confirmation-email.ts index 5673d9603..36b256965 100644 --- a/packages/lib/server-only/auth/send-confirmation-email.ts +++ b/packages/lib/server-only/auth/send-confirmation-email.ts @@ -23,7 +23,7 @@ export const sendConfirmationEmail = async ({ userId }: SendConfirmationEmailPro id: userId, }, include: { - VerificationToken: { + verificationTokens: { orderBy: { createdAt: 'desc', }, @@ -32,7 +32,7 @@ export const sendConfirmationEmail = async ({ userId }: SendConfirmationEmailPro }, }); - const [verificationToken] = user.VerificationToken; + const [verificationToken] = user.verificationTokens; if (!verificationToken?.token) { throw new Error('Verification token not found for the user'); diff --git a/packages/lib/server-only/auth/send-forgot-password.ts b/packages/lib/server-only/auth/send-forgot-password.ts index fef1543c3..6bf5da3e9 100644 --- a/packages/lib/server-only/auth/send-forgot-password.ts +++ b/packages/lib/server-only/auth/send-forgot-password.ts @@ -20,7 +20,7 @@ export const sendForgotPassword = async ({ userId }: SendForgotPasswordOptions) id: userId, }, include: { - PasswordResetToken: { + passwordResetTokens: { orderBy: { createdAt: 'desc', }, @@ -33,7 +33,7 @@ export const sendForgotPassword = async ({ userId }: SendForgotPasswordOptions) throw new Error('User not found'); } - const token = user.PasswordResetToken[0].token; + const token = user.passwordResetTokens[0].token; const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL() || 'http://localhost:3000'; const resetPasswordLink = `${NEXT_PUBLIC_WEBAPP_URL()}/reset-password/${token}`; 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 c6f4fd7a3..bec1a6404 100644 --- a/packages/lib/server-only/document-meta/upsert-document-meta.ts +++ b/packages/lib/server-only/document-meta/upsert-document-meta.ts @@ -1,7 +1,7 @@ 'use server'; import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; -import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; import { createDocumentAuditLogData, diffDocumentMetaChanges, @@ -10,9 +10,12 @@ import { prisma } from '@documenso/prisma'; import type { DocumentDistributionMethod, DocumentSigningOrder } from '@documenso/prisma/client'; import type { SupportedLanguageCodes } from '../../constants/i18n'; +import { AppError, AppErrorCode } from '../../errors/app-error'; import type { TDocumentEmailSettings } from '../../types/document-email'; export type CreateDocumentMetaOptions = { + userId: number; + teamId?: number; documentId: number; subject?: string; message?: string; @@ -25,18 +28,18 @@ export type CreateDocumentMetaOptions = { distributionMethod?: DocumentDistributionMethod; typedSignatureEnabled?: boolean; language?: SupportedLanguageCodes; - userId: number; - requestMetadata: RequestMetadata; + requestMetadata: ApiRequestMetadata; }; export const upsertDocumentMeta = async ({ + userId, + teamId, subject, message, timezone, dateFormat, documentId, password, - userId, redirectUrl, signingOrder, emailSettings, @@ -45,40 +48,38 @@ export const upsertDocumentMeta = async ({ language, requestMetadata, }: CreateDocumentMetaOptions) => { - const user = await prisma.user.findFirstOrThrow({ - where: { - id: userId, - }, - select: { - id: true, - email: true, - name: true, - }, - }); - - const { documentMeta: originalDocumentMeta } = await prisma.document.findFirstOrThrow({ + const document = await prisma.document.findFirst({ where: { id: documentId, - OR: [ - { - userId: user.id, - }, - { - team: { - members: { - some: { - userId: user.id, + ...(teamId + ? { + team: { + id: teamId, + members: { + some: { + userId, + }, }, }, - }, - }, - ], + } + : { + userId, + teamId: null, + }), }, include: { documentMeta: true, }, }); + if (!document) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'Document not found', + }); + } + + const { documentMeta: originalDocumentMeta } = document; + return await prisma.$transaction(async (tx) => { const upsertedDocumentMeta = await tx.documentMeta.upsert({ where: { @@ -120,8 +121,7 @@ export const upsertDocumentMeta = async ({ data: createDocumentAuditLogData({ type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_META_UPDATED, documentId, - user, - requestMetadata, + metadata: requestMetadata, data: { changes: diffDocumentMetaChanges(originalDocumentMeta ?? {}, upsertedDocumentMeta), }, diff --git a/packages/lib/server-only/document/complete-document-with-token.ts b/packages/lib/server-only/document/complete-document-with-token.ts index c7cc9491e..8db7a7abe 100644 --- a/packages/lib/server-only/document/complete-document-with-token.ts +++ b/packages/lib/server-only/document/complete-document-with-token.ts @@ -14,7 +14,10 @@ import { import { jobs } from '../../jobs/client'; import type { TRecipientActionAuth } from '../../types/document-auth'; -import { ZWebhookDocumentSchema } from '../../types/webhook-payload'; +import { + ZWebhookDocumentSchema, + mapDocumentToWebhookDocumentPayload, +} from '../../types/webhook-payload'; import { getIsRecipientsTurnToSign } from '../recipient/get-is-recipient-turn'; import { triggerWebhook } from '../webhooks/trigger/trigger-webhook'; import { sendPendingEmail } from './send-pending-email'; @@ -31,7 +34,7 @@ const getDocument = async ({ token, documentId }: CompleteDocumentWithTokenOptio return await prisma.document.findFirstOrThrow({ where: { id: documentId, - Recipient: { + recipients: { some: { token, }, @@ -39,7 +42,7 @@ const getDocument = async ({ token, documentId }: CompleteDocumentWithTokenOptio }, include: { documentMeta: true, - Recipient: { + recipients: { where: { token, }, @@ -59,11 +62,11 @@ export const completeDocumentWithToken = async ({ throw new Error(`Document ${document.id} must be pending`); } - if (document.Recipient.length === 0) { + if (document.recipients.length === 0) { throw new Error(`Document ${document.id} has no recipient with token ${token}`); } - const [recipient] = document.Recipient; + const [recipient] = document.recipients; if (recipient.signingStatus === SigningStatus.SIGNED) { throw new Error(`Recipient ${recipient.id} has already signed`); @@ -195,7 +198,7 @@ export const completeDocumentWithToken = async ({ const haveAllRecipientsSigned = await prisma.document.findFirst({ where: { id: document.id, - Recipient: { + recipients: { every: { OR: [{ signingStatus: SigningStatus.SIGNED }, { role: RecipientRole.CC }], }, @@ -219,13 +222,13 @@ export const completeDocumentWithToken = async ({ }, include: { documentMeta: true, - Recipient: true, + recipients: true, }, }); await triggerWebhook({ event: WebhookTriggerEvents.DOCUMENT_SIGNED, - data: ZWebhookDocumentSchema.parse(updatedDocument), + data: ZWebhookDocumentSchema.parse(mapDocumentToWebhookDocumentPayload(updatedDocument)), userId: updatedDocument.userId, teamId: updatedDocument.teamId ?? undefined, }); diff --git a/packages/lib/server-only/document/create-document-v2.ts b/packages/lib/server-only/document/create-document-v2.ts new file mode 100644 index 000000000..222e23445 --- /dev/null +++ b/packages/lib/server-only/document/create-document-v2.ts @@ -0,0 +1,248 @@ +import { isUserEnterprise } from '@documenso/ee/server-only/util/is-document-enterprise'; +import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; +import { normalizePdf as makeNormalizedPdf } from '@documenso/lib/server-only/pdf/normalize-pdf'; +import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; +import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import { nanoid } from '@documenso/lib/universal/id'; +import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs'; +import { prisma } from '@documenso/prisma'; +import type { DocumentVisibility, TemplateMeta } from '@documenso/prisma/client'; +import { + DocumentSource, + RecipientRole, + SendStatus, + SigningStatus, + WebhookTriggerEvents, +} from '@documenso/prisma/client'; +import { TeamMemberRole } from '@documenso/prisma/client'; +import type { TCreateDocumentV2Request } from '@documenso/trpc/server/document-router/schema'; + +import type { TDocumentAccessAuthTypes, TDocumentActionAuthTypes } from '../../types/document-auth'; +import type { TDocumentFormValues } from '../../types/document-form-values'; +import { + ZWebhookDocumentSchema, + mapDocumentToWebhookDocumentPayload, +} from '../../types/webhook-payload'; +import { getFile } from '../../universal/upload/get-file'; +import { putPdfFile } from '../../universal/upload/put-file'; +import { createDocumentAuthOptions, createRecipientAuthOptions } from '../../utils/document-auth'; +import { determineDocumentVisibility } from '../../utils/document-visibility'; +import { triggerWebhook } from '../webhooks/trigger/trigger-webhook'; + +export type CreateDocumentOptions = { + userId: number; + teamId?: number; + documentDataId: string; + normalizePdf?: boolean; + data: { + title: string; + externalId?: string; + visibility?: DocumentVisibility; + globalAccessAuth?: TDocumentAccessAuthTypes; + globalActionAuth?: TDocumentActionAuthTypes; + formValues?: TDocumentFormValues; + recipients: TCreateDocumentV2Request['recipients']; + }; + meta?: Partial>; + requestMetadata: ApiRequestMetadata; +}; + +export const createDocumentV2 = async ({ + userId, + teamId, + documentDataId, + normalizePdf, + data, + meta, + requestMetadata, +}: CreateDocumentOptions) => { + const { title, formValues } = data; + + const team = teamId + ? await prisma.team.findFirst({ + where: { + id: teamId, + members: { + some: { + userId, + }, + }, + }, + include: { + teamGlobalSettings: true, + members: { + where: { + userId: userId, + }, + select: { + role: true, + }, + }, + }, + }) + : null; + + if (teamId !== undefined && !team) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'Team not found', + }); + } + + if (normalizePdf) { + const documentData = await prisma.documentData.findFirst({ + where: { + id: documentDataId, + }, + }); + + if (documentData) { + const buffer = await getFile(documentData); + + const normalizedPdf = await makeNormalizedPdf(Buffer.from(buffer)); + + const newDocumentData = await putPdfFile({ + name: title.endsWith('.pdf') ? title : `${title}.pdf`, + type: 'application/pdf', + arrayBuffer: async () => Promise.resolve(normalizedPdf), + }); + + // eslint-disable-next-line require-atomic-updates + documentDataId = newDocumentData.id; + } + } + + const authOptions = createDocumentAuthOptions({ + globalAccessAuth: data?.globalAccessAuth || null, + globalActionAuth: data?.globalActionAuth || null, + }); + + const recipientsHaveActionAuth = data.recipients?.some((recipient) => recipient.actionAuth); + + // Check if user has permission to set the global action auth. + if (authOptions.globalActionAuth || recipientsHaveActionAuth) { + const isDocumentEnterprise = await isUserEnterprise({ + userId, + teamId, + }); + + if (!isDocumentEnterprise) { + throw new AppError(AppErrorCode.UNAUTHORIZED, { + message: 'You do not have permission to set the action auth', + }); + } + } + + const visibility = determineDocumentVisibility( + team?.teamGlobalSettings?.documentVisibility, + team?.members[0].role ?? TeamMemberRole.MEMBER, + ); + + return await prisma.$transaction(async (tx) => { + const document = await tx.document.create({ + data: { + title, + externalId: data.externalId, + documentDataId, + userId, + teamId, + authOptions, + visibility, + formValues, + source: DocumentSource.DOCUMENT, + documentMeta: { + create: { + ...meta, + signingOrder: meta?.signingOrder || undefined, + emailSettings: meta?.emailSettings || undefined, + language: meta?.language || team?.teamGlobalSettings?.documentLanguage, + typedSignatureEnabled: + meta?.typedSignatureEnabled ?? team?.teamGlobalSettings?.typedSignatureEnabled, + }, + }, + }, + }); + + await Promise.all( + (data.recipients || []).map(async (recipient) => { + const recipientAuthOptions = createRecipientAuthOptions({ + accessAuth: recipient.accessAuth || null, + actionAuth: recipient.actionAuth || null, + }); + + await tx.recipient.create({ + data: { + documentId: document.id, + name: recipient.name, + email: recipient.email, + role: recipient.role, + signingOrder: recipient.signingOrder, + token: nanoid(), + sendStatus: recipient.role === RecipientRole.CC ? SendStatus.SENT : SendStatus.NOT_SENT, + signingStatus: + recipient.role === RecipientRole.CC ? SigningStatus.SIGNED : SigningStatus.NOT_SIGNED, + authOptions: recipientAuthOptions, + fields: { + createMany: { + data: (recipient.fields || []).map((field) => ({ + documentId: document.id, + type: field.type, + page: field.pageNumber, + positionX: field.pageX, + positionY: field.pageY, + width: field.width, + height: field.height, + customText: '', + inserted: false, + fieldMeta: field.fieldMeta, + })), + }, + }, + }, + }); + }), + ); + + // Todo: Is it necessary to create a full audit log with all fields and recipients audit logs? + + await tx.documentAuditLog.create({ + data: createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_CREATED, + documentId: document.id, + metadata: requestMetadata, + data: { + title, + source: { + type: DocumentSource.DOCUMENT, + }, + }, + }), + }); + + const createdDocument = await tx.document.findFirst({ + where: { + id: document.id, + }, + include: { + documentData: true, + documentMeta: true, + recipients: true, + fields: true, + }, + }); + + if (!createdDocument) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'Document not found', + }); + } + + await triggerWebhook({ + event: WebhookTriggerEvents.DOCUMENT_CREATED, + data: ZWebhookDocumentSchema.parse(mapDocumentToWebhookDocumentPayload(createdDocument)), + userId, + teamId, + }); + + return createdDocument; + }); +}; diff --git a/packages/lib/server-only/document/create-document.ts b/packages/lib/server-only/document/create-document.ts index a0b857fbf..5912d7314 100644 --- a/packages/lib/server-only/document/create-document.ts +++ b/packages/lib/server-only/document/create-document.ts @@ -1,21 +1,22 @@ 'use server'; -import type { z } from 'zod'; - import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; import { normalizePdf as makeNormalizedPdf } from '@documenso/lib/server-only/pdf/normalize-pdf'; import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; -import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs'; import { prisma } from '@documenso/prisma'; -import { DocumentSource, DocumentVisibility, WebhookTriggerEvents } from '@documenso/prisma/client'; +import { DocumentSource, WebhookTriggerEvents } from '@documenso/prisma/client'; import type { Team, TeamGlobalSettings } from '@documenso/prisma/client'; import { TeamMemberRole } from '@documenso/prisma/client'; -import { DocumentSchema } from '@documenso/prisma/generated/zod'; -import { ZWebhookDocumentSchema } from '../../types/webhook-payload'; +import { + ZWebhookDocumentSchema, + mapDocumentToWebhookDocumentPayload, +} from '../../types/webhook-payload'; import { getFile } from '../../universal/upload/get-file'; import { putPdfFile } from '../../universal/upload/put-file'; +import { determineDocumentVisibility } from '../../utils/document-visibility'; import { triggerWebhook } from '../webhooks/trigger/trigger-webhook'; export type CreateDocumentOptions = { @@ -27,13 +28,9 @@ export type CreateDocumentOptions = { formValues?: Record; normalizePdf?: boolean; timezone?: string; - requestMetadata?: RequestMetadata; + requestMetadata: ApiRequestMetadata; }; -export const ZCreateDocumentResponseSchema = DocumentSchema; - -export type TCreateDocumentResponse = z.infer; - export const createDocument = async ({ userId, title, @@ -44,7 +41,7 @@ export const createDocument = async ({ formValues, requestMetadata, timezone, -}: CreateDocumentOptions): Promise => { +}: CreateDocumentOptions) => { const user = await prisma.user.findFirstOrThrow({ where: { id: userId, @@ -92,25 +89,6 @@ export const createDocument = async ({ userTeamRole = teamWithUserRole.members[0]?.role; } - const determineVisibility = ( - globalVisibility: DocumentVisibility | null | undefined, - userRole: TeamMemberRole, - ): DocumentVisibility => { - if (globalVisibility) { - return globalVisibility; - } - - if (userRole === TeamMemberRole.ADMIN) { - return DocumentVisibility.ADMIN; - } - - if (userRole === TeamMemberRole.MANAGER) { - return DocumentVisibility.MANAGER_AND_ABOVE; - } - - return DocumentVisibility.EVERYONE; - }; - if (normalizePdf) { const documentData = await prisma.documentData.findFirst({ where: { @@ -142,7 +120,7 @@ export const createDocument = async ({ documentDataId, userId, teamId, - visibility: determineVisibility( + visibility: determineDocumentVisibility( team?.teamGlobalSettings?.documentVisibility, userTeamRole ?? TeamMemberRole.MEMBER, ), @@ -162,8 +140,7 @@ export const createDocument = async ({ data: createDocumentAuditLogData({ type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_CREATED, documentId: document.id, - user, - requestMetadata, + metadata: requestMetadata, data: { title, source: { @@ -179,7 +156,7 @@ export const createDocument = async ({ }, include: { documentMeta: true, - Recipient: true, + recipients: true, }, }); @@ -189,7 +166,7 @@ export const createDocument = async ({ await triggerWebhook({ event: WebhookTriggerEvents.DOCUMENT_CREATED, - data: ZWebhookDocumentSchema.parse(createdDocument), + data: ZWebhookDocumentSchema.parse(mapDocumentToWebhookDocumentPayload(createdDocument)), userId, teamId, }); diff --git a/packages/lib/server-only/document/delete-document.ts b/packages/lib/server-only/document/delete-document.ts index f4d1beecc..43c815558 100644 --- a/packages/lib/server-only/document/delete-document.ts +++ b/packages/lib/server-only/document/delete-document.ts @@ -15,23 +15,29 @@ import type { TeamGlobalSettings, User, } from '@documenso/prisma/client'; -import { DocumentStatus, SendStatus } from '@documenso/prisma/client'; +import { DocumentStatus, SendStatus, WebhookTriggerEvents } from '@documenso/prisma/client'; import { getI18nInstance } from '../../client-only/providers/i18n.server'; import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; import { FROM_ADDRESS, FROM_NAME } from '../../constants/email'; +import { AppError, AppErrorCode } from '../../errors/app-error'; import { DOCUMENT_AUDIT_LOG_TYPE } from '../../types/document-audit-logs'; import { extractDerivedDocumentEmailSettings } from '../../types/document-email'; -import type { RequestMetadata } from '../../universal/extract-request-metadata'; +import { + ZWebhookDocumentSchema, + mapDocumentToWebhookDocumentPayload, +} from '../../types/webhook-payload'; +import type { ApiRequestMetadata } from '../../universal/extract-request-metadata'; import { createDocumentAuditLogData } from '../../utils/document-audit-logs'; import { renderEmailWithI18N } from '../../utils/render-email-with-i18n'; import { teamGlobalSettingsToBranding } from '../../utils/team-global-settings-to-branding'; +import { triggerWebhook } from '../webhooks/trigger/trigger-webhook'; export type DeleteDocumentOptions = { id: number; userId: number; teamId?: number; - requestMetadata?: RequestMetadata; + requestMetadata: ApiRequestMetadata; }; export const deleteDocument = async ({ @@ -47,7 +53,9 @@ export const deleteDocument = async ({ }); if (!user) { - throw new Error('User not found'); + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'User not found', + }); } const document = await prisma.document.findUnique({ @@ -55,7 +63,7 @@ export const deleteDocument = async ({ id, }, include: { - Recipient: true, + recipients: true, documentMeta: true, team: { include: { @@ -67,15 +75,19 @@ export const deleteDocument = async ({ }); if (!document || (teamId !== undefined && teamId !== document.teamId)) { - throw new Error('Document not found'); + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'Document not found', + }); } const isUserOwner = document.userId === userId; const isUserTeamMember = document.team?.members.some((member) => member.userId === userId); - const userRecipient = document.Recipient.find((recipient) => recipient.email === user.email); + const userRecipient = document.recipients.find((recipient) => recipient.email === user.email); if (!isUserOwner && !isUserTeamMember && !userRecipient) { - throw new Error('Not allowed'); + throw new AppError(AppErrorCode.UNAUTHORIZED, { + message: 'Not allowed', + }); } // Handle hard or soft deleting the actual document if user has permission. @@ -105,6 +117,13 @@ export const deleteDocument = async ({ }); } + await triggerWebhook({ + event: WebhookTriggerEvents.DOCUMENT_CANCELLED, + data: ZWebhookDocumentSchema.parse(mapDocumentToWebhookDocumentPayload(document)), + userId, + teamId, + }); + // Return partial document for API v1 response. return { id: document.id, @@ -121,7 +140,7 @@ export const deleteDocument = async ({ type HandleDocumentOwnerDeleteOptions = { document: Document & { - Recipient: Recipient[]; + recipients: Recipient[]; documentMeta: DocumentMeta | null; }; team?: @@ -130,7 +149,7 @@ type HandleDocumentOwnerDeleteOptions = { }) | null; user: User; - requestMetadata?: RequestMetadata; + requestMetadata: ApiRequestMetadata; }; const handleDocumentOwnerDelete = async ({ @@ -150,8 +169,7 @@ const handleDocumentOwnerDelete = async ({ data: createDocumentAuditLogData({ documentId: document.id, type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_DELETED, - user, - requestMetadata, + metadata: requestMetadata, data: { type: 'SOFT', }, @@ -177,8 +195,7 @@ const handleDocumentOwnerDelete = async ({ data: createDocumentAuditLogData({ documentId: document.id, type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_DELETED, - user, - requestMetadata, + metadata: requestMetadata, data: { type: 'HARD', }, @@ -205,7 +222,7 @@ const handleDocumentOwnerDelete = async ({ // Send cancellation emails to recipients. await Promise.all( - document.Recipient.map(async (recipient) => { + document.recipients.map(async (recipient) => { if (recipient.sendStatus !== SendStatus.SENT) { return; } diff --git a/packages/lib/server-only/document/duplicate-document-by-id.ts b/packages/lib/server-only/document/duplicate-document-by-id.ts index 1c7d0a38d..7206403c1 100644 --- a/packages/lib/server-only/document/duplicate-document-by-id.ts +++ b/packages/lib/server-only/document/duplicate-document-by-id.ts @@ -1,8 +1,7 @@ -import { z } from 'zod'; - import { prisma } from '@documenso/prisma'; import { DocumentSource, type Prisma } from '@documenso/prisma/client'; +import { AppError, AppErrorCode } from '../../errors/app-error'; import { getDocumentWhereInput } from './get-document-by-id'; export interface DuplicateDocumentOptions { @@ -11,24 +10,18 @@ export interface DuplicateDocumentOptions { teamId?: number; } -export const ZDuplicateDocumentResponseSchema = z.object({ - documentId: z.number(), -}); - -export type TDuplicateDocumentResponse = z.infer; - export const duplicateDocument = async ({ documentId, userId, teamId, -}: DuplicateDocumentOptions): Promise => { +}: DuplicateDocumentOptions) => { const documentWhereInput = await getDocumentWhereInput({ documentId, userId, teamId, }); - const document = await prisma.document.findUniqueOrThrow({ + const document = await prisma.document.findFirst({ where: documentWhereInput, select: { title: true, @@ -53,10 +46,16 @@ export const duplicateDocument = async ({ }, }); + if (!document) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'Document not found', + }); + } + const createDocumentArguments: Prisma.DocumentCreateArgs = { data: { title: document.title, - User: { + user: { connect: { id: document.userId, }, diff --git a/packages/lib/server-only/document/find-document-audit-logs.ts b/packages/lib/server-only/document/find-document-audit-logs.ts index d9eb4d7fd..a0108180d 100644 --- a/packages/lib/server-only/document/find-document-audit-logs.ts +++ b/packages/lib/server-only/document/find-document-audit-logs.ts @@ -8,6 +8,7 @@ import { parseDocumentAuditLogData } from '../../utils/document-audit-logs'; export interface FindDocumentAuditLogsOptions { userId: number; + teamId?: number; documentId: number; page?: number; perPage?: number; @@ -21,6 +22,7 @@ export interface FindDocumentAuditLogsOptions { export const findDocumentAuditLogs = async ({ userId, + teamId, documentId, page = 1, perPage = 30, @@ -34,20 +36,21 @@ export const findDocumentAuditLogs = async ({ const document = await prisma.document.findFirst({ where: { id: documentId, - OR: [ - { - userId, - }, - { - team: { - members: { - some: { - userId, + ...(teamId + ? { + team: { + id: teamId, + members: { + some: { + userId, + }, }, }, - }, - }, - ], + } + : { + userId, + teamId: null, + }), }, }); diff --git a/packages/lib/server-only/document/find-documents.ts b/packages/lib/server-only/document/find-documents.ts index ad53af829..160b1b2ce 100644 --- a/packages/lib/server-only/document/find-documents.ts +++ b/packages/lib/server-only/document/find-documents.ts @@ -1,6 +1,5 @@ import { DateTime } from 'luxon'; import { match } from 'ts-pattern'; -import type { z } from 'zod'; import { prisma } from '@documenso/prisma'; import type { @@ -12,16 +11,10 @@ import type { User, } from '@documenso/prisma/client'; import { RecipientRole, SigningStatus, TeamMemberRole } from '@documenso/prisma/client'; -import { - DocumentSchema, - RecipientSchema, - TeamSchema, - UserSchema, -} from '@documenso/prisma/generated/zod'; import { ExtendedDocumentStatus } from '@documenso/prisma/types/extended-document-status'; import { DocumentVisibility } from '../../types/document-visibility'; -import { type FindResultResponse, ZFindResultResponse } from '../../types/search-params'; +import { type FindResultResponse } from '../../types/search-params'; import { maskRecipientTokensForDocument } from '../../utils/mask-recipient-tokens-for-document'; export type PeriodSelectorValue = '' | '7d' | '14d' | '30d'; @@ -43,23 +36,6 @@ export type FindDocumentsOptions = { query?: string; }; -export const ZFindDocumentsResponseSchema = ZFindResultResponse.extend({ - data: DocumentSchema.extend({ - User: UserSchema.pick({ - id: true, - name: true, - email: true, - }), - Recipient: RecipientSchema.array(), - team: TeamSchema.pick({ - id: true, - url: true, - }).nullable(), - }).array(), // Todo: openapi remap. -}); - -export type TFindDocumentsResponse = z.infer; - export const findDocuments = async ({ userId, teamId, @@ -72,7 +48,7 @@ export const findDocuments = async ({ period, senderIds, query, -}: FindDocumentsOptions): Promise => { +}: FindDocumentsOptions) => { const user = await prisma.user.findFirstOrThrow({ where: { id: userId, @@ -112,8 +88,8 @@ export const findDocuments = async ({ const searchFilter: Prisma.DocumentWhereInput = { OR: [ { title: { contains: query, mode: 'insensitive' } }, - { Recipient: { some: { name: { contains: query, mode: 'insensitive' } } } }, - { Recipient: { some: { email: { contains: query, mode: 'insensitive' } } } }, + { recipients: { some: { name: { contains: query, mode: 'insensitive' } } } }, + { recipients: { some: { email: { contains: query, mode: 'insensitive' } } } }, ], }; @@ -137,7 +113,7 @@ export const findDocuments = async ({ { OR: [ { - Recipient: { + recipients: { some: { email: user.email, }, @@ -174,7 +150,7 @@ export const findDocuments = async ({ deletedAt: null, }, { - Recipient: { + recipients: { some: { email: user.email, documentDeletedAt: null, @@ -195,13 +171,13 @@ export const findDocuments = async ({ deletedAt: null, }, { - User: { + user: { email: team.teamEmail.email, }, deletedAt: null, }, { - Recipient: { + recipients: { some: { email: team.teamEmail.email, documentDeletedAt: null, @@ -266,14 +242,14 @@ export const findDocuments = async ({ [orderByColumn]: orderByDirection, }, include: { - User: { + user: { select: { id: true, name: true, email: true, }, }, - Recipient: true, + recipients: true, team: { select: { id: true, @@ -313,7 +289,7 @@ const findDocumentsFilter = (status: ExtendedDocumentStatus, user: User) => { }, { status: ExtendedDocumentStatus.COMPLETED, - Recipient: { + recipients: { some: { email: user.email, }, @@ -321,7 +297,7 @@ const findDocumentsFilter = (status: ExtendedDocumentStatus, user: User) => { }, { status: ExtendedDocumentStatus.PENDING, - Recipient: { + recipients: { some: { email: user.email, }, @@ -333,7 +309,7 @@ const findDocumentsFilter = (status: ExtendedDocumentStatus, user: User) => { status: { not: ExtendedDocumentStatus.DRAFT, }, - Recipient: { + recipients: { some: { email: user.email, signingStatus: SigningStatus.NOT_SIGNED, @@ -357,7 +333,7 @@ const findDocumentsFilter = (status: ExtendedDocumentStatus, user: User) => { }, { status: ExtendedDocumentStatus.PENDING, - Recipient: { + recipients: { some: { email: user.email, signingStatus: SigningStatus.SIGNED, @@ -378,7 +354,7 @@ const findDocumentsFilter = (status: ExtendedDocumentStatus, user: User) => { }, { status: ExtendedDocumentStatus.COMPLETED, - Recipient: { + recipients: { some: { email: user.email, }, @@ -443,7 +419,7 @@ const findTeamDocumentsFilter = ( status: { not: ExtendedDocumentStatus.DRAFT, }, - Recipient: { + recipients: { some: { email: teamEmail, }, @@ -453,7 +429,7 @@ const findTeamDocumentsFilter = ( // Filter to display all documents that have been sent by the team email. filter.OR.push({ - User: { + user: { email: teamEmail, }, OR: visibilityFilters, @@ -472,7 +448,7 @@ const findTeamDocumentsFilter = ( status: { not: ExtendedDocumentStatus.DRAFT, }, - Recipient: { + recipients: { some: { email: teamEmail, signingStatus: SigningStatus.NOT_SIGNED, @@ -498,7 +474,7 @@ const findTeamDocumentsFilter = ( if (teamEmail && filter.OR) { filter.OR.push({ status: ExtendedDocumentStatus.DRAFT, - User: { + user: { email: teamEmail, }, OR: visibilityFilters, @@ -523,7 +499,7 @@ const findTeamDocumentsFilter = ( status: ExtendedDocumentStatus.PENDING, OR: [ { - Recipient: { + recipients: { some: { email: teamEmail, signingStatus: SigningStatus.SIGNED, @@ -535,7 +511,7 @@ const findTeamDocumentsFilter = ( OR: visibilityFilters, }, { - User: { + user: { email: teamEmail, }, OR: visibilityFilters, @@ -560,7 +536,7 @@ const findTeamDocumentsFilter = ( if (teamEmail && filter.OR) { filter.OR.push( { - Recipient: { + recipients: { some: { email: teamEmail, }, @@ -568,7 +544,7 @@ const findTeamDocumentsFilter = ( OR: visibilityFilters, }, { - User: { + user: { email: teamEmail, }, OR: visibilityFilters, diff --git a/packages/lib/server-only/document/get-document-by-id.ts b/packages/lib/server-only/document/get-document-by-id.ts index 93bd79259..5ab59feec 100644 --- a/packages/lib/server-only/document/get-document-by-id.ts +++ b/packages/lib/server-only/document/get-document-by-id.ts @@ -26,14 +26,14 @@ export const getDocumentById = async ({ documentId, userId, teamId }: GetDocumen include: { documentData: true, documentMeta: true, - User: { + user: { select: { id: true, name: true, email: true, }, }, - Recipient: { + recipients: { select: { email: true, }, @@ -119,14 +119,14 @@ export const getDocumentWhereInput = async ({ if (team.teamEmail) { documentWhereInput.OR.push( { - Recipient: { + recipients: { some: { email: team.teamEmail.email, }, }, }, { - User: { + user: { email: team.teamEmail.email, }, }, @@ -154,7 +154,7 @@ export const getDocumentWhereInput = async ({ { OR: [ { - Recipient: { + recipients: { some: { email: user.email, }, diff --git a/packages/lib/server-only/document/get-document-by-token.ts b/packages/lib/server-only/document/get-document-by-token.ts index 3fc79709b..f4d5615a3 100644 --- a/packages/lib/server-only/document/get-document-by-token.ts +++ b/packages/lib/server-only/document/get-document-by-token.ts @@ -41,7 +41,7 @@ export const getDocumentByToken = async ({ token }: GetDocumentByTokenOptions) = const result = await prisma.document.findFirstOrThrow({ where: { - Recipient: { + recipients: { some: { token, }, @@ -66,17 +66,17 @@ export const getDocumentAndSenderByToken = async ({ const result = await prisma.document.findFirstOrThrow({ where: { - Recipient: { + recipients: { some: { token, }, }, }, include: { - User: true, + user: true, documentData: true, documentMeta: true, - Recipient: { + recipients: { where: { token, }, @@ -96,9 +96,9 @@ export const getDocumentAndSenderByToken = async ({ }); // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars - const { password: _password, ...User } = result.User; + const { password: _password, ...user } = result.user; - const recipient = result.Recipient[0]; + const recipient = result.recipients[0]; // Sanity check, should not be possible. if (!recipient) { @@ -125,7 +125,7 @@ export const getDocumentAndSenderByToken = async ({ return { ...result, - User, + user, }; }; @@ -144,14 +144,14 @@ export const getDocumentAndRecipientByToken = async ({ const result = await prisma.document.findFirstOrThrow({ where: { - Recipient: { + recipients: { some: { token, }, }, }, include: { - Recipient: { + recipients: { where: { token, }, @@ -160,7 +160,7 @@ export const getDocumentAndRecipientByToken = async ({ }, }); - const [recipient] = result.Recipient; + const [recipient] = result.recipients; // Sanity check, should not be possible. if (!recipient) { @@ -185,8 +185,5 @@ export const getDocumentAndRecipientByToken = async ({ }); } - return { - ...result, - Recipient: result.Recipient, - }; + return result; }; diff --git a/packages/lib/server-only/document/get-document-with-details-by-id.ts b/packages/lib/server-only/document/get-document-with-details-by-id.ts index bde03c337..9cabb6838 100644 --- a/packages/lib/server-only/document/get-document-with-details-by-id.ts +++ b/packages/lib/server-only/document/get-document-with-details-by-id.ts @@ -1,13 +1,4 @@ -import type { z } from 'zod'; - import { prisma } from '@documenso/prisma'; -import { - DocumentDataSchema, - DocumentMetaSchema, - DocumentSchema, - FieldSchema, - RecipientSchema, -} from '@documenso/prisma/generated/zod'; import { AppError, AppErrorCode } from '../../errors/app-error'; import { getDocumentWhereInput } from './get-document-by-id'; @@ -18,22 +9,11 @@ export type GetDocumentWithDetailsByIdOptions = { teamId?: number; }; -export const ZGetDocumentWithDetailsByIdResponseSchema = DocumentSchema.extend({ - documentData: DocumentDataSchema, - documentMeta: DocumentMetaSchema.nullable(), - Recipient: RecipientSchema.array(), - Field: FieldSchema.array(), -}); - -export type TGetDocumentWithDetailsByIdResponse = z.infer< - typeof ZGetDocumentWithDetailsByIdResponseSchema ->; - export const getDocumentWithDetailsById = async ({ documentId, userId, teamId, -}: GetDocumentWithDetailsByIdOptions): Promise => { +}: GetDocumentWithDetailsByIdOptions) => { const documentWhereInput = await getDocumentWhereInput({ documentId, userId, @@ -45,8 +25,8 @@ export const getDocumentWithDetailsById = async ({ include: { documentData: true, documentMeta: true, - Recipient: true, - Field: true, + recipients: true, + fields: true, }, }); diff --git a/packages/lib/server-only/document/get-stats.ts b/packages/lib/server-only/document/get-stats.ts index e95e7d53b..adb1b5dea 100644 --- a/packages/lib/server-only/document/get-stats.ts +++ b/packages/lib/server-only/document/get-stats.ts @@ -85,8 +85,8 @@ const getCounts = async ({ user, createdAt, search }: GetCountsOption) => { const searchFilter: Prisma.DocumentWhereInput = { OR: [ { title: { contains: search, mode: 'insensitive' } }, - { Recipient: { some: { name: { contains: search, mode: 'insensitive' } } } }, - { Recipient: { some: { email: { contains: search, mode: 'insensitive' } } } }, + { recipients: { some: { name: { contains: search, mode: 'insensitive' } } } }, + { recipients: { some: { email: { contains: search, mode: 'insensitive' } } } }, ], }; @@ -113,7 +113,7 @@ const getCounts = async ({ user, createdAt, search }: GetCountsOption) => { }, where: { status: ExtendedDocumentStatus.PENDING, - Recipient: { + recipients: { some: { email: user.email, signingStatus: SigningStatus.NOT_SIGNED, @@ -132,7 +132,7 @@ const getCounts = async ({ user, createdAt, search }: GetCountsOption) => { }, where: { createdAt, - User: { + user: { email: { not: user.email, }, @@ -140,7 +140,7 @@ const getCounts = async ({ user, createdAt, search }: GetCountsOption) => { OR: [ { status: ExtendedDocumentStatus.PENDING, - Recipient: { + recipients: { some: { email: user.email, signingStatus: SigningStatus.SIGNED, @@ -150,7 +150,7 @@ const getCounts = async ({ user, createdAt, search }: GetCountsOption) => { }, { status: ExtendedDocumentStatus.COMPLETED, - Recipient: { + recipients: { some: { email: user.email, signingStatus: SigningStatus.SIGNED, @@ -191,8 +191,8 @@ const getTeamCounts = async (options: GetTeamCountsOption) => { const searchFilter: Prisma.DocumentWhereInput = { OR: [ { title: { contains: options.search, mode: 'insensitive' } }, - { Recipient: { some: { name: { contains: options.search, mode: 'insensitive' } } } }, - { Recipient: { some: { email: { contains: options.search, mode: 'insensitive' } } } }, + { recipients: { some: { name: { contains: options.search, mode: 'insensitive' } } } }, + { recipients: { some: { email: { contains: options.search, mode: 'insensitive' } } } }, ], }; @@ -234,7 +234,7 @@ const getTeamCounts = async (options: GetTeamCountsOption) => { { OR: [ { userId: options.userId }, - { Recipient: { some: { email: options.currentUserEmail } } }, + { recipients: { some: { email: options.currentUserEmail } } }, ], }, ], @@ -257,7 +257,7 @@ const getTeamCounts = async (options: GetTeamCountsOption) => { teamId, }, { - User: { + user: { email: teamEmail, }, }, @@ -274,7 +274,7 @@ const getTeamCounts = async (options: GetTeamCountsOption) => { userId: userIdWhereClause, createdAt, status: ExtendedDocumentStatus.PENDING, - Recipient: { + recipients: { some: { email: teamEmail, signingStatus: SigningStatus.NOT_SIGNED, @@ -296,7 +296,7 @@ const getTeamCounts = async (options: GetTeamCountsOption) => { OR: [ { status: ExtendedDocumentStatus.PENDING, - Recipient: { + recipients: { some: { email: teamEmail, signingStatus: SigningStatus.SIGNED, @@ -307,7 +307,7 @@ const getTeamCounts = async (options: GetTeamCountsOption) => { }, { status: ExtendedDocumentStatus.COMPLETED, - Recipient: { + recipients: { some: { email: teamEmail, signingStatus: SigningStatus.SIGNED, diff --git a/packages/lib/server-only/document/move-document-to-team.ts b/packages/lib/server-only/document/move-document-to-team.ts index 8aad63429..921b5ec77 100644 --- a/packages/lib/server-only/document/move-document-to-team.ts +++ b/packages/lib/server-only/document/move-document-to-team.ts @@ -1,10 +1,7 @@ -import { TRPCError } from '@trpc/server'; -import type { z } from 'zod'; - -import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; import { prisma } from '@documenso/prisma'; -import { DocumentSchema } from '@documenso/prisma/generated/zod'; +import { AppError, AppErrorCode } from '../../errors/app-error'; import { DOCUMENT_AUDIT_LOG_TYPE } from '../../types/document-audit-logs'; import { createDocumentAuditLogData } from '../../utils/document-audit-logs'; @@ -12,24 +9,16 @@ export type MoveDocumentToTeamOptions = { documentId: number; teamId: number; userId: number; - requestMetadata?: RequestMetadata; + requestMetadata: ApiRequestMetadata; }; -export const ZMoveDocumentToTeamResponseSchema = DocumentSchema; - -export type TMoveDocumentToTeamResponse = z.infer; - export const moveDocumentToTeam = async ({ documentId, teamId, userId, requestMetadata, -}: MoveDocumentToTeamOptions): Promise => { +}: MoveDocumentToTeamOptions) => { return await prisma.$transaction(async (tx) => { - const user = await tx.user.findUniqueOrThrow({ - where: { id: userId }, - }); - const document = await tx.document.findFirst({ where: { id: documentId, @@ -39,8 +28,7 @@ export const moveDocumentToTeam = async ({ }); if (!document) { - throw new TRPCError({ - code: 'NOT_FOUND', + throw new AppError(AppErrorCode.NOT_FOUND, { message: 'Document not found or already associated with a team.', }); } @@ -57,9 +45,8 @@ export const moveDocumentToTeam = async ({ }); if (!team) { - throw new TRPCError({ - code: 'FORBIDDEN', - message: 'You are not a member of this team.', + throw new AppError(AppErrorCode.UNAUTHORIZED, { + message: 'This team does not exist, or you are not a member of this team.', }); } @@ -68,12 +55,11 @@ export const moveDocumentToTeam = async ({ data: { teamId }, }); - const log = await tx.documentAuditLog.create({ + await tx.documentAuditLog.create({ data: createDocumentAuditLogData({ type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_MOVED_TO_TEAM, documentId: updatedDocument.id, - user, - requestMetadata, + metadata: requestMetadata, data: { movedByUserId: userId, fromPersonalAccount: true, diff --git a/packages/lib/server-only/document/reject-document-with-token.ts b/packages/lib/server-only/document/reject-document-with-token.ts index 33cbc0896..004211d4f 100644 --- a/packages/lib/server-only/document/reject-document-with-token.ts +++ b/packages/lib/server-only/document/reject-document-with-token.ts @@ -1,12 +1,15 @@ import { SigningStatus } from '@prisma/client'; -import { TRPCError } from '@trpc/server'; import { jobs } from '@documenso/lib/jobs/client'; import { prisma } from '@documenso/prisma'; import { WebhookTriggerEvents } from '@documenso/prisma/client'; +import { AppError, AppErrorCode } from '../../errors/app-error'; import { DOCUMENT_AUDIT_LOG_TYPE } from '../../types/document-audit-logs'; -import { ZWebhookDocumentSchema } from '../../types/webhook-payload'; +import { + ZWebhookDocumentSchema, + mapDocumentToWebhookDocumentPayload, +} from '../../types/webhook-payload'; import type { RequestMetadata } from '../../universal/extract-request-metadata'; import { createDocumentAuditLogData } from '../../utils/document-audit-logs'; import { triggerWebhook } from '../webhooks/trigger/trigger-webhook'; @@ -31,21 +34,20 @@ export async function rejectDocumentWithToken({ documentId, }, include: { - Document: { + document: { include: { - User: true, - Recipient: true, + user: true, + recipients: true, documentMeta: true, }, }, }, }); - const document = recipient?.Document; + const document = recipient?.document; if (!recipient || !document) { - throw new TRPCError({ - code: 'NOT_FOUND', + throw new AppError(AppErrorCode.NOT_FOUND, { message: 'Document or recipient not found', }); } @@ -97,7 +99,7 @@ export async function rejectDocumentWithToken({ id: document.id, }, include: { - Recipient: true, + recipients: true, documentMeta: true, }, }); @@ -109,7 +111,7 @@ export async function rejectDocumentWithToken({ // Trigger webhook for document rejection await triggerWebhook({ event: WebhookTriggerEvents.DOCUMENT_REJECTED, - data: ZWebhookDocumentSchema.parse(updatedDocument), + data: ZWebhookDocumentSchema.parse(mapDocumentToWebhookDocumentPayload(updatedDocument)), userId: document.userId, teamId: document.teamId ?? undefined, }); diff --git a/packages/lib/server-only/document/resend-document.tsx b/packages/lib/server-only/document/resend-document.tsx index 1ed899fe1..6f00cbc78 100644 --- a/packages/lib/server-only/document/resend-document.tsx +++ b/packages/lib/server-only/document/resend-document.tsx @@ -10,7 +10,7 @@ import { RECIPIENT_ROLE_TO_EMAIL_TYPE, } from '@documenso/lib/constants/recipient-roles'; import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; -import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs'; import { renderCustomEmailTemplate } from '@documenso/lib/utils/render-custom-email-template'; import { prisma } from '@documenso/prisma'; @@ -29,7 +29,7 @@ export type ResendDocumentOptions = { userId: number; recipients: number[]; teamId?: number; - requestMetadata: RequestMetadata; + requestMetadata: ApiRequestMetadata; }; export const resendDocument = async ({ @@ -54,7 +54,7 @@ export const resendDocument = async ({ const document = await prisma.document.findUnique({ where: documentWhereInput, include: { - Recipient: { + recipients: { where: { id: { in: recipients, @@ -80,7 +80,7 @@ export const resendDocument = async ({ throw new Error('Document not found'); } - if (document.Recipient.length === 0) { + if (document.recipients.length === 0) { throw new Error('Document has no recipients'); } @@ -101,7 +101,7 @@ export const resendDocument = async ({ } await Promise.all( - document.Recipient.map(async (recipient) => { + document.recipients.map(async (recipient) => { if (recipient.role === RecipientRole.CC) { return; } @@ -201,8 +201,7 @@ export const resendDocument = async ({ data: createDocumentAuditLogData({ type: DOCUMENT_AUDIT_LOG_TYPE.EMAIL_SENT, documentId: document.id, - user, - requestMetadata, + metadata: requestMetadata, data: { emailType: recipientEmailType, recipientEmail: recipient.email, diff --git a/packages/lib/server-only/document/seal-document.ts b/packages/lib/server-only/document/seal-document.ts index 9e51d4f58..5850aa30c 100644 --- a/packages/lib/server-only/document/seal-document.ts +++ b/packages/lib/server-only/document/seal-document.ts @@ -14,7 +14,10 @@ import { } from '@documenso/prisma/client'; import { signPdf } from '@documenso/signing'; -import { ZWebhookDocumentSchema } from '../../types/webhook-payload'; +import { + ZWebhookDocumentSchema, + mapDocumentToWebhookDocumentPayload, +} from '../../types/webhook-payload'; import type { RequestMetadata } from '../../universal/extract-request-metadata'; import { getFile } from '../../universal/upload/get-file'; import { putPdfFile } from '../../universal/upload/put-file'; @@ -43,7 +46,7 @@ export const sealDocument = async ({ const document = await prisma.document.findFirstOrThrow({ where: { id: documentId, - Recipient: { + recipients: { every: { signingStatus: SigningStatus.SIGNED, }, @@ -52,7 +55,7 @@ export const sealDocument = async ({ include: { documentData: true, documentMeta: true, - Recipient: true, + recipients: true, team: { select: { teamGlobalSettings: { @@ -89,7 +92,7 @@ export const sealDocument = async ({ documentId: document.id, }, include: { - Signature: true, + signature: true, }, }); @@ -221,13 +224,13 @@ export const sealDocument = async ({ include: { documentData: true, documentMeta: true, - Recipient: true, + recipients: true, }, }); await triggerWebhook({ event: WebhookTriggerEvents.DOCUMENT_COMPLETED, - data: ZWebhookDocumentSchema.parse(updatedDocument), + data: ZWebhookDocumentSchema.parse(mapDocumentToWebhookDocumentPayload(updatedDocument)), userId: document.userId, teamId: document.teamId ?? undefined, }); diff --git a/packages/lib/server-only/document/search-documents-with-keyword.ts b/packages/lib/server-only/document/search-documents-with-keyword.ts index 98def25a4..1fba24de1 100644 --- a/packages/lib/server-only/document/search-documents-with-keyword.ts +++ b/packages/lib/server-only/document/search-documents-with-keyword.ts @@ -35,7 +35,7 @@ export const searchDocumentsWithKeyword = async ({ deletedAt: null, }, { - Recipient: { + recipients: { some: { email: { contains: query, @@ -48,7 +48,7 @@ export const searchDocumentsWithKeyword = async ({ }, { status: DocumentStatus.COMPLETED, - Recipient: { + recipients: { some: { email: user.email, }, @@ -60,7 +60,7 @@ export const searchDocumentsWithKeyword = async ({ }, { status: DocumentStatus.PENDING, - Recipient: { + recipients: { some: { email: user.email, }, @@ -91,7 +91,7 @@ export const searchDocumentsWithKeyword = async ({ ], }, include: { - Recipient: true, + recipients: true, team: { select: { url: true, @@ -140,7 +140,7 @@ export const searchDocumentsWithKeyword = async ({ return canAccessDocument; }) .map((document) => { - const { Recipient, ...documentWithoutRecipient } = document; + const { recipients, ...documentWithoutRecipient } = document; let documentPath; @@ -149,13 +149,13 @@ export const searchDocumentsWithKeyword = async ({ } else if (document.teamId && document.team) { documentPath = `${formatDocumentsPath(document.team.url)}/${document.id}`; } else { - documentPath = getSigningLink(Recipient, user); + documentPath = getSigningLink(recipients, user); } return { ...documentWithoutRecipient, path: documentPath, - value: [document.id, document.title, ...document.Recipient.map((r) => r.email)].join(' '), + value: [document.id, document.title, ...document.recipients.map((r) => r.email)].join(' '), }; }); diff --git a/packages/lib/server-only/document/send-completed-email.ts b/packages/lib/server-only/document/send-completed-email.ts index 845e6551d..c6f764e34 100644 --- a/packages/lib/server-only/document/send-completed-email.ts +++ b/packages/lib/server-only/document/send-completed-email.ts @@ -32,8 +32,8 @@ export const sendCompletedEmail = async ({ documentId, requestMetadata }: SendDo include: { documentData: true, documentMeta: true, - Recipient: true, - User: true, + recipients: true, + user: true, team: { select: { id: true, @@ -50,11 +50,11 @@ export const sendCompletedEmail = async ({ documentId, requestMetadata }: SendDo const isDirectTemplate = document?.source === DocumentSource.TEMPLATE_DIRECT_LINK; - if (document.Recipient.length === 0) { + if (document.recipients.length === 0) { throw new Error('Document has no recipients'); } - const { User: owner } = document; + const { user: owner } = document; const completedDocument = await getFile(document.documentData); @@ -83,7 +83,7 @@ export const sendCompletedEmail = async ({ documentId, requestMetadata }: SendDo // - Recipient emails are disabled if ( isOwnerDocumentCompletedEmailEnabled && - (!document.Recipient.find((recipient) => recipient.email === owner.email) || + (!document.recipients.find((recipient) => recipient.email === owner.email) || !isDocumentCompletedEmailEnabled) ) { const template = createElement(DocumentCompletedEmailTemplate, { @@ -150,7 +150,7 @@ export const sendCompletedEmail = async ({ documentId, requestMetadata }: SendDo } await Promise.all( - document.Recipient.map(async (recipient) => { + document.recipients.map(async (recipient) => { const customEmailTemplate = { 'signer.name': recipient.name, 'signer.email': recipient.email, diff --git a/packages/lib/server-only/document/send-delete-email.ts b/packages/lib/server-only/document/send-delete-email.ts index 85f7534cd..d92d9d263 100644 --- a/packages/lib/server-only/document/send-delete-email.ts +++ b/packages/lib/server-only/document/send-delete-email.ts @@ -8,6 +8,7 @@ import { prisma } from '@documenso/prisma'; import { getI18nInstance } from '../../client-only/providers/i18n.server'; import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; +import { AppError, AppErrorCode } from '../../errors/app-error'; import { extractDerivedDocumentEmailSettings } from '../../types/document-email'; import { renderEmailWithI18N } from '../../utils/render-email-with-i18n'; import { teamGlobalSettingsToBranding } from '../../utils/team-global-settings-to-branding'; @@ -23,7 +24,7 @@ export const sendDeleteEmail = async ({ documentId, reason }: SendDeleteEmailOpt id: documentId, }, include: { - User: true, + user: true, documentMeta: true, team: { include: { @@ -34,7 +35,9 @@ export const sendDeleteEmail = async ({ documentId, reason }: SendDeleteEmailOpt }); if (!document) { - throw new Error('Document not found'); + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'Document not found', + }); } const isDocumentDeletedEmailEnabled = extractDerivedDocumentEmailSettings( @@ -45,7 +48,7 @@ export const sendDeleteEmail = async ({ documentId, reason }: SendDeleteEmailOpt return; } - const { email, name } = document.User; + const { email, name } = document.user; const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL() || 'http://localhost:3000'; diff --git a/packages/lib/server-only/document/send-document.tsx b/packages/lib/server-only/document/send-document.tsx index 8fc2674fc..ac91b5441 100644 --- a/packages/lib/server-only/document/send-document.tsx +++ b/packages/lib/server-only/document/send-document.tsx @@ -1,7 +1,5 @@ -import type { z } from 'zod'; - import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; -import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; import { putPdfFile } from '@documenso/lib/universal/upload/put-file'; import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs'; import { prisma } from '@documenso/prisma'; @@ -13,15 +11,13 @@ import { SigningStatus, WebhookTriggerEvents, } from '@documenso/prisma/client'; -import { - DocumentMetaSchema, - DocumentSchema, - RecipientSchema, -} from '@documenso/prisma/generated/zod'; import { jobs } from '../../jobs/client'; import { extractDerivedDocumentEmailSettings } from '../../types/document-email'; -import { ZWebhookDocumentSchema } from '../../types/webhook-payload'; +import { + ZWebhookDocumentSchema, + mapDocumentToWebhookDocumentPayload, +} from '../../types/webhook-payload'; import { getFile } from '../../universal/upload/get-file'; import { insertFormValuesInPdf } from '../pdf/insert-form-values-in-pdf'; import { triggerWebhook } from '../webhooks/trigger/trigger-webhook'; @@ -31,34 +27,16 @@ export type SendDocumentOptions = { userId: number; teamId?: number; sendEmail?: boolean; - requestMetadata?: RequestMetadata; + requestMetadata: ApiRequestMetadata; }; -export const ZSendDocumentResponseSchema = DocumentSchema.extend({ - documentMeta: DocumentMetaSchema.nullable(), - Recipient: RecipientSchema.array(), -}); - -export type TSendDocumentResponse = z.infer; - export const sendDocument = async ({ documentId, userId, teamId, sendEmail, requestMetadata, -}: SendDocumentOptions): Promise => { - const user = await prisma.user.findFirstOrThrow({ - where: { - id: userId, - }, - select: { - id: true, - name: true, - email: true, - }, - }); - +}: SendDocumentOptions) => { const document = await prisma.document.findUnique({ where: { id: documentId, @@ -79,7 +57,7 @@ export const sendDocument = async ({ }), }, include: { - Recipient: { + recipients: { orderBy: [{ signingOrder: { sort: 'asc', nulls: 'last' } }, { id: 'asc' }], }, documentMeta: true, @@ -91,7 +69,7 @@ export const sendDocument = async ({ throw new Error('Document not found'); } - if (document.Recipient.length === 0) { + if (document.recipients.length === 0) { throw new Error('Document has no recipients'); } @@ -101,13 +79,13 @@ export const sendDocument = async ({ const signingOrder = document.documentMeta?.signingOrder || DocumentSigningOrder.PARALLEL; - let recipientsToNotify = document.Recipient; + let recipientsToNotify = document.recipients; if (signingOrder === DocumentSigningOrder.SEQUENTIAL) { // Get the currently active recipient. - recipientsToNotify = document.Recipient.filter( - (r) => r.signingStatus === SigningStatus.NOT_SIGNED && r.role !== RecipientRole.CC, - ).slice(0, 1); + recipientsToNotify = document.recipients + .filter((r) => r.signingStatus === SigningStatus.NOT_SIGNED && r.role !== RecipientRole.CC) + .slice(0, 1); // Secondary filter so we aren't resending if the current active recipient has already // received the document. @@ -198,14 +176,14 @@ export const sendDocument = async ({ userId, documentId, recipientId: recipient.id, - requestMetadata, + requestMetadata: requestMetadata?.requestMetadata, }, }); }), ); } - const allRecipientsHaveNoActionToTake = document.Recipient.every( + const allRecipientsHaveNoActionToTake = document.recipients.every( (recipient) => recipient.role === RecipientRole.CC || recipient.signingStatus === SigningStatus.SIGNED, ); @@ -215,7 +193,7 @@ export const sendDocument = async ({ name: 'internal.seal-document', payload: { documentId, - requestMetadata, + requestMetadata: requestMetadata?.requestMetadata, }, }); @@ -226,7 +204,7 @@ export const sendDocument = async ({ }, include: { documentMeta: true, - Recipient: true, + recipients: true, }, }); } @@ -237,8 +215,7 @@ export const sendDocument = async ({ data: createDocumentAuditLogData({ type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_SENT, documentId: document.id, - requestMetadata, - user, + metadata: requestMetadata, data: {}, }), }); @@ -253,14 +230,14 @@ export const sendDocument = async ({ }, include: { documentMeta: true, - Recipient: true, + recipients: true, }, }); }); await triggerWebhook({ event: WebhookTriggerEvents.DOCUMENT_SENT, - data: ZWebhookDocumentSchema.parse(updatedDocument), + data: ZWebhookDocumentSchema.parse(mapDocumentToWebhookDocumentPayload(updatedDocument)), userId, teamId, }); diff --git a/packages/lib/server-only/document/send-pending-email.ts b/packages/lib/server-only/document/send-pending-email.ts index 2b599b256..2652cf39e 100644 --- a/packages/lib/server-only/document/send-pending-email.ts +++ b/packages/lib/server-only/document/send-pending-email.ts @@ -21,14 +21,14 @@ export const sendPendingEmail = async ({ documentId, recipientId }: SendPendingE const document = await prisma.document.findFirst({ where: { id: documentId, - Recipient: { + recipients: { some: { id: recipientId, }, }, }, include: { - Recipient: { + recipients: { where: { id: recipientId, }, @@ -46,7 +46,7 @@ export const sendPendingEmail = async ({ documentId, recipientId }: SendPendingE throw new Error('Document not found'); } - if (document.Recipient.length === 0) { + if (document.recipients.length === 0) { throw new Error('Document has no recipients'); } @@ -58,7 +58,7 @@ export const sendPendingEmail = async ({ documentId, recipientId }: SendPendingE return; } - const [recipient] = document.Recipient; + const [recipient] = document.recipients; const { email, name } = recipient; diff --git a/packages/lib/server-only/document/super-delete-document.ts b/packages/lib/server-only/document/super-delete-document.ts index 856d0365c..c427ab724 100644 --- a/packages/lib/server-only/document/super-delete-document.ts +++ b/packages/lib/server-only/document/super-delete-document.ts @@ -12,6 +12,7 @@ import { DocumentStatus, SendStatus } from '@documenso/prisma/client'; import { getI18nInstance } from '../../client-only/providers/i18n.server'; import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; import { FROM_ADDRESS, FROM_NAME } from '../../constants/email'; +import { AppError, AppErrorCode } from '../../errors/app-error'; import { DOCUMENT_AUDIT_LOG_TYPE } from '../../types/document-audit-logs'; import { extractDerivedDocumentEmailSettings } from '../../types/document-email'; import type { RequestMetadata } from '../../universal/extract-request-metadata'; @@ -30,9 +31,9 @@ export const superDeleteDocument = async ({ id, requestMetadata }: SuperDeleteDo id, }, include: { - Recipient: true, + recipients: true, documentMeta: true, - User: true, + user: true, team: { include: { teamGlobalSettings: true, @@ -42,10 +43,12 @@ export const superDeleteDocument = async ({ id, requestMetadata }: SuperDeleteDo }); if (!document) { - throw new Error('Document not found'); + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'Document not found', + }); } - const { status, User: user } = document; + const { status, user } = document; const isDocumentDeletedEmailEnabled = extractDerivedDocumentEmailSettings( document.documentMeta, @@ -54,11 +57,11 @@ export const superDeleteDocument = async ({ id, requestMetadata }: SuperDeleteDo // if the document is pending, send cancellation emails to all recipients if ( status === DocumentStatus.PENDING && - document.Recipient.length > 0 && + document.recipients.length > 0 && isDocumentDeletedEmailEnabled ) { await Promise.all( - document.Recipient.map(async (recipient) => { + document.recipients.map(async (recipient) => { if (recipient.sendStatus !== SendStatus.SENT) { return; } diff --git a/packages/lib/server-only/document/update-document-settings.ts b/packages/lib/server-only/document/update-document-settings.ts deleted file mode 100644 index 87a18d4e7..000000000 --- a/packages/lib/server-only/document/update-document-settings.ts +++ /dev/null @@ -1,281 +0,0 @@ -'use server'; - -import { match } from 'ts-pattern'; -import type { z } from 'zod'; - -import { isUserEnterprise } from '@documenso/ee/server-only/util/is-document-enterprise'; -import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; -import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; -import type { CreateDocumentAuditLogDataResponse } from '@documenso/lib/utils/document-audit-logs'; -import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs'; -import { prisma } from '@documenso/prisma'; -import { DocumentVisibility } from '@documenso/prisma/client'; -import { DocumentStatus, TeamMemberRole } from '@documenso/prisma/client'; -import { DocumentSchema } from '@documenso/prisma/generated/zod'; - -import { AppError, AppErrorCode } from '../../errors/app-error'; -import type { TDocumentAccessAuthTypes, TDocumentActionAuthTypes } from '../../types/document-auth'; -import { createDocumentAuthOptions, extractDocumentAuthMethods } from '../../utils/document-auth'; - -export type UpdateDocumentSettingsOptions = { - userId: number; - teamId?: number; - documentId: number; - data: { - title?: string; - externalId?: string | null; - visibility?: DocumentVisibility | null; - globalAccessAuth?: TDocumentAccessAuthTypes | null; - globalActionAuth?: TDocumentActionAuthTypes | null; - }; - requestMetadata?: RequestMetadata; -}; - -export const ZUpdateDocumentSettingsResponseSchema = DocumentSchema; - -export type TUpdateDocumentSettingsResponse = z.infer; - -export const updateDocumentSettings = async ({ - userId, - teamId, - documentId, - data, - requestMetadata, -}: UpdateDocumentSettingsOptions): Promise => { - if (!data.title && !data.globalAccessAuth && !data.globalActionAuth) { - throw new AppError(AppErrorCode.INVALID_BODY, { - message: 'Missing data to update', - }); - } - - const user = await prisma.user.findFirstOrThrow({ - where: { - id: userId, - }, - }); - - const document = await prisma.document.findFirstOrThrow({ - where: { - id: documentId, - ...(teamId - ? { - team: { - id: teamId, - members: { - some: { - userId, - }, - }, - }, - } - : { - userId, - teamId: null, - }), - }, - include: { - team: { - select: { - members: { - where: { - userId, - }, - select: { - role: true, - }, - }, - }, - }, - }, - }); - - if (teamId) { - const currentUserRole = document.team?.members[0]?.role; - const isDocumentOwner = document.userId === userId; - const requestedVisibility = data.visibility; - - if (!isDocumentOwner) { - match(currentUserRole) - .with(TeamMemberRole.ADMIN, () => true) - .with(TeamMemberRole.MANAGER, () => { - const allowedVisibilities: DocumentVisibility[] = [ - DocumentVisibility.EVERYONE, - DocumentVisibility.MANAGER_AND_ABOVE, - ]; - - if ( - !allowedVisibilities.includes(document.visibility) || - (requestedVisibility && !allowedVisibilities.includes(requestedVisibility)) - ) { - throw new AppError(AppErrorCode.UNAUTHORIZED, { - message: 'You do not have permission to update the document visibility', - }); - } - }) - .with(TeamMemberRole.MEMBER, () => { - if ( - document.visibility !== DocumentVisibility.EVERYONE || - (requestedVisibility && requestedVisibility !== DocumentVisibility.EVERYONE) - ) { - throw new AppError(AppErrorCode.UNAUTHORIZED, { - message: 'You do not have permission to update the document visibility', - }); - } - }) - .otherwise(() => { - throw new AppError(AppErrorCode.UNAUTHORIZED, { - message: 'You do not have permission to update the document', - }); - }); - } - } - - const { documentAuthOption } = extractDocumentAuthMethods({ - documentAuth: document.authOptions, - }); - - const documentGlobalAccessAuth = documentAuthOption?.globalAccessAuth ?? null; - const documentGlobalActionAuth = documentAuthOption?.globalActionAuth ?? null; - - // If the new global auth values aren't passed in, fallback to the current document values. - const newGlobalAccessAuth = - data?.globalAccessAuth === undefined ? documentGlobalAccessAuth : data.globalAccessAuth; - const newGlobalActionAuth = - data?.globalActionAuth === undefined ? documentGlobalActionAuth : data.globalActionAuth; - - // Check if user has permission to set the global action auth. - if (newGlobalActionAuth) { - const isDocumentEnterprise = await isUserEnterprise({ - userId, - teamId, - }); - - if (!isDocumentEnterprise) { - throw new AppError(AppErrorCode.UNAUTHORIZED, { - message: 'You do not have permission to set the action auth', - }); - } - } - - const isTitleSame = data.title === undefined || data.title === document.title; - const isExternalIdSame = data.externalId === undefined || data.externalId === document.externalId; - const isGlobalAccessSame = - documentGlobalAccessAuth === undefined || documentGlobalAccessAuth === newGlobalAccessAuth; - const isGlobalActionSame = - documentGlobalActionAuth === undefined || documentGlobalActionAuth === newGlobalActionAuth; - const isDocumentVisibilitySame = - data.visibility === undefined || data.visibility === document.visibility; - - const auditLogs: CreateDocumentAuditLogDataResponse[] = []; - - if (!isTitleSame && document.status !== DocumentStatus.DRAFT) { - throw new AppError(AppErrorCode.INVALID_BODY, { - message: 'You cannot update the title if the document has been sent', - }); - } - - if (!isTitleSame) { - auditLogs.push( - createDocumentAuditLogData({ - type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_TITLE_UPDATED, - documentId, - user, - requestMetadata, - data: { - from: document.title, - to: data.title || '', - }, - }), - ); - } - - if (!isExternalIdSame) { - auditLogs.push( - createDocumentAuditLogData({ - type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_EXTERNAL_ID_UPDATED, - documentId, - user, - requestMetadata, - data: { - from: document.externalId, - to: data.externalId || '', - }, - }), - ); - } - - if (!isGlobalAccessSame) { - auditLogs.push( - createDocumentAuditLogData({ - type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_GLOBAL_AUTH_ACCESS_UPDATED, - documentId, - user, - requestMetadata, - data: { - from: documentGlobalAccessAuth, - to: newGlobalAccessAuth, - }, - }), - ); - } - - if (!isGlobalActionSame) { - auditLogs.push( - createDocumentAuditLogData({ - type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_GLOBAL_AUTH_ACTION_UPDATED, - documentId, - user, - requestMetadata, - data: { - from: documentGlobalActionAuth, - to: newGlobalActionAuth, - }, - }), - ); - } - - if (!isDocumentVisibilitySame) { - auditLogs.push( - createDocumentAuditLogData({ - type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_VISIBILITY_UPDATED, - documentId, - user, - requestMetadata, - data: { - from: document.visibility, - to: data.visibility || '', - }, - }), - ); - } - - // Early return if nothing is required. - if (auditLogs.length === 0) { - return document; - } - - return await prisma.$transaction(async (tx) => { - const authOptions = createDocumentAuthOptions({ - globalAccessAuth: newGlobalAccessAuth, - globalActionAuth: newGlobalActionAuth, - }); - - const updatedDocument = await tx.document.update({ - where: { - id: documentId, - }, - data: { - title: data.title, - externalId: data.externalId, - visibility: data.visibility as DocumentVisibility, - authOptions, - }, - }); - - await tx.documentAuditLog.createMany({ - data: auditLogs, - }); - - return updatedDocument; - }); -}; diff --git a/packages/lib/server-only/document/update-document.ts b/packages/lib/server-only/document/update-document.ts index 3e35f52e4..bbacfbe1d 100644 --- a/packages/lib/server-only/document/update-document.ts +++ b/packages/lib/server-only/document/update-document.ts @@ -1,23 +1,40 @@ -'use server'; - -import type { Prisma } from '@prisma/client'; +import { match } from 'ts-pattern'; +import { isUserEnterprise } from '@documenso/ee/server-only/util/is-document-enterprise'; +import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; +import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import type { CreateDocumentAuditLogDataResponse } from '@documenso/lib/utils/document-audit-logs'; +import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs'; import { prisma } from '@documenso/prisma'; +import { DocumentVisibility } from '@documenso/prisma/client'; +import { DocumentStatus, TeamMemberRole } from '@documenso/prisma/client'; + +import { AppError, AppErrorCode } from '../../errors/app-error'; +import type { TDocumentAccessAuthTypes, TDocumentActionAuthTypes } from '../../types/document-auth'; +import { createDocumentAuthOptions, extractDocumentAuthMethods } from '../../utils/document-auth'; export type UpdateDocumentOptions = { - documentId: number; - data: Prisma.DocumentUpdateInput; userId: number; teamId?: number; + documentId: number; + data?: { + title?: string; + externalId?: string | null; + visibility?: DocumentVisibility | null; + globalAccessAuth?: TDocumentAccessAuthTypes | null; + globalActionAuth?: TDocumentActionAuthTypes | null; + }; + requestMetadata: ApiRequestMetadata; }; export const updateDocument = async ({ - documentId, userId, teamId, + documentId, data, + requestMetadata, }: UpdateDocumentOptions) => { - return await prisma.document.update({ + const document = await prisma.document.findFirst({ where: { id: documentId, ...(teamId @@ -36,8 +53,215 @@ export const updateDocument = async ({ teamId: null, }), }, - data: { - ...data, + include: { + team: { + select: { + members: { + where: { + userId, + }, + select: { + role: true, + }, + }, + }, + }, }, }); + + if (!document) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'Document not found', + }); + } + + if (teamId) { + const currentUserRole = document.team?.members[0]?.role; + const isDocumentOwner = document.userId === userId; + const requestedVisibility = data?.visibility; + + if (!isDocumentOwner) { + match(currentUserRole) + .with(TeamMemberRole.ADMIN, () => true) + .with(TeamMemberRole.MANAGER, () => { + const allowedVisibilities: DocumentVisibility[] = [ + DocumentVisibility.EVERYONE, + DocumentVisibility.MANAGER_AND_ABOVE, + ]; + + if ( + !allowedVisibilities.includes(document.visibility) || + (requestedVisibility && !allowedVisibilities.includes(requestedVisibility)) + ) { + throw new AppError(AppErrorCode.UNAUTHORIZED, { + message: 'You do not have permission to update the document visibility', + }); + } + }) + .with(TeamMemberRole.MEMBER, () => { + if ( + document.visibility !== DocumentVisibility.EVERYONE || + (requestedVisibility && requestedVisibility !== DocumentVisibility.EVERYONE) + ) { + throw new AppError(AppErrorCode.UNAUTHORIZED, { + message: 'You do not have permission to update the document visibility', + }); + } + }) + .otherwise(() => { + throw new AppError(AppErrorCode.UNAUTHORIZED, { + message: 'You do not have permission to update the document', + }); + }); + } + } + + // If no data just return the document since this function is normally chained after a meta update. + if (!data || Object.values(data).length === 0) { + return document; + } + + const { documentAuthOption } = extractDocumentAuthMethods({ + documentAuth: document.authOptions, + }); + + const documentGlobalAccessAuth = documentAuthOption?.globalAccessAuth ?? null; + const documentGlobalActionAuth = documentAuthOption?.globalActionAuth ?? null; + + // If the new global auth values aren't passed in, fallback to the current document values. + const newGlobalAccessAuth = + data?.globalAccessAuth === undefined ? documentGlobalAccessAuth : data.globalAccessAuth; + const newGlobalActionAuth = + data?.globalActionAuth === undefined ? documentGlobalActionAuth : data.globalActionAuth; + + // Check if user has permission to set the global action auth. + if (newGlobalActionAuth) { + const isDocumentEnterprise = await isUserEnterprise({ + userId, + teamId, + }); + + if (!isDocumentEnterprise) { + throw new AppError(AppErrorCode.UNAUTHORIZED, { + message: 'You do not have permission to set the action auth', + }); + } + } + + const isTitleSame = data.title === undefined || data.title === document.title; + const isExternalIdSame = data.externalId === undefined || data.externalId === document.externalId; + const isGlobalAccessSame = + documentGlobalAccessAuth === undefined || documentGlobalAccessAuth === newGlobalAccessAuth; + const isGlobalActionSame = + documentGlobalActionAuth === undefined || documentGlobalActionAuth === newGlobalActionAuth; + const isDocumentVisibilitySame = + data.visibility === undefined || data.visibility === document.visibility; + + const auditLogs: CreateDocumentAuditLogDataResponse[] = []; + + if (!isTitleSame && document.status !== DocumentStatus.DRAFT) { + throw new AppError(AppErrorCode.INVALID_BODY, { + message: 'You cannot update the title if the document has been sent', + }); + } + + if (!isTitleSame) { + auditLogs.push( + createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_TITLE_UPDATED, + documentId, + metadata: requestMetadata, + data: { + from: document.title, + to: data.title || '', + }, + }), + ); + } + + if (!isExternalIdSame) { + auditLogs.push( + createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_EXTERNAL_ID_UPDATED, + documentId, + metadata: requestMetadata, + data: { + from: document.externalId, + to: data.externalId || '', + }, + }), + ); + } + + if (!isGlobalAccessSame) { + auditLogs.push( + createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_GLOBAL_AUTH_ACCESS_UPDATED, + documentId, + metadata: requestMetadata, + data: { + from: documentGlobalAccessAuth, + to: newGlobalAccessAuth, + }, + }), + ); + } + + if (!isGlobalActionSame) { + auditLogs.push( + createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_GLOBAL_AUTH_ACTION_UPDATED, + documentId, + metadata: requestMetadata, + data: { + from: documentGlobalActionAuth, + to: newGlobalActionAuth, + }, + }), + ); + } + + if (!isDocumentVisibilitySame) { + auditLogs.push( + createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_VISIBILITY_UPDATED, + documentId, + metadata: requestMetadata, + data: { + from: document.visibility, + to: data.visibility || '', + }, + }), + ); + } + + // Early return if nothing is required. + if (auditLogs.length === 0) { + return document; + } + + return await prisma.$transaction(async (tx) => { + const authOptions = createDocumentAuthOptions({ + globalAccessAuth: newGlobalAccessAuth, + globalActionAuth: newGlobalActionAuth, + }); + + const updatedDocument = await tx.document.update({ + where: { + id: documentId, + }, + data: { + title: data.title, + externalId: data.externalId, + visibility: data.visibility as DocumentVisibility, + authOptions, + }, + }); + + await tx.documentAuditLog.createMany({ + data: auditLogs, + }); + + return updatedDocument; + }); }; diff --git a/packages/lib/server-only/document/viewed-document.ts b/packages/lib/server-only/document/viewed-document.ts index b20dc9412..34385d0ab 100644 --- a/packages/lib/server-only/document/viewed-document.ts +++ b/packages/lib/server-only/document/viewed-document.ts @@ -6,7 +6,10 @@ import { ReadStatus, SendStatus } from '@documenso/prisma/client'; import { WebhookTriggerEvents } from '@documenso/prisma/client'; import type { TDocumentAccessAuthTypes } from '../../types/document-auth'; -import { ZWebhookDocumentSchema } from '../../types/webhook-payload'; +import { + ZWebhookDocumentSchema, + mapDocumentToWebhookDocumentPayload, +} from '../../types/webhook-payload'; import { triggerWebhook } from '../webhooks/trigger/trigger-webhook'; export type ViewedDocumentOptions = { @@ -71,7 +74,7 @@ export const viewedDocument = async ({ }, include: { documentMeta: true, - Recipient: true, + recipients: true, }, }); @@ -81,7 +84,7 @@ export const viewedDocument = async ({ await triggerWebhook({ event: WebhookTriggerEvents.DOCUMENT_OPENED, - data: ZWebhookDocumentSchema.parse(document), + data: ZWebhookDocumentSchema.parse(mapDocumentToWebhookDocumentPayload(document)), userId: document.userId, teamId: document.teamId ?? undefined, }); diff --git a/packages/lib/server-only/field/create-document-fields.ts b/packages/lib/server-only/field/create-document-fields.ts new file mode 100644 index 000000000..dfe68f448 --- /dev/null +++ b/packages/lib/server-only/field/create-document-fields.ts @@ -0,0 +1,136 @@ +import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; +import type { TFieldAndMeta } from '@documenso/lib/types/field-meta'; +import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs'; +import { prisma } from '@documenso/prisma'; + +import { AppError, AppErrorCode } from '../../errors/app-error'; +import { canRecipientFieldsBeModified } from '../../utils/recipients'; + +export interface CreateDocumentFieldsOptions { + userId: number; + teamId?: number; + documentId: number; + fields: (TFieldAndMeta & { + recipientId: number; + pageNumber: number; + pageX: number; + pageY: number; + width: number; + height: number; + })[]; + requestMetadata: ApiRequestMetadata; +} + +export const createDocumentFields = async ({ + userId, + teamId, + documentId, + fields, + requestMetadata, +}: CreateDocumentFieldsOptions) => { + const document = await prisma.document.findFirst({ + where: { + id: documentId, + ...(teamId + ? { + team: { + id: teamId, + members: { + some: { + userId, + }, + }, + }, + } + : { + userId, + teamId: null, + }), + }, + include: { + recipients: true, + fields: true, + }, + }); + + if (!document) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'Document not found', + }); + } + + if (document.completedAt) { + throw new AppError(AppErrorCode.INVALID_REQUEST, { + message: 'Document already complete', + }); + } + + // Field validation. + const validatedFields = fields.map((field) => { + const recipient = document.recipients.find((recipient) => recipient.id === field.recipientId); + + // Each field MUST have a recipient associated with it. + if (!recipient) { + throw new AppError(AppErrorCode.INVALID_REQUEST, { + message: `Recipient ${field.recipientId} not found`, + }); + } + + // Check whether the recipient associated with the field can have new fields created. + if (!canRecipientFieldsBeModified(recipient, document.fields)) { + throw new AppError(AppErrorCode.INVALID_REQUEST, { + message: + 'Recipient type cannot have fields, or they have already interacted with the document.', + }); + } + + return { + ...field, + recipientEmail: recipient.email, + }; + }); + + const createdFields = await prisma.$transaction(async (tx) => { + return await Promise.all( + validatedFields.map(async (field) => { + const createdField = await tx.field.create({ + data: { + type: field.type, + page: field.pageNumber, + positionX: field.pageX, + positionY: field.pageY, + width: field.width, + height: field.height, + customText: '', + inserted: false, + fieldMeta: field.fieldMeta, + documentId, + recipientId: field.recipientId, + }, + }); + + // Handle field created audit log. + await tx.documentAuditLog.create({ + data: createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.FIELD_CREATED, + documentId, + metadata: requestMetadata, + data: { + fieldId: createdField.secondaryId, + fieldRecipientEmail: field.recipientEmail, + fieldRecipientId: createdField.recipientId, + fieldType: createdField.type, + }, + }), + }); + + return createdField; + }), + ); + }); + + return { + fields: createdFields, + }; +}; diff --git a/packages/lib/server-only/field/create-field.ts b/packages/lib/server-only/field/create-field.ts index da1a26276..96b6afa9e 100644 --- a/packages/lib/server-only/field/create-field.ts +++ b/packages/lib/server-only/field/create-field.ts @@ -145,7 +145,7 @@ export const createField = async ({ fieldMeta: result.data, }, include: { - Recipient: true, + recipient: true, }, }); @@ -160,7 +160,7 @@ export const createField = async ({ }, data: { fieldId: field.secondaryId, - fieldRecipientEmail: field.Recipient?.email ?? '', + fieldRecipientEmail: field.recipient?.email ?? '', fieldRecipientId: recipientId, fieldType: field.type, }, diff --git a/packages/lib/server-only/field/create-template-fields.ts b/packages/lib/server-only/field/create-template-fields.ts new file mode 100644 index 000000000..0bd392175 --- /dev/null +++ b/packages/lib/server-only/field/create-template-fields.ts @@ -0,0 +1,113 @@ +import type { TFieldMetaSchema } from '@documenso/lib/types/field-meta'; +import { prisma } from '@documenso/prisma'; +import type { FieldType } from '@documenso/prisma/client'; + +import { AppError, AppErrorCode } from '../../errors/app-error'; +import { canRecipientFieldsBeModified } from '../../utils/recipients'; + +export interface CreateTemplateFieldsOptions { + userId: number; + teamId?: number; + templateId: number; + fields: { + recipientId: number; + type: FieldType; + pageNumber: number; + pageX: number; + pageY: number; + width: number; + height: number; + fieldMeta?: TFieldMetaSchema; + }[]; +} + +export const createTemplateFields = async ({ + userId, + teamId, + templateId, + fields, +}: CreateTemplateFieldsOptions) => { + const template = await prisma.template.findFirst({ + where: { + id: templateId, + ...(teamId + ? { + team: { + id: teamId, + members: { + some: { + userId, + }, + }, + }, + } + : { + userId, + teamId: null, + }), + }, + include: { + recipients: true, + fields: true, + }, + }); + + if (!template) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'template not found', + }); + } + + // Field validation. + const validatedFields = fields.map((field) => { + const recipient = template.recipients.find((recipient) => recipient.id === field.recipientId); + + // Each field MUST have a recipient associated with it. + if (!recipient) { + throw new AppError(AppErrorCode.INVALID_REQUEST, { + message: `Recipient ${field.recipientId} not found`, + }); + } + + // Check whether the recipient associated with the field can have new fields created. + if (!canRecipientFieldsBeModified(recipient, template.fields)) { + throw new AppError(AppErrorCode.INVALID_REQUEST, { + message: + 'Recipient type cannot have fields, or they have already interacted with the template.', + }); + } + + return { + ...field, + recipientEmail: recipient.email, + }; + }); + + const createdFields = await prisma.$transaction(async (tx) => { + return await Promise.all( + validatedFields.map(async (field) => { + const createdField = await tx.field.create({ + data: { + type: field.type, + page: field.pageNumber, + positionX: field.pageX, + positionY: field.pageY, + width: field.width, + height: field.height, + customText: '', + inserted: false, + fieldMeta: field.fieldMeta, + templateId, + recipientId: field.recipientId, + }, + }); + + return createdField; + }), + ); + }); + + return { + fields: createdFields, + }; +}; diff --git a/packages/lib/server-only/field/delete-document-field.ts b/packages/lib/server-only/field/delete-document-field.ts new file mode 100644 index 000000000..97c6659a1 --- /dev/null +++ b/packages/lib/server-only/field/delete-document-field.ts @@ -0,0 +1,122 @@ +import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; +import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs'; +import { prisma } from '@documenso/prisma'; + +import { AppError, AppErrorCode } from '../../errors/app-error'; +import { canRecipientFieldsBeModified } from '../../utils/recipients'; + +export interface DeleteDocumentFieldOptions { + userId: number; + teamId?: number; + fieldId: number; + requestMetadata: ApiRequestMetadata; +} + +export const deleteDocumentField = async ({ + userId, + teamId, + fieldId, + requestMetadata, +}: DeleteDocumentFieldOptions): Promise => { + const field = await prisma.field.findFirst({ + where: { + id: fieldId, + }, + }); + + if (!field) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'Field not found', + }); + } + + const documentId = field.documentId; + + if (!documentId) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'Field does not belong to a document. Use delete template field instead.', + }); + } + + const document = await prisma.document.findFirst({ + where: { + id: documentId, + ...(teamId + ? { + team: { + id: teamId, + members: { + some: { + userId, + }, + }, + }, + } + : { + userId, + teamId: null, + }), + }, + include: { + recipients: { + where: { + id: field.recipientId, + }, + include: { + fields: true, + }, + }, + }, + }); + + if (!document) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'Document not found', + }); + } + + if (document.completedAt) { + throw new AppError(AppErrorCode.INVALID_REQUEST, { + message: 'Document already complete', + }); + } + + const recipient = document.recipients.find((recipient) => recipient.id === field.recipientId); + + if (!recipient) { + throw new AppError(AppErrorCode.INVALID_REQUEST, { + message: `Recipient for field ${fieldId} not found`, + }); + } + + // Check whether the recipient associated with the field can have new fields created. + if (!canRecipientFieldsBeModified(recipient, recipient.fields)) { + throw new AppError(AppErrorCode.INVALID_REQUEST, { + message: 'Recipient has already interacted with the document.', + }); + } + + await prisma.$transaction(async (tx) => { + const deletedField = await tx.field.delete({ + where: { + id: fieldId, + }, + }); + + // Handle field deleted audit log. + await tx.documentAuditLog.create({ + data: createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.FIELD_DELETED, + documentId, + metadata: requestMetadata, + data: { + fieldId: deletedField.secondaryId, + fieldRecipientEmail: recipient.email, + fieldRecipientId: deletedField.recipientId, + fieldType: deletedField.type, + }, + }), + }); + }); +}; diff --git a/packages/lib/server-only/field/delete-field.ts b/packages/lib/server-only/field/delete-field.ts index 67145de10..1049daf89 100644 --- a/packages/lib/server-only/field/delete-field.ts +++ b/packages/lib/server-only/field/delete-field.ts @@ -22,7 +22,7 @@ export const deleteField = async ({ const field = await prisma.field.delete({ where: { id: fieldId, - Document: { + document: { id: documentId, ...(teamId ? { @@ -42,7 +42,7 @@ export const deleteField = async ({ }, }, include: { - Recipient: true, + recipient: true, }, }); @@ -78,7 +78,7 @@ export const deleteField = async ({ }, data: { fieldId: field.secondaryId, - fieldRecipientEmail: field.Recipient?.email ?? '', + fieldRecipientEmail: field.recipient?.email ?? '', fieldRecipientId: field.recipientId ?? -1, fieldType: field.type, }, diff --git a/packages/lib/server-only/field/delete-template-field.ts b/packages/lib/server-only/field/delete-template-field.ts new file mode 100644 index 000000000..3c534943b --- /dev/null +++ b/packages/lib/server-only/field/delete-template-field.ts @@ -0,0 +1,48 @@ +import { prisma } from '@documenso/prisma'; + +import { AppError, AppErrorCode } from '../../errors/app-error'; + +export interface DeleteTemplateFieldOptions { + userId: number; + teamId?: number; + fieldId: number; +} + +export const deleteTemplateField = async ({ + userId, + teamId, + fieldId, +}: DeleteTemplateFieldOptions): Promise => { + const field = await prisma.field.findFirst({ + where: { + id: fieldId, + template: teamId + ? { + team: { + id: teamId, + members: { + some: { + userId, + }, + }, + }, + } + : { + userId, + teamId: null, + }, + }, + }); + + if (!field || !field.templateId) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'Field not found', + }); + } + + await prisma.field.delete({ + where: { + id: fieldId, + }, + }); +}; diff --git a/packages/lib/server-only/field/get-completed-fields-for-document.ts b/packages/lib/server-only/field/get-completed-fields-for-document.ts index 304be95ba..7fadc26b9 100644 --- a/packages/lib/server-only/field/get-completed-fields-for-document.ts +++ b/packages/lib/server-only/field/get-completed-fields-for-document.ts @@ -11,14 +11,14 @@ export const getCompletedFieldsForDocument = async ({ return await prisma.field.findMany({ where: { documentId, - Recipient: { + recipient: { signingStatus: SigningStatus.SIGNED, }, inserted: true, }, include: { - Signature: true, - Recipient: { + signature: true, + recipient: { select: { name: true, email: true, diff --git a/packages/lib/server-only/field/get-completed-fields-for-token.ts b/packages/lib/server-only/field/get-completed-fields-for-token.ts index 10cfb2672..ae6f122d6 100644 --- a/packages/lib/server-only/field/get-completed-fields-for-token.ts +++ b/packages/lib/server-only/field/get-completed-fields-for-token.ts @@ -8,21 +8,21 @@ export type GetCompletedFieldsForTokenOptions = { export const getCompletedFieldsForToken = async ({ token }: GetCompletedFieldsForTokenOptions) => { return await prisma.field.findMany({ where: { - Document: { - Recipient: { + document: { + recipients: { some: { token, }, }, }, - Recipient: { + recipient: { signingStatus: SigningStatus.SIGNED, }, inserted: true, }, include: { - Signature: true, - Recipient: { + signature: true, + recipient: { select: { name: true, email: true, diff --git a/packages/lib/server-only/field/get-field-by-id.ts b/packages/lib/server-only/field/get-field-by-id.ts index 13aa75d54..4df97868f 100644 --- a/packages/lib/server-only/field/get-field-by-id.ts +++ b/packages/lib/server-only/field/get-field-by-id.ts @@ -1,7 +1,4 @@ -import type { z } from 'zod'; - import { prisma } from '@documenso/prisma'; -import { FieldSchema } from '@documenso/prisma/generated/zod'; import { AppError, AppErrorCode } from '../../errors/app-error'; @@ -13,23 +10,19 @@ export type GetFieldByIdOptions = { templateId?: number; }; -export const ZGetFieldByIdResponseSchema = FieldSchema; - -export type TGetFieldByIdResponse = z.infer; - export const getFieldById = async ({ userId, teamId, fieldId, documentId, templateId, -}: GetFieldByIdOptions): Promise => { +}: GetFieldByIdOptions) => { const field = await prisma.field.findFirst({ where: { id: fieldId, documentId, templateId, - Document: { + document: { OR: teamId === undefined ? [ diff --git a/packages/lib/server-only/field/get-fields-for-document.ts b/packages/lib/server-only/field/get-fields-for-document.ts index 2cd8aa07c..9fa9f592d 100644 --- a/packages/lib/server-only/field/get-fields-for-document.ts +++ b/packages/lib/server-only/field/get-fields-for-document.ts @@ -3,34 +3,38 @@ import { prisma } from '@documenso/prisma'; export interface GetFieldsForDocumentOptions { documentId: number; userId: number; + teamId?: number; } export type DocumentField = Awaited>[number]; -export const getFieldsForDocument = async ({ documentId, userId }: GetFieldsForDocumentOptions) => { +export const getFieldsForDocument = async ({ + documentId, + userId, + teamId, +}: GetFieldsForDocumentOptions) => { const fields = await prisma.field.findMany({ where: { documentId, - Document: { - OR: [ - { - userId, - }, - { + document: teamId + ? { team: { + id: teamId, members: { some: { userId, }, }, }, + } + : { + userId, + teamId: null, }, - ], - }, }, include: { - Signature: true, - Recipient: { + signature: true, + recipient: { select: { name: true, email: true, diff --git a/packages/lib/server-only/field/get-fields-for-template.ts b/packages/lib/server-only/field/get-fields-for-template.ts deleted file mode 100644 index 724ec75fb..000000000 --- a/packages/lib/server-only/field/get-fields-for-template.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { prisma } from '@documenso/prisma'; - -export interface GetFieldsForTemplateOptions { - templateId: number; - userId: number; -} - -export const getFieldsForTemplate = async ({ templateId, userId }: GetFieldsForTemplateOptions) => { - const fields = await prisma.field.findMany({ - where: { - templateId, - Template: { - OR: [ - { - userId, - }, - { - team: { - members: { - some: { - userId, - }, - }, - }, - }, - ], - }, - }, - orderBy: { - id: 'asc', - }, - }); - - return fields; -}; diff --git a/packages/lib/server-only/field/get-fields-for-token.ts b/packages/lib/server-only/field/get-fields-for-token.ts index f70b3ec81..635773f8f 100644 --- a/packages/lib/server-only/field/get-fields-for-token.ts +++ b/packages/lib/server-only/field/get-fields-for-token.ts @@ -7,12 +7,12 @@ export type GetFieldsForTokenOptions = { export const getFieldsForToken = async ({ token }: GetFieldsForTokenOptions) => { return await prisma.field.findMany({ where: { - Recipient: { + recipient: { token, }, }, include: { - Signature: true, + signature: true, }, }); }; diff --git a/packages/lib/server-only/field/remove-signed-field-with-token.ts b/packages/lib/server-only/field/remove-signed-field-with-token.ts index 46d04dd58..654dfec20 100644 --- a/packages/lib/server-only/field/remove-signed-field-with-token.ts +++ b/packages/lib/server-only/field/remove-signed-field-with-token.ts @@ -20,17 +20,17 @@ export const removeSignedFieldWithToken = async ({ const field = await prisma.field.findFirstOrThrow({ where: { id: fieldId, - Recipient: { + recipient: { token, }, }, include: { - Document: true, - Recipient: true, + document: true, + recipient: true, }, }); - const { Document: document, Recipient: recipient } = field; + const { document, recipient } = field; if (!document) { throw new Error(`Document not found for field ${field.id}`); diff --git a/packages/lib/server-only/field/set-fields-for-document.ts b/packages/lib/server-only/field/set-fields-for-document.ts index 6b3a79bf2..b35deca02 100644 --- a/packages/lib/server-only/field/set-fields-for-document.ts +++ b/packages/lib/server-only/field/set-fields-for-document.ts @@ -1,5 +1,4 @@ import { isDeepEqual } from 'remeda'; -import { z } from 'zod'; import { validateCheckboxField } from '@documenso/lib/advanced-fields-validation/validate-checkbox'; import { validateDropdownField } from '@documenso/lib/advanced-fields-validation/validate-dropdown'; @@ -16,7 +15,7 @@ import { ZRadioFieldMeta, ZTextFieldMeta, } from '@documenso/lib/types/field-meta'; -import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; import { createDocumentAuditLogData, diffFieldChanges, @@ -24,61 +23,46 @@ import { import { prisma } from '@documenso/prisma'; import type { Field } from '@documenso/prisma/client'; import { FieldType } from '@documenso/prisma/client'; -import { FieldSchema } from '@documenso/prisma/generated/zod'; import { AppError, AppErrorCode } from '../../errors/app-error'; import { canRecipientFieldsBeModified } from '../../utils/recipients'; export interface SetFieldsForDocumentOptions { userId: number; + teamId?: number; documentId: number; fields: FieldData[]; - requestMetadata?: RequestMetadata; + requestMetadata: ApiRequestMetadata; } -export const ZSetFieldsForDocumentResponseSchema = z.object({ - fields: z.array(FieldSchema), -}); - -export type TSetFieldsForDocumentResponse = z.infer; - export const setFieldsForDocument = async ({ userId, + teamId, documentId, fields, requestMetadata, -}: SetFieldsForDocumentOptions): Promise => { +}: SetFieldsForDocumentOptions) => { const document = await prisma.document.findFirst({ where: { id: documentId, - OR: [ - { - userId, - }, - { - team: { - members: { - some: { - userId, + ...(teamId + ? { + team: { + id: teamId, + members: { + some: { + userId, + }, }, }, - }, - }, - ], + } + : { + userId, + teamId: null, + }), }, include: { - Recipient: true, - }, - }); - - const user = await prisma.user.findFirstOrThrow({ - where: { - id: userId, - }, - select: { - id: true, - name: true, - email: true, + recipients: true, }, }); @@ -99,7 +83,7 @@ export const setFieldsForDocument = async ({ documentId, }, include: { - Recipient: true, + recipient: true, }, }); @@ -110,7 +94,7 @@ export const setFieldsForDocument = async ({ const linkedFields = fields.map((field) => { const existing = existingFields.find((existingField) => existingField.id === field.id); - const recipient = document.Recipient.find( + const recipient = document.recipients.find( (recipient) => recipient.email.toLowerCase() === field.signerEmail.toLowerCase(), ); @@ -245,12 +229,12 @@ export const setFieldsForDocument = async ({ customText: '', inserted: false, fieldMeta: parsedFieldMeta, - Document: { + document: { connect: { id: documentId, }, }, - Recipient: { + recipient: { connect: { documentId_email: { documentId, @@ -280,8 +264,7 @@ export const setFieldsForDocument = async ({ data: createDocumentAuditLogData({ type: DOCUMENT_AUDIT_LOG_TYPE.FIELD_UPDATED, documentId: documentId, - user, - requestMetadata, + metadata: requestMetadata, data: { changes, ...baseAuditLog, @@ -296,8 +279,7 @@ export const setFieldsForDocument = async ({ data: createDocumentAuditLogData({ type: DOCUMENT_AUDIT_LOG_TYPE.FIELD_CREATED, documentId: documentId, - user, - requestMetadata, + metadata: requestMetadata, data: { ...baseAuditLog, }, @@ -325,11 +307,10 @@ export const setFieldsForDocument = async ({ createDocumentAuditLogData({ type: DOCUMENT_AUDIT_LOG_TYPE.FIELD_DELETED, documentId: documentId, - user, - requestMetadata, + metadata: requestMetadata, data: { fieldId: field.secondaryId, - fieldRecipientEmail: field.Recipient?.email ?? '', + fieldRecipientEmail: field.recipient?.email ?? '', fieldRecipientId: field.recipientId ?? -1, fieldType: field.type, }, diff --git a/packages/lib/server-only/field/set-fields-for-template.ts b/packages/lib/server-only/field/set-fields-for-template.ts index e89fa6250..156f0b359 100644 --- a/packages/lib/server-only/field/set-fields-for-template.ts +++ b/packages/lib/server-only/field/set-fields-for-template.ts @@ -1,5 +1,3 @@ -import { z } from 'zod'; - import { validateCheckboxField } from '@documenso/lib/advanced-fields-validation/validate-checkbox'; import { validateDropdownField } from '@documenso/lib/advanced-fields-validation/validate-dropdown'; import { validateNumberField } from '@documenso/lib/advanced-fields-validation/validate-number'; @@ -16,10 +14,10 @@ import { } from '@documenso/lib/types/field-meta'; import { prisma } from '@documenso/prisma'; import { FieldType } from '@documenso/prisma/client'; -import { FieldSchema } from '@documenso/prisma/generated/zod'; export type SetFieldsForTemplateOptions = { userId: number; + teamId?: number; templateId: number; fields: { id?: number | null; @@ -34,34 +32,30 @@ export type SetFieldsForTemplateOptions = { }[]; }; -export const ZSetFieldsForTemplateResponseSchema = z.object({ - fields: z.array(FieldSchema), -}); - -export type TSetFieldsForTemplateResponse = z.infer; - export const setFieldsForTemplate = async ({ userId, + teamId, templateId, fields, -}: SetFieldsForTemplateOptions): Promise => { +}: SetFieldsForTemplateOptions) => { const template = await prisma.template.findFirst({ where: { id: templateId, - OR: [ - { - userId, - }, - { - team: { - members: { - some: { - userId, + ...(teamId + ? { + team: { + id: teamId, + members: { + some: { + userId, + }, }, }, - }, - }, - ], + } + : { + userId, + teamId: null, + }), }, }); @@ -74,7 +68,7 @@ export const setFieldsForTemplate = async ({ templateId, }, include: { - Recipient: true, + recipient: true, }, }); @@ -179,12 +173,12 @@ export const setFieldsForTemplate = async ({ customText: '', inserted: false, fieldMeta: parsedFieldMeta, - Template: { + template: { connect: { id: templateId, }, }, - Recipient: { + recipient: { connect: { templateId_email: { templateId, 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 937ea8f1d..f5b170ba5 100644 --- a/packages/lib/server-only/field/sign-field-with-token.ts +++ b/packages/lib/server-only/field/sign-field-with-token.ts @@ -59,17 +59,17 @@ export const signFieldWithToken = async ({ const field = await prisma.field.findFirstOrThrow({ where: { id: fieldId, - Recipient: { + recipient: { token, }, }, include: { - Document: true, - Recipient: true, + document: true, + recipient: true, }, }); - const { Document: document, Recipient: recipient } = field; + const { document, recipient } = field; if (!document) { throw new Error(`Document not found for field ${field.id}`); @@ -213,7 +213,7 @@ export const signFieldWithToken = async ({ // Dirty but I don't want to deal with type information Object.assign(updatedField, { - Signature: signature, + signature, }); } diff --git a/packages/lib/server-only/field/update-document-fields.ts b/packages/lib/server-only/field/update-document-fields.ts new file mode 100644 index 000000000..0e279f2aa --- /dev/null +++ b/packages/lib/server-only/field/update-document-fields.ts @@ -0,0 +1,156 @@ +import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; +import type { TFieldMetaSchema } from '@documenso/lib/types/field-meta'; +import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import { + createDocumentAuditLogData, + diffFieldChanges, +} from '@documenso/lib/utils/document-audit-logs'; +import { prisma } from '@documenso/prisma'; +import type { FieldType } from '@documenso/prisma/client'; + +import { AppError, AppErrorCode } from '../../errors/app-error'; +import { canRecipientFieldsBeModified } from '../../utils/recipients'; + +export interface UpdateDocumentFieldsOptions { + userId: number; + teamId?: number; + documentId: number; + fields: { + id: number; + type?: FieldType; + pageNumber?: number; + pageX?: number; + pageY?: number; + width?: number; + height?: number; + fieldMeta?: TFieldMetaSchema; + }[]; + requestMetadata: ApiRequestMetadata; +} + +export const updateDocumentFields = async ({ + userId, + teamId, + documentId, + fields, + requestMetadata, +}: UpdateDocumentFieldsOptions) => { + const document = await prisma.document.findFirst({ + where: { + id: documentId, + ...(teamId + ? { + team: { + id: teamId, + members: { + some: { + userId, + }, + }, + }, + } + : { + userId, + teamId: null, + }), + }, + include: { + recipients: true, + fields: true, + }, + }); + + if (!document) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'Document not found', + }); + } + + if (document.completedAt) { + throw new AppError(AppErrorCode.INVALID_REQUEST, { + message: 'Document already complete', + }); + } + + const fieldsToUpdate = fields.map((field) => { + const originalField = document.fields.find((existingField) => existingField.id === field.id); + + if (!originalField) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: `Field with id ${field.id} not found`, + }); + } + + const recipient = document.recipients.find( + (recipient) => recipient.id === originalField.recipientId, + ); + + // Each field MUST have a recipient associated with it. + if (!recipient) { + throw new AppError(AppErrorCode.INVALID_REQUEST, { + message: `Recipient attached to field ${field.id} not found`, + }); + } + + // Check whether the recipient associated with the field can be modified. + if (!canRecipientFieldsBeModified(recipient, document.fields)) { + throw new AppError(AppErrorCode.INVALID_REQUEST, { + message: + 'Cannot modify a field where the recipient has already interacted with the document', + }); + } + + return { + originalField, + updateData: field, + recipientEmail: recipient.email, + }; + }); + + const updatedFields = await prisma.$transaction(async (tx) => { + return await Promise.all( + fieldsToUpdate.map(async ({ originalField, updateData, recipientEmail }) => { + const updatedField = await tx.field.update({ + where: { + id: updateData.id, + }, + data: { + type: updateData.type, + page: updateData.pageNumber, + positionX: updateData.pageX, + positionY: updateData.pageY, + width: updateData.width, + height: updateData.height, + fieldMeta: updateData.fieldMeta, + }, + }); + + const changes = diffFieldChanges(originalField, updatedField); + + // Handle field updated audit log. + if (changes.length > 0) { + await tx.documentAuditLog.create({ + data: createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.FIELD_UPDATED, + documentId: documentId, + metadata: requestMetadata, + data: { + fieldId: updatedField.secondaryId, + fieldRecipientEmail: recipientEmail, + fieldRecipientId: updatedField.recipientId, + fieldType: updatedField.type, + changes, + }, + }), + }); + } + + return updatedField; + }), + ); + }); + + return { + fields: updatedFields, + }; +}; diff --git a/packages/lib/server-only/field/update-field.ts b/packages/lib/server-only/field/update-field.ts index 434d0f651..baf04bca8 100644 --- a/packages/lib/server-only/field/update-field.ts +++ b/packages/lib/server-only/field/update-field.ts @@ -44,7 +44,7 @@ export const updateField = async ({ const oldField = await prisma.field.findFirstOrThrow({ where: { id: fieldId, - Document: { + document: { id: documentId, ...(teamId ? { @@ -65,11 +65,6 @@ export const updateField = async ({ }, }); - const newFieldMeta = { - ...(oldField.fieldMeta as FieldMeta), - ...fieldMeta, - }; - const field = prisma.$transaction(async (tx) => { const updatedField = await tx.field.update({ where: { @@ -83,10 +78,10 @@ export const updateField = async ({ positionY: pageY, width: pageWidth, height: pageHeight, - fieldMeta: newFieldMeta, + fieldMeta, }, include: { - Recipient: true, + recipient: true, }, }); @@ -127,7 +122,7 @@ export const updateField = async ({ }, data: { fieldId: updatedField.secondaryId, - fieldRecipientEmail: updatedField.Recipient?.email ?? '', + fieldRecipientEmail: updatedField.recipient?.email ?? '', fieldRecipientId: recipientId ?? -1, fieldType: updatedField.type, changes: diffFieldChanges(oldField, updatedField), diff --git a/packages/lib/server-only/field/update-template-fields.ts b/packages/lib/server-only/field/update-template-fields.ts new file mode 100644 index 000000000..c1b3bc389 --- /dev/null +++ b/packages/lib/server-only/field/update-template-fields.ts @@ -0,0 +1,120 @@ +import type { TFieldMetaSchema } from '@documenso/lib/types/field-meta'; +import { prisma } from '@documenso/prisma'; +import type { FieldType } from '@documenso/prisma/client'; + +import { AppError, AppErrorCode } from '../../errors/app-error'; +import { canRecipientFieldsBeModified } from '../../utils/recipients'; + +export interface UpdateTemplateFieldsOptions { + userId: number; + teamId?: number; + templateId: number; + fields: { + id: number; + type?: FieldType; + pageNumber?: number; + pageX?: number; + pageY?: number; + width?: number; + height?: number; + fieldMeta?: TFieldMetaSchema; + }[]; +} + +export const updateTemplateFields = async ({ + userId, + teamId, + templateId, + fields, +}: UpdateTemplateFieldsOptions) => { + const template = await prisma.template.findFirst({ + where: { + id: templateId, + ...(teamId + ? { + team: { + id: teamId, + members: { + some: { + userId, + }, + }, + }, + } + : { + userId, + teamId: null, + }), + }, + include: { + recipients: true, + fields: true, + }, + }); + + if (!template) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'Document not found', + }); + } + + const fieldsToUpdate = fields.map((field) => { + const originalField = template.fields.find((existingField) => existingField.id === field.id); + + if (!originalField) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: `Field with id ${field.id} not found`, + }); + } + + const recipient = template.recipients.find( + (recipient) => recipient.id === originalField.recipientId, + ); + + // Each field MUST have a recipient associated with it. + if (!recipient) { + throw new AppError(AppErrorCode.INVALID_REQUEST, { + message: `Recipient attached to field ${field.id} not found`, + }); + } + + // Check whether the recipient associated with the field can be modified. + if (!canRecipientFieldsBeModified(recipient, template.fields)) { + throw new AppError(AppErrorCode.INVALID_REQUEST, { + message: + 'Cannot modify a field where the recipient has already interacted with the document', + }); + } + + return { + updateData: field, + }; + }); + + const updatedFields = await prisma.$transaction(async (tx) => { + return await Promise.all( + fieldsToUpdate.map(async ({ updateData }) => { + const updatedField = await tx.field.update({ + where: { + id: updateData.id, + }, + data: { + type: updateData.type, + page: updateData.pageNumber, + positionX: updateData.pageX, + positionY: updateData.pageY, + width: updateData.width, + height: updateData.height, + fieldMeta: updateData.fieldMeta, + }, + }); + + return updatedField; + }), + ); + }); + + return { + fields: updatedFields, + }; +}; diff --git a/packages/lib/server-only/pdf/insert-field-in-pdf.ts b/packages/lib/server-only/pdf/insert-field-in-pdf.ts index 588b3b854..dc2308978 100644 --- a/packages/lib/server-only/pdf/insert-field-in-pdf.ts +++ b/packages/lib/server-only/pdf/insert-field-in-pdf.ts @@ -1,7 +1,7 @@ // https://github.com/Hopding/pdf-lib/issues/20#issuecomment-412852821 import fontkit from '@pdf-lib/fontkit'; import type { PDFDocument } from 'pdf-lib'; -import { RotationTypes, degrees, radiansToDegrees } from 'pdf-lib'; +import { RotationTypes, degrees, radiansToDegrees, rgb } from 'pdf-lib'; import { P, match } from 'ts-pattern'; import { @@ -36,6 +36,9 @@ export const insertFieldInPDF = async (pdf: PDFDocument, field: FieldWithSignatu ); const isSignatureField = isSignatureFieldType(field.type); + const isDebugMode = + // eslint-disable-next-line turbo/no-undeclared-env-vars + process.env.DEBUG_PDF_INSERT === '1' || process.env.DEBUG_PDF_INSERT === 'true'; pdf.registerFontkit(fontkit); @@ -83,6 +86,35 @@ export const insertFieldInPDF = async (pdf: PDFDocument, field: FieldWithSignatu const fieldX = pageWidth * (Number(field.positionX) / 100); const fieldY = pageHeight * (Number(field.positionY) / 100); + // Draw debug box if debug mode is enabled + if (isDebugMode) { + let debugX = fieldX; + let debugY = pageHeight - fieldY - fieldHeight; // Invert Y for PDF coordinates + + if (pageRotationInDegrees !== 0) { + const adjustedPosition = adjustPositionForRotation( + pageWidth, + pageHeight, + debugX, + debugY, + pageRotationInDegrees, + ); + + debugX = adjustedPosition.xPos; + debugY = adjustedPosition.yPos; + } + + page.drawRectangle({ + x: debugX, + y: debugY, + width: fieldWidth, + height: fieldHeight, + borderColor: rgb(1, 0, 0), // Red + borderWidth: 1, + rotate: degrees(pageRotationInDegrees), + }); + } + const font = await pdf.embedFont( isSignatureField ? fontCaveat : fontNoto, isSignatureField ? { features: { calt: false } } : undefined, @@ -98,8 +130,8 @@ export const insertFieldInPDF = async (pdf: PDFDocument, field: FieldWithSignatu type: P.union(FieldType.SIGNATURE, FieldType.FREE_SIGNATURE), }, async (field) => { - if (field.Signature?.signatureImageAsBase64) { - const image = await pdf.embedPng(field.Signature?.signatureImageAsBase64 ?? ''); + if (field.signature?.signatureImageAsBase64) { + const image = await pdf.embedPng(field.signature?.signatureImageAsBase64 ?? ''); let imageWidth = image.width; let imageHeight = image.height; @@ -136,7 +168,7 @@ export const insertFieldInPDF = async (pdf: PDFDocument, field: FieldWithSignatu rotate: degrees(pageRotationInDegrees), }); } else { - const signatureText = field.Signature?.typedSignature ?? ''; + const signatureText = field.signature?.typedSignature ?? ''; const longestLineInTextForWidth = signatureText .split('\n') @@ -278,6 +310,7 @@ export const insertFieldInPDF = async (pdf: PDFDocument, field: FieldWithSignatu const meta = Parser ? Parser.safeParse(field.fieldMeta) : null; const customFontSize = meta?.success && meta.data.fontSize ? meta.data.fontSize : null; + const textAlign = meta?.success && meta.data.textAlign ? meta.data.textAlign : 'center'; const longestLineInTextForWidth = field.customText .split('\n') .sort((a, b) => b.length - a.length)[0]; @@ -293,7 +326,17 @@ export const insertFieldInPDF = async (pdf: PDFDocument, field: FieldWithSignatu textWidth = font.widthOfTextAtSize(longestLineInTextForWidth, fontSize); - let textX = fieldX + (fieldWidth - textWidth) / 2; + // Add padding similar to web display (roughly 0.5rem equivalent in PDF units) + const padding = 8; // PDF points, roughly equivalent to 0.5rem + + // Calculate X position based on text alignment with padding + let textX = fieldX + padding; // Left alignment starts after padding + if (textAlign === 'center') { + textX = fieldX + (fieldWidth - textWidth) / 2; // Center alignment ignores padding + } else if (textAlign === 'right') { + textX = fieldX + fieldWidth - textWidth - padding; // Right alignment respects right padding + } + let textY = fieldY + (fieldHeight - textHeight) / 2; // Invert the Y axis since PDFs use a bottom-left coordinate system diff --git a/packages/lib/server-only/profile/get-public-profile-by-url.ts b/packages/lib/server-only/profile/get-public-profile-by-url.ts index 015ca9709..7b8f53e3f 100644 --- a/packages/lib/server-only/profile/get-public-profile-by-url.ts +++ b/packages/lib/server-only/profile/get-public-profile-by-url.ts @@ -61,7 +61,7 @@ export const getPublicProfileByUrl = async ({ }, include: { profile: true, - Template: { + templates: { where: { directLink: { enabled: true, @@ -73,7 +73,7 @@ export const getPublicProfileByUrl = async ({ }, }, // Subscriptions and teamMembers are used to calculate the badges. - Subscription: { + subscriptions: { where: { status: SubscriptionStatus.ACTIVE, }, @@ -133,7 +133,7 @@ export const getPublicProfileByUrl = async ({ if (IS_BILLING_ENABLED()) { const earlyAdopterPriceIds = await getCommunityPlanPriceIds(); - const activeEarlyAdopterSub = user.Subscription.find( + const activeEarlyAdopterSub = user.subscriptions.find( (subscription) => subscription.status === SubscriptionStatus.ACTIVE && earlyAdopterPriceIds.includes(subscription.priceId), @@ -154,7 +154,7 @@ export const getPublicProfileByUrl = async ({ url: profileUrl, avatarImageId: user.avatarImageId, name: user.name || '', - templates: user.Template.filter( + templates: user.templates.filter( (template): template is PublicDirectLinkTemplate => template.directLink?.enabled === true && template.type === TemplateType.PUBLIC, ), diff --git a/packages/lib/server-only/profile/set-avatar-image.ts b/packages/lib/server-only/profile/set-avatar-image.ts index 92683dcc4..1bb63d824 100644 --- a/packages/lib/server-only/profile/set-avatar-image.ts +++ b/packages/lib/server-only/profile/set-avatar-image.ts @@ -3,13 +3,13 @@ import sharp from 'sharp'; import { prisma } from '@documenso/prisma'; import { AppError, AppErrorCode } from '../../errors/app-error'; -import type { RequestMetadata } from '../../universal/extract-request-metadata'; +import type { ApiRequestMetadata } from '../../universal/extract-request-metadata'; export type SetAvatarImageOptions = { userId: number; teamId?: number | null; bytes?: string | null; - requestMetadata?: RequestMetadata; + requestMetadata: ApiRequestMetadata; }; export const setAvatarImage = async ({ diff --git a/packages/lib/server-only/public-api/create-api-token.ts b/packages/lib/server-only/public-api/create-api-token.ts index 3d54eb26d..e40dccb0c 100644 --- a/packages/lib/server-only/public-api/create-api-token.ts +++ b/packages/lib/server-only/public-api/create-api-token.ts @@ -6,6 +6,7 @@ import { TeamMemberRole } from '@documenso/prisma/client'; // temporary choice for testing only import * as timeConstants from '../../constants/time'; +import { AppError, AppErrorCode } from '../../errors/app-error'; import { alphaid } from '../../universal/id'; import { hashString } from '../auth/hash'; @@ -42,7 +43,9 @@ export const createApiToken = async ({ }); if (!member) { - throw new Error('You do not have permission to create a token for this team'); + throw new AppError(AppErrorCode.UNAUTHORIZED, { + message: 'You do not have permission to create a token for this team', + }); } } @@ -56,10 +59,6 @@ export const createApiToken = async ({ }, }); - if (!storedToken) { - throw new Error('Failed to create the API token'); - } - return { id: storedToken.id, token: apiToken, diff --git a/packages/lib/server-only/public-api/get-user-by-token.ts b/packages/lib/server-only/public-api/get-user-by-token.ts index 5fe50f336..a8c39f75b 100644 --- a/packages/lib/server-only/public-api/get-user-by-token.ts +++ b/packages/lib/server-only/public-api/get-user-by-token.ts @@ -7,14 +7,14 @@ export const getUserByApiToken = async ({ token }: { token: string }) => { const user = await prisma.user.findFirst({ where: { - ApiToken: { + apiTokens: { some: { token: hashedToken, }, }, }, include: { - ApiToken: true, + apiTokens: true, }, }); @@ -22,7 +22,7 @@ export const getUserByApiToken = async ({ token }: { token: string }) => { throw new Error('Invalid token'); } - const retrievedToken = user.ApiToken.find((apiToken) => apiToken.token === hashedToken); + const retrievedToken = user.apiTokens.find((apiToken) => apiToken.token === hashedToken); // This should be impossible but we need to satisfy TypeScript if (!retrievedToken) { diff --git a/packages/lib/server-only/recipient/create-document-recipients.ts b/packages/lib/server-only/recipient/create-document-recipients.ts new file mode 100644 index 000000000..cd52b3632 --- /dev/null +++ b/packages/lib/server-only/recipient/create-document-recipients.ts @@ -0,0 +1,156 @@ +import { isUserEnterprise } from '@documenso/ee/server-only/util/is-document-enterprise'; +import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; +import type { TRecipientAccessAuthTypes } from '@documenso/lib/types/document-auth'; +import { type TRecipientActionAuthTypes } from '@documenso/lib/types/document-auth'; +import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import { nanoid } from '@documenso/lib/universal/id'; +import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs'; +import { createRecipientAuthOptions } from '@documenso/lib/utils/document-auth'; +import { prisma } from '@documenso/prisma'; +import { RecipientRole } from '@documenso/prisma/client'; +import { SendStatus, SigningStatus } from '@documenso/prisma/client'; + +import { AppError, AppErrorCode } from '../../errors/app-error'; + +export interface CreateDocumentRecipientsOptions { + userId: number; + teamId?: number; + documentId: number; + recipients: { + email: string; + name: string; + role: RecipientRole; + signingOrder?: number | null; + accessAuth?: TRecipientAccessAuthTypes | null; + actionAuth?: TRecipientActionAuthTypes | null; + }[]; + requestMetadata: ApiRequestMetadata; +} + +export const createDocumentRecipients = async ({ + userId, + teamId, + documentId, + recipients: recipientsToCreate, + requestMetadata, +}: CreateDocumentRecipientsOptions) => { + const document = await prisma.document.findFirst({ + where: { + id: documentId, + ...(teamId + ? { + team: { + id: teamId, + members: { + some: { + userId, + }, + }, + }, + } + : { + userId, + teamId: null, + }), + }, + include: { + recipients: true, + }, + }); + + if (!document) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'Document not found', + }); + } + + if (document.completedAt) { + throw new AppError(AppErrorCode.INVALID_REQUEST, { + message: 'Document already complete', + }); + } + + const recipientsHaveActionAuth = recipientsToCreate.some((recipient) => recipient.actionAuth); + + // Check if user has permission to set the global action auth. + if (recipientsHaveActionAuth) { + const isEnterprise = await isUserEnterprise({ + userId, + teamId, + }); + + if (!isEnterprise) { + throw new AppError(AppErrorCode.UNAUTHORIZED, { + message: 'You do not have permission to set the action auth', + }); + } + } + + const normalizedRecipients = recipientsToCreate.map((recipient) => ({ + ...recipient, + email: recipient.email.toLowerCase(), + })); + + const duplicateRecipients = normalizedRecipients.filter((newRecipient) => { + const existingRecipient = document.recipients.find( + (existingRecipient) => existingRecipient.email === newRecipient.email, + ); + + return existingRecipient !== undefined; + }); + + if (duplicateRecipients.length > 0) { + throw new AppError(AppErrorCode.INVALID_REQUEST, { + message: `Duplicate recipient(s) found for ${duplicateRecipients.map((recipient) => recipient.email).join(', ')}`, + }); + } + + const createdRecipients = await prisma.$transaction(async (tx) => { + return await Promise.all( + normalizedRecipients.map(async (recipient) => { + const authOptions = createRecipientAuthOptions({ + accessAuth: recipient.accessAuth || null, + actionAuth: recipient.actionAuth || null, + }); + + const createdRecipient = await tx.recipient.create({ + data: { + documentId, + name: recipient.name, + email: recipient.email, + role: recipient.role, + signingOrder: recipient.signingOrder, + token: nanoid(), + sendStatus: recipient.role === RecipientRole.CC ? SendStatus.SENT : SendStatus.NOT_SENT, + signingStatus: + recipient.role === RecipientRole.CC ? SigningStatus.SIGNED : SigningStatus.NOT_SIGNED, + authOptions, + }, + }); + + // Handle recipient created audit log. + await tx.documentAuditLog.create({ + data: createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.RECIPIENT_CREATED, + documentId: documentId, + metadata: requestMetadata, + data: { + recipientEmail: createdRecipient.email, + recipientName: createdRecipient.name, + recipientId: createdRecipient.id, + recipientRole: createdRecipient.role, + accessAuth: recipient.accessAuth || undefined, + actionAuth: recipient.actionAuth || undefined, + }, + }), + }); + + return createdRecipient; + }), + ); + }); + + return { + recipients: createdRecipients, + }; +}; diff --git a/packages/lib/server-only/recipient/create-template-recipients.ts b/packages/lib/server-only/recipient/create-template-recipients.ts new file mode 100644 index 000000000..a843a0adb --- /dev/null +++ b/packages/lib/server-only/recipient/create-template-recipients.ts @@ -0,0 +1,128 @@ +import { isUserEnterprise } from '@documenso/ee/server-only/util/is-document-enterprise'; +import type { TRecipientAccessAuthTypes } from '@documenso/lib/types/document-auth'; +import { type TRecipientActionAuthTypes } from '@documenso/lib/types/document-auth'; +import { nanoid } from '@documenso/lib/universal/id'; +import { createRecipientAuthOptions } from '@documenso/lib/utils/document-auth'; +import { prisma } from '@documenso/prisma'; +import { RecipientRole } from '@documenso/prisma/client'; +import { SendStatus, SigningStatus } from '@documenso/prisma/client'; + +import { AppError, AppErrorCode } from '../../errors/app-error'; + +export interface CreateTemplateRecipientsOptions { + userId: number; + teamId?: number; + templateId: number; + recipients: { + email: string; + name: string; + role: RecipientRole; + signingOrder?: number | null; + accessAuth?: TRecipientAccessAuthTypes | null; + actionAuth?: TRecipientActionAuthTypes | null; + }[]; +} + +export const createTemplateRecipients = async ({ + userId, + teamId, + templateId, + recipients: recipientsToCreate, +}: CreateTemplateRecipientsOptions) => { + const template = await prisma.template.findFirst({ + where: { + id: templateId, + ...(teamId + ? { + team: { + id: teamId, + members: { + some: { + userId, + }, + }, + }, + } + : { + userId, + teamId: null, + }), + }, + include: { + recipients: true, + }, + }); + + if (!template) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'Template not found', + }); + } + + const recipientsHaveActionAuth = recipientsToCreate.some((recipient) => recipient.actionAuth); + + // Check if user has permission to set the global action auth. + if (recipientsHaveActionAuth) { + const isEnterprise = await isUserEnterprise({ + userId, + teamId, + }); + + if (!isEnterprise) { + throw new AppError(AppErrorCode.UNAUTHORIZED, { + message: 'You do not have permission to set the action auth', + }); + } + } + + const normalizedRecipients = recipientsToCreate.map((recipient) => ({ + ...recipient, + email: recipient.email.toLowerCase(), + })); + + const duplicateRecipients = normalizedRecipients.filter((newRecipient) => { + const existingRecipient = template.recipients.find( + (existingRecipient) => existingRecipient.email === newRecipient.email, + ); + + return existingRecipient !== undefined; + }); + + if (duplicateRecipients.length > 0) { + throw new AppError(AppErrorCode.INVALID_REQUEST, { + message: `Duplicate recipient(s) found for ${duplicateRecipients.map((recipient) => recipient.email).join(', ')}`, + }); + } + + const createdRecipients = await prisma.$transaction(async (tx) => { + return await Promise.all( + normalizedRecipients.map(async (recipient) => { + const authOptions = createRecipientAuthOptions({ + accessAuth: recipient.accessAuth || null, + actionAuth: recipient.actionAuth || null, + }); + + const createdRecipient = await tx.recipient.create({ + data: { + templateId, + name: recipient.name, + email: recipient.email, + role: recipient.role, + signingOrder: recipient.signingOrder, + token: nanoid(), + sendStatus: recipient.role === RecipientRole.CC ? SendStatus.SENT : SendStatus.NOT_SENT, + signingStatus: + recipient.role === RecipientRole.CC ? SigningStatus.SIGNED : SigningStatus.NOT_SIGNED, + authOptions, + }, + }); + + return createdRecipient; + }), + ); + }); + + return { + recipients: createdRecipients, + }; +}; diff --git a/packages/lib/server-only/recipient/delete-document-recipient.ts b/packages/lib/server-only/recipient/delete-document-recipient.ts new file mode 100644 index 000000000..792c441ae --- /dev/null +++ b/packages/lib/server-only/recipient/delete-document-recipient.ts @@ -0,0 +1,161 @@ +import { createElement } from 'react'; + +import { msg } from '@lingui/macro'; + +import { mailer } from '@documenso/email/mailer'; +import RecipientRemovedFromDocumentTemplate from '@documenso/email/templates/recipient-removed-from-document'; +import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; +import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import { prisma } from '@documenso/prisma'; +import { SendStatus } from '@documenso/prisma/client'; + +import { getI18nInstance } from '../../client-only/providers/i18n.server'; +import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; +import { FROM_ADDRESS, FROM_NAME } from '../../constants/email'; +import { AppError, AppErrorCode } from '../../errors/app-error'; +import { extractDerivedDocumentEmailSettings } from '../../types/document-email'; +import { createDocumentAuditLogData } from '../../utils/document-audit-logs'; +import { renderEmailWithI18N } from '../../utils/render-email-with-i18n'; + +export interface DeleteDocumentRecipientOptions { + userId: number; + teamId?: number; + recipientId: number; + requestMetadata: ApiRequestMetadata; +} + +export const deleteDocumentRecipient = async ({ + userId, + teamId, + recipientId, + requestMetadata, +}: DeleteDocumentRecipientOptions): Promise => { + const document = await prisma.document.findFirst({ + where: { + recipients: { + some: { + id: recipientId, + }, + }, + ...(teamId + ? { + team: { + id: teamId, + members: { + some: { + userId, + }, + }, + }, + } + : { + userId, + teamId: null, + }), + }, + include: { + documentMeta: true, + team: true, + recipients: { + where: { + id: recipientId, + }, + }, + }, + }); + + const user = await prisma.user.findFirst({ + where: { + id: userId, + }, + select: { + id: true, + name: true, + email: true, + }, + }); + + if (!document) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'Document not found', + }); + } + + if (document.completedAt) { + throw new AppError(AppErrorCode.INVALID_REQUEST, { + message: 'Document already complete', + }); + } + + if (!user) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'User not found', + }); + } + + const recipientToDelete = document.recipients[0]; + + if (!recipientToDelete || recipientToDelete.id !== recipientId) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'Recipient not found', + }); + } + + await prisma.$transaction(async (tx) => { + await tx.recipient.delete({ + where: { + id: recipientId, + }, + }); + + await tx.documentAuditLog.create({ + data: createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.RECIPIENT_DELETED, + documentId: document.id, + metadata: requestMetadata, + data: { + recipientEmail: recipientToDelete.email, + recipientName: recipientToDelete.name, + recipientId: recipientToDelete.id, + recipientRole: recipientToDelete.role, + }, + }), + }); + }); + + const isRecipientRemovedEmailEnabled = extractDerivedDocumentEmailSettings( + document.documentMeta, + ).recipientRemoved; + + // Send email to deleted recipient. + if (recipientToDelete.sendStatus === SendStatus.SENT && isRecipientRemovedEmailEnabled) { + const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL() || 'http://localhost:3000'; + + const template = createElement(RecipientRemovedFromDocumentTemplate, { + documentName: document.title, + inviterName: document.team?.name || user.name || undefined, + assetBaseUrl, + }); + + const [html, text] = await Promise.all([ + renderEmailWithI18N(template, { lang: document.documentMeta?.language }), + renderEmailWithI18N(template, { lang: document.documentMeta?.language, plainText: true }), + ]); + + const i18n = await getI18nInstance(document.documentMeta?.language); + + await mailer.sendMail({ + to: { + address: recipientToDelete.email, + name: recipientToDelete.name, + }, + from: { + name: FROM_NAME, + address: FROM_ADDRESS, + }, + subject: i18n._(msg`You have been removed from a document`), + html, + text, + }); + } +}; diff --git a/packages/lib/server-only/recipient/delete-recipient.ts b/packages/lib/server-only/recipient/delete-recipient.ts index 74fb4a8d2..4b5e398f2 100644 --- a/packages/lib/server-only/recipient/delete-recipient.ts +++ b/packages/lib/server-only/recipient/delete-recipient.ts @@ -23,7 +23,7 @@ export const deleteRecipient = async ({ const recipient = await prisma.recipient.findFirst({ where: { id: recipientId, - Document: { + document: { id: documentId, ...(teamId ? { diff --git a/packages/lib/server-only/recipient/delete-template-recipient.ts b/packages/lib/server-only/recipient/delete-template-recipient.ts new file mode 100644 index 000000000..8b10e9552 --- /dev/null +++ b/packages/lib/server-only/recipient/delete-template-recipient.ts @@ -0,0 +1,67 @@ +import { prisma } from '@documenso/prisma'; + +import { AppError, AppErrorCode } from '../../errors/app-error'; + +export interface DeleteTemplateRecipientOptions { + userId: number; + teamId?: number; + recipientId: number; +} + +export const deleteTemplateRecipient = async ({ + userId, + teamId, + recipientId, +}: DeleteTemplateRecipientOptions): Promise => { + const template = await prisma.template.findFirst({ + where: { + recipients: { + some: { + id: recipientId, + }, + }, + ...(teamId + ? { + team: { + id: teamId, + members: { + some: { + userId, + }, + }, + }, + } + : { + userId, + teamId: null, + }), + }, + include: { + recipients: { + where: { + id: recipientId, + }, + }, + }, + }); + + if (!template) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'Template not found', + }); + } + + const recipientToDelete = template.recipients[0]; + + if (!recipientToDelete || recipientToDelete.id !== recipientId) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'Recipient not found', + }); + } + + await prisma.recipient.delete({ + where: { + id: recipientId, + }, + }); +}; diff --git a/packages/lib/server-only/recipient/get-is-recipient-turn.ts b/packages/lib/server-only/recipient/get-is-recipient-turn.ts index 72977ac22..a59819e95 100644 --- a/packages/lib/server-only/recipient/get-is-recipient-turn.ts +++ b/packages/lib/server-only/recipient/get-is-recipient-turn.ts @@ -8,7 +8,7 @@ export type GetIsRecipientTurnOptions = { export async function getIsRecipientsTurnToSign({ token }: GetIsRecipientTurnOptions) { const document = await prisma.document.findFirstOrThrow({ where: { - Recipient: { + recipients: { some: { token, }, @@ -16,7 +16,7 @@ export async function getIsRecipientsTurnToSign({ token }: GetIsRecipientTurnOpt }, include: { documentMeta: true, - Recipient: { + recipients: { orderBy: { signingOrder: 'asc', }, @@ -28,7 +28,7 @@ export async function getIsRecipientsTurnToSign({ token }: GetIsRecipientTurnOpt return true; } - const recipients = document.Recipient; + const { recipients } = document; const currentRecipientIndex = recipients.findIndex((r) => r.token === token); diff --git a/packages/lib/server-only/recipient/get-recipient-by-id.ts b/packages/lib/server-only/recipient/get-recipient-by-id.ts index 52b98019f..e14c93955 100644 --- a/packages/lib/server-only/recipient/get-recipient-by-id.ts +++ b/packages/lib/server-only/recipient/get-recipient-by-id.ts @@ -1,7 +1,4 @@ -import type { z } from 'zod'; - import { prisma } from '@documenso/prisma'; -import { FieldSchema, RecipientSchema } from '@documenso/prisma/generated/zod'; import { AppError, AppErrorCode } from '../../errors/app-error'; @@ -11,12 +8,6 @@ export type GetRecipientByIdOptions = { teamId?: number; }; -export const ZGetRecipientByIdResponseSchema = RecipientSchema.extend({ - Field: FieldSchema.array(), -}); - -export type TGetRecipientByIdResponse = z.infer; - /** * Get a recipient by ID. This will also return the recipient signing token so * be careful when using this. @@ -25,32 +16,28 @@ export const getRecipientById = async ({ recipientId, userId, teamId, -}: GetRecipientByIdOptions): Promise => { +}: GetRecipientByIdOptions) => { const recipient = await prisma.recipient.findFirst({ where: { id: recipientId, - Document: { - OR: [ - teamId === undefined - ? { - userId, - teamId: null, - } - : { - teamId, - team: { - members: { - some: { - userId, - }, - }, + document: teamId + ? { + team: { + id: teamId, + members: { + some: { + userId, }, }, - ], - }, + }, + } + : { + userId, + teamId: null, + }, }, include: { - Field: true, + fields: true, }, }); diff --git a/packages/lib/server-only/recipient/get-recipient-signatures.ts b/packages/lib/server-only/recipient/get-recipient-signatures.ts index 9b37e84b5..26701a97d 100644 --- a/packages/lib/server-only/recipient/get-recipient-signatures.ts +++ b/packages/lib/server-only/recipient/get-recipient-signatures.ts @@ -7,7 +7,7 @@ export type GetRecipientSignaturesOptions = { export const getRecipientSignatures = async ({ recipientId }: GetRecipientSignaturesOptions) => { return await prisma.signature.findMany({ where: { - Field: { + field: { recipientId, }, }, diff --git a/packages/lib/server-only/recipient/get-recipients-for-document.ts b/packages/lib/server-only/recipient/get-recipients-for-document.ts index 03bc0e6c8..daa34d106 100644 --- a/packages/lib/server-only/recipient/get-recipients-for-document.ts +++ b/packages/lib/server-only/recipient/get-recipients-for-document.ts @@ -14,23 +14,21 @@ export const getRecipientsForDocument = async ({ const recipients = await prisma.recipient.findMany({ where: { documentId, - Document: { - OR: [ - { - userId, - }, - { - teamId, + document: teamId + ? { team: { + id: teamId, members: { some: { userId, }, }, }, + } + : { + userId, + teamId: null, }, - ], - }, }, orderBy: { id: 'asc', diff --git a/packages/lib/server-only/recipient/get-recipients-for-template.ts b/packages/lib/server-only/recipient/get-recipients-for-template.ts index 4b393353d..6256126ef 100644 --- a/packages/lib/server-only/recipient/get-recipients-for-template.ts +++ b/packages/lib/server-only/recipient/get-recipients-for-template.ts @@ -3,31 +3,32 @@ import { prisma } from '@documenso/prisma'; export interface GetRecipientsForTemplateOptions { templateId: number; userId: number; + teamId?: number; } export const getRecipientsForTemplate = async ({ templateId, userId, + teamId, }: GetRecipientsForTemplateOptions) => { const recipients = await prisma.recipient.findMany({ where: { templateId, - Template: { - OR: [ - { - userId, - }, - { + template: teamId + ? { team: { + id: teamId, members: { some: { userId, }, }, }, + } + : { + userId, + teamId: null, }, - ], - }, }, orderBy: { id: 'asc', diff --git a/packages/lib/server-only/recipient/set-recipients-for-document.ts b/packages/lib/server-only/recipient/set-document-recipients.ts similarity index 90% rename from packages/lib/server-only/recipient/set-recipients-for-document.ts rename to packages/lib/server-only/recipient/set-document-recipients.ts index fb1a50997..78ca3f176 100644 --- a/packages/lib/server-only/recipient/set-recipients-for-document.ts +++ b/packages/lib/server-only/recipient/set-document-recipients.ts @@ -1,17 +1,17 @@ import { createElement } from 'react'; import { msg } from '@lingui/macro'; -import { z } from 'zod'; import { isUserEnterprise } from '@documenso/ee/server-only/util/is-document-enterprise'; import { mailer } from '@documenso/email/mailer'; import RecipientRemovedFromDocumentTemplate from '@documenso/email/templates/recipient-removed-from-document'; import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; +import type { TRecipientAccessAuthTypes } from '@documenso/lib/types/document-auth'; import { type TRecipientActionAuthTypes, ZRecipientAuthOptionsSchema, } from '@documenso/lib/types/document-auth'; -import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; import { nanoid } from '@documenso/lib/universal/id'; import { createDocumentAuditLogData, @@ -22,7 +22,6 @@ import { prisma } from '@documenso/prisma'; import type { Recipient } from '@documenso/prisma/client'; import { RecipientRole } from '@documenso/prisma/client'; import { SendStatus, SigningStatus } from '@documenso/prisma/client'; -import { RecipientSchema } from '@documenso/prisma/generated/zod'; import { getI18nInstance } from '../../client-only/providers/i18n.server'; import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; @@ -33,29 +32,21 @@ import { canRecipientBeModified } from '../../utils/recipients'; import { renderEmailWithI18N } from '../../utils/render-email-with-i18n'; import { teamGlobalSettingsToBranding } from '../../utils/team-global-settings-to-branding'; -export interface SetRecipientsForDocumentOptions { +export interface SetDocumentRecipientsOptions { userId: number; teamId?: number; documentId: number; recipients: RecipientData[]; - requestMetadata?: RequestMetadata; + requestMetadata: ApiRequestMetadata; } -export const ZSetRecipientsForDocumentResponseSchema = z.object({ - recipients: RecipientSchema.array(), -}); - -export type TSetRecipientsForDocumentResponse = z.infer< - typeof ZSetRecipientsForDocumentResponseSchema ->; - -export const setRecipientsForDocument = async ({ +export const setDocumentRecipients = async ({ userId, teamId, documentId, recipients, requestMetadata, -}: SetRecipientsForDocumentOptions): Promise => { +}: SetDocumentRecipientsOptions) => { const document = await prisma.document.findFirst({ where: { id: documentId, @@ -76,7 +67,7 @@ export const setRecipientsForDocument = async ({ }), }, include: { - Field: true, + fields: true, documentMeta: true, team: { include: { @@ -149,7 +140,7 @@ export const setRecipientsForDocument = async ({ if ( existing && hasRecipientBeenChanged(existing, recipient) && - !canRecipientBeModified(existing, document.Field) + !canRecipientBeModified(existing, document.fields) ) { throw new AppError(AppErrorCode.INVALID_REQUEST, { message: 'Cannot modify a recipient who has already interacted with the document', @@ -167,10 +158,10 @@ export const setRecipientsForDocument = async ({ linkedRecipients.map(async (recipient) => { let authOptions = ZRecipientAuthOptionsSchema.parse(recipient._persisted?.authOptions); - if (recipient.actionAuth !== undefined) { + if (recipient.actionAuth !== undefined || recipient.accessAuth !== undefined) { authOptions = createRecipientAuthOptions({ - accessAuth: authOptions.accessAuth, - actionAuth: recipient.actionAuth, + accessAuth: recipient.accessAuth || authOptions.accessAuth, + actionAuth: recipient.actionAuth || authOptions.actionAuth, }); } @@ -236,8 +227,7 @@ export const setRecipientsForDocument = async ({ data: createDocumentAuditLogData({ type: DOCUMENT_AUDIT_LOG_TYPE.RECIPIENT_UPDATED, documentId: documentId, - user, - requestMetadata, + metadata: requestMetadata, data: { changes, ...baseAuditLog, @@ -252,10 +242,10 @@ export const setRecipientsForDocument = async ({ data: createDocumentAuditLogData({ type: DOCUMENT_AUDIT_LOG_TYPE.RECIPIENT_CREATED, documentId: documentId, - user, - requestMetadata, + metadata: requestMetadata, data: { ...baseAuditLog, + accessAuth: recipient.accessAuth || undefined, actionAuth: recipient.actionAuth || undefined, }, }), @@ -282,8 +272,7 @@ export const setRecipientsForDocument = async ({ createDocumentAuditLogData({ type: DOCUMENT_AUDIT_LOG_TYPE.RECIPIENT_DELETED, documentId: documentId, - user, - requestMetadata, + metadata: requestMetadata, data: { recipientEmail: recipient.email, recipientName: recipient.name, @@ -368,17 +357,22 @@ type RecipientData = { name: string; role: RecipientRole; signingOrder?: number | null; + accessAuth?: TRecipientAccessAuthTypes | null; actionAuth?: TRecipientActionAuthTypes | null; }; const hasRecipientBeenChanged = (recipient: Recipient, newRecipientData: RecipientData) => { const authOptions = ZRecipientAuthOptionsSchema.parse(recipient.authOptions); + const newRecipientAccessAuth = newRecipientData.accessAuth || null; + const newRecipientActionAuth = newRecipientData.actionAuth || null; + return ( recipient.email !== newRecipientData.email || recipient.name !== newRecipientData.name || recipient.role !== newRecipientData.role || recipient.signingOrder !== newRecipientData.signingOrder || - authOptions.actionAuth !== newRecipientData.actionAuth + authOptions.accessAuth !== newRecipientAccessAuth || + authOptions.actionAuth !== newRecipientActionAuth ); }; diff --git a/packages/lib/server-only/recipient/set-recipients-for-template.ts b/packages/lib/server-only/recipient/set-template-recipients.ts similarity index 89% rename from packages/lib/server-only/recipient/set-recipients-for-template.ts rename to packages/lib/server-only/recipient/set-template-recipients.ts index 82859ca73..d4bb8cb8e 100644 --- a/packages/lib/server-only/recipient/set-recipients-for-template.ts +++ b/packages/lib/server-only/recipient/set-template-recipients.ts @@ -1,5 +1,3 @@ -import { z } from 'zod'; - import { isUserEnterprise } from '@documenso/ee/server-only/util/is-document-enterprise'; import { DIRECT_TEMPLATE_RECIPIENT_EMAIL, @@ -8,7 +6,6 @@ import { import { prisma } from '@documenso/prisma'; import type { Recipient } from '@documenso/prisma/client'; import { RecipientRole } from '@documenso/prisma/client'; -import { RecipientSchema } from '@documenso/prisma/generated/zod'; import { AppError, AppErrorCode } from '../../errors/app-error'; import { @@ -18,7 +15,7 @@ import { import { nanoid } from '../../universal/id'; import { createRecipientAuthOptions } from '../../utils/document-auth'; -export type SetRecipientsForTemplateOptions = { +export type SetTemplateRecipientsOptions = { userId: number; teamId?: number; templateId: number; @@ -32,37 +29,30 @@ export type SetRecipientsForTemplateOptions = { }[]; }; -export const ZSetRecipientsForTemplateResponseSchema = z.object({ - recipients: RecipientSchema.array(), -}); - -export type TSetRecipientsForTemplateResponse = z.infer< - typeof ZSetRecipientsForTemplateResponseSchema ->; - -export const setRecipientsForTemplate = async ({ +export const setTemplateRecipients = async ({ userId, teamId, templateId, recipients, -}: SetRecipientsForTemplateOptions): Promise => { +}: SetTemplateRecipientsOptions) => { const template = await prisma.template.findFirst({ where: { id: templateId, - OR: [ - { - userId, - }, - { - team: { - members: { - some: { - userId, + ...(teamId + ? { + team: { + id: teamId, + members: { + some: { + userId, + }, }, }, - }, - }, - ], + } + : { + userId, + teamId: null, + }), }, include: { directLink: true, diff --git a/packages/lib/server-only/recipient/update-document-recipients.ts b/packages/lib/server-only/recipient/update-document-recipients.ts new file mode 100644 index 000000000..62f53fbf9 --- /dev/null +++ b/packages/lib/server-only/recipient/update-document-recipients.ts @@ -0,0 +1,238 @@ +import { isUserEnterprise } from '@documenso/ee/server-only/util/is-document-enterprise'; +import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; +import type { TRecipientAccessAuthTypes } from '@documenso/lib/types/document-auth'; +import { + type TRecipientActionAuthTypes, + ZRecipientAuthOptionsSchema, +} from '@documenso/lib/types/document-auth'; +import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import { + createDocumentAuditLogData, + diffRecipientChanges, +} from '@documenso/lib/utils/document-audit-logs'; +import { createRecipientAuthOptions } from '@documenso/lib/utils/document-auth'; +import { prisma } from '@documenso/prisma'; +import type { Recipient } from '@documenso/prisma/client'; +import { RecipientRole } from '@documenso/prisma/client'; +import { SendStatus, SigningStatus } from '@documenso/prisma/client'; + +import { AppError, AppErrorCode } from '../../errors/app-error'; +import { canRecipientBeModified } from '../../utils/recipients'; + +export interface UpdateDocumentRecipientsOptions { + userId: number; + teamId?: number; + documentId: number; + recipients: RecipientData[]; + requestMetadata: ApiRequestMetadata; +} + +export const updateDocumentRecipients = async ({ + userId, + teamId, + documentId, + recipients, + requestMetadata, +}: UpdateDocumentRecipientsOptions) => { + const document = await prisma.document.findFirst({ + where: { + id: documentId, + ...(teamId + ? { + team: { + id: teamId, + members: { + some: { + userId, + }, + }, + }, + } + : { + userId, + teamId: null, + }), + }, + include: { + fields: true, + recipients: true, + }, + }); + + if (!document) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'Document not found', + }); + } + + if (document.completedAt) { + throw new AppError(AppErrorCode.INVALID_REQUEST, { + message: 'Document already complete', + }); + } + + const recipientsHaveActionAuth = recipients.some((recipient) => recipient.actionAuth); + + // Check if user has permission to set the global action auth. + if (recipientsHaveActionAuth) { + const isEnterprise = await isUserEnterprise({ + userId, + teamId, + }); + + if (!isEnterprise) { + throw new AppError(AppErrorCode.UNAUTHORIZED, { + message: 'You do not have permission to set the action auth', + }); + } + } + + const recipientsToUpdate = recipients.map((recipient) => { + const originalRecipient = document.recipients.find( + (existingRecipient) => existingRecipient.id === recipient.id, + ); + + if (!originalRecipient) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: `Recipient with id ${recipient.id} not found`, + }); + } + + const duplicateRecipientWithSameEmail = document.recipients.find( + (existingRecipient) => + existingRecipient.email === recipient.email && existingRecipient.id !== recipient.id, + ); + + if (duplicateRecipientWithSameEmail) { + throw new AppError(AppErrorCode.INVALID_REQUEST, { + message: `Duplicate recipient with the same email found: ${duplicateRecipientWithSameEmail.email}`, + }); + } + + if ( + hasRecipientBeenChanged(originalRecipient, recipient) && + !canRecipientBeModified(originalRecipient, document.fields) + ) { + throw new AppError(AppErrorCode.INVALID_REQUEST, { + message: 'Cannot modify a recipient who has already interacted with the document', + }); + } + + return { + originalRecipient, + updateData: recipient, + }; + }); + + const updatedRecipients = await prisma.$transaction(async (tx) => { + return await Promise.all( + recipientsToUpdate.map(async ({ originalRecipient, updateData }) => { + let authOptions = ZRecipientAuthOptionsSchema.parse(originalRecipient.authOptions); + + if (updateData.actionAuth !== undefined || updateData.accessAuth !== undefined) { + authOptions = createRecipientAuthOptions({ + accessAuth: updateData.accessAuth || authOptions.accessAuth, + actionAuth: updateData.actionAuth || authOptions.actionAuth, + }); + } + + const mergedRecipient = { + ...originalRecipient, + ...updateData, + }; + + const updatedRecipient = await tx.recipient.update({ + where: { + id: originalRecipient.id, + documentId, + }, + data: { + name: mergedRecipient.name, + email: mergedRecipient.email, + role: mergedRecipient.role, + signingOrder: mergedRecipient.signingOrder, + documentId, + sendStatus: + mergedRecipient.role === RecipientRole.CC ? SendStatus.SENT : SendStatus.NOT_SENT, + signingStatus: + mergedRecipient.role === RecipientRole.CC + ? SigningStatus.SIGNED + : SigningStatus.NOT_SIGNED, + authOptions, + }, + include: { + fields: true, + }, + }); + + // Clear all fields if the recipient role is changed to a type that cannot have fields. + if ( + originalRecipient.role !== updatedRecipient.role && + (updatedRecipient.role === RecipientRole.CC || + updatedRecipient.role === RecipientRole.VIEWER) + ) { + await tx.field.deleteMany({ + where: { + recipientId: updatedRecipient.id, + }, + }); + } + + const changes = diffRecipientChanges(originalRecipient, updatedRecipient); + + // Handle recipient updated audit log. + if (changes.length > 0) { + await tx.documentAuditLog.create({ + data: createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.RECIPIENT_UPDATED, + documentId: documentId, + metadata: requestMetadata, + data: { + recipientEmail: updatedRecipient.email, + recipientName: updatedRecipient.name, + recipientId: updatedRecipient.id, + recipientRole: updatedRecipient.role, + changes, + }, + }), + }); + } + + return updatedRecipient; + }), + ); + }); + + return { + recipients: updatedRecipients, + }; +}; + +/** + * If you change this you MUST update the `hasRecipientBeenChanged` function. + */ +type RecipientData = { + id: number; + email?: string; + name?: string; + role?: RecipientRole; + signingOrder?: number | null; + accessAuth?: TRecipientAccessAuthTypes | null; + actionAuth?: TRecipientActionAuthTypes | null; +}; + +const hasRecipientBeenChanged = (recipient: Recipient, newRecipientData: RecipientData) => { + const authOptions = ZRecipientAuthOptionsSchema.parse(recipient.authOptions); + + const newRecipientAccessAuth = newRecipientData.accessAuth || null; + const newRecipientActionAuth = newRecipientData.actionAuth || null; + + return ( + recipient.email !== newRecipientData.email || + recipient.name !== newRecipientData.name || + recipient.role !== newRecipientData.role || + recipient.signingOrder !== newRecipientData.signingOrder || + authOptions.accessAuth !== newRecipientAccessAuth || + authOptions.actionAuth !== newRecipientActionAuth + ); +}; diff --git a/packages/lib/server-only/recipient/update-recipient.ts b/packages/lib/server-only/recipient/update-recipient.ts index 5d2c64259..2aec9f7ee 100644 --- a/packages/lib/server-only/recipient/update-recipient.ts +++ b/packages/lib/server-only/recipient/update-recipient.ts @@ -40,7 +40,7 @@ export const updateRecipient = async ({ const recipient = await prisma.recipient.findFirst({ where: { id: recipientId, - Document: { + document: { id: documentId, ...(teamId ? { @@ -60,7 +60,7 @@ export const updateRecipient = async ({ }, }, include: { - Document: true, + document: true, }, }); diff --git a/packages/lib/server-only/recipient/update-template-recipients.ts b/packages/lib/server-only/recipient/update-template-recipients.ts new file mode 100644 index 000000000..de9b90383 --- /dev/null +++ b/packages/lib/server-only/recipient/update-template-recipients.ts @@ -0,0 +1,174 @@ +import { isUserEnterprise } from '@documenso/ee/server-only/util/is-document-enterprise'; +import type { TRecipientAccessAuthTypes } from '@documenso/lib/types/document-auth'; +import { + type TRecipientActionAuthTypes, + ZRecipientAuthOptionsSchema, +} from '@documenso/lib/types/document-auth'; +import { createRecipientAuthOptions } from '@documenso/lib/utils/document-auth'; +import { prisma } from '@documenso/prisma'; +import { RecipientRole } from '@documenso/prisma/client'; +import { SendStatus, SigningStatus } from '@documenso/prisma/client'; + +import { AppError, AppErrorCode } from '../../errors/app-error'; + +export interface UpdateTemplateRecipientsOptions { + userId: number; + teamId?: number; + templateId: number; + recipients: { + id: number; + email?: string; + name?: string; + role?: RecipientRole; + signingOrder?: number | null; + accessAuth?: TRecipientAccessAuthTypes | null; + actionAuth?: TRecipientActionAuthTypes | null; + }[]; +} + +export const updateTemplateRecipients = async ({ + userId, + teamId, + templateId, + recipients, +}: UpdateTemplateRecipientsOptions) => { + const template = await prisma.template.findFirst({ + where: { + id: templateId, + ...(teamId + ? { + team: { + id: teamId, + members: { + some: { + userId, + }, + }, + }, + } + : { + userId, + teamId: null, + }), + }, + include: { + recipients: true, + }, + }); + + if (!template) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: 'Template not found', + }); + } + + const recipientsHaveActionAuth = recipients.some((recipient) => recipient.actionAuth); + + // Check if user has permission to set the global action auth. + if (recipientsHaveActionAuth) { + const isEnterprise = await isUserEnterprise({ + userId, + teamId, + }); + + if (!isEnterprise) { + throw new AppError(AppErrorCode.UNAUTHORIZED, { + message: 'You do not have permission to set the action auth', + }); + } + } + + const recipientsToUpdate = recipients.map((recipient) => { + const originalRecipient = template.recipients.find( + (existingRecipient) => existingRecipient.id === recipient.id, + ); + + if (!originalRecipient) { + throw new AppError(AppErrorCode.NOT_FOUND, { + message: `Recipient with id ${recipient.id} not found`, + }); + } + + const duplicateRecipientWithSameEmail = template.recipients.find( + (existingRecipient) => + existingRecipient.email === recipient.email && existingRecipient.id !== recipient.id, + ); + + if (duplicateRecipientWithSameEmail) { + throw new AppError(AppErrorCode.INVALID_REQUEST, { + message: `Duplicate recipient with the same email found: ${duplicateRecipientWithSameEmail.email}`, + }); + } + + return { + originalRecipient, + recipientUpdateData: recipient, + }; + }); + + const updatedRecipients = await prisma.$transaction(async (tx) => { + return await Promise.all( + recipientsToUpdate.map(async ({ originalRecipient, recipientUpdateData }) => { + let authOptions = ZRecipientAuthOptionsSchema.parse(originalRecipient.authOptions); + + if ( + recipientUpdateData.actionAuth !== undefined || + recipientUpdateData.accessAuth !== undefined + ) { + authOptions = createRecipientAuthOptions({ + accessAuth: recipientUpdateData.accessAuth || authOptions.accessAuth, + actionAuth: recipientUpdateData.actionAuth || authOptions.actionAuth, + }); + } + + const mergedRecipient = { + ...originalRecipient, + ...recipientUpdateData, + }; + + const updatedRecipient = await tx.recipient.update({ + where: { + id: originalRecipient.id, + templateId, + }, + data: { + name: mergedRecipient.name, + email: mergedRecipient.email, + role: mergedRecipient.role, + signingOrder: mergedRecipient.signingOrder, + templateId, + sendStatus: + mergedRecipient.role === RecipientRole.CC ? SendStatus.SENT : SendStatus.NOT_SENT, + signingStatus: + mergedRecipient.role === RecipientRole.CC + ? SigningStatus.SIGNED + : SigningStatus.NOT_SIGNED, + authOptions, + }, + include: { + fields: true, + }, + }); + + // Clear all fields if the recipient role is changed to a type that cannot have fields. + if ( + originalRecipient.role !== updatedRecipient.role && + (updatedRecipient.role === RecipientRole.CC || + updatedRecipient.role === RecipientRole.VIEWER) + ) { + await tx.field.deleteMany({ + where: { + recipientId: updatedRecipient.id, + }, + }); + } + + return updatedRecipient; + }), + ); + }); + + return { + recipients: updatedRecipients, + }; +}; diff --git a/packages/lib/server-only/share/get-recipient-or-sender-by-share-link-slug.ts b/packages/lib/server-only/share/get-recipient-or-sender-by-share-link-slug.ts index fee8eecc1..1cfabe6ab 100644 --- a/packages/lib/server-only/share/get-recipient-or-sender-by-share-link-slug.ts +++ b/packages/lib/server-only/share/get-recipient-or-sender-by-share-link-slug.ts @@ -15,7 +15,7 @@ export const getRecipientOrSenderByShareLinkSlug = async ({ const sender = await prisma.user.findFirst({ where: { - Document: { some: { id: documentId } }, + documents: { some: { id: documentId } }, email, }, select: { @@ -35,7 +35,7 @@ export const getRecipientOrSenderByShareLinkSlug = async ({ email, }, include: { - Signature: true, + signatures: true, }, }); diff --git a/packages/lib/server-only/team/create-team.ts b/packages/lib/server-only/team/create-team.ts index 1b60ef99f..27ff11a00 100644 --- a/packages/lib/server-only/team/create-team.ts +++ b/packages/lib/server-only/team/create-team.ts @@ -56,7 +56,7 @@ export const createTeam = async ({ id: userId, }, include: { - Subscription: true, + subscriptions: true, }, }); @@ -68,7 +68,7 @@ export const createTeam = async ({ prices.map((price) => price.id), ); - isPaymentRequired = !subscriptionsContainsActivePlan(user.Subscription, teamRelatedPriceIds); + isPaymentRequired = !subscriptionsContainsActivePlan(user.subscriptions, teamRelatedPriceIds); customerId = await createTeamCustomer({ name: user.name ?? teamName, @@ -95,7 +95,7 @@ export const createTeam = async ({ }); } - await tx.team.create({ + const team = await tx.team.create({ data: { name: teamName, url: teamUrl, @@ -104,13 +104,23 @@ export const createTeam = async ({ members: { create: [ { - userId, + userId: user.id, role: TeamMemberRole.ADMIN, }, ], }, }, }); + + await tx.teamGlobalSettings.upsert({ + where: { + teamId: team.id, + }, + update: {}, + create: { + teamId: team.id, + }, + }); }); return { @@ -225,6 +235,16 @@ export const createTeamFromPendingTeam = async ({ }, }); + await tx.teamGlobalSettings.upsert({ + where: { + teamId: team.id, + }, + update: {}, + create: { + teamId: team.id, + }, + }); + await tx.subscription.upsert( mapStripeSubscriptionToPrismaUpsertAction(subscription, undefined, team.id), ); diff --git a/packages/lib/server-only/team/transfer-team-ownership.ts b/packages/lib/server-only/team/transfer-team-ownership.ts index b7fb99a84..57ac43813 100644 --- a/packages/lib/server-only/team/transfer-team-ownership.ts +++ b/packages/lib/server-only/team/transfer-team-ownership.ts @@ -57,7 +57,7 @@ export const transferTeamOwnership = async ({ token }: TransferTeamOwnershipOpti }, }, include: { - Subscription: true, + subscriptions: true, }, }); 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 68b0d8060..b3e187688 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 @@ -32,8 +32,11 @@ import { DOCUMENT_AUDIT_LOG_TYPE } from '../../types/document-audit-logs'; import type { TRecipientActionAuthTypes } from '../../types/document-auth'; import { DocumentAccessAuth, ZRecipientAuthOptionsSchema } from '../../types/document-auth'; import { ZFieldMetaSchema } from '../../types/field-meta'; -import { ZWebhookDocumentSchema } from '../../types/webhook-payload'; -import type { RequestMetadata } from '../../universal/extract-request-metadata'; +import { + ZWebhookDocumentSchema, + mapDocumentToWebhookDocumentPayload, +} from '../../types/webhook-payload'; +import type { ApiRequestMetadata } from '../../universal/extract-request-metadata'; import type { CreateDocumentAuditLogDataResponse } from '../../utils/document-audit-logs'; import { createDocumentAuditLogData } from '../../utils/document-audit-logs'; import { @@ -55,7 +58,7 @@ export type CreateDocumentFromDirectTemplateOptions = { directTemplateExternalId?: string; signedFieldValues: TSignFieldWithTokenMutationSchema[]; templateUpdatedAt: Date; - requestMetadata: RequestMetadata; + requestMetadata: ApiRequestMetadata; user?: { id: number; name?: string; @@ -64,7 +67,7 @@ export type CreateDocumentFromDirectTemplateOptions = { }; type CreatedDirectRecipientField = { - field: Field & { Signature?: Signature | null }; + field: Field & { signature?: Signature | null }; derivedRecipientActionAuth: TRecipientActionAuthTypes | null; }; @@ -95,15 +98,15 @@ export const createDocumentFromDirectTemplate = async ({ }, }, include: { - Recipient: { + recipients: { include: { - Field: true, + fields: true, }, }, directLink: true, templateDocumentData: true, templateMeta: true, - User: true, + user: true, team: { include: { teamGlobalSettings: true, @@ -116,7 +119,7 @@ export const createDocumentFromDirectTemplate = async ({ throw new AppError(AppErrorCode.INVALID_REQUEST, { message: 'Invalid or missing template' }); } - const { Recipient: recipients, directLink, User: templateOwner } = template; + const { recipients, directLink, user: templateOwner } = template; const directTemplateRecipient = recipients.find( (recipient) => recipient.id === directLink.directTemplateRecipientId, @@ -159,7 +162,7 @@ export const createDocumentFromDirectTemplate = async ({ directTemplateRecipient.authOptions, ); - const nonDirectTemplateRecipients = template.Recipient.filter( + const nonDirectTemplateRecipients = template.recipients.filter( (recipient) => recipient.id !== directTemplateRecipient.id, ); @@ -173,7 +176,7 @@ export const createDocumentFromDirectTemplate = async ({ // Associate, validate and map to a query every direct template recipient field with the provided fields. const createDirectRecipientFieldArgs = await Promise.all( - directTemplateRecipient.Field.map(async (templateField) => { + directTemplateRecipient.fields.map(async (templateField) => { const signedFieldValue = signedFieldValues.find( (value) => value.fieldId === templateField.id, ); @@ -268,7 +271,7 @@ export const createDocumentFromDirectTemplate = async ({ globalAccessAuth: templateAuthOptions.globalAccessAuth, globalActionAuth: templateAuthOptions.globalActionAuth, }), - Recipient: { + recipients: { createMany: { data: nonDirectTemplateRecipients.map((recipient) => { const authOptions = ZRecipientAuthOptionsSchema.parse(recipient?.authOptions); @@ -306,7 +309,7 @@ export const createDocumentFromDirectTemplate = async ({ }, }, include: { - Recipient: true, + recipients: true, team: { select: { url: true, @@ -318,7 +321,7 @@ export const createDocumentFromDirectTemplate = async ({ let nonDirectRecipientFieldsToCreate: Omit[] = []; Object.values(nonDirectTemplateRecipients).forEach((templateRecipient) => { - const recipient = document.Recipient.find( + const recipient = document.recipients.find( (recipient) => recipient.email === templateRecipient.email, ); @@ -327,7 +330,7 @@ export const createDocumentFromDirectTemplate = async ({ } nonDirectRecipientFieldsToCreate = nonDirectRecipientFieldsToCreate.concat( - templateRecipient.Field.map((field) => ({ + templateRecipient.fields.map((field) => ({ documentId: document.id, recipientId: recipient.id, type: field.type, @@ -366,7 +369,7 @@ export const createDocumentFromDirectTemplate = async ({ sendStatus: SendStatus.SENT, signedAt: initialRequestTime, signingOrder: directTemplateRecipient.signingOrder, - Field: { + fields: { createMany: { data: directTemplateNonSignatureFields.map(({ templateField, customText }) => ({ documentId: document.id, @@ -384,7 +387,7 @@ export const createDocumentFromDirectTemplate = async ({ }, }, include: { - Field: true, + fields: true, }, }); @@ -410,7 +413,7 @@ export const createDocumentFromDirectTemplate = async ({ customText: '', inserted: true, fieldMeta: templateField.fieldMeta || Prisma.JsonNull, - Signature: { + signature: { create: { recipientId: createdDirectRecipient.id, signatureImageAsBase64: signature.signatureImageAsBase64, @@ -419,7 +422,7 @@ export const createDocumentFromDirectTemplate = async ({ }, }, include: { - Signature: true, + signature: true, }, }); @@ -432,7 +435,7 @@ export const createDocumentFromDirectTemplate = async ({ ); const createdDirectRecipientFields: CreatedDirectRecipientField[] = [ - ...createdDirectRecipient.Field.map((field) => ({ + ...createdDirectRecipient.fields.map((field) => ({ field, derivedRecipientActionAuth: null, })), @@ -454,7 +457,7 @@ export const createDocumentFromDirectTemplate = async ({ name: user?.name, email: directRecipientEmail, }, - requestMetadata, + metadata: requestMetadata, data: { title: document.title, source: { @@ -472,7 +475,7 @@ export const createDocumentFromDirectTemplate = async ({ name: user?.name, email: directRecipientEmail, }, - requestMetadata, + metadata: requestMetadata, data: { recipientEmail: createdDirectRecipient.email, recipientId: createdDirectRecipient.id, @@ -490,7 +493,7 @@ export const createDocumentFromDirectTemplate = async ({ name: user?.name, email: directRecipientEmail, }, - requestMetadata, + metadata: requestMetadata, data: { recipientEmail: createdDirectRecipient.email, recipientId: createdDirectRecipient.id, @@ -501,7 +504,7 @@ export const createDocumentFromDirectTemplate = async ({ .with(FieldType.SIGNATURE, FieldType.FREE_SIGNATURE, (type) => ({ type, data: - field.Signature?.signatureImageAsBase64 || field.Signature?.typedSignature || '', + field.signature?.signatureImageAsBase64 || field.signature?.typedSignature || '', })) .with( FieldType.DATE, @@ -535,7 +538,7 @@ export const createDocumentFromDirectTemplate = async ({ name: user?.name, email: directRecipientEmail, }, - requestMetadata, + metadata: requestMetadata, data: { recipientEmail: createdDirectRecipient.email, recipientId: createdDirectRecipient.id, @@ -609,13 +612,14 @@ export const createDocumentFromDirectTemplate = async ({ }, include: { documentData: true, - Recipient: true, + documentMeta: true, + recipients: true, }, }); await triggerWebhook({ event: WebhookTriggerEvents.DOCUMENT_SIGNED, - data: ZWebhookDocumentSchema.parse(createdDocument), + data: ZWebhookDocumentSchema.parse(mapDocumentToWebhookDocumentPayload(createdDocument)), userId: template.userId, teamId: template.teamId ?? undefined, }); 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 c9ffaffc1..bf79f080e 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 @@ -43,8 +43,8 @@ export const createDocumentFromTemplateLegacy = async ({ }), }, include: { - Recipient: true, - Field: true, + recipients: true, + fields: true, templateDocumentData: true, templateMeta: true, team: { @@ -76,8 +76,8 @@ export const createDocumentFromTemplateLegacy = async ({ title: template.title, visibility: template.team?.teamGlobalSettings?.documentVisibility, documentDataId: documentData.id, - Recipient: { - create: template.Recipient.map((recipient) => ({ + recipients: { + create: template.recipients.map((recipient) => ({ email: recipient.email, name: recipient.name, role: recipient.role, @@ -100,7 +100,7 @@ export const createDocumentFromTemplateLegacy = async ({ }, include: { - Recipient: { + recipients: { orderBy: { id: 'asc', }, @@ -110,10 +110,10 @@ export const createDocumentFromTemplateLegacy = async ({ }); await prisma.field.createMany({ - data: template.Field.map((field) => { - const recipient = template.Recipient.find((recipient) => recipient.id === field.recipientId); + data: template.fields.map((field) => { + const recipient = template.recipients.find((recipient) => recipient.id === field.recipientId); - const documentRecipient = document.Recipient.find((doc) => doc.email === recipient?.email); + const documentRecipient = document.recipients.find((doc) => doc.email === recipient?.email); if (!documentRecipient) { throw new Error('Recipient not found.'); @@ -135,9 +135,9 @@ export const createDocumentFromTemplateLegacy = async ({ }); if (recipients && recipients.length > 0) { - document.Recipient = await Promise.all( + document.recipients = await Promise.all( recipients.map(async (recipient, index) => { - const existingRecipient = document.Recipient.at(index); + const existingRecipient = document.recipients.at(index); return await prisma.recipient.upsert({ where: { 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 be497955d..470e909e5 100644 --- a/packages/lib/server-only/template/create-document-from-template.ts +++ b/packages/lib/server-only/template/create-document-from-template.ts @@ -1,5 +1,3 @@ -import type { z } from 'zod'; - import { nanoid } from '@documenso/lib/universal/id'; import { prisma } from '@documenso/prisma'; import type { DocumentDistributionMethod } from '@documenso/prisma/client'; @@ -13,11 +11,6 @@ import { SigningStatus, WebhookTriggerEvents, } from '@documenso/prisma/client'; -import { - DocumentDataSchema, - DocumentSchema, - RecipientSchema, -} from '@documenso/prisma/generated/zod'; import type { SupportedLanguageCodes } from '../../constants/i18n'; import { AppError, AppErrorCode } from '../../errors/app-error'; @@ -25,8 +18,11 @@ import { DOCUMENT_AUDIT_LOG_TYPE } from '../../types/document-audit-logs'; import { ZRecipientAuthOptionsSchema } from '../../types/document-auth'; import type { TDocumentEmailSettings } from '../../types/document-email'; import { ZFieldMetaSchema } from '../../types/field-meta'; -import { ZWebhookDocumentSchema } from '../../types/webhook-payload'; -import type { RequestMetadata } from '../../universal/extract-request-metadata'; +import { + ZWebhookDocumentSchema, + mapDocumentToWebhookDocumentPayload, +} from '../../types/webhook-payload'; +import type { ApiRequestMetadata } from '../../universal/extract-request-metadata'; import { createDocumentAuditLogData } from '../../utils/document-audit-logs'; import { createDocumentAuthOptions, @@ -73,18 +69,9 @@ export type CreateDocumentFromTemplateOptions = { typedSignatureEnabled?: boolean; emailSettings?: TDocumentEmailSettings; }; - requestMetadata?: RequestMetadata; + requestMetadata: ApiRequestMetadata; }; -export const ZCreateDocumentFromTemplateResponseSchema = DocumentSchema.extend({ - documentData: DocumentDataSchema, - Recipient: RecipientSchema.array(), -}); - -export type TCreateDocumentFromTemplateResponse = z.infer< - typeof ZCreateDocumentFromTemplateResponseSchema ->; - export const createDocumentFromTemplate = async ({ templateId, externalId, @@ -94,13 +81,7 @@ export const createDocumentFromTemplate = async ({ customDocumentDataId, override, requestMetadata, -}: CreateDocumentFromTemplateOptions): Promise => { - const user = await prisma.user.findFirstOrThrow({ - where: { - id: userId, - }, - }); - +}: CreateDocumentFromTemplateOptions) => { const template = await prisma.template.findUnique({ where: { id: templateId, @@ -121,9 +102,9 @@ export const createDocumentFromTemplate = async ({ }), }, include: { - Recipient: { + recipients: { include: { - Field: true, + fields: true, }, }, templateDocumentData: true, @@ -144,7 +125,7 @@ export const createDocumentFromTemplate = async ({ // Check that all the passed in recipient IDs can be associated with a template recipient. recipients.forEach((recipient) => { - const foundRecipient = template.Recipient.find( + const foundRecipient = template.recipients.find( (templateRecipient) => templateRecipient.id === recipient.id, ); @@ -159,12 +140,12 @@ export const createDocumentFromTemplate = async ({ documentAuth: template.authOptions, }); - const finalRecipients: FinalRecipient[] = template.Recipient.map((templateRecipient) => { + const finalRecipients: FinalRecipient[] = template.recipients.map((templateRecipient) => { const foundRecipient = recipients.find((recipient) => recipient.id === templateRecipient.id); return { templateRecipientId: templateRecipient.id, - fields: templateRecipient.Field, + fields: templateRecipient.fields, name: foundRecipient ? (foundRecipient.name ?? '') : templateRecipient.name, email: foundRecipient ? foundRecipient.email : templateRecipient.email, role: templateRecipient.role, @@ -239,7 +220,7 @@ export const createDocumentFromTemplate = async ({ override?.typedSignatureEnabled ?? template.templateMeta?.typedSignatureEnabled, }, }, - Recipient: { + recipients: { createMany: { data: finalRecipients.map((recipient) => { const authOptions = ZRecipientAuthOptionsSchema.parse(recipient?.authOptions); @@ -266,7 +247,7 @@ export const createDocumentFromTemplate = async ({ }, }, include: { - Recipient: { + recipients: { orderBy: { id: 'asc', }, @@ -278,7 +259,7 @@ export const createDocumentFromTemplate = async ({ let fieldsToCreate: Omit[] = []; Object.values(finalRecipients).forEach(({ email, fields }) => { - const recipient = document.Recipient.find((recipient) => recipient.email === email); + const recipient = document.recipients.find((recipient) => recipient.email === email); if (!recipient) { throw new Error('Recipient not found.'); @@ -312,8 +293,7 @@ export const createDocumentFromTemplate = async ({ data: createDocumentAuditLogData({ type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_CREATED, documentId: document.id, - user, - requestMetadata, + metadata: requestMetadata, data: { title: document.title, source: { @@ -330,7 +310,7 @@ export const createDocumentFromTemplate = async ({ }, include: { documentMeta: true, - Recipient: true, + recipients: true, }, }); @@ -340,7 +320,7 @@ export const createDocumentFromTemplate = async ({ await triggerWebhook({ event: WebhookTriggerEvents.DOCUMENT_CREATED, - data: ZWebhookDocumentSchema.parse(createdDocument), + data: ZWebhookDocumentSchema.parse(mapDocumentToWebhookDocumentPayload(createdDocument)), userId, teamId, }); diff --git a/packages/lib/server-only/template/create-template-direct-link.ts b/packages/lib/server-only/template/create-template-direct-link.ts index 388739498..ae3220948 100644 --- a/packages/lib/server-only/template/create-template-direct-link.ts +++ b/packages/lib/server-only/template/create-template-direct-link.ts @@ -1,7 +1,6 @@ 'use server'; import { nanoid } from 'nanoid'; -import type { z } from 'zod'; import { DIRECT_TEMPLATE_RECIPIENT_EMAIL, @@ -9,47 +8,43 @@ import { } from '@documenso/lib/constants/direct-templates'; import { prisma } from '@documenso/prisma'; import type { Recipient } from '@documenso/prisma/client'; -import { TemplateDirectLinkSchema } from '@documenso/prisma/generated/zod'; import { AppError, AppErrorCode } from '../../errors/app-error'; export type CreateTemplateDirectLinkOptions = { templateId: number; userId: number; + teamId?: number; directRecipientId?: number; }; -export const ZCreateTemplateDirectLinkResponseSchema = TemplateDirectLinkSchema; - -export type TCreateTemplateDirectLinkResponse = z.infer< - typeof ZCreateTemplateDirectLinkResponseSchema ->; - export const createTemplateDirectLink = async ({ templateId, userId, + teamId, directRecipientId, -}: CreateTemplateDirectLinkOptions): Promise => { +}: CreateTemplateDirectLinkOptions) => { const template = await prisma.template.findFirst({ where: { id: templateId, - OR: [ - { - userId, - }, - { - team: { - members: { - some: { - userId, + ...(teamId + ? { + team: { + id: teamId, + members: { + some: { + userId, + }, }, }, - }, - }, - ], + } + : { + userId, + teamId: null, + }), }, include: { - Recipient: true, + recipients: true, directLink: true, }, }); @@ -64,14 +59,14 @@ export const createTemplateDirectLink = async ({ if ( directRecipientId && - !template.Recipient.find((recipient) => recipient.id === directRecipientId) + !template.recipients.find((recipient) => recipient.id === directRecipientId) ) { throw new AppError(AppErrorCode.NOT_FOUND, { message: 'Recipient not found' }); } if ( !directRecipientId && - template.Recipient.find( + template.recipients.find( (recipient) => recipient.email.toLowerCase() === DIRECT_TEMPLATE_RECIPIENT_EMAIL, ) ) { diff --git a/packages/lib/server-only/template/delete-template-direct-link.ts b/packages/lib/server-only/template/delete-template-direct-link.ts index 7f3d00606..501b86338 100644 --- a/packages/lib/server-only/template/delete-template-direct-link.ts +++ b/packages/lib/server-only/template/delete-template-direct-link.ts @@ -8,33 +8,36 @@ import { AppError, AppErrorCode } from '../../errors/app-error'; export type DeleteTemplateDirectLinkOptions = { templateId: number; userId: number; + teamId?: number; }; export const deleteTemplateDirectLink = async ({ templateId, userId, + teamId, }: DeleteTemplateDirectLinkOptions): Promise => { const template = await prisma.template.findFirst({ where: { id: templateId, - OR: [ - { - userId, - }, - { - team: { - members: { - some: { - userId, + ...(teamId + ? { + team: { + id: teamId, + members: { + some: { + userId, + }, }, }, - }, - }, - ], + } + : { + userId, + teamId: null, + }), }, include: { directLink: true, - Recipient: true, + recipients: true, }, }); @@ -57,7 +60,7 @@ export const deleteTemplateDirectLink = async ({ id: directLink.directTemplateRecipientId, }, data: { - ...generateAvaliableRecipientPlaceholder(template.Recipient), + ...generateAvaliableRecipientPlaceholder(template.recipients), }, }); diff --git a/packages/lib/server-only/template/delete-template.ts b/packages/lib/server-only/template/delete-template.ts index 0962b6b9a..964f432b8 100644 --- a/packages/lib/server-only/template/delete-template.ts +++ b/packages/lib/server-only/template/delete-template.ts @@ -12,26 +12,21 @@ export const deleteTemplate = async ({ id, userId, teamId }: DeleteTemplateOptio return await prisma.template.delete({ where: { id, - OR: - teamId === undefined - ? [ - { - userId, - teamId: null, - }, - ] - : [ - { - teamId, - team: { - members: { - some: { - userId, - }, - }, + ...(teamId + ? { + team: { + id: teamId, + members: { + some: { + userId, }, }, - ], + }, + } + : { + userId, + teamId: null, + }), }, }); }; diff --git a/packages/lib/server-only/template/duplicate-template.ts b/packages/lib/server-only/template/duplicate-template.ts index 8d5722a82..374dee8de 100644 --- a/packages/lib/server-only/template/duplicate-template.ts +++ b/packages/lib/server-only/template/duplicate-template.ts @@ -1,50 +1,42 @@ import { omit } from 'remeda'; -import type { z } from 'zod'; import { nanoid } from '@documenso/lib/universal/id'; import { prisma } from '@documenso/prisma'; import type { Prisma } from '@documenso/prisma/client'; -import { TemplateSchema } from '@documenso/prisma/generated/zod'; import type { TDuplicateTemplateMutationSchema } from '@documenso/trpc/server/template-router/schema'; export type DuplicateTemplateOptions = TDuplicateTemplateMutationSchema & { userId: number; + teamId?: number; }; -export const ZDuplicateTemplateResponseSchema = TemplateSchema; - -export type TDuplicateTemplateResponse = z.infer; - export const duplicateTemplate = async ({ templateId, userId, teamId, -}: DuplicateTemplateOptions): Promise => { - let templateWhereFilter: Prisma.TemplateWhereUniqueInput = { - id: templateId, - userId, - teamId: null, - }; - - if (teamId !== undefined) { - templateWhereFilter = { - id: templateId, - teamId, - team: { - members: { - some: { - userId, - }, - }, - }, - }; - } - +}: DuplicateTemplateOptions) => { const template = await prisma.template.findUnique({ - where: templateWhereFilter, + where: { + id: templateId, + ...(teamId + ? { + team: { + id: teamId, + members: { + some: { + userId, + }, + }, + }, + } + : { + userId, + teamId: null, + }), + }, include: { - Recipient: true, - Field: true, + recipients: true, + fields: true, templateDocumentData: true, templateMeta: true, }, @@ -79,8 +71,8 @@ export const duplicateTemplate = async ({ teamId, title: template.title + ' (copy)', templateDocumentDataId: documentData.id, - Recipient: { - create: template.Recipient.map((recipient) => ({ + recipients: { + create: template.recipients.map((recipient) => ({ email: recipient.email, name: recipient.name, token: nanoid(), @@ -89,15 +81,15 @@ export const duplicateTemplate = async ({ templateMeta, }, include: { - Recipient: true, + recipients: true, }, }); await prisma.field.createMany({ - data: template.Field.map((field) => { - const recipient = template.Recipient.find((recipient) => recipient.id === field.recipientId); + data: template.fields.map((field) => { + const recipient = template.recipients.find((recipient) => recipient.id === field.recipientId); - const duplicatedTemplateRecipient = duplicatedTemplate.Recipient.find( + const duplicatedTemplateRecipient = duplicatedTemplate.recipients.find( (doc) => doc.email === recipient?.email, ); diff --git a/packages/lib/server-only/template/find-templates.ts b/packages/lib/server-only/template/find-templates.ts index 9f9ae6587..eae56742a 100644 --- a/packages/lib/server-only/template/find-templates.ts +++ b/packages/lib/server-only/template/find-templates.ts @@ -1,5 +1,4 @@ import { match } from 'ts-pattern'; -import type { z } from 'zod'; import { prisma } from '@documenso/prisma'; import { @@ -8,18 +7,9 @@ import { TeamMemberRole, type Template, } from '@documenso/prisma/client'; -import { - DocumentDataSchema, - FieldSchema, - RecipientSchema, - TeamSchema, - TemplateDirectLinkSchema, - TemplateMetaSchema, - TemplateSchema, -} from '@documenso/prisma/generated/zod'; import { AppError, AppErrorCode } from '../../errors/app-error'; -import { type FindResultResponse, ZFindResultResponse } from '../../types/search-params'; +import { type FindResultResponse } from '../../types/search-params'; export type FindTemplatesOptions = { userId: number; @@ -29,36 +19,13 @@ export type FindTemplatesOptions = { perPage?: number; }; -export const ZFindTemplatesResponseSchema = ZFindResultResponse.extend({ - data: TemplateSchema.extend({ - templateDocumentData: DocumentDataSchema, - team: TeamSchema.pick({ - id: true, - url: true, - }).nullable(), - Field: FieldSchema.array(), - Recipient: RecipientSchema.array(), - templateMeta: TemplateMetaSchema.pick({ - signingOrder: true, - distributionMethod: true, - }).nullable(), - directLink: TemplateDirectLinkSchema.pick({ - token: true, - enabled: true, - }).nullable(), - }).array(), // Todo: openapi. -}); - -export type TFindTemplatesResponse = z.infer; -export type FindTemplateRow = TFindTemplatesResponse['data'][number]; - export const findTemplates = async ({ userId, teamId, type, page = 1, perPage = 10, -}: FindTemplatesOptions): Promise => { +}: FindTemplatesOptions) => { const whereFilter: Prisma.TemplateWhereInput[] = []; if (teamId === undefined) { @@ -112,21 +79,15 @@ export const findTemplates = async ({ AND: whereFilter, }, include: { - templateDocumentData: true, team: { select: { id: true, url: true, }, }, - Field: true, - Recipient: true, - templateMeta: { - select: { - signingOrder: true, - distributionMethod: true, - }, - }, + fields: true, + recipients: true, + templateMeta: true, directLink: { select: { token: true, diff --git a/packages/lib/server-only/template/get-template-by-direct-link-token.ts b/packages/lib/server-only/template/get-template-by-direct-link-token.ts index 49d518468..83d1c59b6 100644 --- a/packages/lib/server-only/template/get-template-by-direct-link-token.ts +++ b/packages/lib/server-only/template/get-template-by-direct-link-token.ts @@ -16,9 +16,9 @@ export const getTemplateByDirectLinkToken = async ({ }, include: { directLink: true, - Recipient: { + recipients: { include: { - Field: true, + fields: true, }, }, templateDocumentData: true, @@ -28,6 +28,6 @@ export const getTemplateByDirectLinkToken = async ({ return { ...template, - Field: template.Recipient.map((recipient) => recipient.Field).flat(), + fields: template.recipients.map((recipient) => recipient.fields).flat(), }; }; diff --git a/packages/lib/server-only/template/get-template-by-id.ts b/packages/lib/server-only/template/get-template-by-id.ts index 1e4b36d0f..e978d75bb 100644 --- a/packages/lib/server-only/template/get-template-by-id.ts +++ b/packages/lib/server-only/template/get-template-by-id.ts @@ -1,16 +1,4 @@ -import type { z } from 'zod'; - import { prisma } from '@documenso/prisma'; -import type { Prisma } from '@documenso/prisma/client'; -import { - DocumentDataSchema, - FieldSchema, - RecipientSchema, - TemplateDirectLinkSchema, - TemplateMetaSchema, - TemplateSchema, - UserSchema, -} from '@documenso/prisma/generated/zod'; import { AppError, AppErrorCode } from '../../errors/app-error'; @@ -20,59 +8,33 @@ export type GetTemplateByIdOptions = { teamId?: number; }; -export const ZGetTemplateByIdResponseSchema = TemplateSchema.extend({ - directLink: TemplateDirectLinkSchema.nullable(), - templateDocumentData: DocumentDataSchema, - templateMeta: TemplateMetaSchema.nullable(), - Recipient: RecipientSchema.array(), - Field: FieldSchema.array(), - User: UserSchema.pick({ - id: true, - name: true, - email: true, - }), -}); - -export type TGetTemplateByIdResponse = z.infer; - -export const getTemplateById = async ({ - id, - userId, - teamId, -}: GetTemplateByIdOptions): Promise => { - const whereFilter: Prisma.TemplateWhereInput = { - id, - OR: - teamId === undefined - ? [ - { - userId, - teamId: null, - }, - ] - : [ - { - teamId, - team: { - members: { - some: { - userId, - }, +export const getTemplateById = async ({ id, userId, teamId }: GetTemplateByIdOptions) => { + const template = await prisma.template.findFirst({ + where: { + id, + ...(teamId + ? { + team: { + id: teamId, + members: { + some: { + userId, }, }, }, - ], - }; - - const template = await prisma.template.findFirst({ - where: whereFilter, + } + : { + userId, + teamId: null, + }), + }, include: { directLink: true, templateDocumentData: true, templateMeta: true, - Recipient: true, - Field: true, - User: { + recipients: true, + fields: true, + user: { select: { id: true, name: true, diff --git a/packages/lib/server-only/template/move-template-to-team.ts b/packages/lib/server-only/template/move-template-to-team.ts index 9dae002a1..e43382389 100644 --- a/packages/lib/server-only/template/move-template-to-team.ts +++ b/packages/lib/server-only/template/move-template-to-team.ts @@ -1,7 +1,4 @@ -import type { z } from 'zod'; - import { prisma } from '@documenso/prisma'; -import { TemplateSchema } from '@documenso/prisma/generated/zod'; import { AppError, AppErrorCode } from '../../errors/app-error'; @@ -11,15 +8,11 @@ export type MoveTemplateToTeamOptions = { userId: number; }; -export const ZMoveTemplateToTeamResponseSchema = TemplateSchema; - -export type TMoveTemplateToTeamResponse = z.infer; - export const moveTemplateToTeam = async ({ templateId, teamId, userId, -}: MoveTemplateToTeamOptions): Promise => { +}: MoveTemplateToTeamOptions) => { return await prisma.$transaction(async (tx) => { const template = await tx.template.findFirst({ where: { diff --git a/packages/lib/server-only/template/toggle-template-direct-link.ts b/packages/lib/server-only/template/toggle-template-direct-link.ts index 7c1573ef9..aa9daa461 100644 --- a/packages/lib/server-only/template/toggle-template-direct-link.ts +++ b/packages/lib/server-only/template/toggle-template-direct-link.ts @@ -1,49 +1,43 @@ 'use server'; -import type { z } from 'zod'; - import { prisma } from '@documenso/prisma'; -import { TemplateDirectLinkSchema } from '@documenso/prisma/generated/zod'; import { AppError, AppErrorCode } from '../../errors/app-error'; export type ToggleTemplateDirectLinkOptions = { templateId: number; userId: number; + teamId?: number; enabled: boolean; }; -export const ZToggleTemplateDirectLinkResponseSchema = TemplateDirectLinkSchema; - -export type TToggleTemplateDirectLinkResponse = z.infer< - typeof ZToggleTemplateDirectLinkResponseSchema ->; - export const toggleTemplateDirectLink = async ({ templateId, userId, + teamId, enabled, -}: ToggleTemplateDirectLinkOptions): Promise => { +}: ToggleTemplateDirectLinkOptions) => { const template = await prisma.template.findFirst({ where: { id: templateId, - OR: [ - { - userId, - }, - { - team: { - members: { - some: { - userId, + ...(teamId + ? { + team: { + id: teamId, + members: { + some: { + userId, + }, }, }, - }, - }, - ], + } + : { + userId, + teamId: null, + }), }, include: { - Recipient: true, + recipients: true, directLink: true, }, }); diff --git a/packages/lib/server-only/template/update-template-settings.ts b/packages/lib/server-only/template/update-template.ts similarity index 75% rename from packages/lib/server-only/template/update-template-settings.ts rename to packages/lib/server-only/template/update-template.ts index 3c2bfb7c1..465d64702 100644 --- a/packages/lib/server-only/template/update-template-settings.ts +++ b/packages/lib/server-only/template/update-template.ts @@ -1,22 +1,18 @@ 'use server'; -import type { z } from 'zod'; - import { isUserEnterprise } from '@documenso/ee/server-only/util/is-document-enterprise'; -import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; import { prisma } from '@documenso/prisma'; import type { DocumentVisibility, Template, TemplateMeta } from '@documenso/prisma/client'; -import { TemplateSchema } from '@documenso/prisma/generated/zod'; import { AppError, AppErrorCode } from '../../errors/app-error'; import type { TDocumentAccessAuthTypes, TDocumentActionAuthTypes } from '../../types/document-auth'; import { createDocumentAuthOptions, extractDocumentAuthMethods } from '../../utils/document-auth'; -export type UpdateTemplateSettingsOptions = { +export type UpdateTemplateOptions = { userId: number; teamId?: number; templateId: number; - data: { + data?: { title?: string; externalId?: string | null; visibility?: DocumentVisibility; @@ -27,26 +23,15 @@ export type UpdateTemplateSettingsOptions = { type?: Template['type']; }; meta?: Partial>; - requestMetadata?: RequestMetadata; }; -export const ZUpdateTemplateSettingsResponseSchema = TemplateSchema; - -export type TUpdateTemplateSettingsResponse = z.infer; - -export const updateTemplateSettings = async ({ +export const updateTemplate = async ({ userId, teamId, templateId, - meta, - data, -}: UpdateTemplateSettingsOptions): Promise => { - if (Object.values(data).length === 0 && Object.keys(meta ?? {}).length === 0) { - throw new AppError(AppErrorCode.INVALID_BODY, { - message: 'Missing data to update', - }); - } - + meta = {}, + data = {}, +}: UpdateTemplateOptions) => { const template = await prisma.template.findFirstOrThrow({ where: { id: templateId, @@ -71,6 +56,10 @@ export const updateTemplateSettings = async ({ }, }); + if (Object.values(data).length === 0 && Object.keys(meta).length === 0) { + return template; + } + const { documentAuthOption } = extractDocumentAuthMethods({ documentAuth: template.authOptions, }); @@ -108,12 +97,12 @@ export const updateTemplateSettings = async ({ id: templateId, }, data: { - title: data.title, - externalId: data.externalId, - type: data.type, - visibility: data.visibility, - publicDescription: data.publicDescription, - publicTitle: data.publicTitle, + title: data?.title, + externalId: data?.externalId, + type: data?.type, + visibility: data?.visibility, + publicDescription: data?.publicDescription, + publicTitle: data?.publicTitle, authOptions, templateMeta: { upsert: { diff --git a/packages/lib/server-only/user/delete-user.ts b/packages/lib/server-only/user/delete-user.ts index 71f579c26..7748f9a6d 100644 --- a/packages/lib/server-only/user/delete-user.ts +++ b/packages/lib/server-only/user/delete-user.ts @@ -1,6 +1,7 @@ import { prisma } from '@documenso/prisma'; import { DocumentStatus } from '@documenso/prisma/client'; +import { AppError, AppErrorCode } from '../../errors/app-error'; import { deletedAccountServiceAccount } from './service-accounts/deleted-account'; export type DeleteUserOptions = { @@ -15,7 +16,9 @@ export const deleteUser = async ({ id }: DeleteUserOptions) => { }); if (!user) { - throw new Error(`User with ID ${id} not found`); + throw new AppError(AppErrorCode.NOT_FOUND, { + message: `User with ID ${id} not found`, + }); } const serviceAccount = await deletedAccountServiceAccount(); diff --git a/packages/lib/server-only/user/disable-user.ts b/packages/lib/server-only/user/disable-user.ts index 787b70422..483df99b2 100644 --- a/packages/lib/server-only/user/disable-user.ts +++ b/packages/lib/server-only/user/disable-user.ts @@ -11,11 +11,11 @@ export const disableUser = async ({ id }: DisableUserOptions) => { id, }, include: { - ApiToken: true, - Webhooks: true, + apiTokens: true, + webhooks: true, passkeys: true, - VerificationToken: true, - PasswordResetToken: true, + verificationTokens: true, + passwordResetTokens: true, }, }); diff --git a/packages/lib/server-only/user/get-all-users.ts b/packages/lib/server-only/user/get-all-users.ts index 797d1e0b2..6642e6483 100644 --- a/packages/lib/server-only/user/get-all-users.ts +++ b/packages/lib/server-only/user/get-all-users.ts @@ -34,8 +34,8 @@ export const findUsers = async ({ const [users, count] = await Promise.all([ prisma.user.findMany({ include: { - Subscription: true, - Document: { + subscriptions: true, + documents: { select: { id: true, }, diff --git a/packages/lib/server-only/user/reset-password.ts b/packages/lib/server-only/user/reset-password.ts index 823c645b5..8ff0c8bc3 100644 --- a/packages/lib/server-only/user/reset-password.ts +++ b/packages/lib/server-only/user/reset-password.ts @@ -24,7 +24,7 @@ export const resetPassword = async ({ token, password, requestMetadata }: ResetP token, }, include: { - User: true, + user: true, }, }); @@ -38,7 +38,7 @@ export const resetPassword = async ({ token, password, requestMetadata }: ResetP throw new AppError(AppErrorCode.EXPIRED_CODE); } - const isSamePassword = await compare(password, foundToken.User.password || ''); + const isSamePassword = await compare(password, foundToken.user.password || ''); if (isSamePassword) { throw new AppError('SAME_PASSWORD'); diff --git a/packages/lib/translations/de/web.po b/packages/lib/translations/de/web.po index 2408f10cb..791f3ad25 100644 --- a/packages/lib/translations/de/web.po +++ b/packages/lib/translations/de/web.po @@ -8,7 +8,7 @@ msgstr "" "Language: de\n" "Project-Id-Version: documenso-app\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2024-12-31 08:04\n" +"PO-Revision-Date: 2025-01-19 12:04\n" "Last-Translator: \n" "Language-Team: German\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -22,7 +22,7 @@ msgstr "" msgid "\"{0}\" has invited you to sign \"example document\"." msgstr "\"{0}\" hat Sie eingeladen, \"Beispieldokument\" zu unterschreiben." -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:69 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:74 msgid "\"{0}\" will appear on the document as it has a timezone of \"{timezone}\"." msgstr "\"{0}\" wird im Dokument erscheinen, da es eine Zeitzone von \"{timezone}\" hat." @@ -38,7 +38,7 @@ msgstr "„{documentName}“ wurde unterschrieben" msgid "“{documentName}” was signed by all signers" msgstr "„{documentName}“ wurde von allen Unterzeichnern signiert" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:62 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:61 msgid "\"{documentTitle}\" has been successfully deleted" msgstr "\"{documentTitle}\" wurde erfolgreich gelöscht" @@ -46,12 +46,12 @@ msgstr "\"{documentTitle}\" wurde erfolgreich gelöscht" msgid "\"{placeholderEmail}\" on behalf of \"{0}\" has invited you to sign \"example document\"." msgstr "\"{placeholderEmail}\" im Namen von \"{0}\" hat Sie eingeladen, \"Beispieldokument\" zu unterzeichnen." -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:313 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:330 msgid "{0, plural, one {(1 character over)} other {(# characters over)}}" msgstr "{0, plural, one {(1 Zeichen über dem Limit)} other {(# Zeichen über dem Limit)}}" #: apps/web/src/components/forms/public-profile-form.tsx:237 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:395 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:393 msgid "{0, plural, one {# character over the limit} other {# characters over the limit}}" msgstr "{0, plural, one {# Zeichen über dem Limit} other {# Zeichen über dem Limit}}" @@ -76,7 +76,7 @@ msgstr "{0, plural, one {1 passendes Feld} other {# passende Felder}}" msgid "{0, plural, one {1 Recipient} other {# Recipients}}" msgstr "{0, plural, one {1 Empfänger} other {# Empfänger}}" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:238 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:239 msgid "{0, plural, one {Waiting on 1 recipient} other {Waiting on # recipients}}" msgstr "{0, plural, one {Warte auf 1 Empfänger} other {Warte auf # Empfänger}}" @@ -88,7 +88,7 @@ msgstr "{0, plural, zero {Werte auswählen} other {# ausgewählt...}}" msgid "{0}" msgstr "{0}" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:249 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:247 msgid "{0} direct signing templates" msgstr "{0} direkte Signaturvorlagen" @@ -108,7 +108,7 @@ msgstr "{0} ist dem Team {teamName} bei Documenso beigetreten" msgid "{0} left the team {teamName} on Documenso" msgstr "{0} hat das Team {teamName} bei Documenso verlassen" -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:151 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:145 msgid "{0} of {1} documents remaining this month." msgstr "{0} von {1} Dokumenten verbleibend in diesem Monat." @@ -121,11 +121,11 @@ msgstr "{0} von {1} Zeile(n) ausgewählt." msgid "{0} on behalf of \"{1}\" has invited you to {recipientActionVerb} the document \"{2}\"." msgstr "{0} im Namen von \"{1}\" hat Sie eingeladen, das Dokument \"{2}\" {recipientActionVerb}." -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:173 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:174 msgid "{0} Recipient(s)" msgstr "{0} Empfänger(in)" -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:294 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:311 msgid "{charactersRemaining, plural, one {1 character remaining} other {{charactersRemaining} characters remaining}}" msgstr "{charactersRemaining, plural, one {1 Zeichen verbleibend} other {{charactersRemaining} Zeichen verbleibend}}" @@ -141,7 +141,7 @@ msgstr "{inviterName} hat das Dokument {documentName} storniert, du musst es nic msgid "{inviterName} has cancelled the document<0/>\"{documentName}\"" msgstr "{inviterName} hat das Dokument<0/>\"{documentName}\" storniert" -#: packages/email/template-components/template-document-invite.tsx:75 +#: packages/email/template-components/template-document-invite.tsx:74 msgid "{inviterName} has invited you to {0}<0/>\"{documentName}\"" msgstr "{inviterName} hat dich eingeladen, {0}<0/>\"{documentName}\"" @@ -161,9 +161,9 @@ msgstr "{inviterName} hat dich aus dem Dokument {documentName} entfernt." msgid "{inviterName} has removed you from the document<0/>\"{documentName}\"" msgstr "{inviterName} hat dich aus dem Dokument<0/>\"{documentName}\" entfernt" -#: packages/email/template-components/template-document-invite.tsx:63 -msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {0}" -msgstr "{inviterName} im Namen von \"{teamName}\" hat Sie eingeladen zu {0}" +#: packages/email/template-components/template-document-invite.tsx:61 +msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {0}<0/>\"{documentName}\"" +msgstr "" #: packages/email/templates/document-invite.tsx:45 msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {action} {documentName}" @@ -181,87 +181,87 @@ msgstr "{memberEmail} hat das folgende Team verlassen" msgid "{numberOfSeats, plural, one {# member} other {# members}}" msgstr "{numberOfSeats, plural, one {# Mitglied} other {# Mitglieder}}" -#: packages/lib/utils/document-audit-logs.ts:263 +#: packages/lib/utils/document-audit-logs.ts:279 msgid "{prefix} added a field" msgstr "{prefix} hat ein Feld hinzugefügt" -#: packages/lib/utils/document-audit-logs.ts:275 +#: packages/lib/utils/document-audit-logs.ts:291 msgid "{prefix} added a recipient" msgstr "{prefix} hat einen Empfänger hinzugefügt" -#: packages/lib/utils/document-audit-logs.ts:287 +#: packages/lib/utils/document-audit-logs.ts:303 msgid "{prefix} created the document" msgstr "{prefix} hat das Dokument erstellt" -#: packages/lib/utils/document-audit-logs.ts:291 +#: packages/lib/utils/document-audit-logs.ts:307 msgid "{prefix} deleted the document" msgstr "{prefix} hat das Dokument gelöscht" -#: packages/lib/utils/document-audit-logs.ts:335 +#: packages/lib/utils/document-audit-logs.ts:351 msgid "{prefix} moved the document to team" msgstr "{prefix} hat das Dokument ins Team verschoben" -#: packages/lib/utils/document-audit-logs.ts:319 +#: packages/lib/utils/document-audit-logs.ts:335 msgid "{prefix} opened the document" msgstr "{prefix} hat das Dokument geöffnet" -#: packages/lib/utils/document-audit-logs.ts:267 +#: packages/lib/utils/document-audit-logs.ts:283 msgid "{prefix} removed a field" msgstr "{prefix} hat ein Feld entfernt" -#: packages/lib/utils/document-audit-logs.ts:279 +#: packages/lib/utils/document-audit-logs.ts:295 msgid "{prefix} removed a recipient" msgstr "{prefix} hat einen Empfänger entfernt" -#: packages/lib/utils/document-audit-logs.ts:365 +#: packages/lib/utils/document-audit-logs.ts:381 msgid "{prefix} resent an email to {0}" msgstr "{prefix} hat eine E-Mail an {0} erneut gesendet" -#: packages/lib/utils/document-audit-logs.ts:366 +#: packages/lib/utils/document-audit-logs.ts:382 msgid "{prefix} sent an email to {0}" msgstr "{prefix} hat eine E-Mail an {0} gesendet" -#: packages/lib/utils/document-audit-logs.ts:331 +#: packages/lib/utils/document-audit-logs.ts:347 msgid "{prefix} sent the document" msgstr "{prefix} hat das Dokument gesendet" -#: packages/lib/utils/document-audit-logs.ts:295 +#: packages/lib/utils/document-audit-logs.ts:311 msgid "{prefix} signed a field" msgstr "{prefix} hat ein Feld unterschrieben" -#: packages/lib/utils/document-audit-logs.ts:299 +#: packages/lib/utils/document-audit-logs.ts:315 msgid "{prefix} unsigned a field" msgstr "{prefix} hat ein Feld ungültig gemacht" -#: packages/lib/utils/document-audit-logs.ts:271 +#: packages/lib/utils/document-audit-logs.ts:287 msgid "{prefix} updated a field" msgstr "{prefix} hat ein Feld aktualisiert" -#: packages/lib/utils/document-audit-logs.ts:283 +#: packages/lib/utils/document-audit-logs.ts:299 msgid "{prefix} updated a recipient" msgstr "{prefix} hat einen Empfänger aktualisiert" -#: packages/lib/utils/document-audit-logs.ts:315 +#: packages/lib/utils/document-audit-logs.ts:331 msgid "{prefix} updated the document" msgstr "{prefix} hat das Dokument aktualisiert" -#: packages/lib/utils/document-audit-logs.ts:307 +#: packages/lib/utils/document-audit-logs.ts:323 msgid "{prefix} updated the document access auth requirements" msgstr "{prefix} hat die Anforderungen an die Dokumentenzugriffsautorisierung aktualisiert" -#: packages/lib/utils/document-audit-logs.ts:327 +#: packages/lib/utils/document-audit-logs.ts:343 msgid "{prefix} updated the document external ID" msgstr "{prefix} hat die externe ID des Dokuments aktualisiert" -#: packages/lib/utils/document-audit-logs.ts:311 +#: packages/lib/utils/document-audit-logs.ts:327 msgid "{prefix} updated the document signing auth requirements" msgstr "{prefix} hat die Authentifizierungsanforderungen für die Dokumentenunterzeichnung aktualisiert" -#: packages/lib/utils/document-audit-logs.ts:323 +#: packages/lib/utils/document-audit-logs.ts:339 msgid "{prefix} updated the document title" msgstr "{prefix} hat den Titel des Dokuments aktualisiert" -#: packages/lib/utils/document-audit-logs.ts:303 +#: packages/lib/utils/document-audit-logs.ts:319 msgid "{prefix} updated the document visibility" msgstr "{prefix} hat die Sichtbarkeit des Dokuments aktualisiert" @@ -298,7 +298,7 @@ msgid "{recipientReference} has signed {documentName}" msgstr "{recipientReference} hat {documentName} unterschrieben" #: apps/web/src/components/forms/public-profile-form.tsx:231 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:389 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:387 msgid "{remaningLength, plural, one {# character remaining} other {# characters remaining}}" msgstr "{remaningLength, plural, one {# Zeichen verbleibend} other {# Zeichen verbleibend}}" @@ -307,8 +307,8 @@ msgid "{signerName} has rejected the document \"{documentName}\"." msgstr "{signerName} hat das Dokument \"{documentName}\" abgelehnt." #: packages/email/template-components/template-document-invite.tsx:68 -msgid "{teamName} has invited you to {0}" -msgstr "{teamName} hat Sie eingeladen, {0}" +msgid "{teamName} has invited you to {0}<0/>\"{documentName}\"" +msgstr "" #: packages/email/templates/document-invite.tsx:46 msgid "{teamName} has invited you to {action} {documentName}" @@ -318,27 +318,27 @@ msgstr "{teamName} hat Sie eingeladen, {action} {documentName}" msgid "{teamName} ownership transfer request" msgstr "Anfrage zur Übertragung des Eigentums von {teamName}" -#: packages/lib/utils/document-audit-logs.ts:343 +#: packages/lib/utils/document-audit-logs.ts:359 msgid "{userName} approved the document" msgstr "{userName} hat das Dokument genehmigt" -#: packages/lib/utils/document-audit-logs.ts:344 +#: packages/lib/utils/document-audit-logs.ts:360 msgid "{userName} CC'd the document" msgstr "{userName} hat das Dokument in CC gesetzt" -#: packages/lib/utils/document-audit-logs.ts:345 +#: packages/lib/utils/document-audit-logs.ts:361 msgid "{userName} completed their task" msgstr "{userName} hat ihre Aufgabe abgeschlossen" -#: packages/lib/utils/document-audit-logs.ts:355 +#: packages/lib/utils/document-audit-logs.ts:371 msgid "{userName} rejected the document" msgstr "{userName} hat das Dokument abgelehnt" -#: packages/lib/utils/document-audit-logs.ts:341 +#: packages/lib/utils/document-audit-logs.ts:357 msgid "{userName} signed the document" msgstr "{userName} hat das Dokument unterschrieben" -#: packages/lib/utils/document-audit-logs.ts:342 +#: packages/lib/utils/document-audit-logs.ts:358 msgid "{userName} viewed the document" msgstr "{userName} hat das Dokument angesehen" @@ -358,7 +358,11 @@ msgstr "<0>{senderName} hat angefordert, dass du das folgende Team übernimm msgid "<0>{teamName} has requested to use your email address for their team on Documenso." msgstr "<0>{teamName} hat angefragt, Ihre E-Mail-Adresse für ihr Team bei Documenso zu verwenden." -#: packages/ui/primitives/template-flow/add-template-settings.tsx:241 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:463 +msgid "<0>Click to upload or drag and drop" +msgstr "<0>Klicken Sie hier, um hochzuladen oder ziehen Sie die Datei per Drag & Drop" + +#: packages/ui/primitives/template-flow/add-template-settings.tsx:287 msgid "<0>Email - The recipient will be emailed the document to sign, approve, etc." msgstr "<0>E-Mail - Der Empfänger erhält das Dokument zur Unterschrift, Genehmigung usw." @@ -378,11 +382,11 @@ msgstr "<0>Keine Einschränkungen - Das Dokument kann direkt über die dem E msgid "<0>None - No authentication required" msgstr "<0>Keine - Keine Authentifizierung erforderlich" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:247 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:293 msgid "<0>None - We will generate links which you can send to the recipients manually." msgstr "<0>Keiner - Wir werden Links generieren, die Sie manuell an die Empfänger senden können." -#: packages/ui/primitives/template-flow/add-template-settings.tsx:254 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:300 msgid "<0>Note - If you use Links in combination with direct templates, you will need to manually send the links to the remaining recipients." msgstr "<0>Hinweis - Wenn Sie Links in Kombination mit direkten Vorlagen verwenden, müssen Sie die Links manuell an die restlichen Empfänger senden." @@ -464,19 +468,19 @@ msgstr "Ein Gerät, das in der Lage ist, Dokumente zuzugreifen, zu öffnen und z msgid "A document was created by your direct template that requires you to {recipientActionVerb} it." msgstr "Ein Dokument wurde von deiner direkten Vorlage erstellt, das erfordert, dass du {recipientActionVerb}." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:218 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:230 msgid "A draft document will be created" msgstr "Ein Entwurf wird erstellt" -#: packages/lib/utils/document-audit-logs.ts:262 +#: packages/lib/utils/document-audit-logs.ts:278 msgid "A field was added" msgstr "Ein Feld wurde hinzugefügt" -#: packages/lib/utils/document-audit-logs.ts:266 +#: packages/lib/utils/document-audit-logs.ts:282 msgid "A field was removed" msgstr "Ein Feld wurde entfernt" -#: packages/lib/utils/document-audit-logs.ts:270 +#: packages/lib/utils/document-audit-logs.ts:286 msgid "A field was updated" msgstr "Ein Feld wurde aktualisiert" @@ -488,7 +492,7 @@ msgstr "Ein Mittel, um Dokumente für Ihre Unterlagen zu drucken oder herunterzu msgid "A new member has joined your team" msgstr "Ein neues Mitglied ist deinem Team beigetreten" -#: apps/web/src/components/forms/token.tsx:127 +#: apps/web/src/components/forms/token.tsx:128 msgid "A new token was created successfully." msgstr "Ein neuer Token wurde erfolgreich erstellt." @@ -497,15 +501,15 @@ msgstr "Ein neuer Token wurde erfolgreich erstellt." msgid "A password reset email has been sent, if you have an account you should see it in your inbox shortly." msgstr "Eine E-Mail zum Zurücksetzen des Passworts wurde gesendet, wenn du ein Konto hast, solltest du sie in Kürze in deinem Posteingang sehen." -#: packages/lib/utils/document-audit-logs.ts:274 +#: packages/lib/utils/document-audit-logs.ts:290 msgid "A recipient was added" msgstr "Ein Empfänger wurde hinzugefügt" -#: packages/lib/utils/document-audit-logs.ts:278 +#: packages/lib/utils/document-audit-logs.ts:294 msgid "A recipient was removed" msgstr "Ein Empfänger wurde entfernt" -#: packages/lib/utils/document-audit-logs.ts:282 +#: packages/lib/utils/document-audit-logs.ts:298 msgid "A recipient was updated" msgstr "Ein Empfänger wurde aktualisiert" @@ -591,7 +595,7 @@ msgstr "Team-Einladung akzeptiert" msgid "Account Authentication" msgstr "Kontowauthentifizierung" -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:50 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:51 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:47 msgid "Account deleted" msgstr "Konto gelöscht" @@ -612,20 +616,20 @@ msgstr "Kontowiederauthentifizierung" msgid "Acknowledgment" msgstr "Bestätigung" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:108 -#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:98 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:123 -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:164 -#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:116 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:114 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:97 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:117 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:159 +#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:115 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:46 msgid "Action" msgstr "Aktion" #: apps/web/src/app/(dashboard)/documents/data-table.tsx:79 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:177 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:175 #: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:140 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:131 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:140 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:130 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:139 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:116 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:125 msgid "Actions" @@ -650,16 +654,16 @@ msgid "Add a document" msgstr "Dokument hinzufügen" #: packages/ui/primitives/document-flow/add-settings.tsx:390 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:468 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:514 msgid "Add a URL to redirect the user to once the document is signed" msgstr "Fügen Sie eine URL hinzu, um den Benutzer nach der Unterzeichnung des Dokuments weiterzuleiten" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:177 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:88 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:153 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:87 msgid "Add all relevant fields for each recipient." msgstr "Fügen Sie alle relevanten Felder für jeden Empfänger hinzu." -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:83 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:82 msgid "Add all relevant placeholders for each recipient." msgstr "Fügen Sie alle relevanten Platzhalter für jeden Empfänger hinzu." @@ -675,7 +679,7 @@ msgstr "Fügen Sie einen Authenticator hinzu, um als sekundäre Authentifizierun msgid "Add an external ID to the document. This can be used to identify the document in external systems." msgstr "Fügen Sie dem Dokument eine externe ID hinzu. Diese kann verwendet werden, um das Dokument in externen Systemen zu identifizieren." -#: packages/ui/primitives/template-flow/add-template-settings.tsx:385 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:431 msgid "Add an external ID to the template. This can be used to identify in external systems." msgstr "Fügen Sie der Vorlage eine externe ID hinzu. Diese kann zur Identifizierung in externen Systemen verwendet werden." @@ -692,8 +696,8 @@ msgstr "Weiteren Wert hinzufügen" msgid "Add email" msgstr "E-Mail hinzufügen" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:176 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:87 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:152 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:86 msgid "Add Fields" msgstr "Felder hinzufügen" @@ -718,7 +722,7 @@ msgstr "Passkey hinzufügen" msgid "Add Placeholder Recipient" msgstr "Platzhalterempfänger hinzufügen" -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:82 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:81 msgid "Add Placeholders" msgstr "Platzhalter hinzufügen" @@ -726,7 +730,7 @@ msgstr "Platzhalter hinzufügen" msgid "Add Signer" msgstr "Unterzeichner hinzufügen" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:171 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:147 msgid "Add Signers" msgstr "Unterzeichner hinzufügen" @@ -734,19 +738,19 @@ msgstr "Unterzeichner hinzufügen" msgid "Add team email" msgstr "Team-E-Mail hinzufügen" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:73 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:80 msgid "Add text" msgstr "Text hinzufügen" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:78 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:85 msgid "Add text to the field" msgstr "Text zum Feld hinzufügen" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:172 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:148 msgid "Add the people who will sign the document." msgstr "Fügen Sie die Personen hinzu, die das Dokument unterschreiben werden." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:220 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:232 msgid "Add the recipients to create the document with" msgstr "Fügen Sie die Empfänger hinzu, um das Dokument zu erstellen" @@ -771,12 +775,12 @@ msgid "Admin panel" msgstr "Admin-Panel" #: packages/ui/primitives/document-flow/add-settings.tsx:284 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:367 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:413 msgid "Advanced Options" msgstr "Erweiterte Optionen" #: packages/ui/primitives/document-flow/add-fields.tsx:585 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:415 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:490 msgid "Advanced settings" msgstr "Erweiterte Einstellungen" @@ -804,11 +808,11 @@ msgstr "Alle Dokumente wurden verarbeitet. Alle neuen Dokumente, die gesendet od msgid "All documents related to the electronic signing process will be provided to you electronically through our platform or via email. It is your responsibility to ensure that your email address is current and that you can receive and open our emails." msgstr "Alle Dokumente, die mit dem elektronischen Unterzeichnungsprozess zusammenhängen, werden Ihnen elektronisch über unsere Plattform oder per E-Mail zur Verfügung gestellt. Es liegt in Ihrer Verantwortung, sicherzustellen, dass Ihre E-Mail-Adresse aktuell ist und dass Sie unsere E-Mails empfangen und öffnen können." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:147 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:146 msgid "All inserted signatures will be voided" msgstr "Alle eingefügten Unterschriften werden annulliert" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:150 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:149 msgid "All recipients will be notified" msgstr "Alle Empfänger werden benachrichtigt" @@ -864,30 +868,26 @@ msgstr "Eine E-Mail mit einer Einladung wird an jedes Mitglied gesendet." msgid "An email requesting the transfer of this team has been sent." msgstr "Eine E-Mail, in der die Übertragung dieses Teams angefordert wird, wurde gesendet." -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:60 -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:83 -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:59 #: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:100 #: apps/web/src/components/forms/avatar-image.tsx:122 #: apps/web/src/components/forms/password.tsx:92 -#: apps/web/src/components/forms/profile.tsx:81 #: apps/web/src/components/forms/reset-password.tsx:95 #: apps/web/src/components/forms/signup.tsx:112 -#: apps/web/src/components/forms/token.tsx:137 +#: apps/web/src/components/forms/token.tsx:146 #: apps/web/src/components/forms/v2/signup.tsx:166 msgid "An error occurred" msgstr "Ein Fehler ist aufgetreten" -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:257 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:227 msgid "An error occurred while adding fields." msgstr "Ein Fehler ist aufgetreten beim Hinzufügen von Feldern." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:269 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:218 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:243 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:187 msgid "An error occurred while adding signers." msgstr "Ein Fehler ist aufgetreten, während Unterzeichner hinzugefügt wurden." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:304 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:281 msgid "An error occurred while adding the fields." msgstr "Ein Fehler ist aufgetreten, während die Felder hinzugefügt wurden." @@ -895,7 +895,7 @@ msgstr "Ein Fehler ist aufgetreten, während die Felder hinzugefügt wurden." msgid "An error occurred while auto-signing the document, some fields may not be signed. Please review and manually sign any remaining fields." msgstr "Beim automatischen Signieren des Dokuments ist ein Fehler aufgetreten, einige Felder wurden möglicherweise nicht signiert. Bitte überprüfen Sie und signieren Sie alle verbleibenden Felder manuell." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:176 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:188 msgid "An error occurred while creating document from template." msgstr "Ein Fehler ist aufgetreten, während das Dokument aus der Vorlage erstellt wurde." @@ -903,7 +903,11 @@ msgstr "Ein Fehler ist aufgetreten, während das Dokument aus der Vorlage erstel msgid "An error occurred while creating the webhook. Please try again." msgstr "Ein Fehler ist aufgetreten, während der Webhook erstellt wurde. Bitte versuchen Sie es erneut." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:124 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:63 +msgid "An error occurred while deleting the user." +msgstr "Ein Fehler ist beim Löschen des Benutzers aufgetreten." + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:120 msgid "An error occurred while disabling direct link signing." msgstr "Ein Fehler ist aufgetreten, während das direkte Links-Signieren deaktiviert wurde." @@ -911,18 +915,18 @@ msgstr "Ein Fehler ist aufgetreten, während das direkte Links-Signieren deaktiv msgid "An error occurred while disabling the user." msgstr "Ein Fehler ist aufgetreten, während der Benutzer deaktiviert wurde." -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:64 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:92 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:76 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:107 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:70 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:98 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:77 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:101 msgid "An error occurred while downloading your document." msgstr "Ein Fehler ist aufgetreten, während dein Dokument heruntergeladen wurde." -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:52 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51 msgid "An error occurred while duplicating template." msgstr "Ein Fehler ist aufgetreten, während die Vorlage dupliziert wurde." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:123 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:119 msgid "An error occurred while enabling direct link signing." msgstr "Ein Fehler ist aufgetreten, während das direkte Links-Signieren aktiviert wurde." @@ -951,21 +955,21 @@ msgid "An error occurred while removing the field." msgstr "Ein Fehler ist beim Entfernen des Feldes aufgetreten." #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:154 -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:126 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:131 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:137 -#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:110 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:148 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:195 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:115 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:153 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:196 #: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:129 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:194 msgid "An error occurred while removing the signature." msgstr "Ein Fehler ist aufgetreten, während die Unterschrift entfernt wurde." -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:196 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:197 msgid "An error occurred while removing the text." msgstr "Ein Fehler ist aufgetreten, während der Text entfernt wurde." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:350 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:326 msgid "An error occurred while sending the document." msgstr "Ein Fehler ist aufgetreten, während das Dokument gesendet wurde." @@ -974,15 +978,15 @@ msgid "An error occurred while sending your confirmation email" msgstr "Beim Senden Ihrer Bestätigungs-E-Mail ist ein Fehler aufgetreten" #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:125 -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:100 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:105 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:106 -#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:84 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:89 #: apps/web/src/app/(signing)/sign/[token]/initials-field.tsx:90 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:122 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:150 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:127 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:151 #: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:102 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:168 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:168 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:169 msgid "An error occurred while signing the document." msgstr "Ein Fehler ist aufgetreten, während das Dokument unterzeichnet wurde." @@ -990,8 +994,8 @@ msgstr "Ein Fehler ist aufgetreten, während das Dokument unterzeichnet wurde." msgid "An error occurred while trying to create a checkout session." msgstr "Ein Fehler ist aufgetreten, während versucht wurde, eine Checkout-Sitzung zu erstellen." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:235 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:187 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:210 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:156 msgid "An error occurred while updating the document settings." msgstr "Ein Fehler ist aufgetreten, während die Dokumenteinstellungen aktualisiert wurden." @@ -1003,13 +1007,12 @@ msgstr "Ein Fehler ist aufgetreten, während die Unterschrift aktualisiert wurde msgid "An error occurred while updating your profile." msgstr "Ein Fehler ist aufgetreten, während dein Profil aktualisiert wurde." -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:118 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:108 msgid "An error occurred while uploading your document." msgstr "Ein Fehler ist aufgetreten, während dein Dokument hochgeladen wurde." -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:66 -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:89 -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:65 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:58 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:81 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:55 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:54 #: apps/web/src/components/(dashboard)/common/command-menu.tsx:301 @@ -1026,7 +1029,7 @@ msgstr "Ein Fehler ist aufgetreten, während dein Dokument hochgeladen wurde." #: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:100 #: apps/web/src/components/(teams)/forms/update-team-form.tsx:93 #: apps/web/src/components/forms/avatar-image.tsx:94 -#: apps/web/src/components/forms/profile.tsx:87 +#: apps/web/src/components/forms/profile.tsx:79 #: apps/web/src/components/forms/public-profile-claim-dialog.tsx:113 #: apps/web/src/components/forms/public-profile-form.tsx:104 #: apps/web/src/components/forms/signin.tsx:249 @@ -1036,11 +1039,10 @@ msgstr "Ein Fehler ist aufgetreten, während dein Dokument hochgeladen wurde." #: apps/web/src/components/forms/signin.tsx:302 #: apps/web/src/components/forms/signup.tsx:124 #: apps/web/src/components/forms/signup.tsx:138 -#: apps/web/src/components/forms/token.tsx:143 #: apps/web/src/components/forms/v2/signup.tsx:187 #: apps/web/src/components/forms/v2/signup.tsx:201 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:141 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:178 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:140 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:176 msgid "An unknown error occurred" msgstr "Es ist ein unbekannter Fehler aufgetreten" @@ -1048,11 +1050,11 @@ msgstr "Es ist ein unbekannter Fehler aufgetreten" msgid "Any payment methods attached to this team will remain attached to this team. Please contact us if you need to update this information." msgstr "Alle Zahlungsmethoden, die mit diesem Team verbunden sind, bleiben diesem Team zugeordnet. Bitte kontaktiere uns, wenn du diese Informationen aktualisieren möchtest." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:221 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:219 msgid "Any Source" msgstr "Jede Quelle" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:201 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:199 msgid "Any Status" msgstr "Jeder Status" @@ -1070,16 +1072,16 @@ msgstr "API-Token" msgid "App Version" msgstr "App-Version" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:89 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:120 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:146 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:95 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:121 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:140 #: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:143 #: packages/lib/constants/recipient-roles.ts:8 msgid "Approve" msgstr "Genehmigen" #: apps/web/src/app/(signing)/sign/[token]/form.tsx:142 -#: packages/email/template-components/template-document-invite.tsx:106 +#: packages/email/template-components/template-document-invite.tsx:105 msgid "Approve Document" msgstr "Dokument genehmigen" @@ -1116,13 +1118,13 @@ msgstr "Bist du sicher, dass du den <0>{passkeyName} Passkey entfernen möch msgid "Are you sure you wish to delete this team?" msgstr "Bist du dir sicher, dass du dieses Team löschen möchtest?" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:100 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:99 #: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:94 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:455 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:449 #: apps/web/src/components/(teams)/dialogs/delete-team-member-dialog.tsx:81 #: apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx:81 #: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:116 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:439 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:437 msgid "Are you sure?" msgstr "Bist du dir sicher?" @@ -1130,11 +1132,11 @@ msgstr "Bist du dir sicher?" 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." -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:130 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:136 msgid "Audit Log" msgstr "Audit-Protokoll" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:198 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:200 msgid "Authentication Level" msgstr "Authentifizierungsstufe" @@ -1165,7 +1167,7 @@ msgstr "Zurück" msgid "Back to Documents" msgstr "Zurück zu Dokumenten" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:146 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:137 msgid "Background Color" msgstr "Hintergrundfarbe" @@ -1178,7 +1180,7 @@ msgstr "Backup-Code" msgid "Backup codes" msgstr "Backup-Codes" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:74 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:73 msgid "Banner Updated" msgstr "Banner aktualisiert" @@ -1215,7 +1217,7 @@ msgstr "Markenpräferenzen" msgid "Branding preferences updated" msgstr "Markenpräferenzen aktualisiert" -#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:97 +#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:96 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:48 msgid "Browser" msgstr "Browser" @@ -1228,6 +1230,23 @@ msgstr "Massenkopie" msgid "Bulk Import" msgstr "Bulk-Import" +#: packages/lib/jobs/definitions/internal/bulk-send-template.handler.ts:203 +msgid "Bulk Send Complete: {0}" +msgstr "" + +#: packages/email/templates/bulk-send-complete.tsx:30 +msgid "Bulk send operation complete for template \"{templateName}\"" +msgstr "" + +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:128 +msgid "Bulk Send Template via CSV" +msgstr "" + +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:97 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:120 +msgid "Bulk Send via CSV" +msgstr "" + #: packages/email/templates/team-invite.tsx:84 msgid "by <0>{senderName}" msgstr "von <0>{senderName}" @@ -1240,7 +1259,7 @@ msgstr "Durch die Annahme dieser Anfrage gewähren Sie <0>{teamName} Zugriff msgid "By accepting this request, you will take responsibility for any billing items associated with this team." msgstr "Indem du diese Anfrage annimmst, übernimmst du die Verantwortung für alle Abrechnungspunkte, die mit diesem Team verbunden sind." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:158 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:157 msgid "By deleting this document, the following will occur:" msgstr "Durch das Löschen dieses Dokuments wird Folgendes passieren:" @@ -1261,17 +1280,17 @@ msgid "By using the electronic signature feature, you are consenting to conduct 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." #: apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx:185 -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:192 -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:108 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:191 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:107 #: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:120 #: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:248 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:157 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:198 #: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:109 -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:81 -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:78 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:76 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:77 #: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:131 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:472 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:466 #: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:220 #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:178 #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:71 @@ -1279,12 +1298,12 @@ msgstr "Durch die Verwendung der elektronischen Unterschriftsfunktion stimmen Si #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:189 #: apps/web/src/app/(signing)/sign/[token]/form.tsx:164 #: apps/web/src/app/(signing)/sign/[token]/form.tsx:246 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:215 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:328 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:232 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:341 #: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:153 #: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:131 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:320 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:335 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:352 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121 #: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:176 #: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:242 @@ -1302,8 +1321,9 @@ msgstr "Durch die Verwendung der elektronischen Unterschriftsfunktion stimmen Si #: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:187 #: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:257 #: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:163 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:450 -#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:357 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:448 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:263 +#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:323 #: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:58 msgid "Cancel" msgstr "Abbrechen" @@ -1333,7 +1353,7 @@ msgstr "CC'd" msgid "Ccers" msgstr "Kohlenstoffkopierer" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:86 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:93 msgid "Character Limit" msgstr "Zeichenbeschränkung" @@ -1353,15 +1373,15 @@ msgstr "Checkbox-Werte" msgid "Checkout" msgstr "Abrechnung" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:271 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:266 msgid "Choose an existing recipient from below to continue" msgstr "Wählen Sie einen vorhandenen Empfänger unten aus, um fortzufahren" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:267 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:262 msgid "Choose Direct Link Recipient" msgstr "Wählen Sie den direkten Link Empfänger" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:182 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:158 msgid "Choose how the document will reach recipients" msgstr "Wählen Sie, wie das Dokument die Empfänger erreichen soll" @@ -1385,6 +1405,10 @@ msgstr "Profile später beanspruchen" msgid "Claim your username now" msgstr "Benutzername jetzt beanspruchen" +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:537 +msgid "Clear file" +msgstr "Datei löschen" + #: packages/ui/primitives/data-table.tsx:156 msgid "Clear filters" msgstr "Filter löschen" @@ -1393,13 +1417,13 @@ msgstr "Filter löschen" msgid "Clear Signature" msgstr "Unterschrift löschen" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:130 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:125 msgid "Click here to get started" msgstr "Klicken Sie hier, um zu beginnen" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recent-activity.tsx:76 -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:118 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:66 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:113 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:64 #: apps/web/src/components/document/document-history-sheet.tsx:133 msgid "Click here to retry" msgstr "Klicken Sie hier, um es erneut zu versuchen" @@ -1420,16 +1444,16 @@ msgstr "Klicken Sie, um den Signatur-Link zu kopieren, um ihn an den Empfänger msgid "Click to insert field" msgstr "Klicken, um das Feld auszufüllen" -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:126 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:388 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:125 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:556 #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:125 #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:138 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121 #: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:140 #: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:180 #: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:102 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:319 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:423 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:317 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:421 #: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx:44 msgid "Close" msgstr "Schließen" @@ -1453,7 +1477,7 @@ msgstr "Unterzeichnung abschließen" msgid "Complete Viewing" msgstr "Betrachten abschließen" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:204 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:202 #: apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx:77 #: apps/web/src/components/formatter/document-status.tsx:28 #: packages/email/template-components/template-document-completed.tsx:35 @@ -1480,25 +1504,25 @@ msgstr "Abgeschlossene Dokumente" msgid "Configure Direct Recipient" msgstr "Direkten Empfänger konfigurieren" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:167 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:143 msgid "Configure general settings for the document." msgstr "Konfigurieren Sie die allgemeinen Einstellungen für das Dokument." -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:78 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:77 msgid "Configure general settings for the template." msgstr "Konfigurieren Sie die allgemeinen Einstellungen für die Vorlage." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:337 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:335 msgid "Configure template" msgstr "Vorlage konfigurieren" #: packages/ui/primitives/document-flow/add-fields.tsx:586 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:416 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:491 msgid "Configure the {0} field" msgstr "Konfigurieren Sie das Feld {0}" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:481 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:460 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:475 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:458 msgid "Confirm" msgstr "Bestätigen" @@ -1536,7 +1560,7 @@ msgstr "Zustimmung zu elektronischen Transaktionen" msgid "Contact Information" msgstr "Kontaktinformationen" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:189 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:180 msgid "Content" msgstr "Inhalt" @@ -1546,12 +1570,12 @@ msgstr "Inhalt" #: apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx:143 #: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:72 #: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:122 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:328 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:326 #: packages/ui/primitives/document-flow/document-flow-root.tsx:141 msgid "Continue" msgstr "Fortsetzen" -#: packages/email/template-components/template-document-invite.tsx:86 +#: packages/email/template-components/template-document-invite.tsx:85 msgid "Continue by approving the document." msgstr "Fahre fort, indem du das Dokument genehmigst." @@ -1559,11 +1583,11 @@ msgstr "Fahre fort, indem du das Dokument genehmigst." msgid "Continue by downloading the document." msgstr "Fahre fort, indem du das Dokument herunterlädst." -#: packages/email/template-components/template-document-invite.tsx:84 +#: packages/email/template-components/template-document-invite.tsx:83 msgid "Continue by signing the document." msgstr "Fahre fort, indem du das Dokument signierst." -#: packages/email/template-components/template-document-invite.tsx:85 +#: packages/email/template-components/template-document-invite.tsx:84 msgid "Continue by viewing the document." msgstr "Fahre fort, indem du das Dokument ansiehst." @@ -1597,9 +1621,9 @@ msgid "Copied" msgstr "Kopiert" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:162 -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:77 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:72 #: apps/web/src/app/(dashboard)/templates/template-direct-link-badge.tsx:31 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:163 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:159 #: apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx:40 #: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:61 #: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:117 @@ -1618,11 +1642,11 @@ msgstr "Kopieren" msgid "Copy Link" msgstr "Link kopieren" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:169 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:164 msgid "Copy sharable link" msgstr "Kopieren Sie den teilbaren Link" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:397 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:391 msgid "Copy Shareable Link" msgstr "Kopiere den teilbaren Link" @@ -1657,15 +1681,15 @@ msgstr "Ein Team erstellen, um mit Ihren Teammitgliedern zusammenzuarbeiten." msgid "Create account" msgstr "Konto erstellen" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:396 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:564 msgid "Create and send" msgstr "Erstellen und senden" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:394 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:562 msgid "Create as draft" msgstr "Als Entwurf erstellen" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:354 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:365 msgid "Create as pending" msgstr "Als ausstehend erstellen" @@ -1673,11 +1697,11 @@ msgstr "Als ausstehend erstellen" msgid "Create Direct Link" msgstr "Direkten Link erstellen" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:202 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:197 msgid "Create Direct Signing Link" msgstr "Direkten Signatur-Link erstellen" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:214 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:226 msgid "Create document from template" msgstr "Dokument aus der Vorlage erstellen" @@ -1685,11 +1709,11 @@ msgstr "Dokument aus der Vorlage erstellen" msgid "Create now" msgstr "Jetzt erstellen" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:352 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:346 msgid "Create one automatically" msgstr "Einen automatisch erstellen" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:398 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:566 msgid "Create signing links" msgstr "Unterzeichnung Links erstellen" @@ -1704,7 +1728,7 @@ msgstr "Team erstellen" msgid "Create Team" msgstr "Team erstellen" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:361 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:372 msgid "Create the document as pending and ready to sign." msgstr "Erstellen Sie das Dokument als ausstehend und bereit zur Unterschrift." @@ -1730,19 +1754,19 @@ msgid "Create your account and start using state-of-the-art document signing. Op msgstr "Erstellen Sie Ihr Konto und beginnen Sie mit dem modernen Dokumentensignieren. Offenes und schönes Signieren liegt in Ihrer Reichweite." #: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:62 -#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:96 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:35 +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:112 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:36 #: apps/web/src/app/(dashboard)/documents/data-table.tsx:48 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table.tsx:63 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:105 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:34 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:103 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:35 #: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:56 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:274 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:272 msgid "Created" msgstr "Erstellt" #: apps/web/src/app/(dashboard)/admin/subscriptions/page.tsx:35 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:111 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:112 msgid "Created At" msgstr "Erstellt am" @@ -1762,6 +1786,10 @@ msgstr "Erstellt am" msgid "Created on {0}" msgstr "Erstellt am {0}" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:143 +msgid "CSV Structure" +msgstr "" + #: apps/web/src/components/forms/password.tsx:112 msgid "Current Password" msgstr "Aktuelles Passwort" @@ -1770,6 +1798,10 @@ msgstr "Aktuelles Passwort" msgid "Current password is incorrect." msgstr "Aktuelles Passwort ist falsch." +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:154 +msgid "Current recipients:" +msgstr "" + #: apps/web/src/app/(dashboard)/settings/billing/billing-plans.tsx:28 msgid "Daily" msgstr "Täglich" @@ -1778,11 +1810,11 @@ msgstr "Täglich" msgid "Dark Mode" msgstr "Dunkelmodus" -#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:68 -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:148 +#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:67 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:153 #: packages/ui/primitives/document-flow/add-fields.tsx:945 #: packages/ui/primitives/document-flow/types.ts:53 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:732 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:810 msgid "Date" msgstr "Datum" @@ -1791,7 +1823,7 @@ msgid "Date created" msgstr "Erstellungsdatum" #: packages/ui/primitives/document-flow/add-settings.tsx:325 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:408 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:454 msgid "Date Format" msgstr "Datumsformat" @@ -1812,19 +1844,19 @@ msgstr "Standardsprache des Dokuments" msgid "Default Document Visibility" msgstr "Standard Sichtbarkeit des Dokuments" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:50 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:49 msgid "delete" msgstr "löschen" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:144 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:189 -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:202 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:150 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:183 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:201 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:177 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:211 #: apps/web/src/app/(dashboard)/settings/tokens/page.tsx:83 #: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:100 -#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:94 -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:90 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:107 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:85 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:116 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/page.tsx:105 #: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:121 @@ -1843,25 +1875,25 @@ msgstr "löschen {0}" msgid "delete {teamName}" msgstr "löschen {teamName}" -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:136 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:133 msgid "Delete account" msgstr "Konto löschen" -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:97 -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:104 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:94 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:101 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:72 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:86 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:93 msgid "Delete Account" msgstr "Konto löschen" -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:135 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:125 msgid "Delete document" msgstr "Dokument löschen" -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:85 -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:98 -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:105 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:75 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:88 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:95 msgid "Delete Document" msgstr "Dokument löschen" @@ -1878,11 +1910,11 @@ msgstr "Team löschen" msgid "Delete team member" msgstr "Teammitglied löschen" -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:88 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:78 msgid "Delete the document. This action is irreversible so proceed with caution." msgstr "Löschen Sie das Dokument. Diese Aktion ist irreversibel, daher seien Sie vorsichtig." -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:86 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:83 msgid "Delete the users account and all its contents. This action is irreversible and will cancel their subscription, so proceed with caution." msgstr "Löschen Sie das Benutzerkonto und seinen gesamten Inhalt. Diese Aktion ist irreversibel und wird das Abonnement kündigen, seien Sie also vorsichtig." @@ -1895,7 +1927,7 @@ msgid "Delete your account and all its contents, including completed documents. msgstr "Löschen Sie Ihr Konto und alle Inhalte, einschließlich abgeschlossener Dokumente. Diese Aktion ist irreversibel und führt zur Kündigung Ihres Abonnements, seien Sie also vorsichtig." #: apps/web/src/app/(dashboard)/admin/documents/[id]/page.tsx:41 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:97 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:98 msgid "Deleted" msgstr "Gelöscht" @@ -1903,12 +1935,12 @@ msgstr "Gelöscht" msgid "Deleting account..." msgstr "Konto wird gelöscht..." -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:178 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:180 msgid "Details" msgstr "Einzelheiten" -#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:73 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:242 +#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:72 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:244 msgid "Device" msgstr "Gerät" @@ -1922,12 +1954,12 @@ msgid "direct link" msgstr "Direkter Link" #: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:40 -#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:79 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:81 msgid "Direct link" msgstr "Direkter Link" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:156 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:227 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:154 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:225 msgid "Direct Link" msgstr "Direkter Link" @@ -1939,15 +1971,15 @@ msgstr "Direkter Link deaktiviert" msgid "Direct link receiver" msgstr "Empfänger des direkten Links" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:363 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:357 msgid "Direct Link Signing" msgstr "Direkt-Link-Signatur" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:115 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:111 msgid "Direct link signing has been disabled" msgstr "Die direkte Links-Signatur wurde deaktiviert" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:114 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:110 msgid "Direct link signing has been enabled" msgstr "Die direkte Links-Signatur wurde aktiviert" @@ -1955,15 +1987,15 @@ msgstr "Die direkte Links-Signatur wurde aktiviert" msgid "Direct link templates contain one dynamic recipient placeholder. Anyone with access to this link can sign the document, and it will then appear on your documents page." msgstr "Direkte Linkvorlagen enthalten einen dynamischen Empfänger-Platzhalter. Jeder, der Zugriff auf diesen Link hat, kann das Dokument unterzeichnen, und es wird dann auf Ihrer Dokumenten-Seite angezeigt." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:142 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:138 msgid "Direct template link deleted" msgstr "Direkter Vorlagenlink gelöscht" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:228 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:223 msgid "Direct template link usage exceeded ({0}/{1})" msgstr "Die Verwendung des direkten Vorlagenlinks wurde überschritten ({0}/{1})" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:417 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:415 msgid "Disable" msgstr "Deaktivieren" @@ -1991,7 +2023,7 @@ msgstr "Deaktivieren Sie die Zwei-Faktor-Authentifizierung, bevor Sie Ihr Konto msgid "Disabled" msgstr "Deaktiviert" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:380 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:374 msgid "Disabling direct link signing will prevent anyone from accessing the link." msgstr "Das Deaktivieren der direkten Link-Signatur verhindert, dass jemand auf den Link zugreifen kann." @@ -2003,15 +2035,15 @@ msgstr "Das Deaktivieren des Benutzers führt dazu, dass der Benutzer das Konto msgid "Display your name and email in documents" msgstr "Zeigen Sie Ihren Namen und Ihre E-Mail in Dokumenten an" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:181 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:157 msgid "Distribute Document" msgstr "Dokument verteilen" -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:63 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:58 msgid "Do you want to delete this template?" msgstr "Möchten Sie diese Vorlage löschen?" -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:63 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:62 msgid "Do you want to duplicate this template?" msgstr "Möchten Sie diese Vorlage duplizieren?" @@ -2034,11 +2066,11 @@ msgstr "Dokument \"{0}\" - Ablehnung Bestätigt" #: packages/ui/components/document/document-global-auth-access-select.tsx:62 #: packages/ui/primitives/document-flow/add-settings.tsx:227 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:202 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:224 msgid "Document access" msgstr "Dokumentenzugriff" -#: packages/lib/utils/document-audit-logs.ts:306 +#: packages/lib/utils/document-audit-logs.ts:322 msgid "Document access auth updated" msgstr "Die Authentifizierung für den Dokumentenzugriff wurde aktualisiert" @@ -2051,14 +2083,14 @@ msgid "Document Approved" msgstr "Dokument genehmigt" #: apps/web/src/app/(signing)/sign/[token]/no-longer-available.tsx:40 -#: packages/lib/server-only/document/delete-document.ts:246 -#: packages/lib/server-only/document/super-delete-document.ts:98 +#: packages/lib/server-only/document/delete-document.ts:263 +#: packages/lib/server-only/document/super-delete-document.ts:101 msgid "Document Cancelled" msgstr "Dokument storniert" #: apps/web/src/components/formatter/document-status.tsx:29 -#: packages/lib/utils/document-audit-logs.ts:369 -#: packages/lib/utils/document-audit-logs.ts:370 +#: packages/lib/utils/document-audit-logs.ts:385 +#: packages/lib/utils/document-audit-logs.ts:386 msgid "Document completed" msgstr "Dokument abgeschlossen" @@ -2071,21 +2103,21 @@ msgstr "E-Mail zum Abschluss des Dokuments" msgid "Document Completed!" msgstr "Dokument abgeschlossen!" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:156 -#: packages/lib/utils/document-audit-logs.ts:286 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:168 +#: packages/lib/utils/document-audit-logs.ts:302 msgid "Document created" msgstr "Dokument erstellt" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:127 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:125 msgid "Document created by <0>{0}" msgstr "Dokument erstellt von <0>{0}" #: packages/email/templates/document-created-from-direct-template.tsx:32 -#: packages/lib/server-only/template/create-document-from-direct-template.ts:585 +#: packages/lib/server-only/template/create-document-from-direct-template.ts:588 msgid "Document created from direct template" msgstr "Dokument erstellt aus direkter Vorlage" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:132 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:130 msgid "Document created using a <0>direct link" msgstr "Dokument erstellt mit einem <0>direkten Link" @@ -2093,10 +2125,10 @@ msgstr "Dokument erstellt mit einem <0>direkten Link" msgid "Document Creation" msgstr "Dokumenterstellung" -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:51 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:181 -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:61 -#: packages/lib/utils/document-audit-logs.ts:290 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:50 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:182 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:60 +#: packages/lib/utils/document-audit-logs.ts:306 msgid "Document deleted" msgstr "Dokument gelöscht" @@ -2104,12 +2136,12 @@ msgstr "Dokument gelöscht" msgid "Document deleted email" msgstr "E-Mail zum Löschen des Dokuments" -#: packages/lib/server-only/document/send-delete-email.ts:82 +#: packages/lib/server-only/document/send-delete-email.ts:85 msgid "Document Deleted!" msgstr "Dokument gelöscht!" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:219 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:228 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:265 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:274 msgid "Document Distribution Method" msgstr "Verteilungsmethode für Dokumente" @@ -2117,21 +2149,21 @@ msgstr "Verteilungsmethode für Dokumente" msgid "Document draft" msgstr "Dokument-Entwurf" -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:58 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:57 msgid "Document Duplicated" msgstr "Dokument dupliziert" -#: packages/lib/utils/document-audit-logs.ts:326 +#: packages/lib/utils/document-audit-logs.ts:342 msgid "Document external ID updated" msgstr "Externe ID des Dokuments aktualisiert" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:192 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:193 #: apps/web/src/components/document/document-history-sheet.tsx:104 msgid "Document history" msgstr "Dokumentverlauf" #: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-page-view.tsx:71 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:81 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:82 msgid "Document ID" msgstr "Dokument-ID" @@ -2151,7 +2183,7 @@ msgstr "Dokumentmetrik" msgid "Document moved" msgstr "Dokument verschoben" -#: packages/lib/utils/document-audit-logs.ts:334 +#: packages/lib/utils/document-audit-logs.ts:350 msgid "Document moved to team" msgstr "Dokument ins Team verschoben" @@ -2159,7 +2191,7 @@ msgstr "Dokument ins Team verschoben" msgid "Document no longer available to sign" msgstr "Dokument steht nicht mehr zur Unterschrift zur Verfügung" -#: packages/lib/utils/document-audit-logs.ts:318 +#: packages/lib/utils/document-audit-logs.ts:334 msgid "Document opened" msgstr "Dokument geöffnet" @@ -2188,8 +2220,8 @@ msgstr "Dokument Abgelehnt" msgid "Document resealed" msgstr "Dokument wieder versiegelt" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:327 -#: packages/lib/utils/document-audit-logs.ts:330 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:303 +#: packages/lib/utils/document-audit-logs.ts:346 msgid "Document sent" msgstr "Dokument gesendet" @@ -2197,11 +2229,11 @@ msgstr "Dokument gesendet" msgid "Document Signed" msgstr "Dokument signiert" -#: packages/lib/utils/document-audit-logs.ts:310 +#: packages/lib/utils/document-audit-logs.ts:326 msgid "Document signing auth updated" msgstr "Dokument unterzeichnen Authentifizierung aktualisiert" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:144 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:143 msgid "Document signing process will be cancelled" msgstr "Der Dokumentenunterzeichnungsprozess wird abgebrochen" @@ -2213,11 +2245,11 @@ msgstr "Dokumentenstatus" msgid "Document title" msgstr "Dokumenttitel" -#: packages/lib/utils/document-audit-logs.ts:322 +#: packages/lib/utils/document-audit-logs.ts:338 msgid "Document title updated" msgstr "Dokumenttitel aktualisiert" -#: packages/lib/utils/document-audit-logs.ts:314 +#: packages/lib/utils/document-audit-logs.ts:330 msgid "Document updated" msgstr "Dokument aktualisiert" @@ -2225,7 +2257,7 @@ msgstr "Dokument aktualisiert" msgid "Document upload disabled due to unpaid invoices" msgstr "Dokumenten-Upload deaktiviert aufgrund unbezahlter Rechnungen" -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:86 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:85 msgid "Document uploaded" msgstr "Dokument hochgeladen" @@ -2233,17 +2265,17 @@ msgstr "Dokument hochgeladen" msgid "Document Viewed" msgstr "Dokument angesehen" -#: packages/lib/utils/document-audit-logs.ts:302 +#: packages/lib/utils/document-audit-logs.ts:318 msgid "Document visibility updated" msgstr "Sichtbarkeit des Dokuments aktualisiert" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:141 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:140 msgid "Document will be permanently deleted" msgstr "Dokument wird dauerhaft gelöscht" #: apps/web/src/app/(dashboard)/admin/nav.tsx:65 #: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:92 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:144 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:145 #: apps/web/src/app/(dashboard)/documents/[id]/edit/document-edit-page-view.tsx:109 #: apps/web/src/app/(dashboard)/documents/[id]/loading.tsx:16 #: apps/web/src/app/(dashboard)/documents/[id]/sent/page.tsx:15 @@ -2257,7 +2289,7 @@ msgstr "Dokument wird dauerhaft gelöscht" msgid "Documents" msgstr "Dokumente" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:197 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:200 msgid "Documents created from template" msgstr "Dokumente erstellt aus Vorlage" @@ -2274,10 +2306,10 @@ msgstr "Dokumente angesehen" msgid "Don't have an account? <0>Sign up" msgstr "Haben Sie kein Konto? <0>Registrieren" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:111 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:123 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:141 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:162 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:117 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:129 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:142 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:156 #: apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx:110 #: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:185 #: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:107 @@ -2286,7 +2318,7 @@ msgstr "Haben Sie kein Konto? <0>Registrieren" msgid "Download" msgstr "Herunterladen" -#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:81 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:77 msgid "Download Audit Logs" msgstr "Auditprotokolle herunterladen" @@ -2294,7 +2326,11 @@ msgstr "Auditprotokolle herunterladen" msgid "Download Certificate" msgstr "Zertifikat herunterladen" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:210 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:168 +msgid "Download Template CSV" +msgstr "" + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:208 #: apps/web/src/components/formatter/document-status.tsx:34 #: packages/lib/constants/document.ts:13 msgid "Draft" @@ -2313,7 +2349,7 @@ msgid "Drag & drop your PDF here." msgstr "Ziehen Sie Ihr PDF hierher." #: packages/ui/primitives/document-flow/add-fields.tsx:1076 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:863 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:941 msgid "Dropdown" msgstr "Dropdown" @@ -2325,28 +2361,28 @@ msgstr "Dropdown-Optionen" msgid "Due to an unpaid invoice, your team has been restricted. Please settle the payment to restore full access to your team." msgstr "Aufgrund einer unbezahlten Rechnung wurde Ihrem Team der Zugriff eingeschränkt. Bitte begleichen Sie die Zahlung, um den vollumfänglichen Zugang zu Ihrem Team wiederherzustellen." -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:136 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:167 -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:85 -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:118 -#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:74 -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:91 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:142 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:161 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:84 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:117 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:76 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:89 msgid "Duplicate" msgstr "Duplizieren" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:104 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:115 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:102 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:156 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:110 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:121 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:103 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:150 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:111 #: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:95 -#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:65 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:67 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx:77 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/page.tsx:100 msgid "Edit" msgstr "Bearbeiten" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:117 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:120 msgid "Edit Template" msgstr "Vorlage bearbeiten" @@ -2366,18 +2402,18 @@ msgstr "Offenlegung der elektronischen Unterschrift" #: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:166 #: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:116 #: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:71 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:265 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:272 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:277 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:284 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:122 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:129 -#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:118 -#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:126 +#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:119 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:131 #: apps/web/src/app/embed/direct/[[...url]]/client.tsx:407 #: apps/web/src/app/embed/sign/[[...url]]/client.tsx:287 #: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:169 #: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:153 #: apps/web/src/components/forms/forgot-password.tsx:81 -#: apps/web/src/components/forms/profile.tsx:122 +#: apps/web/src/components/forms/profile.tsx:113 #: apps/web/src/components/forms/signin.tsx:339 #: apps/web/src/components/forms/signup.tsx:176 #: packages/lib/constants/document.ts:28 @@ -2385,7 +2421,7 @@ msgstr "Offenlegung der elektronischen Unterschrift" #: packages/ui/primitives/document-flow/add-signers.tsx:511 #: packages/ui/primitives/document-flow/add-signers.tsx:518 #: packages/ui/primitives/document-flow/types.ts:54 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:680 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:758 #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:470 #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:477 msgid "Email" @@ -2401,7 +2437,7 @@ msgstr "E-Mail-Adresse" msgid "Email Address" msgstr "E-Mail-Adresse" -#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:80 +#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:81 msgid "Email cannot already exist in the template" msgstr "E-Mail darf nicht bereits in der Vorlage vorhanden sein" @@ -2409,15 +2445,15 @@ msgstr "E-Mail darf nicht bereits in der Vorlage vorhanden sein" msgid "Email Confirmed!" msgstr "E-Mail bestätigt!" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:307 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:353 msgid "Email Options" msgstr "E-Mail-Optionen" -#: packages/lib/utils/document-audit-logs.ts:363 +#: packages/lib/utils/document-audit-logs.ts:379 msgid "Email resent" msgstr "E-Mail erneut gesendet" -#: packages/lib/utils/document-audit-logs.ts:363 +#: packages/lib/utils/document-audit-logs.ts:379 msgid "Email sent" msgstr "E-Mail gesendet" @@ -2459,11 +2495,11 @@ msgstr "Authenticator-App aktivieren" msgid "Enable custom branding for all documents in this team." msgstr "Aktivieren Sie individuelles Branding für alle Dokumente in diesem Team." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:251 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:246 msgid "Enable direct link signing" msgstr "Direktlinksignierung aktivieren" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:374 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:368 #: packages/lib/constants/template.ts:8 msgid "Enable Direct Link Signing" msgstr "Direktlink-Signierung aktivieren" @@ -2478,11 +2514,11 @@ msgid "Enable Typed Signature" msgstr "Getippte Unterschrift aktivieren" #: packages/ui/primitives/document-flow/add-fields.tsx:813 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:600 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:678 msgid "Enable Typed Signatures" msgstr "Aktivieren Sie getippte Unterschriften" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:123 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:114 #: apps/web/src/app/(dashboard)/settings/webhooks/[id]/page.tsx:138 #: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:74 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/[id]/page.tsx:142 @@ -2495,7 +2531,7 @@ msgstr "Aktiviert" msgid "Enabling the account results in the user being able to use the account again, and all the related features such as webhooks, teams, and API keys for example." msgstr "Das Aktivieren des Kontos führt dazu, dass der Benutzer das Konto wieder nutzen kann, sowie alle damit verbundenen Funktionen wie Webhooks, Teams und API-Schlüssel beispielsweise." -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:87 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:88 msgid "Enclosed Document" msgstr "Beigefügte Dokument" @@ -2515,7 +2551,7 @@ msgstr "Geben Sie Ihre Markendaten ein" msgid "Enter your email" msgstr "Geben Sie Ihre E-Mail-Adresse ein" -#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:135 +#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:136 msgid "Enter your email address to receive the completed document." msgstr "Geben Sie Ihre E-Mail-Adresse ein, um das abgeschlossene Dokument zu erhalten." @@ -2523,53 +2559,53 @@ msgstr "Geben Sie Ihre E-Mail-Adresse ein, um das abgeschlossene Dokument zu erh msgid "Enter your name" msgstr "Geben Sie Ihren Namen ein" -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:280 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:293 msgid "Enter your text here" msgstr "Geben Sie hier Ihren Text ein" #: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:41 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:66 #: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:60 #: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:60 #: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:80 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:234 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:268 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:303 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:349 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:209 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:242 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:280 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:325 #: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:57 #: apps/web/src/app/(dashboard)/documents/upload-document.tsx:111 -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:117 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:155 #: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:186 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:217 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:256 -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:226 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:50 #: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:68 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:175 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:187 #: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:152 #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:124 #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:153 #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:214 -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:99 -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:125 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:104 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:130 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:105 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:136 -#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:83 -#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:109 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:88 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:114 #: apps/web/src/app/(signing)/sign/[token]/initials-field.tsx:89 #: apps/web/src/app/(signing)/sign/[token]/initials-field.tsx:115 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:121 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:147 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:149 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:194 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:126 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:152 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:150 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:195 #: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:101 #: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:128 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:133 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:167 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:193 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:167 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:195 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:168 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:196 #: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:54 #: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:101 -#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:258 +#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:224 #: packages/ui/primitives/pdf-viewer.tsx:166 msgid "Error" msgstr "Fehler" @@ -2600,7 +2636,7 @@ msgid "Expires on {0}" msgstr "Läuft ab am {0}" #: packages/ui/primitives/document-flow/add-settings.tsx:295 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:378 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:424 msgid "External ID" msgstr "Externe ID" @@ -2608,7 +2644,7 @@ msgstr "Externe ID" msgid "Failed to reseal document" msgstr "Dokument konnte nicht erneut versiegelt werden" -#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:259 +#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:225 msgid "Failed to save settings." msgstr "Einstellungen konnten nicht gespeichert werden." @@ -2621,16 +2657,20 @@ msgstr "Empfänger konnte nicht aktualisiert werden" msgid "Failed to update webhook" msgstr "Webhook konnte nicht aktualisiert werden" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:93 +#: packages/email/templates/bulk-send-complete.tsx:55 +msgid "Failed: {failedCount}" +msgstr "" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:100 msgid "Field character limit" msgstr "Zeichenbeschränkung des Feldes" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:62 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:44 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:44 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:44 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:69 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:51 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:46 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:51 #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:130 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:107 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:114 msgid "Field font size" msgstr "Feldschriftgröße" @@ -2638,19 +2678,19 @@ msgstr "Feldschriftgröße" msgid "Field format" msgstr "Feldformat" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:53 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:60 msgid "Field label" msgstr "Feldbeschriftung" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:65 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:72 msgid "Field placeholder" msgstr "Feldplatzhalter" -#: packages/lib/utils/document-audit-logs.ts:294 +#: packages/lib/utils/document-audit-logs.ts:310 msgid "Field signed" msgstr "Feld unterschrieben" -#: packages/lib/utils/document-audit-logs.ts:298 +#: packages/lib/utils/document-audit-logs.ts:314 msgid "Field unsigned" msgstr "Feld nicht unterschrieben" @@ -2658,16 +2698,20 @@ msgstr "Feld nicht unterschrieben" msgid "Fields" msgstr "Felder" -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:130 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:124 msgid "File cannot be larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB" msgstr "Die Datei darf nicht größer als {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB sein" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:56 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:38 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:38 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:38 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:513 +msgid "File size exceeds the limit of {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB" +msgstr "Dateigröße überschreitet das Limit von {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:63 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:45 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:40 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:45 #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:124 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:101 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:108 msgid "Font Size" msgstr "Schriftgröße" @@ -2675,6 +2719,10 @@ msgstr "Schriftgröße" msgid "For any questions regarding this disclosure, electronic signatures, or any related process, please contact us at: <0>{SUPPORT_EMAIL}" msgstr "Für Fragen zu dieser Offenlegung, elektronischen Unterschriften oder einem verwandten Verfahren kontaktieren Sie uns bitte unter: <0>{SUPPORT_EMAIL}" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:147 +msgid "For each recipient, provide their email (required) and name (optional) in separate columns. Download the template CSV below for the correct format." +msgstr "" + #: packages/lib/server-only/auth/send-forgot-password.ts:61 msgid "Forgot Password?" msgstr "Passwort vergessen?" @@ -2691,16 +2739,16 @@ msgstr "Freie Unterschrift" #: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:330 #: apps/web/src/app/(signing)/sign/[token]/form.tsx:191 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:193 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:210 #: apps/web/src/app/embed/direct/[[...url]]/client.tsx:392 #: apps/web/src/app/embed/sign/[[...url]]/client.tsx:272 -#: apps/web/src/components/forms/profile.tsx:110 +#: apps/web/src/components/forms/profile.tsx:101 #: apps/web/src/components/forms/v2/signup.tsx:316 msgid "Full Name" msgstr "Vollständiger Name" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:166 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:77 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:142 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:76 #: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:62 #: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:44 #: apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx:52 @@ -2776,7 +2824,7 @@ msgstr "Hier können Sie Präferenzen und Voreinstellungen für das Branding fes msgid "Here you can set preferences and defaults for your team." msgstr "Hier können Sie Präferenzen und Voreinstellungen für Ihr Team festlegen." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:206 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:201 msgid "Here's how it works:" msgstr "So funktioniert es:" @@ -2784,13 +2832,17 @@ msgstr "So funktioniert es:" msgid "Hey I’m Timur" msgstr "Hey, ich bin Timur" +#: packages/email/templates/bulk-send-complete.tsx:36 +msgid "Hi {userName}," +msgstr "" + #: packages/email/templates/reset-password.tsx:56 msgid "Hi, {userName} <0>({userEmail})" msgstr "Hallo, {userName} <0>({userEmail})" -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:189 -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:202 -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:155 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:183 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:201 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:154 msgid "Hide" msgstr "Ausblenden" @@ -2851,8 +2903,8 @@ msgstr "Posteingang Dokumente" msgid "Include the Signing Certificate in the Document" msgstr "Signaturzertifikat in das Dokument einfügen" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:53 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:50 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:54 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:51 msgid "Information" msgstr "Information" @@ -2882,10 +2934,6 @@ msgstr "Ungültiger Code. Bitte versuchen Sie es erneut." msgid "Invalid email" msgstr "Ungültige E-Mail" -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:105 -msgid "Invalid file" -msgstr "Ungültige Datei" - #: apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx:33 #: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:36 msgid "Invalid link" @@ -2908,11 +2956,11 @@ msgstr "Einladung akzeptiert!" msgid "Invitation declined" msgstr "Einladung abgelehnt" -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:78 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:77 msgid "Invitation has been deleted" msgstr "Einladung wurde gelöscht" -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:61 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:60 msgid "Invitation has been resent" msgstr "Einladung wurde erneut gesendet" @@ -2932,7 +2980,7 @@ msgstr "Mitglieder einladen" msgid "Invite team members" msgstr "Teammitglieder einladen" -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:126 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:125 msgid "Invited At" msgstr "Eingeladen am" @@ -2941,7 +2989,7 @@ msgid "Invoice" msgstr "Rechnung" #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:47 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:235 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:237 msgid "IP Address" msgstr "IP-Adresse" @@ -2975,13 +3023,13 @@ msgstr "Tritt {teamName} auf Documenso bei" #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:67 #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:72 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:48 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:55 msgid "Label" msgstr "Beschriftung" #: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:286 #: packages/ui/primitives/document-flow/add-settings.tsx:187 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:162 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:184 msgid "Language" msgstr "Sprache" @@ -2997,8 +3045,8 @@ msgstr "Die letzten 30 Tage" msgid "Last 7 days" msgstr "Die letzten 7 Tage" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:41 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:38 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:42 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:39 msgid "Last modified" msgstr "Zuletzt geändert" @@ -3006,7 +3054,7 @@ msgstr "Zuletzt geändert" msgid "Last updated" msgstr "Zuletzt aktualisiert" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:121 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:122 msgid "Last Updated" msgstr "Zuletzt aktualisiert" @@ -3048,11 +3096,11 @@ msgstr "Möchten Sie Ihr eigenes öffentliches Profil mit Vereinbarungen haben?" msgid "Link expires in 1 hour." msgstr "Link läuft in 1 Stunde ab." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:216 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:215 msgid "Link template" msgstr "Vorlage verlinken" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:338 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:314 msgid "Links Generated" msgstr "Links generiert" @@ -3073,7 +3121,7 @@ msgstr "Lade Dokument..." #: apps/web/src/app/(dashboard)/documents/[id]/loading.tsx:20 #: apps/web/src/app/(dashboard)/documents/[id]/sent/page.tsx:19 -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:91 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:90 msgid "Loading Document..." msgstr "Dokument wird geladen..." @@ -3104,7 +3152,7 @@ msgstr "Verwalten Sie das Profil von {0}" msgid "Manage all teams you are currently associated with." msgstr "Verwalten Sie alle Teams, mit denen Sie derzeit verbunden sind." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:161 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:164 msgid "Manage and view template" msgstr "Vorlage verwalten und anzeigen" @@ -3112,7 +3160,7 @@ msgstr "Vorlage verwalten und anzeigen" msgid "Manage billing" msgstr "Rechnungsmanagement" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:341 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:339 msgid "Manage details for this public template" msgstr "Details für diese öffentliche Vorlage verwalten" @@ -3148,7 +3196,7 @@ msgstr "Teamabonnement verwalten." msgid "Manage teams" msgstr "Teams verwalten" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:367 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:361 msgid "Manage the direct link signing for this template" msgstr "Die direkte Linkunterzeichnung für diese Vorlage verwalten" @@ -3184,10 +3232,14 @@ msgstr "MAU (erstellt Dokument)" msgid "MAU (had document completed)" msgstr "MAU (hat Dokument abgeschlossen)" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:188 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:209 msgid "Max" msgstr "Max" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:227 +msgid "Maximum file size: 4MB. Maximum 100 rows per upload. Blank values will use template defaults." +msgstr "" + #: packages/lib/constants/teams.ts:12 msgid "Member" msgstr "Mitglied" @@ -3204,11 +3256,11 @@ msgid "Members" msgstr "Mitglieder" #: packages/ui/primitives/document-flow/add-subject.tsx:160 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:338 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:384 msgid "Message <0>(Optional)" msgstr "Nachricht <0>(Optional)" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:176 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:197 msgid "Min" msgstr "Min" @@ -3243,8 +3295,8 @@ msgstr "Dokument in Team verschieben" msgid "Move Template to Team" msgstr "Vorlage in Team verschieben" -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:174 -#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:85 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:168 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:87 msgid "Move to Team" msgstr "In Team verschieben" @@ -3263,10 +3315,10 @@ msgstr "Meine Vorlagen" #: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:66 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:144 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table.tsx:59 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:287 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:294 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:299 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:306 #: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:118 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:170 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:175 #: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:153 #: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:141 #: apps/web/src/components/forms/signup.tsx:160 @@ -3274,7 +3326,7 @@ msgstr "Meine Vorlagen" #: packages/ui/primitives/document-flow/add-signers.tsx:549 #: packages/ui/primitives/document-flow/add-signers.tsx:555 #: packages/ui/primitives/document-flow/types.ts:55 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:706 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:784 #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:505 #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:511 msgid "Name" @@ -3308,8 +3360,8 @@ msgstr "Nie ablaufen" msgid "New team owner" msgstr "Neuer Teamowner" -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:96 -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:103 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:95 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:102 msgid "New Template" msgstr "Neue Vorlage" @@ -3335,7 +3387,7 @@ msgstr "Es sind derzeit keine weiteren Maßnahmen Ihrerseits erforderlich." msgid "No payment required" msgstr "Keine Zahlung erforderlich" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:125 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:120 msgid "No public profile templates found" msgstr "Keine Vorlagen für das öffentliche Profil gefunden" @@ -3343,12 +3395,12 @@ msgstr "Keine Vorlagen für das öffentliche Profil gefunden" msgid "No recent activity" msgstr "Keine aktuellen Aktivitäten" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:101 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:99 msgid "No recent documents" msgstr "Keine aktuellen Dokumente" #: packages/ui/primitives/document-flow/add-fields.tsx:705 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:520 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:598 msgid "No recipient matching this description was found." msgstr "Kein passender Empfänger mit dieser Beschreibung gefunden." @@ -3360,7 +3412,7 @@ msgid "No recipients" msgstr "Keine Empfänger" #: packages/ui/primitives/document-flow/add-fields.tsx:720 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:535 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:613 msgid "No recipients with this role" msgstr "Keine Empfänger mit dieser Rolle" @@ -3387,11 +3439,11 @@ msgstr "Kein Unterschriftsfeld gefunden" msgid "No token provided" msgstr "Kein Token bereitgestellt" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:284 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:282 msgid "No valid direct templates found" msgstr "Keine gültigen direkten Vorlagen gefunden" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:293 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:288 msgid "No valid recipients found" msgstr "Keine gültigen Empfänger gefunden" @@ -3419,10 +3471,10 @@ msgstr "Nicht unterstützt" msgid "Nothing to do" msgstr "Nichts zu tun" -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:271 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:284 #: packages/ui/primitives/document-flow/add-fields.tsx:997 #: packages/ui/primitives/document-flow/types.ts:56 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:784 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:862 msgid "Number" msgstr "Nummer" @@ -3464,7 +3516,7 @@ msgstr "Auf dieser Seite können Sie neue Webhooks erstellen und die vorhandenen msgid "On this page, you can edit the webhook and its settings." msgstr "Auf dieser Seite können Sie den Webhook und seine Einstellungen bearbeiten." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:136 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:135 msgid "Once confirmed, the following will occur:" msgstr "Sobald dies bestätigt ist, wird Folgendes geschehen:" @@ -3504,7 +3556,7 @@ msgstr "Hoppla! Etwas ist schief gelaufen." msgid "Opened" msgstr "Geöffnet" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:337 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:332 #: apps/web/src/components/forms/signup.tsx:239 #: apps/web/src/components/forms/signup.tsx:263 #: apps/web/src/components/forms/v2/signup.tsx:387 @@ -3515,12 +3567,12 @@ msgstr "Oder" msgid "Or continue with" msgstr "Oder fahren Sie fort mit" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:340 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:351 msgid "Otherwise, the document will be created as a draft." msgstr "Andernfalls wird das Dokument als Entwurf erstellt." #: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:86 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:103 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:104 #: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:81 #: apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx:84 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:107 @@ -3629,7 +3681,7 @@ msgid "Payment overdue" msgstr "Zahlung überfällig" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:131 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:207 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:205 #: apps/web/src/components/(teams)/tables/teams-member-page-data-table.tsx:82 #: apps/web/src/components/(teams)/tables/user-settings-teams-page-data-table.tsx:77 #: apps/web/src/components/document/document-read-only-fields.tsx:89 @@ -3680,11 +3732,11 @@ msgstr "Wählen Sie eine der folgenden Vereinbarungen aus und beginnen Sie das S #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:79 #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:84 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:60 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:67 msgid "Placeholder" msgstr "Platzhalter" -#: packages/email/template-components/template-document-invite.tsx:56 +#: packages/email/template-components/template-document-invite.tsx:55 msgid "Please {0} your document<0/>\"{documentName}\"" msgstr "Bitte {0} dein Dokument<0/>\"{documentName}\"" @@ -3724,7 +3776,7 @@ msgstr "Bitte bestätige deine E-Mail" msgid "Please confirm your email address" msgstr "Bitte bestätige deine E-Mail-Adresse" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:176 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:175 msgid "Please contact support if you would like to revert this action." msgstr "Bitte kontaktieren Sie den Support, wenn Sie diese Aktion rückgängig machen möchten." @@ -3741,19 +3793,19 @@ msgstr "Bitte geben Sie einen gültigen Namen ein." msgid "Please mark as viewed to complete" msgstr "Bitte als angesehen markieren, um abzuschließen" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:459 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:453 msgid "Please note that proceeding will remove direct linking recipient and turn it into a placeholder." msgstr "Bitte beachten Sie, dass das Fortfahren den direkten Linkempfänger entfernt und ihn in einen Platzhalter umwandelt." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:130 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:129 msgid "Please note that this action is <0>irreversible." msgstr "Bitte beachten Sie, dass diese Aktion <0>irreversibel ist." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:121 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:120 msgid "Please note that this action is <0>irreversible. Once confirmed, this document will be permanently deleted." msgstr "Bitte beachten Sie, dass diese Aktion <0>irreversibel ist. Nachdem dies bestätigt wurde, wird dieses Dokument dauerhaft gelöscht." -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:67 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:62 msgid "Please note that this action is irreversible. Once confirmed, your template will be permanently deleted." msgstr "Bitte beachten Sie, dass diese Aktion irreversibel ist. Sobald sie bestätigt wird, wird Ihre Vorlage dauerhaft gelöscht." @@ -3785,6 +3837,10 @@ msgstr "Bitte geben Sie ein Token von Ihrem Authentifizierer oder einen Backup-C msgid "Please review the document before signing." msgstr "Bitte überprüfen Sie das Dokument vor der Unterzeichnung." +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:503 +msgid "Please select a PDF file" +msgstr "Bitte wählen Sie eine PDF-Datei aus" + #: apps/web/src/components/forms/send-confirmation-email.tsx:64 msgid "Please try again and make sure you enter the correct email address." msgstr "Bitte versuchen Sie es erneut und stellen Sie sicher, dass Sie die korrekte E-Mail-Adresse eingeben." @@ -3793,7 +3849,7 @@ msgstr "Bitte versuchen Sie es erneut und stellen Sie sicher, dass Sie die korre msgid "Please try again later or login using your normal details" msgstr "Bitte versuchen Sie es später erneut oder melden Sie sich mit Ihren normalen Daten an" -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:80 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:79 msgid "Please try again later." msgstr "Bitte versuchen Sie es später noch einmal." @@ -3802,7 +3858,7 @@ msgstr "Bitte versuchen Sie es später noch einmal." msgid "Please try again or contact our support." msgstr "Bitte versuchen Sie es erneut oder kontaktieren Sie unseren Support." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:186 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:185 msgid "Please type {0} to confirm" msgstr "Bitte {0} eingeben, um zu bestätigen" @@ -3810,6 +3866,10 @@ msgstr "Bitte {0} eingeben, um zu bestätigen" msgid "Please type <0>{0} to confirm." msgstr "Bitte geben Sie <0>{0} ein, um zu bestätigen." +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:172 +msgid "Pre-formatted CSV template with example data." +msgstr "" + #: apps/web/src/components/(dashboard)/common/command-menu.tsx:214 #: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:58 #: apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx:67 @@ -3840,16 +3900,16 @@ msgstr "Private Vorlagen können nur von Ihnen bearbeitet und angezeigt werden." msgid "Profile" msgstr "Profil" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:184 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:183 msgid "Profile is currently <0>hidden." msgstr "Profil ist derzeit <0>versteckt." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:172 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:171 msgid "Profile is currently <0>visible." msgstr "Profil ist derzeit <0>sichtbar." #: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:74 -#: apps/web/src/components/forms/profile.tsx:72 +#: apps/web/src/components/forms/profile.tsx:71 msgid "Profile updated" msgstr "Profil aktualisiert" @@ -3888,9 +3948,9 @@ msgstr "Radio-Werte" #: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:186 #: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:147 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:156 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:177 #: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:122 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:133 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:161 msgid "Read only" msgstr "Nur lesen" @@ -3906,7 +3966,7 @@ msgstr "Lesen Sie die vollständige <0>Offenlegung der Unterschrift." msgid "Ready" msgstr "Bereit" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:289 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:291 msgid "Reason" msgstr "Grund" @@ -3935,21 +3995,21 @@ msgstr "Erhält Kopie" msgid "Recent activity" msgstr "Aktuelle Aktivitäten" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:45 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:43 msgid "Recent documents" msgstr "Neueste Dokumente" #: apps/web/src/app/(dashboard)/documents/data-table.tsx:63 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:116 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:280 -#: packages/lib/utils/document-audit-logs.ts:338 -#: packages/lib/utils/document-audit-logs.ts:353 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:114 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:275 +#: packages/lib/utils/document-audit-logs.ts:354 +#: packages/lib/utils/document-audit-logs.ts:369 msgid "Recipient" msgstr "Empfänger" #: packages/ui/components/recipient/recipient-action-auth-select.tsx:39 #: packages/ui/primitives/document-flow/add-settings.tsx:269 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:291 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:337 msgid "Recipient action authentication" msgstr "Empfängeraktion Authentifizierung" @@ -3972,7 +4032,7 @@ msgstr "Empfänger aktualisiert" #: apps/web/src/app/(dashboard)/admin/documents/[id]/page.tsx:66 #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:49 #: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recipients.tsx:30 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:139 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:140 msgid "Recipients" msgstr "Empfänger" @@ -3980,7 +4040,7 @@ msgstr "Empfänger" msgid "Recipients metrics" msgstr "Empfängermetriken" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:166 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:165 msgid "Recipients will still retain their copy of the document" msgstr "Empfänger behalten weiterhin ihre Kopie des Dokuments" @@ -3997,7 +4057,7 @@ msgid "Red" msgstr "Rot" #: packages/ui/primitives/document-flow/add-settings.tsx:383 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:461 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:507 msgid "Redirect URL" msgstr "Weiterleitungs-URL" @@ -4010,7 +4070,7 @@ msgstr "Registrierung erfolgreich" #: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:109 #: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:116 #: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:162 -#: packages/email/template-components/template-document-invite.tsx:96 +#: packages/email/template-components/template-document-invite.tsx:95 msgid "Reject Document" msgstr "Dokument Ablehnen" @@ -4047,17 +4107,18 @@ msgstr "Erinnerung: Bitte {recipientActionVerb} dieses Dokument" msgid "Reminder: Please {recipientActionVerb} your document" msgstr "Erinnerung: Bitte {recipientActionVerb} dein Dokument" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:193 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:431 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:188 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:425 #: apps/web/src/app/(signing)/sign/[token]/signing-field-container.tsx:156 #: apps/web/src/app/(signing)/sign/[token]/signing-field-container.tsx:180 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:250 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx:89 #: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:159 #: apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx:54 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:164 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:163 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:165 #: apps/web/src/components/forms/avatar-image.tsx:166 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:217 #: packages/ui/primitives/document-flow/add-fields.tsx:1128 msgid "Remove" msgstr "Entfernen" @@ -4085,9 +4146,9 @@ msgstr "Übertragung anfordern" #: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:176 #: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:137 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:146 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:167 #: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:112 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:123 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:151 msgid "Required field" msgstr "Pflichtfeld" @@ -4096,7 +4157,7 @@ msgid "Reseal document" msgstr "Dokument wieder versiegeln" #: apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx:118 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:152 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:151 #: packages/ui/primitives/document-flow/add-subject.tsx:84 msgid "Resend" msgstr "Erneut senden" @@ -4177,11 +4238,11 @@ msgstr "Zugriff widerrufen" msgid "Revoke access" msgstr "Zugriff widerrufen" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:283 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:278 #: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:318 #: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:163 #: apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx:80 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:121 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:120 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:103 msgid "Role" msgstr "Rolle" @@ -4195,16 +4256,16 @@ msgstr "Rollen" msgid "Rows per page" msgstr "Zeilen pro Seite" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:446 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:337 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:344 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:440 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:350 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:361 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:312 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:305 -#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:356 +#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:322 msgid "Save" msgstr "Speichern" -#: packages/ui/primitives/template-flow/add-template-fields.tsx:896 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:974 msgid "Save Template" msgstr "Vorlage speichern" @@ -4219,7 +4280,7 @@ msgstr "Suchen" msgid "Search by document title" msgstr "Nach Dokumenttitel suchen" -#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:147 +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:174 #: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:144 msgid "Search by name or email" msgstr "Nach Name oder E-Mail suchen" @@ -4266,11 +4327,11 @@ msgstr "Wählen Sie ein Team aus, um dieses Dokument dorthin zu verschieben. Die msgid "Select a team to move this template to. This action cannot be undone." msgstr "Wählen Sie ein Team aus, um diese Vorlage dorthin zu verschieben. Diese Aktion kann nicht rückgängig gemacht werden." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:261 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:259 msgid "Select a template you'd like to display on your public profile" msgstr "Wählen Sie eine Vorlage aus, die Sie in Ihrem öffentlichen Profil anzeigen möchten" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:257 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:255 msgid "Select a template you'd like to display on your team's public profile" msgstr "Wählen Sie eine Vorlage aus, die Sie im öffentlichen Profil Ihres Teams anzeigen möchten" @@ -4301,7 +4362,7 @@ msgstr "Senden" msgid "Send confirmation email" msgstr "Bestätigungs-E-Mail senden" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:325 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:336 msgid "Send document" msgstr "Dokument senden" @@ -4329,6 +4390,10 @@ msgstr "E-Mail über ausstehende Dokumente senden" msgid "Send documents on behalf of the team using the email address" msgstr "Dokumente im Namen des Teams über die E-Mail-Adresse senden" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:253 +msgid "Send documents to recipients immediately" +msgstr "" + #: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:200 msgid "Send on Behalf of Team" msgstr "Im Namen des Teams senden" @@ -4362,7 +4427,7 @@ msgid "Sending..." msgstr "Senden..." #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:101 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:256 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:258 msgid "Sent" msgstr "Gesendet" @@ -4381,8 +4446,8 @@ msgstr "Einstellungen" msgid "Setup" msgstr "Einrichten" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:148 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:193 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:154 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:187 msgid "Share" msgstr "Teilen" @@ -4390,8 +4455,8 @@ msgstr "Teilen" msgid "Share Signature Card" msgstr "Unterschriftenkarte teilen" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:179 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:219 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:185 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:213 msgid "Share Signing Card" msgstr "Signaturkarte teilen" @@ -4403,7 +4468,7 @@ msgstr "Link teilen" msgid "Share your signing experience!" msgstr "Teilen Sie Ihre Unterzeichnungserfahrung!" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:163 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:162 msgid "Show" msgstr "Anzeigen" @@ -4424,13 +4489,13 @@ msgstr "Vorlagen in Ihrem öffentlichen Profil anzeigen, damit Ihre Zielgruppe u msgid "Show templates in your team public profile for your audience to sign and get started quickly" msgstr "Vorlagen in Ihrem Team-Öffentliches Profil anzeigen, damit Ihre Zielgruppe unterschreiben und schnell loslegen kann" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:83 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:114 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:139 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:89 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:115 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:133 #: apps/web/src/app/(profile)/p/[url]/page.tsx:192 #: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:229 #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:182 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:224 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:241 #: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:142 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:328 #: apps/web/src/components/ui/user-profile-skeleton.tsx:75 @@ -4443,7 +4508,7 @@ msgstr "Unterschreiben" msgid "Sign as {0} <0>({1})" msgstr "Unterzeichnen als {0} <0>({1})" -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:183 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:200 msgid "Sign as<0>{0} <1>({1})" msgstr "Unterzeichnen als<0>{0} <1>({1})" @@ -4453,7 +4518,7 @@ msgid "Sign document" msgstr "Dokument unterschreiben" #: apps/web/src/app/(signing)/sign/[token]/form.tsx:141 -#: packages/email/template-components/template-document-invite.tsx:104 +#: packages/email/template-components/template-document-invite.tsx:103 msgid "Sign Document" msgstr "Dokument signieren" @@ -4506,22 +4571,22 @@ msgid "Sign Up with OIDC" msgstr "Registrieren mit OIDC" #: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:88 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:177 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:179 #: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:342 #: apps/web/src/app/(signing)/sign/[token]/form.tsx:205 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:251 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:286 #: apps/web/src/app/embed/direct/[[...url]]/client.tsx:422 #: apps/web/src/app/embed/sign/[[...url]]/client.tsx:301 -#: apps/web/src/components/forms/profile.tsx:132 +#: apps/web/src/components/forms/profile.tsx:123 #: packages/ui/primitives/document-flow/add-fields.tsx:841 #: packages/ui/primitives/document-flow/field-icon.tsx:52 #: packages/ui/primitives/document-flow/types.ts:49 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:628 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:706 msgid "Signature" msgstr "Unterschrift" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:228 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:230 msgid "Signature ID" msgstr "Signatur-ID" @@ -4541,7 +4606,7 @@ msgid "Signatures will appear once the document has been completed" msgstr "Unterschriften erscheinen, sobald das Dokument abgeschlossen ist" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:114 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:278 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:280 #: apps/web/src/components/document/document-read-only-fields.tsx:84 #: packages/lib/constants/recipient-roles.ts:23 msgid "Signed" @@ -4551,7 +4616,7 @@ msgstr "Unterzeichnet" msgid "Signer" msgstr "Unterzeichner" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:176 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:178 msgid "Signer Events" msgstr "Signer-Ereignisse" @@ -4567,11 +4632,11 @@ msgstr "Unterzeichner müssen eindeutige E-Mails haben" msgid "Signing" msgstr "Unterzeichnung" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:168 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:170 msgid "Signing Certificate" msgstr "Unterzeichnungszertifikat" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:311 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:313 msgid "Signing certificate provided by" msgstr "Unterzeichnungszertifikat bereitgestellt von" @@ -4585,12 +4650,12 @@ msgstr "Unterzeichnung abgeschlossen!" msgid "Signing in..." msgstr "Anmeldung..." -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:160 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:203 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:166 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:197 msgid "Signing Links" msgstr "Signierlinks" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:339 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:315 msgid "Signing links have been generated for this document." msgstr "Unterzeichnungslinks wurden für dieses Dokument erstellt." @@ -4598,7 +4663,7 @@ msgstr "Unterzeichnungslinks wurden für dieses Dokument erstellt." msgid "Signing up..." msgstr "Registrierung..." -#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:82 +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:90 #: apps/web/src/app/(dashboard)/admin/leaderboard/page.tsx:46 msgid "Signing Volume" msgstr "Unterzeichnungsvolumen" @@ -4611,7 +4676,7 @@ msgstr "Registrierungen sind deaktiviert." msgid "Since {0}" msgstr "Seit {0}" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:102 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:93 msgid "Site Banner" msgstr "Website Banner" @@ -4625,27 +4690,27 @@ msgid "Some signers have not been assigned a signature field. Please assign at l msgstr "Einige Unterzeichner haben noch kein Unterschriftsfeld zugewiesen bekommen. Bitte weisen Sie jedem Unterzeichner mindestens ein Unterschriftsfeld zu, bevor Sie fortfahren." #: apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx:105 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:63 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:91 -#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:65 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:69 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:97 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:61 #: apps/web/src/app/(dashboard)/documents/[id]/logs/download-certificate-button.tsx:68 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:75 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:106 -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:82 -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:72 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:76 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:100 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:81 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:71 #: apps/web/src/app/(dashboard)/settings/billing/billing-plans.tsx:62 #: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:51 -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:124 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:123 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:73 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:93 #: apps/web/src/app/(dashboard)/settings/teams/accept-team-invitation-button.tsx:32 #: apps/web/src/app/(dashboard)/settings/teams/decline-team-invitation-button.tsx:32 #: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:44 -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:50 -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:79 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:104 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:127 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:151 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:45 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:78 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:100 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:123 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:147 #: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:118 #: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:27 #: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:38 @@ -4661,8 +4726,8 @@ msgstr "Einige Unterzeichner haben noch kein Unterschriftsfeld zugewiesen bekomm #: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:64 #: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:83 #: apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx:33 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:66 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:83 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:65 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:82 #: apps/web/src/components/(teams)/team-billing-portal-button.tsx:29 #: packages/ui/components/document/document-share-button.tsx:51 msgid "Something went wrong" @@ -4701,12 +4766,16 @@ msgstr "Etwas ist schiefgelaufen!" msgid "Something went wrong." msgstr "Etwas ist schief gelaufen." +#: apps/web/src/components/forms/token.tsx:143 +msgid "Something went wrong. Please try again later." +msgstr "Etwas ist schiefgelaufen. Bitte versuchen Sie es später noch einmal." + #: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:240 #: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:154 msgid "Something went wrong. Please try again or contact support." msgstr "Etwas ist schiefgelaufen. Bitte versuchen Sie es erneut oder kontaktieren Sie den Support." -#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:67 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:63 msgid "Sorry, we were unable to download the audit logs. Please try again later." msgstr "Entschuldigung, wir konnten die Prüfprotokolle nicht herunterladen. Bitte versuchen Sie es später erneut." @@ -4714,7 +4783,7 @@ msgstr "Entschuldigung, wir konnten die Prüfprotokolle nicht herunterladen. Bit msgid "Sorry, we were unable to download the certificate. Please try again later." msgstr "Entschuldigung, wir konnten das Zertifikat nicht herunterladen. Bitte versuchen Sie es später erneut." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:134 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:132 msgid "Source" msgstr "Quelle" @@ -4725,8 +4794,8 @@ msgstr "Statistiken" #: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:81 #: apps/web/src/app/(dashboard)/admin/subscriptions/page.tsx:32 #: apps/web/src/app/(dashboard)/documents/data-table.tsx:73 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:126 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:93 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:124 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:94 #: apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx:73 msgid "Status" msgstr "Status" @@ -4736,7 +4805,7 @@ msgid "Step <0>{step} of {maxStep}" msgstr "Schritt <0>{step} von {maxStep}" #: packages/ui/primitives/document-flow/add-subject.tsx:143 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:318 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:364 msgid "Subject <0>(Optional)" msgstr "Betreff <0>(Optional)" @@ -4762,8 +4831,8 @@ msgstr "Abonnements" #: apps/web/src/app/(dashboard)/settings/teams/accept-team-invitation-button.tsx:25 #: apps/web/src/app/(dashboard)/settings/teams/decline-team-invitation-button.tsx:25 #: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:37 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:118 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:141 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:114 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:137 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx:32 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:44 #: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:44 @@ -4780,11 +4849,12 @@ msgstr "Abonnements" #: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:92 #: apps/web/src/components/(teams)/forms/update-team-form.tsx:67 #: apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx:27 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:60 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:77 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:59 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:76 #: apps/web/src/components/forms/public-profile-form.tsx:80 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:133 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:170 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:132 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:168 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:95 msgid "Success" msgstr "Erfolg" @@ -4792,6 +4862,14 @@ msgstr "Erfolg" msgid "Successfully created passkey" msgstr "Passkey erfolgreich erstellt" +#: packages/email/templates/bulk-send-complete.tsx:52 +msgid "Successfully created: {successCount}" +msgstr "" + +#: packages/email/templates/bulk-send-complete.tsx:44 +msgid "Summary:" +msgstr "" + #: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:57 msgid "System Requirements" msgstr "Systemanforderungen" @@ -4863,7 +4941,7 @@ msgstr "Teameinladung" msgid "Team invitations have been sent." msgstr "Teameinladungen wurden gesendet." -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:107 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:106 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:84 msgid "Team Member" msgstr "Teammitglied" @@ -4940,31 +5018,31 @@ msgstr "Teams beschränkt" #: apps/web/src/app/(dashboard)/templates/[id]/edit/template-edit-page-view.tsx:64 #: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:39 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:144 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:224 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:148 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:142 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:222 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:151 #: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:408 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:271 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:269 msgid "Template" msgstr "Vorlage" -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:41 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:36 msgid "Template deleted" msgstr "Vorlage gelöscht" -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:67 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:66 msgid "Template document uploaded" msgstr "Vorlagendokument hochgeladen" -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:42 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:41 msgid "Template duplicated" msgstr "Vorlage dupliziert" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:134 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:133 msgid "Template has been removed from your public profile." msgstr "Vorlage ist von Deinem öffentlichen Profil entfernt worden." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:171 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:169 msgid "Template has been updated." msgstr "Vorlage wurde aktualisiert." @@ -4976,15 +5054,15 @@ msgstr "Vorlage verschoben" msgid "Template not found or already associated with a team." msgstr "Vorlage nicht gefunden oder bereits mit einem Team verknüpft." -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:246 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:216 msgid "Template saved" msgstr "Vorlage gespeichert" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:145 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:167 msgid "Template title" msgstr "Vorlagentitel" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:86 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:87 #: apps/web/src/app/(dashboard)/templates/templates-page-view.tsx:55 #: apps/web/src/components/(dashboard)/common/command-menu.tsx:208 #: apps/web/src/components/(dashboard)/layout/desktop-nav.tsx:22 @@ -4992,19 +5070,28 @@ msgstr "Vorlagentitel" msgid "Templates" msgstr "Vorlagen" -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:106 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:105 msgid "Templates allow you to quickly generate documents with pre-filled recipients and fields." msgstr "Vorlagen erlauben dir das schnelle Erstlelen von Dokumenten mit vorausgefüllten Empfängern und Feldern." -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:257 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:274 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:258 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:287 #: packages/ui/primitives/document-flow/add-fields.tsx:971 #: packages/ui/primitives/document-flow/types.ts:52 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:758 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:836 msgid "Text" msgstr "Text" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:166 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:79 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:61 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:56 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:61 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:140 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:124 +msgid "Text Align" +msgstr "" + +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:157 msgid "Text Color" msgstr "Textfarbe" @@ -5016,7 +5103,7 @@ msgstr "Vielen Dank, dass Sie Documenso zur elektronischen Unterzeichnung Ihrer msgid "That's okay, it happens! Click the button below to reset your password." msgstr "Das ist in Ordnung, das passiert! Klicke auf den Button unten, um dein Passwort zurückzusetzen." -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:51 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:52 msgid "The account has been deleted successfully." msgstr "Das Konto wurde erfolgreich gelöscht." @@ -5040,13 +5127,13 @@ msgstr "Die Authentifizierung, die erforderlich ist, damit Empfänger das Signat msgid "The authentication required for recipients to view the document." msgstr "Die Authentifizierung, die erforderlich ist, damit Empfänger das Dokument anzeigen können." -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:197 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:188 msgid "The content to show in the banner, HTML is allowed" msgstr "Der Inhalt, der im Banne rgezeig wird, HTML ist erlaubt" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:78 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:73 #: apps/web/src/app/(dashboard)/templates/template-direct-link-badge.tsx:32 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:164 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:160 msgid "The direct link has been copied to your clipboard" msgstr "Der direkte Linkt wurde in die Zwischenablage kopiert" @@ -5066,15 +5153,15 @@ msgstr "Der Dokumenteninhaber wurde über diese Ablehnung informiert. Es sind de msgid "The document owner has been notified of your decision. They may contact you with further instructions if necessary." msgstr "Der Dokumenteneigentümer wurde über Ihre Entscheidung informiert. Er kann Sie bei Bedarf mit weiteren Anweisungen kontaktieren." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:182 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:194 msgid "The document was created but could not be sent to recipients." msgstr "Das Dokument wurde erstellt, konnte aber nicht an die Empfänger versendet werden." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:163 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:162 msgid "The document will be hidden from your account" msgstr "Das Dokument wird von Ihrem Konto verborgen werden" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:333 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:344 msgid "The document will be immediately sent to recipients if this is checked." msgstr "Das Dokument wird sofort an die Empfänger gesendet, wenn dies angehakt ist." @@ -5088,6 +5175,10 @@ msgstr "Der Name des Dokuments" msgid "The events that will trigger a webhook to be sent to your URL." msgstr "Die Ereignisse, die einen Webhook auslösen, der an Ihre URL gesendet wird." +#: packages/email/templates/bulk-send-complete.tsx:62 +msgid "The following errors occurred:" +msgstr "" + #: packages/email/templates/team-delete.tsx:37 msgid "The following team has been deleted by its owner. You will no longer be able to access this team and its documents" msgstr "Das folgende Team wurde von seinem Besitzer gelöscht. Du kannst nicht mehr auf dieses Team und seine Dokumente zugreifen" @@ -5116,11 +5207,11 @@ msgstr "Der Profil-Link wurde in die Zwischenablage kopiert" msgid "The profile you are looking for could not be found." msgstr "Das Profil, nach dem Sie suchen, konnte nicht gefunden werden." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:380 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:378 msgid "The public description that will be displayed with this template" msgstr "Die öffentliche Beschreibung, die mit dieser Vorlage angezeigt wird" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:358 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:356 msgid "The public name for your template" msgstr "Der öffentliche Name für Ihre Vorlage" @@ -5175,7 +5266,7 @@ msgstr "Der Name des Unterzeichners" msgid "The signing link has been copied to your clipboard." msgstr "Der Signierlink wurde in die Zwischenablage kopiert." -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:105 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:96 msgid "The site banner is a message that is shown at the top of the site. It can be used to display important information to your users." msgstr "Das Seitenbanner ist eine Nachricht, die oben auf der Seite angezeigt wird. Es kann verwendet werden, um Ihren Nutzern wichtige Informationen anzuzeigen." @@ -5199,7 +5290,7 @@ msgstr "Das Team, das Sie suchen, wurde möglicherweise entfernt, umbenannt oder msgid "The template has been successfully moved to the selected team." msgstr "Die Vorlage wurde erfolgreich in das ausgewählte Team verschoben." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:443 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:441 msgid "The template will be removed from your profile" msgstr "Die Vorlage wird von Ihrem Profil entfernt" @@ -5207,7 +5298,7 @@ msgstr "Die Vorlage wird von Ihrem Profil entfernt" msgid "The template you are looking for may have been disabled, deleted or may have never existed." msgstr "Die Vorlage, die Sie suchen, wurde möglicherweise deaktiviert, gelöscht oder hat möglicherweise nie existiert." -#: apps/web/src/components/forms/token.tsx:106 +#: apps/web/src/components/forms/token.tsx:107 msgid "The token was copied to your clipboard." msgstr "Der Token wurde in die Zwischenablage kopiert." @@ -5250,8 +5341,8 @@ msgstr "Es gibt noch keine abgeschlossenen Dokumente. Dokumente, die Sie erstell msgid "They have permission on your behalf to:" msgstr "Sie haben in Ihrem Namen die Erlaubnis, zu:" -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:110 -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:109 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:100 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:106 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:98 msgid "This action is not reversible. Please be certain." msgstr "Diese Aktion ist nicht umkehrbar. Bitte seien Sie sicher." @@ -5268,11 +5359,11 @@ msgstr "Dies kann überschrieben werden, indem die Authentifizierungsanforderung msgid "This document can not be recovered, if you would like to dispute the reason for future documents please contact support." msgstr "Dieses Dokument kann nicht wiederhergestellt werden. Wenn du den Grund für zukünftige Dokumente anfechten möchtest, kontaktiere bitte den Support." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:83 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:82 msgid "This document could not be deleted at this time. Please try again." msgstr "Dieses Dokument konnte derzeit nicht gelöscht werden. Bitte versuchen Sie es erneut." -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:73 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:72 msgid "This document could not be duplicated at this time. Please try again." msgstr "Dieses Dokument konnte derzeit nicht dupliziert werden. Bitte versuche es erneut." @@ -5292,11 +5383,11 @@ 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/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:227 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:228 msgid "This document has been signed by all recipients" msgstr "Dieses Dokument wurde von allen Empfängern unterschrieben" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:230 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:231 msgid "This document is currently a draft and has not been sent" msgstr "Dieses Dokument ist momentan ein Entwurf und wurde nicht gesendet" @@ -5304,11 +5395,11 @@ msgstr "Dieses Dokument ist momentan ein Entwurf und wurde nicht gesendet" msgid "This document is password protected. Please enter the password to view the document." msgstr "Dieses Dokument ist durch ein Passwort geschützt. Bitte geben Sie das Passwort ein, um das Dokument anzusehen." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:148 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:146 msgid "This document was created by you or a team member using the template above." msgstr "Dieses Dokument wurde von Ihnen oder einem Teammitglied unter Verwendung der oben genannten Vorlage erstellt." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:160 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:158 msgid "This document was created using a direct link." msgstr "Dieses Dokument wurde mit einem direkten Link erstellt." @@ -5344,7 +5435,7 @@ msgstr "Diese E-Mail wird an den Empfänger gesendet, der das Dokument gerade un msgid "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them." msgstr "Dieses Feld kann nicht geändert oder gelöscht werden. Wenn Sie den direkten Link dieser Vorlage teilen oder zu Ihrem öffentlichen Profil hinzufügen, kann jeder, der darauf zugreift, seinen Namen und seine E-Mail-Adresse eingeben und die ihm zugewiesenen Felder ausfüllen." -#: packages/ui/primitives/template-flow/add-template-settings.tsx:233 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:279 msgid "This is how the document will reach the recipients once the document is ready for signing." msgstr "So wird das Dokument die Empfänger erreichen, sobald es zum Unterschreiben bereit ist." @@ -5384,7 +5475,7 @@ msgstr "Dieser Unterzeichner hat das Dokument bereits unterschrieben." msgid "This team, and any associated data excluding billing invoices will be permanently deleted." msgstr "Dieses Team und alle zugehörigen Daten, ausgenommen Rechnungen, werden permanent gelöscht." -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:51 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:46 msgid "This template could not be deleted at this time. Please try again." msgstr "Diese Vorlage konnte derzeit nicht gelöscht werden. Bitte versuchen Sie es erneut." @@ -5425,7 +5516,7 @@ msgstr "Dies wird an den Dokumenteneigentümer gesendet, sobald das Dokument vol msgid "This will override any global settings." msgstr "Dies überschreibt alle globalen Einstellungen." -#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:71 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:70 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:44 msgid "Time" msgstr "Zeit" @@ -5434,15 +5525,15 @@ msgstr "Zeit" msgid "Time zone" msgstr "Zeitzone" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:131 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:132 #: packages/ui/primitives/document-flow/add-settings.tsx:359 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:438 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:484 msgid "Time Zone" msgstr "Zeitzone" #: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:67 #: apps/web/src/app/(dashboard)/documents/data-table.tsx:54 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:111 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:109 #: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:61 #: packages/ui/primitives/document-flow/add-settings.tsx:166 msgid "Title" @@ -5456,13 +5547,13 @@ msgstr "Um diese Einladung anzunehmen, müssen Sie ein Konto erstellen." msgid "To change the email you must remove and add a new email address." msgstr "Um die E-Mail zu ändern, müssen Sie die aktuelle entfernen und eine neue hinzufügen." -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:116 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:113 #: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:111 #: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:101 msgid "To confirm, please enter the accounts email address <0/>({0})." msgstr "Um zu bestätigen, geben Sie bitte die E-Mail-Adresse des Kontos <0/>({0}) ein." -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:117 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:107 msgid "To confirm, please enter the reason" msgstr "Um zu bestätigen, geben Sie bitte den Grund ein" @@ -5483,7 +5574,7 @@ msgid "To mark this document as viewed, you need to be logged in as <0>{0}" msgstr "Um dieses Dokument als angesehen zu markieren, müssen Sie als <0>{0} angemeldet sein" #: packages/ui/primitives/document-flow/add-fields.tsx:1091 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:876 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:954 msgid "To proceed further, please set at least one value for the {0} field." msgstr "Um fortzufahren, legen Sie bitte mindestens einen Wert für das Feld {0} fest." @@ -5495,11 +5586,11 @@ msgstr "Um unseren elektronischen Signaturdienst nutzen zu können, müssen Sie msgid "To view this document you need to be signed into your account, please sign in to continue." msgstr "Um dieses Dokument anzusehen, müssen Sie in Ihr Konto eingeloggt sein. Bitte melden Sie sich an, um fortzufahren." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:178 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:177 msgid "Toggle the switch to hide your profile from the public." msgstr "Schalten Sie den Schalter um, um Ihr Profil vor der Öffentlichkeit zu verbergen." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:190 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:189 msgid "Toggle the switch to show your profile to the public." msgstr "Schalten Sie den Schalter um, um Ihr Profil der Öffentlichkeit anzuzeigen." @@ -5507,11 +5598,11 @@ msgstr "Schalten Sie den Schalter um, um Ihr Profil der Öffentlichkeit anzuzeig msgid "Token" msgstr "Token" -#: apps/web/src/components/forms/token.tsx:105 +#: apps/web/src/components/forms/token.tsx:106 msgid "Token copied to clipboard" msgstr "Token wurde in die Zwischenablage kopiert" -#: apps/web/src/components/forms/token.tsx:126 +#: apps/web/src/components/forms/token.tsx:127 msgid "Token created" msgstr "Token erstellt" @@ -5544,6 +5635,10 @@ msgstr "Gesamtdokumente" msgid "Total Recipients" msgstr "Gesamtempfänger" +#: packages/email/templates/bulk-send-complete.tsx:49 +msgid "Total rows processed: {totalProcessed}" +msgstr "" + #: apps/web/src/app/(dashboard)/admin/stats/page.tsx:150 msgid "Total Signers that Signed Up" msgstr "Gesamtanzahl der Unterzeichner, die sich angemeldet haben" @@ -5629,11 +5724,11 @@ msgstr "Zurzeit kann die Sprache nicht geändert werden. Bitte versuchen Sie es msgid "Unable to copy recovery code" msgstr "Kann Code zur Wiederherstellung nicht kopieren" -#: apps/web/src/components/forms/token.tsx:110 +#: apps/web/src/components/forms/token.tsx:111 msgid "Unable to copy token" msgstr "Token kann nicht kopiert werden" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:105 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:101 msgid "Unable to create direct template access. Please try again later." msgstr "Direkter Zugriff auf die Vorlage kann nicht erstellt werden. Bitte versuche es später noch einmal." @@ -5641,7 +5736,7 @@ msgstr "Direkter Zugriff auf die Vorlage kann nicht erstellt werden. Bitte versu msgid "Unable to decline this team invitation at this time." msgstr "Zurzeit kann diese Teameinladung nicht abgelehnt werden." -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:84 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:83 msgid "Unable to delete invitation. Please try again." msgstr "Einladung kann nicht gelöscht werden. Bitte versuchen Sie es erneut." @@ -5662,11 +5757,11 @@ msgstr "Zurzeit kann diesem Team nicht beigetreten werden." msgid "Unable to load document history" msgstr "Kann den Dokumentverlauf nicht laden" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:60 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:58 msgid "Unable to load documents" msgstr "Dokumente können nicht geladen werden" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:111 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:106 msgid "Unable to load your public profile templates at this time" msgstr "Derzeit können Ihre öffentlichen Profilvorlagen nicht geladen werden" @@ -5678,7 +5773,7 @@ msgstr "Derzeit ist es nicht möglich, die E-Mail-Verifizierung zu entfernen. Bi msgid "Unable to remove team email at this time. Please try again." msgstr "Das Team-E-Mail kann zurzeit nicht entfernt werden. Bitte versuchen Sie es erneut." -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:67 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:66 msgid "Unable to resend invitation. Please try again." msgstr "Einladung kann nicht erneut gesendet werden. Bitte versuchen Sie es erneut." @@ -5709,10 +5804,10 @@ msgstr "Nicht autorisiert" msgid "Uncompleted" msgstr "Unvollendet" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:237 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:262 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:273 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:284 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:239 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:264 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:275 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:286 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx:55 msgid "Unknown" msgstr "Unbekannt" @@ -5725,17 +5820,17 @@ msgstr "Unbekannter Fehler" msgid "Unpaid" msgstr "Unbezahlt" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:181 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:176 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:162 #: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:166 #: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:191 #: apps/web/src/components/forms/public-profile-form.tsx:279 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:428 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:426 #: packages/ui/primitives/document-flow/add-subject.tsx:86 msgid "Update" msgstr "Aktualisieren" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:211 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:202 msgid "Update Banner" msgstr "Banner aktualisieren" @@ -5747,7 +5842,7 @@ msgstr "Passkey aktualisieren" msgid "Update password" msgstr "Passwort aktualisieren" -#: apps/web/src/components/forms/profile.tsx:151 +#: apps/web/src/components/forms/profile.tsx:142 msgid "Update profile" msgstr "Profil aktualisieren" @@ -5790,7 +5885,7 @@ msgstr "Webhook aktualisieren" msgid "Updating password..." msgstr "Passwort wird aktualisiert..." -#: apps/web/src/components/forms/profile.tsx:151 +#: apps/web/src/components/forms/profile.tsx:142 msgid "Updating profile..." msgstr "Profil wird aktualisiert..." @@ -5802,10 +5897,30 @@ msgstr "Aktualisierung Ihrer Informationen" msgid "Upgrade" msgstr "Upgrade" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:132 +msgid "Upload a CSV file to create multiple documents from this template. Each row represents one document with its recipient details." +msgstr "" + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:426 +msgid "Upload a custom document to use instead of the template's default document" +msgstr "Laden Sie ein benutzerdefiniertes Dokument hoch, um es anstelle des Standarddokuments der Vorlage zu verwenden" + +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:267 +msgid "Upload and Process" +msgstr "" + #: apps/web/src/components/forms/avatar-image.tsx:179 msgid "Upload Avatar" msgstr "Avatar hochladen" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:198 +msgid "Upload CSV" +msgstr "" + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:419 +msgid "Upload custom document" +msgstr "Benutzerdefiniertes Dokument hochladen" + #: packages/ui/primitives/signature-pad/signature-pad.tsx:529 msgid "Upload Signature" msgstr "Signatur hochladen" @@ -5835,7 +5950,7 @@ msgstr "Die hochgeladene Datei ist zu klein" msgid "Uploaded file not an allowed file type" msgstr "Die hochgeladene Datei ist kein zulässiger Dateityp" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:172 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:175 msgid "Use" msgstr "Verwenden" @@ -5849,11 +5964,11 @@ msgstr "Authenticator verwenden" msgid "Use Backup Code" msgstr "Backup-Code verwenden" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:207 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:219 msgid "Use Template" msgstr "Vorlage verwenden" -#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:76 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:75 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:45 msgid "User" msgstr "Benutzer" @@ -5866,6 +5981,7 @@ msgstr "Benutzer hat kein Passwort." msgid "User ID" msgstr "Benutzer-ID" +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:61 #: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:55 #: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:55 msgid "User not found." @@ -5892,7 +6008,7 @@ msgid "Users" msgstr "Benutzer" #: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:132 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:167 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:188 msgid "Validation" msgstr "Validierung" @@ -5930,14 +6046,14 @@ msgstr "Überprüfen Sie Ihre E-Mail, um Dokumente hochzuladen." msgid "Verify your team email address" msgstr "Überprüfen Sie Ihre Team-E-Mail-Adresse" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:75 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:76 msgid "Version History" msgstr "Versionsverlauf" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:95 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:126 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:135 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:132 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:101 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:127 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:136 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:126 #: apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx:100 #: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:168 #: packages/lib/constants/recipient-roles.ts:29 @@ -5960,7 +6076,7 @@ msgstr "Alle Dokumente anzeigen, die an Ihr Konto gesendet wurden" msgid "View all recent security activity related to your account." msgstr "Sehen Sie sich alle aktuellen Sicherheitsaktivitäten in Ihrem Konto an." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:155 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:153 msgid "View all related documents" msgstr "Alle verwandten Dokumente anzeigen" @@ -5977,7 +6093,7 @@ msgid "View document" msgstr "Dokument anzeigen" #: apps/web/src/app/(signing)/sign/[token]/form.tsx:140 -#: packages/email/template-components/template-document-invite.tsx:105 +#: packages/email/template-components/template-document-invite.tsx:104 #: packages/email/template-components/template-document-rejected.tsx:44 #: packages/ui/primitives/document-flow/add-subject.tsx:90 #: packages/ui/primitives/document-flow/add-subject.tsx:91 @@ -5992,7 +6108,7 @@ msgstr "Dokumente ansehen, die mit dieser E-Mail verknüpft sind" msgid "View invites" msgstr "Einladungen ansehen" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:93 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:91 msgid "View more" msgstr "Mehr anzeigen" @@ -6014,7 +6130,7 @@ msgid "View teams" msgstr "Teams ansehen" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:120 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:267 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:269 #: packages/lib/constants/recipient-roles.ts:30 msgid "Viewed" msgstr "Betrachtet" @@ -6073,7 +6189,7 @@ msgstr "Wir können diesen Schlüssel im Moment nicht entfernen. Bitte versuchen msgid "We are unable to update this passkey at the moment. Please try again later." msgstr "Wir können diesen Schlüssel im Moment nicht aktualisieren. Bitte versuchen Sie es später erneut." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:153 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:149 msgid "We encountered an error while removing the direct template link. Please try again later." msgstr "Wir sind auf einen Fehler gestoßen, während wir den direkten Vorlagenlink entfernt haben. Bitte versuchen Sie es später erneut." @@ -6082,10 +6198,6 @@ msgstr "Wir sind auf einen Fehler gestoßen, während wir den direkten Vorlagenl msgid "We encountered an error while updating the webhook. Please try again later." msgstr "Wir sind auf einen Fehler gestoßen, während wir den Webhook aktualisieren wollten. Bitte versuchen Sie es später erneut." -#: apps/web/src/components/forms/token.tsx:145 -msgid "We encountered an unknown error while attempting create the new token. Please try again later." -msgstr "Wir sind auf einen unbekannten Fehler gestoßen, während wir versucht haben, das neue Token zu erstellen. Bitte versuchen Sie es später erneut." - #: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:102 msgid "We encountered an unknown error while attempting to add this email. Please try again later." msgstr "Wir sind auf einen unbekannten Fehler gestoßen, während wir versucht haben, diese E-Mail hinzuzufügen. Bitte versuchen Sie es später erneut." @@ -6110,7 +6222,6 @@ msgstr "Wir sind auf einen unbekannten Fehler gestoßen, während wir versucht h msgid "We encountered an unknown error while attempting to delete this token. Please try again later." msgstr "Wir sind auf einen unbekannten Fehler gestoßen, während wir versucht haben, dieses Token zu löschen. Bitte versuchen Sie es später erneut." -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:70 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:58 msgid "We encountered an unknown error while attempting to delete your account. Please try again later." msgstr "Wir sind auf einen unbekannten Fehler gestoßen, während wir versucht haben, Ihr Konto zu löschen. Bitte versuchen Sie es später erneut." @@ -6123,7 +6234,7 @@ msgstr "Wir sind auf einen unbekannten Fehler gestoßen, während wir versucht h msgid "We encountered an unknown error while attempting to leave this team. Please try again later." msgstr "Wir sind auf einen unbekannten Fehler gestoßen, während wir versucht haben, dieses Team zu verlassen. Bitte versuchen Sie es später erneut." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:143 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:142 msgid "We encountered an unknown error while attempting to remove this template from your profile. Please try again later." msgstr "Wir sind auf einen unbekannten Fehler gestoßen, während wir versucht haben, diese Vorlage aus Ihrem Profil zu entfernen. Bitte versuchen Sie es später erneut." @@ -6151,7 +6262,6 @@ msgstr "Wir sind auf einen unbekannten Fehler gestoßen, während wir versucht h msgid "We encountered an unknown error while attempting to save your details. Please try again later." msgstr "Wir sind auf einen unbekannten Fehler gestoßen, während wir versucht haben, Ihre Daten zu speichern. Bitte versuchen Sie es später erneut." -#: apps/web/src/components/forms/profile.tsx:89 #: apps/web/src/components/forms/signin.tsx:273 #: apps/web/src/components/forms/signin.tsx:288 #: apps/web/src/components/forms/signin.tsx:304 @@ -6165,11 +6275,11 @@ msgstr "Wir sind auf einen unbekannten Fehler gestoßen, während wir versucht h msgid "We encountered an unknown error while attempting to sign you Up. Please try again later." msgstr "Wir sind auf einen unbekannten Fehler gestoßen, während wir versucht haben, Sie anzumelden. Bitte versuchen Sie es später erneut." -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:92 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:84 msgid "We encountered an unknown error while attempting to update the banner. Please try again later." msgstr "Wir sind auf einen unbekannten Fehler gestoßen, während wir versucht haben, das Banner zu aktualisieren. Bitte versuchen Sie es später erneut." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:180 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:178 msgid "We encountered an unknown error while attempting to update the template. Please try again later." msgstr "Wir sind auf einen unbekannten Fehler gestoßen, während wir versucht haben, die Vorlage zu aktualisieren. Bitte versuchen Sie es später erneut." @@ -6194,6 +6304,10 @@ msgstr "Wir sind auf einen unbekannten Fehler gestoßen, während wir versucht h msgid "We encountered an unknown error while attempting update the team email. Please try again later." msgstr "Wir sind auf einen unbekannten Fehler gestoßen, während wir versucht haben, die Team-E-Mail zu aktualisieren. Bitte versuchen Sie es später erneut." +#: apps/web/src/components/forms/profile.tsx:81 +msgid "We encountered an unknown error while attempting update your profile. Please try again later." +msgstr "Wir haben einen unbekannten Fehler festgestellt, während wir versuchten, Ihr Profil zu aktualisieren. Bitte versuchen Sie es später noch einmal." + #: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:80 msgid "We have sent a confirmation email for verification." msgstr "Wir haben eine Bestätigungs-E-Mail zur Überprüfung gesendet." @@ -6206,7 +6320,7 @@ msgstr "Wir benötigen einen Benutzernamen, um Ihr Profil zu erstellen" msgid "We need your signature to sign documents" msgstr "Wir benötigen Ihre Unterschrift, um Dokumente zu unterschreiben" -#: apps/web/src/components/forms/token.tsx:111 +#: apps/web/src/components/forms/token.tsx:112 msgid "We were unable to copy the token to your clipboard. Please try again." msgstr "Wir konnten das Token nicht in Ihre Zwischenablage kopieren. Bitte versuchen Sie es erneut." @@ -6231,7 +6345,7 @@ msgstr "Wir konnten die Zwei-Faktor-Authentifizierung für Ihr Konto nicht deakt msgid "We were unable to log you out at this time." msgstr "Wir konnten Sie zurzeit nicht abmelden." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:125 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:124 msgid "We were unable to set your public profile to public. Please try again." msgstr "Wir konnten Ihr öffentliches Profil nicht auf öffentlich setzen. Bitte versuchen Sie es erneut." @@ -6266,11 +6380,11 @@ msgstr "Wir konnten Ihre E-Mail nicht bestätigen. Wenn Ihre E-Mail noch nicht b msgid "We will generate signing links for with you, which you can send to the recipients through your method of choice." msgstr "Wir generieren Signierlinks mit Ihnen, die Sie den Empfängern über Ihre bevorzugte Methode senden können." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:369 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:382 msgid "We will generate signing links for you, which you can send to the recipients through your method of choice." msgstr "Wir werden Unterzeichnungslinks für Sie erstellen, die Sie an die Empfänger über Ihre bevorzugte Methode senden können." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:365 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:378 #: packages/ui/primitives/document-flow/add-subject.tsx:201 msgid "We won't send anything to notify recipients." msgstr "Wir werden nichts senden, um die Empfänger zu benachrichtigen." @@ -6376,13 +6490,13 @@ msgstr "Schreiben Sie über sich selbst" msgid "Yearly" msgstr "Jährlich" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:32 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:31 -#: packages/lib/utils/document-audit-logs.ts:258 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:33 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:32 +#: packages/lib/utils/document-audit-logs.ts:274 msgid "You" msgstr "Du" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:105 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:104 msgid "You are about to delete <0>\"{documentTitle}\"" msgstr "Sie sind dabei, <0>\"{documentTitle}\" zu löschen" @@ -6390,7 +6504,7 @@ msgstr "Sie sind dabei, <0>\"{documentTitle}\" zu löschen" msgid "You are about to delete the following team email from <0>{teamName}." msgstr "Sie stehen kurz davor, die folgende Team-E-Mail von <0>{teamName} zu löschen." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:109 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:108 msgid "You are about to hide <0>\"{documentTitle}\"" msgstr "Sie sind dabei, <0>\"{documentTitle}\" zu verstecken" @@ -6426,6 +6540,10 @@ msgstr "Sie aktualisieren derzeit den <0>{passkeyName} Passkey." msgid "You are not a member of this team." msgstr "Sie sind kein Mitglied dieses Teams." +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:62 +msgid "You are not authorized to delete this user." +msgstr "Sie sind nicht berechtigt, diesen Benutzer zu löschen." + #: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:56 msgid "You are not authorized to disable this user." msgstr "Sie sind nicht berechtigt, diesen Benutzer zu deaktivieren." @@ -6474,6 +6592,10 @@ msgstr "Sie können die folgenden Variablen in Ihrer Nachricht verwenden:" msgid "You can view documents associated with this email and use this identity when sending documents." msgstr "Sie können Dokumente ansehen, die mit dieser E-Mail verknüpft sind, und diese Identität beim Senden von Dokumenten verwenden." +#: packages/email/templates/bulk-send-complete.tsx:76 +msgid "You can view the created documents in your dashboard under the \"Documents created from template\" section." +msgstr "" + #: packages/email/template-components/template-document-rejected.tsx:37 msgid "You can view the document and its status by clicking the button below." msgstr "Sie können das Dokument und seinen Status einsehen, indem Sie auf die Schaltfläche unten klicken." @@ -6490,7 +6612,7 @@ msgstr "Sie können ein Teammitglied, das eine höhere Rolle als Sie hat, nicht msgid "You cannot upload documents at this time." msgstr "Sie können derzeit keine Dokumente hochladen." -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:103 msgid "You cannot upload encrypted PDFs" msgstr "Sie können keine verschlüsselten PDFs hochladen" @@ -6498,6 +6620,10 @@ msgstr "Sie können keine verschlüsselten PDFs hochladen" msgid "You do not currently have a customer record, this should not happen. Please contact support for assistance." msgstr "Sie haben derzeit keinen Kundenrecord, das sollte nicht passieren. Bitte kontaktieren Sie den Support um Hilfe." +#: apps/web/src/components/forms/token.tsx:141 +msgid "You do not have permission to create a token for this team" +msgstr "Sie haben keine Berechtigung, ein Token für dieses Team zu erstellen" + #: packages/email/template-components/template-document-cancel.tsx:35 msgid "You don't need to sign it anymore." msgstr "Du musst es nicht mehr unterschreiben." @@ -6527,7 +6653,8 @@ msgstr "Du wurdest eingeladen, {0} auf Documenso beizutreten" msgid "You have been invited to join the following team" msgstr "Du wurdest eingeladen, dem folgenden Team beizutreten" -#: packages/lib/server-only/recipient/set-recipients-for-document.ts:337 +#: packages/lib/server-only/recipient/delete-document-recipient.ts:156 +#: packages/lib/server-only/recipient/set-document-recipients.ts:326 msgid "You have been removed from a document" msgstr "Du wurdest von einem Dokument entfernt" @@ -6557,10 +6684,14 @@ msgstr "Sie haben noch keine Vorlagen erstellt. Bitte laden Sie eine Datei hoch, msgid "You have not yet created or received any documents. To create a document please upload one." msgstr "Sie haben noch keine Dokumente erstellt oder erhalten. Bitte laden Sie ein Dokument hoch, um eines zu erstellen." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:234 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:229 msgid "You have reached the maximum limit of {0} direct templates. <0>Upgrade your account to continue!" msgstr "Sie haben das maximale Limit von {0} direkten Vorlagen erreicht. <0>Upgrade your account to continue!" +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106 +msgid "You have reached your document limit for this month. Please upgrade your plan." +msgstr "Sie haben Ihr Dokumentenlimit für diesen Monat erreicht. Bitte aktualisieren Sie Ihren Plan." + #: apps/web/src/app/(dashboard)/documents/upload-document.tsx:56 #: packages/ui/primitives/document-dropzone.tsx:69 msgid "You have reached your document limit." @@ -6626,7 +6757,7 @@ msgstr "Sie müssen '{deleteMessage}' eingeben, um fortzufahren" msgid "You must have at least one other team member to transfer ownership." msgstr "Sie müssen mindestens einen anderen Teamkollegen haben, um die Eigentumsübertragung durchzuführen." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:109 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:108 msgid "You must set a profile URL before enabling your public profile." msgstr "Sie müssen eine Profil-URL festlegen, bevor Sie Ihr öffentliches Profil aktivieren." @@ -6662,7 +6793,7 @@ msgstr "Ihr Konto wurde erfolgreich gelöscht." msgid "Your avatar has been updated successfully." msgstr "Ihr Avatar wurde erfolgreich aktualisiert." -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:75 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:74 msgid "Your banner has been updated successfully." msgstr "Ihr Banner wurde erfolgreich aktualisiert." @@ -6674,19 +6805,27 @@ msgstr "Ihre Marken-Website-URL" msgid "Your branding preferences have been updated" msgstr "Ihre Markenpräferenzen wurden aktualisiert" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:97 +msgid "Your bulk send has been initiated. You will receive an email notification upon completion." +msgstr "" + +#: packages/email/templates/bulk-send-complete.tsx:40 +msgid "Your bulk send operation for template \"{templateName}\" has completed." +msgstr "" + #: apps/web/src/app/(dashboard)/settings/billing/page.tsx:125 msgid "Your current plan is past due. Please update your payment information." msgstr "Ihr aktueller Plan ist überfällig. Bitte aktualisieren Sie Ihre Zahlungsinformationen." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:251 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:249 msgid "Your direct signing templates" msgstr "Ihre direkten Unterzeichnungsvorlagen" -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:129 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:123 msgid "Your document failed to upload." msgstr "Ihr Dokument konnte nicht hochgeladen werden." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:157 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:169 msgid "Your document has been created from the template successfully." msgstr "Ihr Dokument wurde erfolgreich aus der Vorlage erstellt." @@ -6698,19 +6837,19 @@ msgstr "Dein Dokument wurde von einem Administrator gelöscht!" msgid "Your document has been re-sent successfully." msgstr "Ihr Dokument wurde erfolgreich erneut gesendet." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:328 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:304 msgid "Your document has been sent successfully." msgstr "Ihr Dokument wurde erfolgreich gesendet." -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:59 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:58 msgid "Your document has been successfully duplicated." msgstr "Ihr Dokument wurde erfolgreich dupliziert." -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:87 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:86 msgid "Your document has been uploaded successfully." msgstr "Ihr Dokument wurde erfolgreich hochgeladen." -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:69 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:68 msgid "Your document has been uploaded successfully. You will be redirected to the template page." msgstr "Ihr Dokument wurde erfolgreich hochgeladen. Sie werden zur Vorlagenseite weitergeleitet." @@ -6753,7 +6892,7 @@ msgstr "Dein Passwort wurde aktualisiert." msgid "Your payment for teams is overdue. Please settle the payment to avoid any service disruptions." msgstr "Ihre Zahlung für Teams ist überfällig. Bitte begleichen Sie die Zahlung, um Unterbrechungen des Dienstes zu vermeiden." -#: apps/web/src/components/forms/profile.tsx:73 +#: apps/web/src/components/forms/profile.tsx:72 msgid "Your profile has been updated successfully." msgstr "Ihr Profil wurde erfolgreich aktualisiert." @@ -6795,19 +6934,19 @@ msgstr "Ihr Team wurde erfolgreich gelöscht." msgid "Your team has been successfully updated." msgstr "Ihr Team wurde erfolgreich aktualisiert." -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:43 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:42 msgid "Your template has been duplicated successfully." msgstr "Ihre Vorlage wurde erfolgreich dupliziert." -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:42 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:37 msgid "Your template has been successfully deleted." msgstr "Ihre Vorlage wurde erfolgreich gelöscht." -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:67 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:66 msgid "Your template will be duplicated." msgstr "Ihre Vorlage wird dupliziert." -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:247 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:217 msgid "Your templates has been saved successfully." msgstr "Ihre Vorlagen wurden erfolgreich gespeichert." @@ -6823,4 +6962,3 @@ msgstr "Ihr Token wurde erfolgreich erstellt! Stellen Sie sicher, dass Sie es ko #: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:86 msgid "Your tokens will be shown here once you create them." msgstr "Ihre Tokens werden hier angezeigt, sobald Sie sie erstellt haben." - diff --git a/packages/lib/translations/en/web.po b/packages/lib/translations/en/web.po index 86ccafac1..79af773f9 100644 --- a/packages/lib/translations/en/web.po +++ b/packages/lib/translations/en/web.po @@ -17,7 +17,7 @@ msgstr "" msgid "\"{0}\" has invited you to sign \"example document\"." msgstr "\"{0}\" has invited you to sign \"example document\"." -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:69 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:74 msgid "\"{0}\" will appear on the document as it has a timezone of \"{timezone}\"." msgstr "\"{0}\" will appear on the document as it has a timezone of \"{timezone}\"." @@ -33,7 +33,7 @@ msgstr "“{documentName}” has been signed" msgid "“{documentName}” was signed by all signers" msgstr "“{documentName}” was signed by all signers" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:62 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:61 msgid "\"{documentTitle}\" has been successfully deleted" msgstr "\"{documentTitle}\" has been successfully deleted" @@ -41,12 +41,12 @@ msgstr "\"{documentTitle}\" has been successfully deleted" msgid "\"{placeholderEmail}\" on behalf of \"{0}\" has invited you to sign \"example document\"." msgstr "\"{placeholderEmail}\" on behalf of \"{0}\" has invited you to sign \"example document\"." -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:313 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:330 msgid "{0, plural, one {(1 character over)} other {(# characters over)}}" msgstr "{0, plural, one {(1 character over)} other {(# characters over)}}" #: apps/web/src/components/forms/public-profile-form.tsx:237 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:395 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:393 msgid "{0, plural, one {# character over the limit} other {# characters over the limit}}" msgstr "{0, plural, one {# character over the limit} other {# characters over the limit}}" @@ -71,7 +71,7 @@ msgstr "{0, plural, one {1 matching field} other {# matching fields}}" msgid "{0, plural, one {1 Recipient} other {# Recipients}}" msgstr "{0, plural, one {1 Recipient} other {# Recipients}}" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:238 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:239 msgid "{0, plural, one {Waiting on 1 recipient} other {Waiting on # recipients}}" msgstr "{0, plural, one {Waiting on 1 recipient} other {Waiting on # recipients}}" @@ -83,7 +83,7 @@ msgstr "{0, plural, zero {Select values} other {# selected...}}" msgid "{0}" msgstr "{0}" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:249 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:247 msgid "{0} direct signing templates" msgstr "{0} direct signing templates" @@ -103,7 +103,7 @@ msgstr "{0} joined the team {teamName} on Documenso" msgid "{0} left the team {teamName} on Documenso" msgstr "{0} left the team {teamName} on Documenso" -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:151 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:145 msgid "{0} of {1} documents remaining this month." msgstr "{0} of {1} documents remaining this month." @@ -116,11 +116,11 @@ msgstr "{0} of {1} row(s) selected." msgid "{0} on behalf of \"{1}\" has invited you to {recipientActionVerb} the document \"{2}\"." msgstr "{0} on behalf of \"{1}\" has invited you to {recipientActionVerb} the document \"{2}\"." -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:173 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:174 msgid "{0} Recipient(s)" msgstr "{0} Recipient(s)" -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:294 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:311 msgid "{charactersRemaining, plural, one {1 character remaining} other {{charactersRemaining} characters remaining}}" msgstr "{charactersRemaining, plural, one {1 character remaining} other {{charactersRemaining} characters remaining}}" @@ -136,7 +136,7 @@ msgstr "{inviterName} has cancelled the document {documentName}, you don't need msgid "{inviterName} has cancelled the document<0/>\"{documentName}\"" msgstr "{inviterName} has cancelled the document<0/>\"{documentName}\"" -#: packages/email/template-components/template-document-invite.tsx:75 +#: packages/email/template-components/template-document-invite.tsx:74 msgid "{inviterName} has invited you to {0}<0/>\"{documentName}\"" msgstr "{inviterName} has invited you to {0}<0/>\"{documentName}\"" @@ -156,9 +156,9 @@ msgstr "{inviterName} has removed you from the document {documentName}." msgid "{inviterName} has removed you from the document<0/>\"{documentName}\"" msgstr "{inviterName} has removed you from the document<0/>\"{documentName}\"" -#: packages/email/template-components/template-document-invite.tsx:63 -msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {0}" -msgstr "{inviterName} on behalf of \"{teamName}\" has invited you to {0}" +#: packages/email/template-components/template-document-invite.tsx:61 +msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {0}<0/>\"{documentName}\"" +msgstr "{inviterName} on behalf of \"{teamName}\" has invited you to {0}<0/>\"{documentName}\"" #: packages/email/templates/document-invite.tsx:45 msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {action} {documentName}" @@ -176,87 +176,87 @@ msgstr "{memberEmail} left the following team" msgid "{numberOfSeats, plural, one {# member} other {# members}}" msgstr "{numberOfSeats, plural, one {# member} other {# members}}" -#: packages/lib/utils/document-audit-logs.ts:263 +#: packages/lib/utils/document-audit-logs.ts:279 msgid "{prefix} added a field" msgstr "{prefix} added a field" -#: packages/lib/utils/document-audit-logs.ts:275 +#: packages/lib/utils/document-audit-logs.ts:291 msgid "{prefix} added a recipient" msgstr "{prefix} added a recipient" -#: packages/lib/utils/document-audit-logs.ts:287 +#: packages/lib/utils/document-audit-logs.ts:303 msgid "{prefix} created the document" msgstr "{prefix} created the document" -#: packages/lib/utils/document-audit-logs.ts:291 +#: packages/lib/utils/document-audit-logs.ts:307 msgid "{prefix} deleted the document" msgstr "{prefix} deleted the document" -#: packages/lib/utils/document-audit-logs.ts:335 +#: packages/lib/utils/document-audit-logs.ts:351 msgid "{prefix} moved the document to team" msgstr "{prefix} moved the document to team" -#: packages/lib/utils/document-audit-logs.ts:319 +#: packages/lib/utils/document-audit-logs.ts:335 msgid "{prefix} opened the document" msgstr "{prefix} opened the document" -#: packages/lib/utils/document-audit-logs.ts:267 +#: packages/lib/utils/document-audit-logs.ts:283 msgid "{prefix} removed a field" msgstr "{prefix} removed a field" -#: packages/lib/utils/document-audit-logs.ts:279 +#: packages/lib/utils/document-audit-logs.ts:295 msgid "{prefix} removed a recipient" msgstr "{prefix} removed a recipient" -#: packages/lib/utils/document-audit-logs.ts:365 +#: packages/lib/utils/document-audit-logs.ts:381 msgid "{prefix} resent an email to {0}" msgstr "{prefix} resent an email to {0}" -#: packages/lib/utils/document-audit-logs.ts:366 +#: packages/lib/utils/document-audit-logs.ts:382 msgid "{prefix} sent an email to {0}" msgstr "{prefix} sent an email to {0}" -#: packages/lib/utils/document-audit-logs.ts:331 +#: packages/lib/utils/document-audit-logs.ts:347 msgid "{prefix} sent the document" msgstr "{prefix} sent the document" -#: packages/lib/utils/document-audit-logs.ts:295 +#: packages/lib/utils/document-audit-logs.ts:311 msgid "{prefix} signed a field" msgstr "{prefix} signed a field" -#: packages/lib/utils/document-audit-logs.ts:299 +#: packages/lib/utils/document-audit-logs.ts:315 msgid "{prefix} unsigned a field" msgstr "{prefix} unsigned a field" -#: packages/lib/utils/document-audit-logs.ts:271 +#: packages/lib/utils/document-audit-logs.ts:287 msgid "{prefix} updated a field" msgstr "{prefix} updated a field" -#: packages/lib/utils/document-audit-logs.ts:283 +#: packages/lib/utils/document-audit-logs.ts:299 msgid "{prefix} updated a recipient" msgstr "{prefix} updated a recipient" -#: packages/lib/utils/document-audit-logs.ts:315 +#: packages/lib/utils/document-audit-logs.ts:331 msgid "{prefix} updated the document" msgstr "{prefix} updated the document" -#: packages/lib/utils/document-audit-logs.ts:307 +#: packages/lib/utils/document-audit-logs.ts:323 msgid "{prefix} updated the document access auth requirements" msgstr "{prefix} updated the document access auth requirements" -#: packages/lib/utils/document-audit-logs.ts:327 +#: packages/lib/utils/document-audit-logs.ts:343 msgid "{prefix} updated the document external ID" msgstr "{prefix} updated the document external ID" -#: packages/lib/utils/document-audit-logs.ts:311 +#: packages/lib/utils/document-audit-logs.ts:327 msgid "{prefix} updated the document signing auth requirements" msgstr "{prefix} updated the document signing auth requirements" -#: packages/lib/utils/document-audit-logs.ts:323 +#: packages/lib/utils/document-audit-logs.ts:339 msgid "{prefix} updated the document title" msgstr "{prefix} updated the document title" -#: packages/lib/utils/document-audit-logs.ts:303 +#: packages/lib/utils/document-audit-logs.ts:319 msgid "{prefix} updated the document visibility" msgstr "{prefix} updated the document visibility" @@ -293,7 +293,7 @@ msgid "{recipientReference} has signed {documentName}" msgstr "{recipientReference} has signed {documentName}" #: apps/web/src/components/forms/public-profile-form.tsx:231 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:389 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:387 msgid "{remaningLength, plural, one {# character remaining} other {# characters remaining}}" msgstr "{remaningLength, plural, one {# character remaining} other {# characters remaining}}" @@ -302,8 +302,8 @@ msgid "{signerName} has rejected the document \"{documentName}\"." msgstr "{signerName} has rejected the document \"{documentName}\"." #: packages/email/template-components/template-document-invite.tsx:68 -msgid "{teamName} has invited you to {0}" -msgstr "{teamName} has invited you to {0}" +msgid "{teamName} has invited you to {0}<0/>\"{documentName}\"" +msgstr "{teamName} has invited you to {0}<0/>\"{documentName}\"" #: packages/email/templates/document-invite.tsx:46 msgid "{teamName} has invited you to {action} {documentName}" @@ -313,27 +313,27 @@ msgstr "{teamName} has invited you to {action} {documentName}" msgid "{teamName} ownership transfer request" msgstr "{teamName} ownership transfer request" -#: packages/lib/utils/document-audit-logs.ts:343 +#: packages/lib/utils/document-audit-logs.ts:359 msgid "{userName} approved the document" msgstr "{userName} approved the document" -#: packages/lib/utils/document-audit-logs.ts:344 +#: packages/lib/utils/document-audit-logs.ts:360 msgid "{userName} CC'd the document" msgstr "{userName} CC'd the document" -#: packages/lib/utils/document-audit-logs.ts:345 +#: packages/lib/utils/document-audit-logs.ts:361 msgid "{userName} completed their task" msgstr "{userName} completed their task" -#: packages/lib/utils/document-audit-logs.ts:355 +#: packages/lib/utils/document-audit-logs.ts:371 msgid "{userName} rejected the document" msgstr "{userName} rejected the document" -#: packages/lib/utils/document-audit-logs.ts:341 +#: packages/lib/utils/document-audit-logs.ts:357 msgid "{userName} signed the document" msgstr "{userName} signed the document" -#: packages/lib/utils/document-audit-logs.ts:342 +#: packages/lib/utils/document-audit-logs.ts:358 msgid "{userName} viewed the document" msgstr "{userName} viewed the document" @@ -353,7 +353,11 @@ msgstr "<0>{senderName} has requested that you take ownership of the followi msgid "<0>{teamName} has requested to use your email address for their team on Documenso." msgstr "<0>{teamName} has requested to use your email address for their team on Documenso." -#: packages/ui/primitives/template-flow/add-template-settings.tsx:241 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:463 +msgid "<0>Click to upload or drag and drop" +msgstr "<0>Click to upload or drag and drop" + +#: packages/ui/primitives/template-flow/add-template-settings.tsx:287 msgid "<0>Email - The recipient will be emailed the document to sign, approve, etc." msgstr "<0>Email - The recipient will be emailed the document to sign, approve, etc." @@ -373,11 +377,11 @@ msgstr "<0>No restrictions - The document can be accessed directly by the UR msgid "<0>None - No authentication required" msgstr "<0>None - No authentication required" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:247 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:293 msgid "<0>None - We will generate links which you can send to the recipients manually." msgstr "<0>None - We will generate links which you can send to the recipients manually." -#: packages/ui/primitives/template-flow/add-template-settings.tsx:254 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:300 msgid "<0>Note - If you use Links in combination with direct templates, you will need to manually send the links to the remaining recipients." msgstr "<0>Note - If you use Links in combination with direct templates, you will need to manually send the links to the remaining recipients." @@ -459,19 +463,19 @@ msgstr "A device capable of accessing, opening, and reading documents" msgid "A document was created by your direct template that requires you to {recipientActionVerb} it." msgstr "A document was created by your direct template that requires you to {recipientActionVerb} it." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:218 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:230 msgid "A draft document will be created" msgstr "A draft document will be created" -#: packages/lib/utils/document-audit-logs.ts:262 +#: packages/lib/utils/document-audit-logs.ts:278 msgid "A field was added" msgstr "A field was added" -#: packages/lib/utils/document-audit-logs.ts:266 +#: packages/lib/utils/document-audit-logs.ts:282 msgid "A field was removed" msgstr "A field was removed" -#: packages/lib/utils/document-audit-logs.ts:270 +#: packages/lib/utils/document-audit-logs.ts:286 msgid "A field was updated" msgstr "A field was updated" @@ -483,7 +487,7 @@ msgstr "A means to print or download documents for your records" msgid "A new member has joined your team" msgstr "A new member has joined your team" -#: apps/web/src/components/forms/token.tsx:127 +#: apps/web/src/components/forms/token.tsx:128 msgid "A new token was created successfully." msgstr "A new token was created successfully." @@ -492,15 +496,15 @@ msgstr "A new token was created successfully." msgid "A password reset email has been sent, if you have an account you should see it in your inbox shortly." msgstr "A password reset email has been sent, if you have an account you should see it in your inbox shortly." -#: packages/lib/utils/document-audit-logs.ts:274 +#: packages/lib/utils/document-audit-logs.ts:290 msgid "A recipient was added" msgstr "A recipient was added" -#: packages/lib/utils/document-audit-logs.ts:278 +#: packages/lib/utils/document-audit-logs.ts:294 msgid "A recipient was removed" msgstr "A recipient was removed" -#: packages/lib/utils/document-audit-logs.ts:282 +#: packages/lib/utils/document-audit-logs.ts:298 msgid "A recipient was updated" msgstr "A recipient was updated" @@ -586,7 +590,7 @@ msgstr "Accepted team invitation" msgid "Account Authentication" msgstr "Account Authentication" -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:50 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:51 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:47 msgid "Account deleted" msgstr "Account deleted" @@ -607,20 +611,20 @@ msgstr "Account Re-Authentication" msgid "Acknowledgment" msgstr "Acknowledgment" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:108 -#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:98 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:123 -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:164 -#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:116 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:114 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:97 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:117 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:159 +#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:115 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:46 msgid "Action" msgstr "Action" #: apps/web/src/app/(dashboard)/documents/data-table.tsx:79 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:177 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:175 #: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:140 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:131 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:140 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:130 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:139 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:116 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:125 msgid "Actions" @@ -645,16 +649,16 @@ msgid "Add a document" msgstr "Add a document" #: packages/ui/primitives/document-flow/add-settings.tsx:390 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:468 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:514 msgid "Add a URL to redirect the user to once the document is signed" msgstr "Add a URL to redirect the user to once the document is signed" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:177 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:88 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:153 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:87 msgid "Add all relevant fields for each recipient." msgstr "Add all relevant fields for each recipient." -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:83 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:82 msgid "Add all relevant placeholders for each recipient." msgstr "Add all relevant placeholders for each recipient." @@ -670,7 +674,7 @@ msgstr "Add an authenticator to serve as a secondary authentication method when msgid "Add an external ID to the document. This can be used to identify the document in external systems." msgstr "Add an external ID to the document. This can be used to identify the document in external systems." -#: packages/ui/primitives/template-flow/add-template-settings.tsx:385 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:431 msgid "Add an external ID to the template. This can be used to identify in external systems." msgstr "Add an external ID to the template. This can be used to identify in external systems." @@ -687,8 +691,8 @@ msgstr "Add another value" msgid "Add email" msgstr "Add email" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:176 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:87 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:152 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:86 msgid "Add Fields" msgstr "Add Fields" @@ -713,7 +717,7 @@ msgstr "Add passkey" msgid "Add Placeholder Recipient" msgstr "Add Placeholder Recipient" -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:82 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:81 msgid "Add Placeholders" msgstr "Add Placeholders" @@ -721,7 +725,7 @@ msgstr "Add Placeholders" msgid "Add Signer" msgstr "Add Signer" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:171 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:147 msgid "Add Signers" msgstr "Add Signers" @@ -729,19 +733,19 @@ msgstr "Add Signers" msgid "Add team email" msgstr "Add team email" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:73 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:80 msgid "Add text" msgstr "Add text" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:78 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:85 msgid "Add text to the field" msgstr "Add text to the field" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:172 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:148 msgid "Add the people who will sign the document." msgstr "Add the people who will sign the document." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:220 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:232 msgid "Add the recipients to create the document with" msgstr "Add the recipients to create the document with" @@ -766,12 +770,12 @@ msgid "Admin panel" msgstr "Admin panel" #: packages/ui/primitives/document-flow/add-settings.tsx:284 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:367 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:413 msgid "Advanced Options" msgstr "Advanced Options" #: packages/ui/primitives/document-flow/add-fields.tsx:585 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:415 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:490 msgid "Advanced settings" msgstr "Advanced settings" @@ -799,11 +803,11 @@ msgstr "All documents have been processed. Any new documents that are sent or re msgid "All documents related to the electronic signing process will be provided to you electronically through our platform or via email. It is your responsibility to ensure that your email address is current and that you can receive and open our emails." msgstr "All documents related to the electronic signing process will be provided to you electronically through our platform or via email. It is your responsibility to ensure that your email address is current and that you can receive and open our emails." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:147 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:146 msgid "All inserted signatures will be voided" msgstr "All inserted signatures will be voided" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:150 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:149 msgid "All recipients will be notified" msgstr "All recipients will be notified" @@ -859,30 +863,26 @@ msgstr "An email containing an invitation will be sent to each member." msgid "An email requesting the transfer of this team has been sent." msgstr "An email requesting the transfer of this team has been sent." -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:60 -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:83 -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:59 #: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:100 #: apps/web/src/components/forms/avatar-image.tsx:122 #: apps/web/src/components/forms/password.tsx:92 -#: apps/web/src/components/forms/profile.tsx:81 #: apps/web/src/components/forms/reset-password.tsx:95 #: apps/web/src/components/forms/signup.tsx:112 -#: apps/web/src/components/forms/token.tsx:137 +#: apps/web/src/components/forms/token.tsx:146 #: apps/web/src/components/forms/v2/signup.tsx:166 msgid "An error occurred" msgstr "An error occurred" -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:257 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:227 msgid "An error occurred while adding fields." msgstr "An error occurred while adding fields." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:269 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:218 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:243 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:187 msgid "An error occurred while adding signers." msgstr "An error occurred while adding signers." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:304 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:281 msgid "An error occurred while adding the fields." msgstr "An error occurred while adding the fields." @@ -890,7 +890,7 @@ msgstr "An error occurred while adding the fields." msgid "An error occurred while auto-signing the document, some fields may not be signed. Please review and manually sign any remaining fields." msgstr "An error occurred while auto-signing the document, some fields may not be signed. Please review and manually sign any remaining fields." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:176 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:188 msgid "An error occurred while creating document from template." msgstr "An error occurred while creating document from template." @@ -898,7 +898,11 @@ msgstr "An error occurred while creating document from template." msgid "An error occurred while creating the webhook. Please try again." msgstr "An error occurred while creating the webhook. Please try again." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:124 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:63 +msgid "An error occurred while deleting the user." +msgstr "An error occurred while deleting the user." + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:120 msgid "An error occurred while disabling direct link signing." msgstr "An error occurred while disabling direct link signing." @@ -906,18 +910,18 @@ msgstr "An error occurred while disabling direct link signing." msgid "An error occurred while disabling the user." msgstr "An error occurred while disabling the user." -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:64 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:92 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:76 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:107 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:70 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:98 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:77 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:101 msgid "An error occurred while downloading your document." msgstr "An error occurred while downloading your document." -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:52 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51 msgid "An error occurred while duplicating template." msgstr "An error occurred while duplicating template." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:123 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:119 msgid "An error occurred while enabling direct link signing." msgstr "An error occurred while enabling direct link signing." @@ -946,21 +950,21 @@ msgid "An error occurred while removing the field." msgstr "An error occurred while removing the field." #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:154 -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:126 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:131 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:137 -#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:110 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:148 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:195 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:115 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:153 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:196 #: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:129 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:194 msgid "An error occurred while removing the signature." msgstr "An error occurred while removing the signature." -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:196 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:197 msgid "An error occurred while removing the text." msgstr "An error occurred while removing the text." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:350 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:326 msgid "An error occurred while sending the document." msgstr "An error occurred while sending the document." @@ -969,15 +973,15 @@ msgid "An error occurred while sending your confirmation email" msgstr "An error occurred while sending your confirmation email" #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:125 -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:100 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:105 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:106 -#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:84 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:89 #: apps/web/src/app/(signing)/sign/[token]/initials-field.tsx:90 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:122 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:150 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:127 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:151 #: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:102 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:168 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:168 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:169 msgid "An error occurred while signing the document." msgstr "An error occurred while signing the document." @@ -985,8 +989,8 @@ msgstr "An error occurred while signing the document." msgid "An error occurred while trying to create a checkout session." msgstr "An error occurred while trying to create a checkout session." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:235 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:187 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:210 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:156 msgid "An error occurred while updating the document settings." msgstr "An error occurred while updating the document settings." @@ -998,13 +1002,12 @@ msgstr "An error occurred while updating the signature." msgid "An error occurred while updating your profile." msgstr "An error occurred while updating your profile." -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:118 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:108 msgid "An error occurred while uploading your document." msgstr "An error occurred while uploading your document." -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:66 -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:89 -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:65 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:58 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:81 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:55 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:54 #: apps/web/src/components/(dashboard)/common/command-menu.tsx:301 @@ -1021,7 +1024,7 @@ msgstr "An error occurred while uploading your document." #: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:100 #: apps/web/src/components/(teams)/forms/update-team-form.tsx:93 #: apps/web/src/components/forms/avatar-image.tsx:94 -#: apps/web/src/components/forms/profile.tsx:87 +#: apps/web/src/components/forms/profile.tsx:79 #: apps/web/src/components/forms/public-profile-claim-dialog.tsx:113 #: apps/web/src/components/forms/public-profile-form.tsx:104 #: apps/web/src/components/forms/signin.tsx:249 @@ -1031,11 +1034,10 @@ msgstr "An error occurred while uploading your document." #: apps/web/src/components/forms/signin.tsx:302 #: apps/web/src/components/forms/signup.tsx:124 #: apps/web/src/components/forms/signup.tsx:138 -#: apps/web/src/components/forms/token.tsx:143 #: apps/web/src/components/forms/v2/signup.tsx:187 #: apps/web/src/components/forms/v2/signup.tsx:201 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:141 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:178 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:140 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:176 msgid "An unknown error occurred" msgstr "An unknown error occurred" @@ -1043,11 +1045,11 @@ msgstr "An unknown error occurred" msgid "Any payment methods attached to this team will remain attached to this team. Please contact us if you need to update this information." msgstr "Any payment methods attached to this team will remain attached to this team. Please contact us if you need to update this information." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:221 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:219 msgid "Any Source" msgstr "Any Source" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:201 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:199 msgid "Any Status" msgstr "Any Status" @@ -1065,16 +1067,16 @@ msgstr "API Tokens" msgid "App Version" msgstr "App Version" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:89 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:120 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:146 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:95 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:121 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:140 #: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:143 #: packages/lib/constants/recipient-roles.ts:8 msgid "Approve" msgstr "Approve" #: apps/web/src/app/(signing)/sign/[token]/form.tsx:142 -#: packages/email/template-components/template-document-invite.tsx:106 +#: packages/email/template-components/template-document-invite.tsx:105 msgid "Approve Document" msgstr "Approve Document" @@ -1111,13 +1113,13 @@ msgstr "Are you sure you want to remove the <0>{passkeyName} passkey." msgid "Are you sure you wish to delete this team?" msgstr "Are you sure you wish to delete this team?" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:100 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:99 #: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:94 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:455 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:449 #: apps/web/src/components/(teams)/dialogs/delete-team-member-dialog.tsx:81 #: apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx:81 #: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:116 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:439 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:437 msgid "Are you sure?" msgstr "Are you sure?" @@ -1125,11 +1127,11 @@ msgstr "Are you sure?" 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." -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:130 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:136 msgid "Audit Log" msgstr "Audit Log" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:198 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:200 msgid "Authentication Level" msgstr "Authentication Level" @@ -1160,7 +1162,7 @@ msgstr "Back" msgid "Back to Documents" msgstr "Back to Documents" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:146 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:137 msgid "Background Color" msgstr "Background Color" @@ -1173,7 +1175,7 @@ msgstr "Backup Code" msgid "Backup codes" msgstr "Backup codes" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:74 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:73 msgid "Banner Updated" msgstr "Banner Updated" @@ -1210,7 +1212,7 @@ msgstr "Branding Preferences" msgid "Branding preferences updated" msgstr "Branding preferences updated" -#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:97 +#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:96 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:48 msgid "Browser" msgstr "Browser" @@ -1223,6 +1225,23 @@ msgstr "Bulk Copy" msgid "Bulk Import" msgstr "Bulk Import" +#: packages/lib/jobs/definitions/internal/bulk-send-template.handler.ts:203 +msgid "Bulk Send Complete: {0}" +msgstr "Bulk Send Complete: {0}" + +#: packages/email/templates/bulk-send-complete.tsx:30 +msgid "Bulk send operation complete for template \"{templateName}\"" +msgstr "Bulk send operation complete for template \"{templateName}\"" + +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:128 +msgid "Bulk Send Template via CSV" +msgstr "Bulk Send Template via CSV" + +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:97 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:120 +msgid "Bulk Send via CSV" +msgstr "Bulk Send via CSV" + #: packages/email/templates/team-invite.tsx:84 msgid "by <0>{senderName}" msgstr "by <0>{senderName}" @@ -1235,7 +1254,7 @@ msgstr "By accepting this request, you will be granting <0>{teamName} access msgid "By accepting this request, you will take responsibility for any billing items associated with this team." msgstr "By accepting this request, you will take responsibility for any billing items associated with this team." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:158 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:157 msgid "By deleting this document, the following will occur:" msgstr "By deleting this document, the following will occur:" @@ -1256,17 +1275,17 @@ msgid "By using the electronic signature feature, you are consenting to conduct 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." #: apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx:185 -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:192 -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:108 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:191 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:107 #: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:120 #: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:248 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:157 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:198 #: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:109 -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:81 -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:78 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:76 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:77 #: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:131 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:472 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:466 #: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:220 #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:178 #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:71 @@ -1274,12 +1293,12 @@ msgstr "By using the electronic signature feature, you are consenting to conduct #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:189 #: apps/web/src/app/(signing)/sign/[token]/form.tsx:164 #: apps/web/src/app/(signing)/sign/[token]/form.tsx:246 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:215 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:328 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:232 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:341 #: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:153 #: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:131 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:320 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:335 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:352 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121 #: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:176 #: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:242 @@ -1297,8 +1316,9 @@ msgstr "By using the electronic signature feature, you are consenting to conduct #: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:187 #: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:257 #: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:163 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:450 -#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:357 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:448 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:263 +#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:323 #: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:58 msgid "Cancel" msgstr "Cancel" @@ -1328,7 +1348,7 @@ msgstr "CC'd" msgid "Ccers" msgstr "Ccers" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:86 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:93 msgid "Character Limit" msgstr "Character Limit" @@ -1348,15 +1368,15 @@ msgstr "Checkbox values" msgid "Checkout" msgstr "Checkout" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:271 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:266 msgid "Choose an existing recipient from below to continue" msgstr "Choose an existing recipient from below to continue" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:267 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:262 msgid "Choose Direct Link Recipient" msgstr "Choose Direct Link Recipient" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:182 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:158 msgid "Choose how the document will reach recipients" msgstr "Choose how the document will reach recipients" @@ -1380,6 +1400,10 @@ msgstr "Claim your profile later" msgid "Claim your username now" msgstr "Claim your username now" +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:537 +msgid "Clear file" +msgstr "Clear file" + #: packages/ui/primitives/data-table.tsx:156 msgid "Clear filters" msgstr "Clear filters" @@ -1388,13 +1412,13 @@ msgstr "Clear filters" msgid "Clear Signature" msgstr "Clear Signature" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:130 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:125 msgid "Click here to get started" msgstr "Click here to get started" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recent-activity.tsx:76 -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:118 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:66 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:113 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:64 #: apps/web/src/components/document/document-history-sheet.tsx:133 msgid "Click here to retry" msgstr "Click here to retry" @@ -1415,16 +1439,16 @@ msgstr "Click to copy signing link for sending to recipient" msgid "Click to insert field" msgstr "Click to insert field" -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:126 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:388 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:125 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:556 #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:125 #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:138 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121 #: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:140 #: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:180 #: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:102 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:319 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:423 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:317 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:421 #: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx:44 msgid "Close" msgstr "Close" @@ -1448,7 +1472,7 @@ msgstr "Complete Signing" msgid "Complete Viewing" msgstr "Complete Viewing" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:204 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:202 #: apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx:77 #: apps/web/src/components/formatter/document-status.tsx:28 #: packages/email/template-components/template-document-completed.tsx:35 @@ -1475,25 +1499,25 @@ msgstr "Completed Documents" msgid "Configure Direct Recipient" msgstr "Configure Direct Recipient" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:167 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:143 msgid "Configure general settings for the document." msgstr "Configure general settings for the document." -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:78 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:77 msgid "Configure general settings for the template." msgstr "Configure general settings for the template." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:337 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:335 msgid "Configure template" msgstr "Configure template" #: packages/ui/primitives/document-flow/add-fields.tsx:586 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:416 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:491 msgid "Configure the {0} field" msgstr "Configure the {0} field" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:481 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:460 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:475 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:458 msgid "Confirm" msgstr "Confirm" @@ -1531,7 +1555,7 @@ msgstr "Consent to Electronic Transactions" msgid "Contact Information" msgstr "Contact Information" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:189 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:180 msgid "Content" msgstr "Content" @@ -1541,12 +1565,12 @@ msgstr "Content" #: apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx:143 #: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:72 #: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:122 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:328 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:326 #: packages/ui/primitives/document-flow/document-flow-root.tsx:141 msgid "Continue" msgstr "Continue" -#: packages/email/template-components/template-document-invite.tsx:86 +#: packages/email/template-components/template-document-invite.tsx:85 msgid "Continue by approving the document." msgstr "Continue by approving the document." @@ -1554,11 +1578,11 @@ msgstr "Continue by approving the document." msgid "Continue by downloading the document." msgstr "Continue by downloading the document." -#: packages/email/template-components/template-document-invite.tsx:84 +#: packages/email/template-components/template-document-invite.tsx:83 msgid "Continue by signing the document." msgstr "Continue by signing the document." -#: packages/email/template-components/template-document-invite.tsx:85 +#: packages/email/template-components/template-document-invite.tsx:84 msgid "Continue by viewing the document." msgstr "Continue by viewing the document." @@ -1592,9 +1616,9 @@ msgid "Copied" msgstr "Copied" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:162 -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:77 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:72 #: apps/web/src/app/(dashboard)/templates/template-direct-link-badge.tsx:31 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:163 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:159 #: apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx:40 #: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:61 #: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:117 @@ -1613,11 +1637,11 @@ msgstr "Copy" msgid "Copy Link" msgstr "Copy Link" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:169 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:164 msgid "Copy sharable link" msgstr "Copy sharable link" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:397 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:391 msgid "Copy Shareable Link" msgstr "Copy Shareable Link" @@ -1652,15 +1676,15 @@ msgstr "Create a team to collaborate with your team members." msgid "Create account" msgstr "Create account" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:396 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:564 msgid "Create and send" msgstr "Create and send" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:394 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:562 msgid "Create as draft" msgstr "Create as draft" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:354 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:365 msgid "Create as pending" msgstr "Create as pending" @@ -1668,11 +1692,11 @@ msgstr "Create as pending" msgid "Create Direct Link" msgstr "Create Direct Link" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:202 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:197 msgid "Create Direct Signing Link" msgstr "Create Direct Signing Link" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:214 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:226 msgid "Create document from template" msgstr "Create document from template" @@ -1680,11 +1704,11 @@ msgstr "Create document from template" msgid "Create now" msgstr "Create now" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:352 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:346 msgid "Create one automatically" msgstr "Create one automatically" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:398 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:566 msgid "Create signing links" msgstr "Create signing links" @@ -1699,7 +1723,7 @@ msgstr "Create team" msgid "Create Team" msgstr "Create Team" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:361 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:372 msgid "Create the document as pending and ready to sign." msgstr "Create the document as pending and ready to sign." @@ -1725,19 +1749,19 @@ msgid "Create your account and start using state-of-the-art document signing. Op msgstr "Create your account and start using state-of-the-art document signing. Open and beautiful signing is within your grasp." #: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:62 -#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:96 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:35 +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:112 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:36 #: apps/web/src/app/(dashboard)/documents/data-table.tsx:48 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table.tsx:63 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:105 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:34 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:103 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:35 #: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:56 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:274 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:272 msgid "Created" msgstr "Created" #: apps/web/src/app/(dashboard)/admin/subscriptions/page.tsx:35 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:111 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:112 msgid "Created At" msgstr "Created At" @@ -1757,6 +1781,10 @@ msgstr "Created on" msgid "Created on {0}" msgstr "Created on {0}" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:143 +msgid "CSV Structure" +msgstr "CSV Structure" + #: apps/web/src/components/forms/password.tsx:112 msgid "Current Password" msgstr "Current Password" @@ -1765,6 +1793,10 @@ msgstr "Current Password" msgid "Current password is incorrect." msgstr "Current password is incorrect." +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:154 +msgid "Current recipients:" +msgstr "Current recipients:" + #: apps/web/src/app/(dashboard)/settings/billing/billing-plans.tsx:28 msgid "Daily" msgstr "Daily" @@ -1773,11 +1805,11 @@ msgstr "Daily" msgid "Dark Mode" msgstr "Dark Mode" -#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:68 -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:148 +#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:67 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:153 #: packages/ui/primitives/document-flow/add-fields.tsx:945 #: packages/ui/primitives/document-flow/types.ts:53 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:732 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:810 msgid "Date" msgstr "Date" @@ -1786,7 +1818,7 @@ msgid "Date created" msgstr "Date created" #: packages/ui/primitives/document-flow/add-settings.tsx:325 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:408 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:454 msgid "Date Format" msgstr "Date Format" @@ -1807,19 +1839,19 @@ msgstr "Default Document Language" msgid "Default Document Visibility" msgstr "Default Document Visibility" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:50 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:49 msgid "delete" msgstr "delete" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:144 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:189 -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:202 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:150 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:183 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:201 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:177 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:211 #: apps/web/src/app/(dashboard)/settings/tokens/page.tsx:83 #: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:100 -#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:94 -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:90 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:107 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:85 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:116 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/page.tsx:105 #: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:121 @@ -1838,25 +1870,25 @@ msgstr "delete {0}" msgid "delete {teamName}" msgstr "delete {teamName}" -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:136 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:133 msgid "Delete account" msgstr "Delete account" -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:97 -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:104 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:94 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:101 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:72 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:86 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:93 msgid "Delete Account" msgstr "Delete Account" -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:135 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:125 msgid "Delete document" msgstr "Delete document" -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:85 -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:98 -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:105 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:75 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:88 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:95 msgid "Delete Document" msgstr "Delete Document" @@ -1873,11 +1905,11 @@ msgstr "Delete team" msgid "Delete team member" msgstr "Delete team member" -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:88 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:78 msgid "Delete the document. This action is irreversible so proceed with caution." msgstr "Delete the document. This action is irreversible so proceed with caution." -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:86 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:83 msgid "Delete the users account and all its contents. This action is irreversible and will cancel their subscription, so proceed with caution." msgstr "Delete the users account and all its contents. This action is irreversible and will cancel their subscription, so proceed with caution." @@ -1890,7 +1922,7 @@ msgid "Delete your account and all its contents, including completed documents. msgstr "Delete your account and all its contents, including completed documents. This action is irreversible and will cancel your subscription, so proceed with caution." #: apps/web/src/app/(dashboard)/admin/documents/[id]/page.tsx:41 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:97 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:98 msgid "Deleted" msgstr "Deleted" @@ -1898,12 +1930,12 @@ msgstr "Deleted" msgid "Deleting account..." msgstr "Deleting account..." -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:178 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:180 msgid "Details" msgstr "Details" -#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:73 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:242 +#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:72 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:244 msgid "Device" msgstr "Device" @@ -1917,12 +1949,12 @@ msgid "direct link" msgstr "direct link" #: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:40 -#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:79 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:81 msgid "Direct link" msgstr "Direct link" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:156 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:227 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:154 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:225 msgid "Direct Link" msgstr "Direct Link" @@ -1934,15 +1966,15 @@ msgstr "direct link disabled" msgid "Direct link receiver" msgstr "Direct link receiver" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:363 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:357 msgid "Direct Link Signing" msgstr "Direct Link Signing" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:115 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:111 msgid "Direct link signing has been disabled" msgstr "Direct link signing has been disabled" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:114 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:110 msgid "Direct link signing has been enabled" msgstr "Direct link signing has been enabled" @@ -1950,15 +1982,15 @@ msgstr "Direct link signing has been enabled" msgid "Direct link templates contain one dynamic recipient placeholder. Anyone with access to this link can sign the document, and it will then appear on your documents page." msgstr "Direct link templates contain one dynamic recipient placeholder. Anyone with access to this link can sign the document, and it will then appear on your documents page." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:142 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:138 msgid "Direct template link deleted" msgstr "Direct template link deleted" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:228 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:223 msgid "Direct template link usage exceeded ({0}/{1})" msgstr "Direct template link usage exceeded ({0}/{1})" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:417 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:415 msgid "Disable" msgstr "Disable" @@ -1986,7 +2018,7 @@ msgstr "Disable Two Factor Authentication before deleting your account." msgid "Disabled" msgstr "Disabled" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:380 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:374 msgid "Disabling direct link signing will prevent anyone from accessing the link." msgstr "Disabling direct link signing will prevent anyone from accessing the link." @@ -1998,15 +2030,15 @@ msgstr "Disabling the user results in the user not being able to use the account msgid "Display your name and email in documents" msgstr "Display your name and email in documents" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:181 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:157 msgid "Distribute Document" msgstr "Distribute Document" -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:63 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:58 msgid "Do you want to delete this template?" msgstr "Do you want to delete this template?" -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:63 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:62 msgid "Do you want to duplicate this template?" msgstr "Do you want to duplicate this template?" @@ -2029,11 +2061,11 @@ msgstr "Document \"{0}\" - Rejection Confirmed" #: packages/ui/components/document/document-global-auth-access-select.tsx:62 #: packages/ui/primitives/document-flow/add-settings.tsx:227 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:202 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:224 msgid "Document access" msgstr "Document access" -#: packages/lib/utils/document-audit-logs.ts:306 +#: packages/lib/utils/document-audit-logs.ts:322 msgid "Document access auth updated" msgstr "Document access auth updated" @@ -2046,14 +2078,14 @@ msgid "Document Approved" msgstr "Document Approved" #: apps/web/src/app/(signing)/sign/[token]/no-longer-available.tsx:40 -#: packages/lib/server-only/document/delete-document.ts:246 -#: packages/lib/server-only/document/super-delete-document.ts:98 +#: packages/lib/server-only/document/delete-document.ts:263 +#: packages/lib/server-only/document/super-delete-document.ts:101 msgid "Document Cancelled" msgstr "Document Cancelled" #: apps/web/src/components/formatter/document-status.tsx:29 -#: packages/lib/utils/document-audit-logs.ts:369 -#: packages/lib/utils/document-audit-logs.ts:370 +#: packages/lib/utils/document-audit-logs.ts:385 +#: packages/lib/utils/document-audit-logs.ts:386 msgid "Document completed" msgstr "Document completed" @@ -2066,21 +2098,21 @@ msgstr "Document completed email" msgid "Document Completed!" msgstr "Document Completed!" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:156 -#: packages/lib/utils/document-audit-logs.ts:286 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:168 +#: packages/lib/utils/document-audit-logs.ts:302 msgid "Document created" msgstr "Document created" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:127 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:125 msgid "Document created by <0>{0}" msgstr "Document created by <0>{0}" #: packages/email/templates/document-created-from-direct-template.tsx:32 -#: packages/lib/server-only/template/create-document-from-direct-template.ts:585 +#: packages/lib/server-only/template/create-document-from-direct-template.ts:588 msgid "Document created from direct template" msgstr "Document created from direct template" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:132 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:130 msgid "Document created using a <0>direct link" msgstr "Document created using a <0>direct link" @@ -2088,10 +2120,10 @@ msgstr "Document created using a <0>direct link" msgid "Document Creation" msgstr "Document Creation" -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:51 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:181 -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:61 -#: packages/lib/utils/document-audit-logs.ts:290 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:50 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:182 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:60 +#: packages/lib/utils/document-audit-logs.ts:306 msgid "Document deleted" msgstr "Document deleted" @@ -2099,12 +2131,12 @@ msgstr "Document deleted" msgid "Document deleted email" msgstr "Document deleted email" -#: packages/lib/server-only/document/send-delete-email.ts:82 +#: packages/lib/server-only/document/send-delete-email.ts:85 msgid "Document Deleted!" msgstr "Document Deleted!" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:219 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:228 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:265 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:274 msgid "Document Distribution Method" msgstr "Document Distribution Method" @@ -2112,21 +2144,21 @@ msgstr "Document Distribution Method" msgid "Document draft" msgstr "Document draft" -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:58 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:57 msgid "Document Duplicated" msgstr "Document Duplicated" -#: packages/lib/utils/document-audit-logs.ts:326 +#: packages/lib/utils/document-audit-logs.ts:342 msgid "Document external ID updated" msgstr "Document external ID updated" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:192 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:193 #: apps/web/src/components/document/document-history-sheet.tsx:104 msgid "Document history" msgstr "Document history" #: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-page-view.tsx:71 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:81 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:82 msgid "Document ID" msgstr "Document ID" @@ -2146,7 +2178,7 @@ msgstr "Document metrics" msgid "Document moved" msgstr "Document moved" -#: packages/lib/utils/document-audit-logs.ts:334 +#: packages/lib/utils/document-audit-logs.ts:350 msgid "Document moved to team" msgstr "Document moved to team" @@ -2154,7 +2186,7 @@ msgstr "Document moved to team" msgid "Document no longer available to sign" msgstr "Document no longer available to sign" -#: packages/lib/utils/document-audit-logs.ts:318 +#: packages/lib/utils/document-audit-logs.ts:334 msgid "Document opened" msgstr "Document opened" @@ -2183,8 +2215,8 @@ msgstr "Document Rejected" msgid "Document resealed" msgstr "Document resealed" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:327 -#: packages/lib/utils/document-audit-logs.ts:330 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:303 +#: packages/lib/utils/document-audit-logs.ts:346 msgid "Document sent" msgstr "Document sent" @@ -2192,11 +2224,11 @@ msgstr "Document sent" msgid "Document Signed" msgstr "Document Signed" -#: packages/lib/utils/document-audit-logs.ts:310 +#: packages/lib/utils/document-audit-logs.ts:326 msgid "Document signing auth updated" msgstr "Document signing auth updated" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:144 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:143 msgid "Document signing process will be cancelled" msgstr "Document signing process will be cancelled" @@ -2208,11 +2240,11 @@ msgstr "Document status" msgid "Document title" msgstr "Document title" -#: packages/lib/utils/document-audit-logs.ts:322 +#: packages/lib/utils/document-audit-logs.ts:338 msgid "Document title updated" msgstr "Document title updated" -#: packages/lib/utils/document-audit-logs.ts:314 +#: packages/lib/utils/document-audit-logs.ts:330 msgid "Document updated" msgstr "Document updated" @@ -2220,7 +2252,7 @@ msgstr "Document updated" msgid "Document upload disabled due to unpaid invoices" msgstr "Document upload disabled due to unpaid invoices" -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:86 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:85 msgid "Document uploaded" msgstr "Document uploaded" @@ -2228,17 +2260,17 @@ msgstr "Document uploaded" msgid "Document Viewed" msgstr "Document Viewed" -#: packages/lib/utils/document-audit-logs.ts:302 +#: packages/lib/utils/document-audit-logs.ts:318 msgid "Document visibility updated" msgstr "Document visibility updated" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:141 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:140 msgid "Document will be permanently deleted" msgstr "Document will be permanently deleted" #: apps/web/src/app/(dashboard)/admin/nav.tsx:65 #: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:92 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:144 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:145 #: apps/web/src/app/(dashboard)/documents/[id]/edit/document-edit-page-view.tsx:109 #: apps/web/src/app/(dashboard)/documents/[id]/loading.tsx:16 #: apps/web/src/app/(dashboard)/documents/[id]/sent/page.tsx:15 @@ -2252,7 +2284,7 @@ msgstr "Document will be permanently deleted" msgid "Documents" msgstr "Documents" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:197 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:200 msgid "Documents created from template" msgstr "Documents created from template" @@ -2269,10 +2301,10 @@ msgstr "Documents Viewed" msgid "Don't have an account? <0>Sign up" msgstr "Don't have an account? <0>Sign up" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:111 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:123 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:141 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:162 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:117 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:129 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:142 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:156 #: apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx:110 #: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:185 #: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:107 @@ -2281,7 +2313,7 @@ msgstr "Don't have an account? <0>Sign up" msgid "Download" msgstr "Download" -#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:81 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:77 msgid "Download Audit Logs" msgstr "Download Audit Logs" @@ -2289,7 +2321,11 @@ msgstr "Download Audit Logs" msgid "Download Certificate" msgstr "Download Certificate" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:210 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:168 +msgid "Download Template CSV" +msgstr "Download Template CSV" + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:208 #: apps/web/src/components/formatter/document-status.tsx:34 #: packages/lib/constants/document.ts:13 msgid "Draft" @@ -2308,7 +2344,7 @@ msgid "Drag & drop your PDF here." msgstr "Drag & drop your PDF here." #: packages/ui/primitives/document-flow/add-fields.tsx:1076 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:863 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:941 msgid "Dropdown" msgstr "Dropdown" @@ -2320,28 +2356,28 @@ msgstr "Dropdown options" msgid "Due to an unpaid invoice, your team has been restricted. Please settle the payment to restore full access to your team." msgstr "Due to an unpaid invoice, your team has been restricted. Please settle the payment to restore full access to your team." -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:136 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:167 -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:85 -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:118 -#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:74 -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:91 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:142 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:161 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:84 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:117 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:76 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:89 msgid "Duplicate" msgstr "Duplicate" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:104 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:115 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:102 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:156 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:110 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:121 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:103 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:150 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:111 #: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:95 -#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:65 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:67 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx:77 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/page.tsx:100 msgid "Edit" msgstr "Edit" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:117 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:120 msgid "Edit Template" msgstr "Edit Template" @@ -2361,18 +2397,18 @@ msgstr "Electronic Signature Disclosure" #: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:166 #: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:116 #: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:71 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:265 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:272 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:277 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:284 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:122 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:129 -#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:118 -#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:126 +#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:119 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:131 #: apps/web/src/app/embed/direct/[[...url]]/client.tsx:407 #: apps/web/src/app/embed/sign/[[...url]]/client.tsx:287 #: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:169 #: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:153 #: apps/web/src/components/forms/forgot-password.tsx:81 -#: apps/web/src/components/forms/profile.tsx:122 +#: apps/web/src/components/forms/profile.tsx:113 #: apps/web/src/components/forms/signin.tsx:339 #: apps/web/src/components/forms/signup.tsx:176 #: packages/lib/constants/document.ts:28 @@ -2380,7 +2416,7 @@ msgstr "Electronic Signature Disclosure" #: packages/ui/primitives/document-flow/add-signers.tsx:511 #: packages/ui/primitives/document-flow/add-signers.tsx:518 #: packages/ui/primitives/document-flow/types.ts:54 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:680 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:758 #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:470 #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:477 msgid "Email" @@ -2396,7 +2432,7 @@ msgstr "Email address" msgid "Email Address" msgstr "Email Address" -#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:80 +#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:81 msgid "Email cannot already exist in the template" msgstr "Email cannot already exist in the template" @@ -2404,15 +2440,15 @@ msgstr "Email cannot already exist in the template" msgid "Email Confirmed!" msgstr "Email Confirmed!" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:307 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:353 msgid "Email Options" msgstr "Email Options" -#: packages/lib/utils/document-audit-logs.ts:363 +#: packages/lib/utils/document-audit-logs.ts:379 msgid "Email resent" msgstr "Email resent" -#: packages/lib/utils/document-audit-logs.ts:363 +#: packages/lib/utils/document-audit-logs.ts:379 msgid "Email sent" msgstr "Email sent" @@ -2454,11 +2490,11 @@ msgstr "Enable Authenticator App" msgid "Enable custom branding for all documents in this team." msgstr "Enable custom branding for all documents in this team." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:251 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:246 msgid "Enable direct link signing" msgstr "Enable direct link signing" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:374 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:368 #: packages/lib/constants/template.ts:8 msgid "Enable Direct Link Signing" msgstr "Enable Direct Link Signing" @@ -2473,11 +2509,11 @@ msgid "Enable Typed Signature" msgstr "Enable Typed Signature" #: packages/ui/primitives/document-flow/add-fields.tsx:813 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:600 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:678 msgid "Enable Typed Signatures" msgstr "Enable Typed Signatures" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:123 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:114 #: apps/web/src/app/(dashboard)/settings/webhooks/[id]/page.tsx:138 #: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:74 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/[id]/page.tsx:142 @@ -2490,7 +2526,7 @@ msgstr "Enabled" msgid "Enabling the account results in the user being able to use the account again, and all the related features such as webhooks, teams, and API keys for example." msgstr "Enabling the account results in the user being able to use the account again, and all the related features such as webhooks, teams, and API keys for example." -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:87 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:88 msgid "Enclosed Document" msgstr "Enclosed Document" @@ -2510,7 +2546,7 @@ msgstr "Enter your brand details" msgid "Enter your email" msgstr "Enter your email" -#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:135 +#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:136 msgid "Enter your email address to receive the completed document." msgstr "Enter your email address to receive the completed document." @@ -2518,53 +2554,53 @@ msgstr "Enter your email address to receive the completed document." msgid "Enter your name" msgstr "Enter your name" -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:280 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:293 msgid "Enter your text here" msgstr "Enter your text here" #: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:41 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:66 #: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:60 #: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:60 #: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:80 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:234 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:268 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:303 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:349 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:209 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:242 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:280 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:325 #: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:57 #: apps/web/src/app/(dashboard)/documents/upload-document.tsx:111 -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:117 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:155 #: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:186 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:217 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:256 -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:226 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:50 #: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:68 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:175 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:187 #: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:152 #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:124 #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:153 #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:214 -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:99 -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:125 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:104 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:130 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:105 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:136 -#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:83 -#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:109 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:88 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:114 #: apps/web/src/app/(signing)/sign/[token]/initials-field.tsx:89 #: apps/web/src/app/(signing)/sign/[token]/initials-field.tsx:115 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:121 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:147 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:149 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:194 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:126 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:152 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:150 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:195 #: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:101 #: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:128 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:133 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:167 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:193 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:167 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:195 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:168 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:196 #: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:54 #: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:101 -#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:258 +#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:224 #: packages/ui/primitives/pdf-viewer.tsx:166 msgid "Error" msgstr "Error" @@ -2595,7 +2631,7 @@ msgid "Expires on {0}" msgstr "Expires on {0}" #: packages/ui/primitives/document-flow/add-settings.tsx:295 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:378 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:424 msgid "External ID" msgstr "External ID" @@ -2603,7 +2639,7 @@ msgstr "External ID" msgid "Failed to reseal document" msgstr "Failed to reseal document" -#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:259 +#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:225 msgid "Failed to save settings." msgstr "Failed to save settings." @@ -2616,16 +2652,20 @@ msgstr "Failed to update recipient" msgid "Failed to update webhook" msgstr "Failed to update webhook" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:93 +#: packages/email/templates/bulk-send-complete.tsx:55 +msgid "Failed: {failedCount}" +msgstr "Failed: {failedCount}" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:100 msgid "Field character limit" msgstr "Field character limit" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:62 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:44 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:44 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:44 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:69 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:51 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:46 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:51 #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:130 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:107 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:114 msgid "Field font size" msgstr "Field font size" @@ -2633,19 +2673,19 @@ msgstr "Field font size" msgid "Field format" msgstr "Field format" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:53 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:60 msgid "Field label" msgstr "Field label" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:65 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:72 msgid "Field placeholder" msgstr "Field placeholder" -#: packages/lib/utils/document-audit-logs.ts:294 +#: packages/lib/utils/document-audit-logs.ts:310 msgid "Field signed" msgstr "Field signed" -#: packages/lib/utils/document-audit-logs.ts:298 +#: packages/lib/utils/document-audit-logs.ts:314 msgid "Field unsigned" msgstr "Field unsigned" @@ -2653,16 +2693,20 @@ msgstr "Field unsigned" msgid "Fields" msgstr "Fields" -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:130 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:124 msgid "File cannot be larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB" msgstr "File cannot be larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:56 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:38 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:38 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:38 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:513 +msgid "File size exceeds the limit of {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB" +msgstr "File size exceeds the limit of {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:63 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:45 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:40 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:45 #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:124 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:101 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:108 msgid "Font Size" msgstr "Font Size" @@ -2670,6 +2714,10 @@ msgstr "Font Size" msgid "For any questions regarding this disclosure, electronic signatures, or any related process, please contact us at: <0>{SUPPORT_EMAIL}" msgstr "For any questions regarding this disclosure, electronic signatures, or any related process, please contact us at: <0>{SUPPORT_EMAIL}" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:147 +msgid "For each recipient, provide their email (required) and name (optional) in separate columns. Download the template CSV below for the correct format." +msgstr "For each recipient, provide their email (required) and name (optional) in separate columns. Download the template CSV below for the correct format." + #: packages/lib/server-only/auth/send-forgot-password.ts:61 msgid "Forgot Password?" msgstr "Forgot Password?" @@ -2686,16 +2734,16 @@ msgstr "Free Signature" #: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:330 #: apps/web/src/app/(signing)/sign/[token]/form.tsx:191 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:193 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:210 #: apps/web/src/app/embed/direct/[[...url]]/client.tsx:392 #: apps/web/src/app/embed/sign/[[...url]]/client.tsx:272 -#: apps/web/src/components/forms/profile.tsx:110 +#: apps/web/src/components/forms/profile.tsx:101 #: apps/web/src/components/forms/v2/signup.tsx:316 msgid "Full Name" msgstr "Full Name" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:166 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:77 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:142 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:76 #: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:62 #: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:44 #: apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx:52 @@ -2771,7 +2819,7 @@ msgstr "Here you can set preferences and defaults for branding." msgid "Here you can set preferences and defaults for your team." msgstr "Here you can set preferences and defaults for your team." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:206 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:201 msgid "Here's how it works:" msgstr "Here's how it works:" @@ -2779,13 +2827,17 @@ msgstr "Here's how it works:" msgid "Hey I’m Timur" msgstr "Hey I’m Timur" +#: packages/email/templates/bulk-send-complete.tsx:36 +msgid "Hi {userName}," +msgstr "Hi {userName}," + #: packages/email/templates/reset-password.tsx:56 msgid "Hi, {userName} <0>({userEmail})" msgstr "Hi, {userName} <0>({userEmail})" -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:189 -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:202 -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:155 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:183 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:201 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:154 msgid "Hide" msgstr "Hide" @@ -2846,8 +2898,8 @@ msgstr "Inbox documents" msgid "Include the Signing Certificate in the Document" msgstr "Include the Signing Certificate in the Document" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:53 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:50 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:54 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:51 msgid "Information" msgstr "Information" @@ -2877,10 +2929,6 @@ msgstr "Invalid code. Please try again." msgid "Invalid email" msgstr "Invalid email" -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:105 -msgid "Invalid file" -msgstr "Invalid file" - #: apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx:33 #: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:36 msgid "Invalid link" @@ -2903,11 +2951,11 @@ msgstr "Invitation accepted!" msgid "Invitation declined" msgstr "Invitation declined" -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:78 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:77 msgid "Invitation has been deleted" msgstr "Invitation has been deleted" -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:61 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:60 msgid "Invitation has been resent" msgstr "Invitation has been resent" @@ -2927,7 +2975,7 @@ msgstr "Invite Members" msgid "Invite team members" msgstr "Invite team members" -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:126 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:125 msgid "Invited At" msgstr "Invited At" @@ -2936,7 +2984,7 @@ msgid "Invoice" msgstr "Invoice" #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:47 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:235 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:237 msgid "IP Address" msgstr "IP Address" @@ -2970,13 +3018,13 @@ msgstr "Join {teamName} on Documenso" #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:67 #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:72 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:48 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:55 msgid "Label" msgstr "Label" #: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:286 #: packages/ui/primitives/document-flow/add-settings.tsx:187 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:162 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:184 msgid "Language" msgstr "Language" @@ -2992,8 +3040,8 @@ msgstr "Last 30 days" msgid "Last 7 days" msgstr "Last 7 days" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:41 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:38 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:42 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:39 msgid "Last modified" msgstr "Last modified" @@ -3001,7 +3049,7 @@ msgstr "Last modified" msgid "Last updated" msgstr "Last updated" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:121 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:122 msgid "Last Updated" msgstr "Last Updated" @@ -3043,11 +3091,11 @@ msgstr "Like to have your own public profile with agreements?" msgid "Link expires in 1 hour." msgstr "Link expires in 1 hour." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:216 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:215 msgid "Link template" msgstr "Link template" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:338 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:314 msgid "Links Generated" msgstr "Links Generated" @@ -3068,7 +3116,7 @@ msgstr "Loading document..." #: apps/web/src/app/(dashboard)/documents/[id]/loading.tsx:20 #: apps/web/src/app/(dashboard)/documents/[id]/sent/page.tsx:19 -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:91 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:90 msgid "Loading Document..." msgstr "Loading Document..." @@ -3099,7 +3147,7 @@ msgstr "Manage {0}'s profile" msgid "Manage all teams you are currently associated with." msgstr "Manage all teams you are currently associated with." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:161 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:164 msgid "Manage and view template" msgstr "Manage and view template" @@ -3107,7 +3155,7 @@ msgstr "Manage and view template" msgid "Manage billing" msgstr "Manage billing" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:341 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:339 msgid "Manage details for this public template" msgstr "Manage details for this public template" @@ -3143,7 +3191,7 @@ msgstr "Manage team subscription." msgid "Manage teams" msgstr "Manage teams" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:367 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:361 msgid "Manage the direct link signing for this template" msgstr "Manage the direct link signing for this template" @@ -3179,10 +3227,14 @@ msgstr "MAU (created document)" msgid "MAU (had document completed)" msgstr "MAU (had document completed)" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:188 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:209 msgid "Max" msgstr "Max" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:227 +msgid "Maximum file size: 4MB. Maximum 100 rows per upload. Blank values will use template defaults." +msgstr "Maximum file size: 4MB. Maximum 100 rows per upload. Blank values will use template defaults." + #: packages/lib/constants/teams.ts:12 msgid "Member" msgstr "Member" @@ -3199,11 +3251,11 @@ msgid "Members" msgstr "Members" #: packages/ui/primitives/document-flow/add-subject.tsx:160 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:338 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:384 msgid "Message <0>(Optional)" msgstr "Message <0>(Optional)" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:176 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:197 msgid "Min" msgstr "Min" @@ -3238,8 +3290,8 @@ msgstr "Move Document to Team" msgid "Move Template to Team" msgstr "Move Template to Team" -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:174 -#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:85 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:168 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:87 msgid "Move to Team" msgstr "Move to Team" @@ -3258,10 +3310,10 @@ msgstr "My templates" #: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:66 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:144 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table.tsx:59 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:287 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:294 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:299 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:306 #: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:118 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:170 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:175 #: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:153 #: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:141 #: apps/web/src/components/forms/signup.tsx:160 @@ -3269,7 +3321,7 @@ msgstr "My templates" #: packages/ui/primitives/document-flow/add-signers.tsx:549 #: packages/ui/primitives/document-flow/add-signers.tsx:555 #: packages/ui/primitives/document-flow/types.ts:55 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:706 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:784 #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:505 #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:511 msgid "Name" @@ -3303,8 +3355,8 @@ msgstr "Never expire" msgid "New team owner" msgstr "New team owner" -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:96 -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:103 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:95 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:102 msgid "New Template" msgstr "New Template" @@ -3330,7 +3382,7 @@ msgstr "No further action is required from you at this time." msgid "No payment required" msgstr "No payment required" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:125 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:120 msgid "No public profile templates found" msgstr "No public profile templates found" @@ -3338,12 +3390,12 @@ msgstr "No public profile templates found" msgid "No recent activity" msgstr "No recent activity" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:101 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:99 msgid "No recent documents" msgstr "No recent documents" #: packages/ui/primitives/document-flow/add-fields.tsx:705 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:520 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:598 msgid "No recipient matching this description was found." msgstr "No recipient matching this description was found." @@ -3355,7 +3407,7 @@ msgid "No recipients" msgstr "No recipients" #: packages/ui/primitives/document-flow/add-fields.tsx:720 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:535 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:613 msgid "No recipients with this role" msgstr "No recipients with this role" @@ -3382,11 +3434,11 @@ msgstr "No signature field found" msgid "No token provided" msgstr "No token provided" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:284 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:282 msgid "No valid direct templates found" msgstr "No valid direct templates found" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:293 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:288 msgid "No valid recipients found" msgstr "No valid recipients found" @@ -3414,10 +3466,10 @@ msgstr "Not supported" msgid "Nothing to do" msgstr "Nothing to do" -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:271 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:284 #: packages/ui/primitives/document-flow/add-fields.tsx:997 #: packages/ui/primitives/document-flow/types.ts:56 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:784 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:862 msgid "Number" msgstr "Number" @@ -3459,7 +3511,7 @@ msgstr "On this page, you can create new Webhooks and manage the existing ones." msgid "On this page, you can edit the webhook and its settings." msgstr "On this page, you can edit the webhook and its settings." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:136 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:135 msgid "Once confirmed, the following will occur:" msgstr "Once confirmed, the following will occur:" @@ -3499,7 +3551,7 @@ msgstr "Oops! Something went wrong." msgid "Opened" msgstr "Opened" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:337 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:332 #: apps/web/src/components/forms/signup.tsx:239 #: apps/web/src/components/forms/signup.tsx:263 #: apps/web/src/components/forms/v2/signup.tsx:387 @@ -3510,12 +3562,12 @@ msgstr "Or" msgid "Or continue with" msgstr "Or continue with" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:340 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:351 msgid "Otherwise, the document will be created as a draft." msgstr "Otherwise, the document will be created as a draft." #: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:86 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:103 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:104 #: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:81 #: apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx:84 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:107 @@ -3624,7 +3676,7 @@ msgid "Payment overdue" msgstr "Payment overdue" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:131 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:207 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:205 #: apps/web/src/components/(teams)/tables/teams-member-page-data-table.tsx:82 #: apps/web/src/components/(teams)/tables/user-settings-teams-page-data-table.tsx:77 #: apps/web/src/components/document/document-read-only-fields.tsx:89 @@ -3675,11 +3727,11 @@ msgstr "Pick any of the following agreements below and start signing to get star #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:79 #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:84 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:60 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:67 msgid "Placeholder" msgstr "Placeholder" -#: packages/email/template-components/template-document-invite.tsx:56 +#: packages/email/template-components/template-document-invite.tsx:55 msgid "Please {0} your document<0/>\"{documentName}\"" msgstr "Please {0} your document<0/>\"{documentName}\"" @@ -3719,7 +3771,7 @@ msgstr "Please confirm your email" msgid "Please confirm your email address" msgstr "Please confirm your email address" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:176 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:175 msgid "Please contact support if you would like to revert this action." msgstr "Please contact support if you would like to revert this action." @@ -3736,19 +3788,19 @@ msgstr "Please enter a valid name." msgid "Please mark as viewed to complete" msgstr "Please mark as viewed to complete" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:459 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:453 msgid "Please note that proceeding will remove direct linking recipient and turn it into a placeholder." msgstr "Please note that proceeding will remove direct linking recipient and turn it into a placeholder." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:130 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:129 msgid "Please note that this action is <0>irreversible." msgstr "Please note that this action is <0>irreversible." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:121 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:120 msgid "Please note that this action is <0>irreversible. Once confirmed, this document will be permanently deleted." msgstr "Please note that this action is <0>irreversible. Once confirmed, this document will be permanently deleted." -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:67 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:62 msgid "Please note that this action is irreversible. Once confirmed, your template will be permanently deleted." msgstr "Please note that this action is irreversible. Once confirmed, your template will be permanently deleted." @@ -3780,6 +3832,10 @@ msgstr "Please provide a token from your authenticator, or a backup code." msgid "Please review the document before signing." msgstr "Please review the document before signing." +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:503 +msgid "Please select a PDF file" +msgstr "Please select a PDF file" + #: apps/web/src/components/forms/send-confirmation-email.tsx:64 msgid "Please try again and make sure you enter the correct email address." msgstr "Please try again and make sure you enter the correct email address." @@ -3788,7 +3844,7 @@ msgstr "Please try again and make sure you enter the correct email address." msgid "Please try again later or login using your normal details" msgstr "Please try again later or login using your normal details" -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:80 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:79 msgid "Please try again later." msgstr "Please try again later." @@ -3797,7 +3853,7 @@ msgstr "Please try again later." msgid "Please try again or contact our support." msgstr "Please try again or contact our support." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:186 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:185 msgid "Please type {0} to confirm" msgstr "Please type {0} to confirm" @@ -3805,6 +3861,10 @@ msgstr "Please type {0} to confirm" msgid "Please type <0>{0} to confirm." msgstr "Please type <0>{0} to confirm." +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:172 +msgid "Pre-formatted CSV template with example data." +msgstr "Pre-formatted CSV template with example data." + #: apps/web/src/components/(dashboard)/common/command-menu.tsx:214 #: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:58 #: apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx:67 @@ -3835,16 +3895,16 @@ msgstr "Private templates can only be modified and viewed by you." msgid "Profile" msgstr "Profile" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:184 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:183 msgid "Profile is currently <0>hidden." msgstr "Profile is currently <0>hidden." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:172 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:171 msgid "Profile is currently <0>visible." msgstr "Profile is currently <0>visible." #: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:74 -#: apps/web/src/components/forms/profile.tsx:72 +#: apps/web/src/components/forms/profile.tsx:71 msgid "Profile updated" msgstr "Profile updated" @@ -3883,9 +3943,9 @@ msgstr "Radio values" #: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:186 #: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:147 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:156 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:177 #: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:122 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:133 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:161 msgid "Read only" msgstr "Read only" @@ -3901,7 +3961,7 @@ msgstr "Read the full <0>signature disclosure." msgid "Ready" msgstr "Ready" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:289 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:291 msgid "Reason" msgstr "Reason" @@ -3930,21 +3990,21 @@ msgstr "Receives copy" msgid "Recent activity" msgstr "Recent activity" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:45 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:43 msgid "Recent documents" msgstr "Recent documents" #: apps/web/src/app/(dashboard)/documents/data-table.tsx:63 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:116 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:280 -#: packages/lib/utils/document-audit-logs.ts:338 -#: packages/lib/utils/document-audit-logs.ts:353 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:114 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:275 +#: packages/lib/utils/document-audit-logs.ts:354 +#: packages/lib/utils/document-audit-logs.ts:369 msgid "Recipient" msgstr "Recipient" #: packages/ui/components/recipient/recipient-action-auth-select.tsx:39 #: packages/ui/primitives/document-flow/add-settings.tsx:269 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:291 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:337 msgid "Recipient action authentication" msgstr "Recipient action authentication" @@ -3967,7 +4027,7 @@ msgstr "Recipient updated" #: apps/web/src/app/(dashboard)/admin/documents/[id]/page.tsx:66 #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:49 #: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recipients.tsx:30 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:139 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:140 msgid "Recipients" msgstr "Recipients" @@ -3975,7 +4035,7 @@ msgstr "Recipients" msgid "Recipients metrics" msgstr "Recipients metrics" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:166 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:165 msgid "Recipients will still retain their copy of the document" msgstr "Recipients will still retain their copy of the document" @@ -3992,7 +4052,7 @@ msgid "Red" msgstr "Red" #: packages/ui/primitives/document-flow/add-settings.tsx:383 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:461 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:507 msgid "Redirect URL" msgstr "Redirect URL" @@ -4005,7 +4065,7 @@ msgstr "Registration Successful" #: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:109 #: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:116 #: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:162 -#: packages/email/template-components/template-document-invite.tsx:96 +#: packages/email/template-components/template-document-invite.tsx:95 msgid "Reject Document" msgstr "Reject Document" @@ -4042,17 +4102,18 @@ msgstr "Reminder: Please {recipientActionVerb} this document" msgid "Reminder: Please {recipientActionVerb} your document" msgstr "Reminder: Please {recipientActionVerb} your document" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:193 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:431 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:188 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:425 #: apps/web/src/app/(signing)/sign/[token]/signing-field-container.tsx:156 #: apps/web/src/app/(signing)/sign/[token]/signing-field-container.tsx:180 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:250 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx:89 #: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:159 #: apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx:54 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:164 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:163 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:165 #: apps/web/src/components/forms/avatar-image.tsx:166 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:217 #: packages/ui/primitives/document-flow/add-fields.tsx:1128 msgid "Remove" msgstr "Remove" @@ -4080,9 +4141,9 @@ msgstr "Request transfer" #: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:176 #: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:137 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:146 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:167 #: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:112 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:123 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:151 msgid "Required field" msgstr "Required field" @@ -4091,7 +4152,7 @@ msgid "Reseal document" msgstr "Reseal document" #: apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx:118 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:152 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:151 #: packages/ui/primitives/document-flow/add-subject.tsx:84 msgid "Resend" msgstr "Resend" @@ -4172,11 +4233,11 @@ msgstr "Revoke" msgid "Revoke access" msgstr "Revoke access" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:283 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:278 #: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:318 #: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:163 #: apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx:80 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:121 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:120 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:103 msgid "Role" msgstr "Role" @@ -4190,16 +4251,16 @@ msgstr "Roles" msgid "Rows per page" msgstr "Rows per page" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:446 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:337 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:344 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:440 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:350 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:361 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:312 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:305 -#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:356 +#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:322 msgid "Save" msgstr "Save" -#: packages/ui/primitives/template-flow/add-template-fields.tsx:896 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:974 msgid "Save Template" msgstr "Save Template" @@ -4214,7 +4275,7 @@ msgstr "Search" msgid "Search by document title" msgstr "Search by document title" -#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:147 +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:174 #: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:144 msgid "Search by name or email" msgstr "Search by name or email" @@ -4261,11 +4322,11 @@ msgstr "Select a team to move this document to. This action cannot be undone." msgid "Select a team to move this template to. This action cannot be undone." msgstr "Select a team to move this template to. This action cannot be undone." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:261 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:259 msgid "Select a template you'd like to display on your public profile" msgstr "Select a template you'd like to display on your public profile" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:257 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:255 msgid "Select a template you'd like to display on your team's public profile" msgstr "Select a template you'd like to display on your team's public profile" @@ -4296,7 +4357,7 @@ msgstr "Send" msgid "Send confirmation email" msgstr "Send confirmation email" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:325 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:336 msgid "Send document" msgstr "Send document" @@ -4324,6 +4385,10 @@ msgstr "Send document pending email" msgid "Send documents on behalf of the team using the email address" msgstr "Send documents on behalf of the team using the email address" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:253 +msgid "Send documents to recipients immediately" +msgstr "Send documents to recipients immediately" + #: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:200 msgid "Send on Behalf of Team" msgstr "Send on Behalf of Team" @@ -4357,7 +4422,7 @@ msgid "Sending..." msgstr "Sending..." #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:101 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:256 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:258 msgid "Sent" msgstr "Sent" @@ -4376,8 +4441,8 @@ msgstr "Settings" msgid "Setup" msgstr "Setup" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:148 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:193 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:154 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:187 msgid "Share" msgstr "Share" @@ -4385,8 +4450,8 @@ msgstr "Share" msgid "Share Signature Card" msgstr "Share Signature Card" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:179 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:219 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:185 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:213 msgid "Share Signing Card" msgstr "Share Signing Card" @@ -4398,7 +4463,7 @@ msgstr "Share the Link" msgid "Share your signing experience!" msgstr "Share your signing experience!" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:163 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:162 msgid "Show" msgstr "Show" @@ -4419,13 +4484,13 @@ msgstr "Show templates in your public profile for your audience to sign and get msgid "Show templates in your team public profile for your audience to sign and get started quickly" msgstr "Show templates in your team public profile for your audience to sign and get started quickly" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:83 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:114 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:139 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:89 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:115 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:133 #: apps/web/src/app/(profile)/p/[url]/page.tsx:192 #: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:229 #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:182 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:224 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:241 #: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:142 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:328 #: apps/web/src/components/ui/user-profile-skeleton.tsx:75 @@ -4438,7 +4503,7 @@ msgstr "Sign" msgid "Sign as {0} <0>({1})" msgstr "Sign as {0} <0>({1})" -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:183 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:200 msgid "Sign as<0>{0} <1>({1})" msgstr "Sign as<0>{0} <1>({1})" @@ -4448,7 +4513,7 @@ msgid "Sign document" msgstr "Sign document" #: apps/web/src/app/(signing)/sign/[token]/form.tsx:141 -#: packages/email/template-components/template-document-invite.tsx:104 +#: packages/email/template-components/template-document-invite.tsx:103 msgid "Sign Document" msgstr "Sign Document" @@ -4501,22 +4566,22 @@ msgid "Sign Up with OIDC" msgstr "Sign Up with OIDC" #: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:88 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:177 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:179 #: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:342 #: apps/web/src/app/(signing)/sign/[token]/form.tsx:205 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:251 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:286 #: apps/web/src/app/embed/direct/[[...url]]/client.tsx:422 #: apps/web/src/app/embed/sign/[[...url]]/client.tsx:301 -#: apps/web/src/components/forms/profile.tsx:132 +#: apps/web/src/components/forms/profile.tsx:123 #: packages/ui/primitives/document-flow/add-fields.tsx:841 #: packages/ui/primitives/document-flow/field-icon.tsx:52 #: packages/ui/primitives/document-flow/types.ts:49 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:628 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:706 msgid "Signature" msgstr "Signature" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:228 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:230 msgid "Signature ID" msgstr "Signature ID" @@ -4536,7 +4601,7 @@ msgid "Signatures will appear once the document has been completed" msgstr "Signatures will appear once the document has been completed" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:114 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:278 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:280 #: apps/web/src/components/document/document-read-only-fields.tsx:84 #: packages/lib/constants/recipient-roles.ts:23 msgid "Signed" @@ -4546,7 +4611,7 @@ msgstr "Signed" msgid "Signer" msgstr "Signer" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:176 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:178 msgid "Signer Events" msgstr "Signer Events" @@ -4562,11 +4627,11 @@ msgstr "Signers must have unique emails" msgid "Signing" msgstr "Signing" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:168 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:170 msgid "Signing Certificate" msgstr "Signing Certificate" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:311 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:313 msgid "Signing certificate provided by" msgstr "Signing certificate provided by" @@ -4580,12 +4645,12 @@ msgstr "Signing Complete!" msgid "Signing in..." msgstr "Signing in..." -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:160 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:203 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:166 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:197 msgid "Signing Links" msgstr "Signing Links" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:339 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:315 msgid "Signing links have been generated for this document." msgstr "Signing links have been generated for this document." @@ -4593,7 +4658,7 @@ msgstr "Signing links have been generated for this document." msgid "Signing up..." msgstr "Signing up..." -#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:82 +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:90 #: apps/web/src/app/(dashboard)/admin/leaderboard/page.tsx:46 msgid "Signing Volume" msgstr "Signing Volume" @@ -4606,7 +4671,7 @@ msgstr "Signups are disabled." msgid "Since {0}" msgstr "Since {0}" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:102 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:93 msgid "Site Banner" msgstr "Site Banner" @@ -4620,27 +4685,27 @@ msgid "Some signers have not been assigned a signature field. Please assign at l msgstr "Some signers have not been assigned a signature field. Please assign at least 1 signature field to each signer before proceeding." #: apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx:105 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:63 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:91 -#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:65 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:69 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:97 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:61 #: apps/web/src/app/(dashboard)/documents/[id]/logs/download-certificate-button.tsx:68 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:75 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:106 -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:82 -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:72 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:76 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:100 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:81 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:71 #: apps/web/src/app/(dashboard)/settings/billing/billing-plans.tsx:62 #: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:51 -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:124 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:123 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:73 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:93 #: apps/web/src/app/(dashboard)/settings/teams/accept-team-invitation-button.tsx:32 #: apps/web/src/app/(dashboard)/settings/teams/decline-team-invitation-button.tsx:32 #: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:44 -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:50 -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:79 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:104 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:127 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:151 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:45 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:78 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:100 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:123 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:147 #: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:118 #: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:27 #: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:38 @@ -4656,8 +4721,8 @@ msgstr "Some signers have not been assigned a signature field. Please assign at #: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:64 #: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:83 #: apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx:33 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:66 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:83 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:65 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:82 #: apps/web/src/components/(teams)/team-billing-portal-button.tsx:29 #: packages/ui/components/document/document-share-button.tsx:51 msgid "Something went wrong" @@ -4696,12 +4761,16 @@ msgstr "Something went wrong!" msgid "Something went wrong." msgstr "Something went wrong." +#: apps/web/src/components/forms/token.tsx:143 +msgid "Something went wrong. Please try again later." +msgstr "Something went wrong. Please try again later." + #: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:240 #: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:154 msgid "Something went wrong. Please try again or contact support." msgstr "Something went wrong. Please try again or contact support." -#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:67 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:63 msgid "Sorry, we were unable to download the audit logs. Please try again later." msgstr "Sorry, we were unable to download the audit logs. Please try again later." @@ -4709,7 +4778,7 @@ msgstr "Sorry, we were unable to download the audit logs. Please try again later msgid "Sorry, we were unable to download the certificate. Please try again later." msgstr "Sorry, we were unable to download the certificate. Please try again later." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:134 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:132 msgid "Source" msgstr "Source" @@ -4720,8 +4789,8 @@ msgstr "Stats" #: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:81 #: apps/web/src/app/(dashboard)/admin/subscriptions/page.tsx:32 #: apps/web/src/app/(dashboard)/documents/data-table.tsx:73 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:126 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:93 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:124 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:94 #: apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx:73 msgid "Status" msgstr "Status" @@ -4731,7 +4800,7 @@ msgid "Step <0>{step} of {maxStep}" msgstr "Step <0>{step} of {maxStep}" #: packages/ui/primitives/document-flow/add-subject.tsx:143 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:318 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:364 msgid "Subject <0>(Optional)" msgstr "Subject <0>(Optional)" @@ -4757,8 +4826,8 @@ msgstr "Subscriptions" #: apps/web/src/app/(dashboard)/settings/teams/accept-team-invitation-button.tsx:25 #: apps/web/src/app/(dashboard)/settings/teams/decline-team-invitation-button.tsx:25 #: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:37 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:118 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:141 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:114 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:137 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx:32 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:44 #: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:44 @@ -4775,11 +4844,12 @@ msgstr "Subscriptions" #: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:92 #: apps/web/src/components/(teams)/forms/update-team-form.tsx:67 #: apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx:27 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:60 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:77 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:59 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:76 #: apps/web/src/components/forms/public-profile-form.tsx:80 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:133 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:170 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:132 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:168 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:95 msgid "Success" msgstr "Success" @@ -4787,6 +4857,14 @@ msgstr "Success" msgid "Successfully created passkey" msgstr "Successfully created passkey" +#: packages/email/templates/bulk-send-complete.tsx:52 +msgid "Successfully created: {successCount}" +msgstr "Successfully created: {successCount}" + +#: packages/email/templates/bulk-send-complete.tsx:44 +msgid "Summary:" +msgstr "Summary:" + #: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:57 msgid "System Requirements" msgstr "System Requirements" @@ -4858,7 +4936,7 @@ msgstr "Team invitation" msgid "Team invitations have been sent." msgstr "Team invitations have been sent." -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:107 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:106 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:84 msgid "Team Member" msgstr "Team Member" @@ -4935,31 +5013,31 @@ msgstr "Teams restricted" #: apps/web/src/app/(dashboard)/templates/[id]/edit/template-edit-page-view.tsx:64 #: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:39 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:144 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:224 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:148 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:142 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:222 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:151 #: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:408 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:271 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:269 msgid "Template" msgstr "Template" -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:41 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:36 msgid "Template deleted" msgstr "Template deleted" -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:67 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:66 msgid "Template document uploaded" msgstr "Template document uploaded" -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:42 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:41 msgid "Template duplicated" msgstr "Template duplicated" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:134 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:133 msgid "Template has been removed from your public profile." msgstr "Template has been removed from your public profile." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:171 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:169 msgid "Template has been updated." msgstr "Template has been updated." @@ -4971,15 +5049,15 @@ msgstr "Template moved" msgid "Template not found or already associated with a team." msgstr "Template not found or already associated with a team." -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:246 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:216 msgid "Template saved" msgstr "Template saved" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:145 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:167 msgid "Template title" msgstr "Template title" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:86 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:87 #: apps/web/src/app/(dashboard)/templates/templates-page-view.tsx:55 #: apps/web/src/components/(dashboard)/common/command-menu.tsx:208 #: apps/web/src/components/(dashboard)/layout/desktop-nav.tsx:22 @@ -4987,19 +5065,28 @@ msgstr "Template title" msgid "Templates" msgstr "Templates" -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:106 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:105 msgid "Templates allow you to quickly generate documents with pre-filled recipients and fields." msgstr "Templates allow you to quickly generate documents with pre-filled recipients and fields." -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:257 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:274 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:258 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:287 #: packages/ui/primitives/document-flow/add-fields.tsx:971 #: packages/ui/primitives/document-flow/types.ts:52 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:758 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:836 msgid "Text" msgstr "Text" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:166 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:79 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:61 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:56 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:61 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:140 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:124 +msgid "Text Align" +msgstr "Text Align" + +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:157 msgid "Text Color" msgstr "Text Color" @@ -5011,7 +5098,7 @@ msgstr "Thank you for using Documenso to perform your electronic document signin msgid "That's okay, it happens! Click the button below to reset your password." msgstr "That's okay, it happens! Click the button below to reset your password." -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:51 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:52 msgid "The account has been deleted successfully." msgstr "The account has been deleted successfully." @@ -5035,13 +5122,13 @@ msgstr "The authentication required for recipients to sign the signature field." msgid "The authentication required for recipients to view the document." msgstr "The authentication required for recipients to view the document." -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:197 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:188 msgid "The content to show in the banner, HTML is allowed" msgstr "The content to show in the banner, HTML is allowed" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:78 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:73 #: apps/web/src/app/(dashboard)/templates/template-direct-link-badge.tsx:32 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:164 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:160 msgid "The direct link has been copied to your clipboard" msgstr "The direct link has been copied to your clipboard" @@ -5061,15 +5148,15 @@ msgstr "The document owner has been notified of this rejection. No further actio msgid "The document owner has been notified of your decision. They may contact you with further instructions if necessary." msgstr "The document owner has been notified of your decision. They may contact you with further instructions if necessary." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:182 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:194 msgid "The document was created but could not be sent to recipients." msgstr "The document was created but could not be sent to recipients." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:163 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:162 msgid "The document will be hidden from your account" msgstr "The document will be hidden from your account" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:333 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:344 msgid "The document will be immediately sent to recipients if this is checked." msgstr "The document will be immediately sent to recipients if this is checked." @@ -5083,6 +5170,10 @@ msgstr "The document's name" msgid "The events that will trigger a webhook to be sent to your URL." msgstr "The events that will trigger a webhook to be sent to your URL." +#: packages/email/templates/bulk-send-complete.tsx:62 +msgid "The following errors occurred:" +msgstr "The following errors occurred:" + #: packages/email/templates/team-delete.tsx:37 msgid "The following team has been deleted by its owner. You will no longer be able to access this team and its documents" msgstr "The following team has been deleted by its owner. You will no longer be able to access this team and its documents" @@ -5111,11 +5202,11 @@ msgstr "The profile link has been copied to your clipboard" msgid "The profile you are looking for could not be found." msgstr "The profile you are looking for could not be found." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:380 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:378 msgid "The public description that will be displayed with this template" msgstr "The public description that will be displayed with this template" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:358 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:356 msgid "The public name for your template" msgstr "The public name for your template" @@ -5170,7 +5261,7 @@ msgstr "The signer's name" msgid "The signing link has been copied to your clipboard." msgstr "The signing link has been copied to your clipboard." -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:105 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:96 msgid "The site banner is a message that is shown at the top of the site. It can be used to display important information to your users." msgstr "The site banner is a message that is shown at the top of the site. It can be used to display important information to your users." @@ -5194,7 +5285,7 @@ msgstr "The team you are looking for may have been removed, renamed or may have msgid "The template has been successfully moved to the selected team." msgstr "The template has been successfully moved to the selected team." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:443 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:441 msgid "The template will be removed from your profile" msgstr "The template will be removed from your profile" @@ -5202,7 +5293,7 @@ msgstr "The template will be removed from your profile" msgid "The template you are looking for may have been disabled, deleted or may have never existed." msgstr "The template you are looking for may have been disabled, deleted or may have never existed." -#: apps/web/src/components/forms/token.tsx:106 +#: apps/web/src/components/forms/token.tsx:107 msgid "The token was copied to your clipboard." msgstr "The token was copied to your clipboard." @@ -5245,8 +5336,8 @@ msgstr "There are no completed documents yet. Documents that you have created or msgid "They have permission on your behalf to:" msgstr "They have permission on your behalf to:" -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:110 -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:109 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:100 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:106 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:98 msgid "This action is not reversible. Please be certain." msgstr "This action is not reversible. Please be certain." @@ -5263,11 +5354,11 @@ msgstr "This can be overriden by setting the authentication requirements directl msgid "This document can not be recovered, if you would like to dispute the reason for future documents please contact support." msgstr "This document can not be recovered, if you would like to dispute the reason for future documents please contact support." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:83 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:82 msgid "This document could not be deleted at this time. Please try again." msgstr "This document could not be deleted at this time. Please try again." -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:73 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:72 msgid "This document could not be duplicated at this time. Please try again." msgstr "This document could not be duplicated at this time. Please try again." @@ -5287,11 +5378,11 @@ 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/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:227 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:228 msgid "This document has been signed by all recipients" msgstr "This document has been signed by all recipients" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:230 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:231 msgid "This document is currently a draft and has not been sent" msgstr "This document is currently a draft and has not been sent" @@ -5299,11 +5390,11 @@ msgstr "This document is currently a draft and has not been sent" msgid "This document is password protected. Please enter the password to view the document." msgstr "This document is password protected. Please enter the password to view the document." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:148 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:146 msgid "This document was created by you or a team member using the template above." msgstr "This document was created by you or a team member using the template above." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:160 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:158 msgid "This document was created using a direct link." msgstr "This document was created using a direct link." @@ -5339,7 +5430,7 @@ msgstr "This email will be sent to the recipient who has just signed the documen msgid "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them." msgstr "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them." -#: packages/ui/primitives/template-flow/add-template-settings.tsx:233 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:279 msgid "This is how the document will reach the recipients once the document is ready for signing." msgstr "This is how the document will reach the recipients once the document is ready for signing." @@ -5379,7 +5470,7 @@ msgstr "This signer has already signed the document." msgid "This team, and any associated data excluding billing invoices will be permanently deleted." msgstr "This team, and any associated data excluding billing invoices will be permanently deleted." -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:51 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:46 msgid "This template could not be deleted at this time. Please try again." msgstr "This template could not be deleted at this time. Please try again." @@ -5420,7 +5511,7 @@ msgstr "This will be sent to the document owner once the document has been fully msgid "This will override any global settings." msgstr "This will override any global settings." -#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:71 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:70 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:44 msgid "Time" msgstr "Time" @@ -5429,15 +5520,15 @@ msgstr "Time" msgid "Time zone" msgstr "Time zone" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:131 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:132 #: packages/ui/primitives/document-flow/add-settings.tsx:359 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:438 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:484 msgid "Time Zone" msgstr "Time Zone" #: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:67 #: apps/web/src/app/(dashboard)/documents/data-table.tsx:54 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:111 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:109 #: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:61 #: packages/ui/primitives/document-flow/add-settings.tsx:166 msgid "Title" @@ -5451,13 +5542,13 @@ msgstr "To accept this invitation you must create an account." msgid "To change the email you must remove and add a new email address." msgstr "To change the email you must remove and add a new email address." -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:116 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:113 #: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:111 #: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:101 msgid "To confirm, please enter the accounts email address <0/>({0})." msgstr "To confirm, please enter the accounts email address <0/>({0})." -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:117 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:107 msgid "To confirm, please enter the reason" msgstr "To confirm, please enter the reason" @@ -5478,7 +5569,7 @@ msgid "To mark this document as viewed, you need to be logged in as <0>{0}" msgstr "To mark this document as viewed, you need to be logged in as <0>{0}" #: packages/ui/primitives/document-flow/add-fields.tsx:1091 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:876 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:954 msgid "To proceed further, please set at least one value for the {0} field." msgstr "To proceed further, please set at least one value for the {0} field." @@ -5490,11 +5581,11 @@ msgstr "To use our electronic signature service, you must have access to:" msgid "To view this document you need to be signed into your account, please sign in to continue." msgstr "To view this document you need to be signed into your account, please sign in to continue." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:178 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:177 msgid "Toggle the switch to hide your profile from the public." msgstr "Toggle the switch to hide your profile from the public." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:190 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:189 msgid "Toggle the switch to show your profile to the public." msgstr "Toggle the switch to show your profile to the public." @@ -5502,11 +5593,11 @@ msgstr "Toggle the switch to show your profile to the public." msgid "Token" msgstr "Token" -#: apps/web/src/components/forms/token.tsx:105 +#: apps/web/src/components/forms/token.tsx:106 msgid "Token copied to clipboard" msgstr "Token copied to clipboard" -#: apps/web/src/components/forms/token.tsx:126 +#: apps/web/src/components/forms/token.tsx:127 msgid "Token created" msgstr "Token created" @@ -5539,6 +5630,10 @@ msgstr "Total Documents" msgid "Total Recipients" msgstr "Total Recipients" +#: packages/email/templates/bulk-send-complete.tsx:49 +msgid "Total rows processed: {totalProcessed}" +msgstr "Total rows processed: {totalProcessed}" + #: apps/web/src/app/(dashboard)/admin/stats/page.tsx:150 msgid "Total Signers that Signed Up" msgstr "Total Signers that Signed Up" @@ -5624,11 +5719,11 @@ msgstr "Unable to change the language at this time. Please try again later." msgid "Unable to copy recovery code" msgstr "Unable to copy recovery code" -#: apps/web/src/components/forms/token.tsx:110 +#: apps/web/src/components/forms/token.tsx:111 msgid "Unable to copy token" msgstr "Unable to copy token" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:105 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:101 msgid "Unable to create direct template access. Please try again later." msgstr "Unable to create direct template access. Please try again later." @@ -5636,7 +5731,7 @@ msgstr "Unable to create direct template access. Please try again later." msgid "Unable to decline this team invitation at this time." msgstr "Unable to decline this team invitation at this time." -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:84 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:83 msgid "Unable to delete invitation. Please try again." msgstr "Unable to delete invitation. Please try again." @@ -5657,11 +5752,11 @@ msgstr "Unable to join this team at this time." msgid "Unable to load document history" msgstr "Unable to load document history" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:60 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:58 msgid "Unable to load documents" msgstr "Unable to load documents" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:111 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:106 msgid "Unable to load your public profile templates at this time" msgstr "Unable to load your public profile templates at this time" @@ -5673,7 +5768,7 @@ msgstr "Unable to remove email verification at this time. Please try again." msgid "Unable to remove team email at this time. Please try again." msgstr "Unable to remove team email at this time. Please try again." -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:67 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:66 msgid "Unable to resend invitation. Please try again." msgstr "Unable to resend invitation. Please try again." @@ -5704,10 +5799,10 @@ msgstr "Unauthorized" msgid "Uncompleted" msgstr "Uncompleted" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:237 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:262 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:273 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:284 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:239 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:264 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:275 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:286 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx:55 msgid "Unknown" msgstr "Unknown" @@ -5720,17 +5815,17 @@ msgstr "Unknown error" msgid "Unpaid" msgstr "Unpaid" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:181 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:176 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:162 #: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:166 #: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:191 #: apps/web/src/components/forms/public-profile-form.tsx:279 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:428 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:426 #: packages/ui/primitives/document-flow/add-subject.tsx:86 msgid "Update" msgstr "Update" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:211 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:202 msgid "Update Banner" msgstr "Update Banner" @@ -5742,7 +5837,7 @@ msgstr "Update passkey" msgid "Update password" msgstr "Update password" -#: apps/web/src/components/forms/profile.tsx:151 +#: apps/web/src/components/forms/profile.tsx:142 msgid "Update profile" msgstr "Update profile" @@ -5785,7 +5880,7 @@ msgstr "Update webhook" msgid "Updating password..." msgstr "Updating password..." -#: apps/web/src/components/forms/profile.tsx:151 +#: apps/web/src/components/forms/profile.tsx:142 msgid "Updating profile..." msgstr "Updating profile..." @@ -5797,10 +5892,30 @@ msgstr "Updating Your Information" msgid "Upgrade" msgstr "Upgrade" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:132 +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." + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:426 +msgid "Upload a custom document to use instead of the template's default document" +msgstr "Upload a custom document to use instead of the template's default document" + +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:267 +msgid "Upload and Process" +msgstr "Upload and Process" + #: apps/web/src/components/forms/avatar-image.tsx:179 msgid "Upload Avatar" msgstr "Upload Avatar" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:198 +msgid "Upload CSV" +msgstr "Upload CSV" + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:419 +msgid "Upload custom document" +msgstr "Upload custom document" + #: packages/ui/primitives/signature-pad/signature-pad.tsx:529 msgid "Upload Signature" msgstr "Upload Signature" @@ -5830,7 +5945,7 @@ msgstr "Uploaded file is too small" msgid "Uploaded file not an allowed file type" msgstr "Uploaded file not an allowed file type" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:172 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:175 msgid "Use" msgstr "Use" @@ -5844,11 +5959,11 @@ msgstr "Use Authenticator" msgid "Use Backup Code" msgstr "Use Backup Code" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:207 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:219 msgid "Use Template" msgstr "Use Template" -#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:76 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:75 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:45 msgid "User" msgstr "User" @@ -5861,6 +5976,7 @@ msgstr "User has no password." msgid "User ID" msgstr "User ID" +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:61 #: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:55 #: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:55 msgid "User not found." @@ -5887,7 +6003,7 @@ msgid "Users" msgstr "Users" #: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:132 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:167 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:188 msgid "Validation" msgstr "Validation" @@ -5925,14 +6041,14 @@ msgstr "Verify your email to upload documents." msgid "Verify your team email address" msgstr "Verify your team email address" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:75 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:76 msgid "Version History" msgstr "Version History" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:95 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:126 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:135 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:132 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:101 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:127 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:136 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:126 #: apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx:100 #: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:168 #: packages/lib/constants/recipient-roles.ts:29 @@ -5955,7 +6071,7 @@ msgstr "View all documents sent to your account" msgid "View all recent security activity related to your account." msgstr "View all recent security activity related to your account." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:155 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:153 msgid "View all related documents" msgstr "View all related documents" @@ -5972,7 +6088,7 @@ msgid "View document" msgstr "View document" #: apps/web/src/app/(signing)/sign/[token]/form.tsx:140 -#: packages/email/template-components/template-document-invite.tsx:105 +#: packages/email/template-components/template-document-invite.tsx:104 #: packages/email/template-components/template-document-rejected.tsx:44 #: packages/ui/primitives/document-flow/add-subject.tsx:90 #: packages/ui/primitives/document-flow/add-subject.tsx:91 @@ -5987,7 +6103,7 @@ msgstr "View documents associated with this email" msgid "View invites" msgstr "View invites" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:93 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:91 msgid "View more" msgstr "View more" @@ -6009,7 +6125,7 @@ msgid "View teams" msgstr "View teams" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:120 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:267 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:269 #: packages/lib/constants/recipient-roles.ts:30 msgid "Viewed" msgstr "Viewed" @@ -6068,7 +6184,7 @@ msgstr "We are unable to remove this passkey at the moment. Please try again lat msgid "We are unable to update this passkey at the moment. Please try again later." msgstr "We are unable to update this passkey at the moment. Please try again later." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:153 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:149 msgid "We encountered an error while removing the direct template link. Please try again later." msgstr "We encountered an error while removing the direct template link. Please try again later." @@ -6077,10 +6193,6 @@ msgstr "We encountered an error while removing the direct template link. Please msgid "We encountered an error while updating the webhook. Please try again later." msgstr "We encountered an error while updating the webhook. Please try again later." -#: apps/web/src/components/forms/token.tsx:145 -msgid "We encountered an unknown error while attempting create the new token. Please try again later." -msgstr "We encountered an unknown error while attempting create the new token. Please try again later." - #: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:102 msgid "We encountered an unknown error while attempting to add this email. Please try again later." msgstr "We encountered an unknown error while attempting to add this email. Please try again later." @@ -6105,7 +6217,6 @@ msgstr "We encountered an unknown error while attempting to delete this team. Pl msgid "We encountered an unknown error while attempting to delete this token. Please try again later." msgstr "We encountered an unknown error while attempting to delete this token. Please try again later." -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:70 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:58 msgid "We encountered an unknown error while attempting to delete your account. Please try again later." msgstr "We encountered an unknown error while attempting to delete your account. Please try again later." @@ -6118,7 +6229,7 @@ msgstr "We encountered an unknown error while attempting to invite team members. msgid "We encountered an unknown error while attempting to leave this team. Please try again later." msgstr "We encountered an unknown error while attempting to leave this team. Please try again later." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:143 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:142 msgid "We encountered an unknown error while attempting to remove this template from your profile. Please try again later." msgstr "We encountered an unknown error while attempting to remove this template from your profile. Please try again later." @@ -6146,7 +6257,6 @@ msgstr "We encountered an unknown error while attempting to revoke access. Pleas msgid "We encountered an unknown error while attempting to save your details. Please try again later." msgstr "We encountered an unknown error while attempting to save your details. Please try again later." -#: apps/web/src/components/forms/profile.tsx:89 #: apps/web/src/components/forms/signin.tsx:273 #: apps/web/src/components/forms/signin.tsx:288 #: apps/web/src/components/forms/signin.tsx:304 @@ -6160,11 +6270,11 @@ msgstr "We encountered an unknown error while attempting to sign you In. Please msgid "We encountered an unknown error while attempting to sign you Up. Please try again later." msgstr "We encountered an unknown error while attempting to sign you Up. Please try again later." -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:92 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:84 msgid "We encountered an unknown error while attempting to update the banner. Please try again later." msgstr "We encountered an unknown error while attempting to update the banner. Please try again later." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:180 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:178 msgid "We encountered an unknown error while attempting to update the template. Please try again later." msgstr "We encountered an unknown error while attempting to update the template. Please try again later." @@ -6189,6 +6299,10 @@ msgstr "We encountered an unknown error while attempting to update your team. Pl msgid "We encountered an unknown error while attempting update the team email. Please try again later." msgstr "We encountered an unknown error while attempting update the team email. Please try again later." +#: apps/web/src/components/forms/profile.tsx:81 +msgid "We encountered an unknown error while attempting update your profile. Please try again later." +msgstr "We encountered an unknown error while attempting update your profile. Please try again later." + #: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:80 msgid "We have sent a confirmation email for verification." msgstr "We have sent a confirmation email for verification." @@ -6201,7 +6315,7 @@ msgstr "We need a username to create your profile" msgid "We need your signature to sign documents" msgstr "We need your signature to sign documents" -#: apps/web/src/components/forms/token.tsx:111 +#: apps/web/src/components/forms/token.tsx:112 msgid "We were unable to copy the token to your clipboard. Please try again." msgstr "We were unable to copy the token to your clipboard. Please try again." @@ -6226,7 +6340,7 @@ msgstr "We were unable to disable two-factor authentication for your account. Pl msgid "We were unable to log you out at this time." msgstr "We were unable to log you out at this time." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:125 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:124 msgid "We were unable to set your public profile to public. Please try again." msgstr "We were unable to set your public profile to public. Please try again." @@ -6261,11 +6375,11 @@ msgstr "We were unable to verify your email. If your email is not verified alrea msgid "We will generate signing links for with you, which you can send to the recipients through your method of choice." msgstr "We will generate signing links for with you, which you can send to the recipients through your method of choice." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:369 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:382 msgid "We will generate signing links for you, which you can send to the recipients through your method of choice." msgstr "We will generate signing links for you, which you can send to the recipients through your method of choice." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:365 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:378 #: packages/ui/primitives/document-flow/add-subject.tsx:201 msgid "We won't send anything to notify recipients." msgstr "We won't send anything to notify recipients." @@ -6371,13 +6485,13 @@ msgstr "Write about yourself" msgid "Yearly" msgstr "Yearly" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:32 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:31 -#: packages/lib/utils/document-audit-logs.ts:258 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:33 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:32 +#: packages/lib/utils/document-audit-logs.ts:274 msgid "You" msgstr "You" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:105 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:104 msgid "You are about to delete <0>\"{documentTitle}\"" msgstr "You are about to delete <0>\"{documentTitle}\"" @@ -6385,7 +6499,7 @@ msgstr "You are about to delete <0>\"{documentTitle}\"" msgid "You are about to delete the following team email from <0>{teamName}." msgstr "You are about to delete the following team email from <0>{teamName}." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:109 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:108 msgid "You are about to hide <0>\"{documentTitle}\"" msgstr "You are about to hide <0>\"{documentTitle}\"" @@ -6421,6 +6535,10 @@ msgstr "You are currently updating the <0>{passkeyName} passkey." msgid "You are not a member of this team." msgstr "You are not a member of this team." +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:62 +msgid "You are not authorized to delete this user." +msgstr "You are not authorized to delete this user." + #: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:56 msgid "You are not authorized to disable this user." msgstr "You are not authorized to disable this user." @@ -6469,6 +6587,10 @@ msgstr "You can use the following variables in your message:" msgid "You can view documents associated with this email and use this identity when sending documents." msgstr "You can view documents associated with this email and use this identity when sending documents." +#: packages/email/templates/bulk-send-complete.tsx:76 +msgid "You can view the created documents in your dashboard under the \"Documents created from template\" section." +msgstr "You can view the created documents in your dashboard under the \"Documents created from template\" section." + #: packages/email/template-components/template-document-rejected.tsx:37 msgid "You can view the document and its status by clicking the button below." msgstr "You can view the document and its status by clicking the button below." @@ -6485,7 +6607,7 @@ msgstr "You cannot modify a team member who has a higher role than you." msgid "You cannot upload documents at this time." msgstr "You cannot upload documents at this time." -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:103 msgid "You cannot upload encrypted PDFs" msgstr "You cannot upload encrypted PDFs" @@ -6493,6 +6615,10 @@ msgstr "You cannot upload encrypted PDFs" msgid "You do not currently have a customer record, this should not happen. Please contact support for assistance." msgstr "You do not currently have a customer record, this should not happen. Please contact support for assistance." +#: apps/web/src/components/forms/token.tsx:141 +msgid "You do not have permission to create a token for this team" +msgstr "You do not have permission to create a token for this team" + #: packages/email/template-components/template-document-cancel.tsx:35 msgid "You don't need to sign it anymore." msgstr "You don't need to sign it anymore." @@ -6522,7 +6648,8 @@ msgstr "You have been invited to join {0} on Documenso" msgid "You have been invited to join the following team" msgstr "You have been invited to join the following team" -#: packages/lib/server-only/recipient/set-recipients-for-document.ts:337 +#: packages/lib/server-only/recipient/delete-document-recipient.ts:156 +#: packages/lib/server-only/recipient/set-document-recipients.ts:326 msgid "You have been removed from a document" msgstr "You have been removed from a document" @@ -6552,10 +6679,14 @@ msgstr "You have not yet created any templates. To create a template please uplo msgid "You have not yet created or received any documents. To create a document please upload one." msgstr "You have not yet created or received any documents. To create a document please upload one." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:234 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:229 msgid "You have reached the maximum limit of {0} direct templates. <0>Upgrade your account to continue!" msgstr "You have reached the maximum limit of {0} direct templates. <0>Upgrade your account to continue!" +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106 +msgid "You have reached your document limit for this month. Please upgrade your plan." +msgstr "You have reached your document limit for this month. Please upgrade your plan." + #: apps/web/src/app/(dashboard)/documents/upload-document.tsx:56 #: packages/ui/primitives/document-dropzone.tsx:69 msgid "You have reached your document limit." @@ -6621,7 +6752,7 @@ msgstr "You must enter '{deleteMessage}' to proceed" msgid "You must have at least one other team member to transfer ownership." msgstr "You must have at least one other team member to transfer ownership." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:109 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:108 msgid "You must set a profile URL before enabling your public profile." msgstr "You must set a profile URL before enabling your public profile." @@ -6657,7 +6788,7 @@ msgstr "Your account has been deleted successfully." msgid "Your avatar has been updated successfully." msgstr "Your avatar has been updated successfully." -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:75 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:74 msgid "Your banner has been updated successfully." msgstr "Your banner has been updated successfully." @@ -6669,19 +6800,27 @@ msgstr "Your brand website URL" msgid "Your branding preferences have been updated" msgstr "Your branding preferences have been updated" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:97 +msgid "Your bulk send has been initiated. You will receive an email notification upon completion." +msgstr "Your bulk send has been initiated. You will receive an email notification upon completion." + +#: packages/email/templates/bulk-send-complete.tsx:40 +msgid "Your bulk send operation for template \"{templateName}\" has completed." +msgstr "Your bulk send operation for template \"{templateName}\" has completed." + #: apps/web/src/app/(dashboard)/settings/billing/page.tsx:125 msgid "Your current plan is past due. Please update your payment information." msgstr "Your current plan is past due. Please update your payment information." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:251 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:249 msgid "Your direct signing templates" msgstr "Your direct signing templates" -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:129 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:123 msgid "Your document failed to upload." msgstr "Your document failed to upload." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:157 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:169 msgid "Your document has been created from the template successfully." msgstr "Your document has been created from the template successfully." @@ -6693,19 +6832,19 @@ msgstr "Your document has been deleted by an admin!" msgid "Your document has been re-sent successfully." msgstr "Your document has been re-sent successfully." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:328 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:304 msgid "Your document has been sent successfully." msgstr "Your document has been sent successfully." -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:59 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:58 msgid "Your document has been successfully duplicated." msgstr "Your document has been successfully duplicated." -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:87 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:86 msgid "Your document has been uploaded successfully." msgstr "Your document has been uploaded successfully." -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:69 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:68 msgid "Your document has been uploaded successfully. You will be redirected to the template page." msgstr "Your document has been uploaded successfully. You will be redirected to the template page." @@ -6748,7 +6887,7 @@ msgstr "Your password has been updated." msgid "Your payment for teams is overdue. Please settle the payment to avoid any service disruptions." msgstr "Your payment for teams is overdue. Please settle the payment to avoid any service disruptions." -#: apps/web/src/components/forms/profile.tsx:73 +#: apps/web/src/components/forms/profile.tsx:72 msgid "Your profile has been updated successfully." msgstr "Your profile has been updated successfully." @@ -6790,19 +6929,19 @@ msgstr "Your team has been successfully deleted." msgid "Your team has been successfully updated." msgstr "Your team has been successfully updated." -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:43 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:42 msgid "Your template has been duplicated successfully." msgstr "Your template has been duplicated successfully." -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:42 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:37 msgid "Your template has been successfully deleted." msgstr "Your template has been successfully deleted." -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:67 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:66 msgid "Your template will be duplicated." msgstr "Your template will be duplicated." -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:247 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:217 msgid "Your templates has been saved successfully." msgstr "Your templates has been saved successfully." diff --git a/packages/lib/translations/es/web.po b/packages/lib/translations/es/web.po index 13e951930..f1c407c5b 100644 --- a/packages/lib/translations/es/web.po +++ b/packages/lib/translations/es/web.po @@ -8,7 +8,7 @@ msgstr "" "Language: es\n" "Project-Id-Version: documenso-app\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2024-12-31 08:04\n" +"PO-Revision-Date: 2025-01-30 03:57\n" "Last-Translator: \n" "Language-Team: Spanish\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -22,7 +22,7 @@ msgstr "" msgid "\"{0}\" has invited you to sign \"example document\"." msgstr "\"{0}\" te ha invitado a firmar \"ejemplo de documento\"." -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:69 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:74 msgid "\"{0}\" will appear on the document as it has a timezone of \"{timezone}\"." msgstr "\"{0}\" aparecerá en el documento ya que tiene un huso horario de \"{timezone}\"." @@ -38,7 +38,7 @@ msgstr "“{documentName}” ha sido firmado" msgid "“{documentName}” was signed by all signers" msgstr "\"{documentName}\" fue firmado por todos los firmantes" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:62 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:61 msgid "\"{documentTitle}\" has been successfully deleted" msgstr "\"{documentTitle}\" ha sido eliminado con éxito" @@ -46,12 +46,12 @@ msgstr "\"{documentTitle}\" ha sido eliminado con éxito" msgid "\"{placeholderEmail}\" on behalf of \"{0}\" has invited you to sign \"example document\"." msgstr "\"{placeholderEmail}\" en nombre de \"{0}\" te ha invitado a firmar \"documento de ejemplo\"." -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:313 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:330 msgid "{0, plural, one {(1 character over)} other {(# characters over)}}" msgstr "{0, plural, one {(1 carácter excedido)} other {(# caracteres excedidos)}}" #: apps/web/src/components/forms/public-profile-form.tsx:237 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:395 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:393 msgid "{0, plural, one {# character over the limit} other {# characters over the limit}}" msgstr "{0, plural, one {# carácter sobre el límite} other {# caracteres sobre el límite}}" @@ -76,7 +76,7 @@ msgstr "{0, plural, one {1 campo que coincide} other {# campos que coinciden}}" msgid "{0, plural, one {1 Recipient} other {# Recipients}}" msgstr "{0, plural, one {1 Destinatario} other {# Destinatarios}}" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:238 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:239 msgid "{0, plural, one {Waiting on 1 recipient} other {Waiting on # recipients}}" msgstr "{0, plural, one {Esperando 1 destinatario} other {Esperando # destinatarios}}" @@ -88,7 +88,7 @@ msgstr "{0, plural, zero {Selecciona valores} other {# seleccionados...}}" msgid "{0}" msgstr "{0}" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:249 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:247 msgid "{0} direct signing templates" msgstr "{0} plantillas de firma directa" @@ -108,7 +108,7 @@ msgstr "{0} se unió al equipo {teamName} en Documenso" msgid "{0} left the team {teamName} on Documenso" msgstr "{0} dejó el equipo {teamName} en Documenso" -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:151 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:145 msgid "{0} of {1} documents remaining this month." msgstr "{0} de {1} documentos restantes este mes." @@ -121,11 +121,11 @@ msgstr "{0} de {1} fila(s) seleccionada." msgid "{0} on behalf of \"{1}\" has invited you to {recipientActionVerb} the document \"{2}\"." msgstr "{0} en nombre de \"{1}\" te ha invitado a {recipientActionVerb} el documento \"{2}\"." -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:173 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:174 msgid "{0} Recipient(s)" msgstr "{0} Destinatario(s)" -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:294 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:311 msgid "{charactersRemaining, plural, one {1 character remaining} other {{charactersRemaining} characters remaining}}" msgstr "{charactersRemaining, plural, one {1 carácter restante} other {{charactersRemaining} caracteres restantes}}" @@ -141,7 +141,7 @@ msgstr "{inviterName} ha cancelado el documento {documentName}, ya no necesitas msgid "{inviterName} has cancelled the document<0/>\"{documentName}\"" msgstr "{inviterName} ha cancelado el documento<0/>\"{documentName}\"" -#: packages/email/template-components/template-document-invite.tsx:75 +#: packages/email/template-components/template-document-invite.tsx:74 msgid "{inviterName} has invited you to {0}<0/>\"{documentName}\"" msgstr "{inviterName} te ha invitado a {0}<0/>\"{documentName}\"" @@ -161,9 +161,9 @@ msgstr "{inviterName} te ha eliminado del documento {documentName}." msgid "{inviterName} has removed you from the document<0/>\"{documentName}\"" msgstr "{inviterName} te ha eliminado del documento<0/>\"{documentName}\"" -#: packages/email/template-components/template-document-invite.tsx:63 -msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {0}" -msgstr "{inviterName} en nombre de \"{teamName}\" te ha invitado a {0}" +#: packages/email/template-components/template-document-invite.tsx:61 +msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {0}<0/>\"{documentName}\"" +msgstr "" #: packages/email/templates/document-invite.tsx:45 msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {action} {documentName}" @@ -181,87 +181,87 @@ msgstr "{memberEmail} dejó el siguiente equipo" msgid "{numberOfSeats, plural, one {# member} other {# members}}" msgstr "{numberOfSeats, plural, one {# miembro} other {# miembros}}" -#: packages/lib/utils/document-audit-logs.ts:263 +#: packages/lib/utils/document-audit-logs.ts:279 msgid "{prefix} added a field" msgstr "{prefix} agregó un campo" -#: packages/lib/utils/document-audit-logs.ts:275 +#: packages/lib/utils/document-audit-logs.ts:291 msgid "{prefix} added a recipient" msgstr "{prefix} agregó un destinatario" -#: packages/lib/utils/document-audit-logs.ts:287 +#: packages/lib/utils/document-audit-logs.ts:303 msgid "{prefix} created the document" msgstr "{prefix} creó el documento" -#: packages/lib/utils/document-audit-logs.ts:291 +#: packages/lib/utils/document-audit-logs.ts:307 msgid "{prefix} deleted the document" msgstr "{prefix} eliminó el documento" -#: packages/lib/utils/document-audit-logs.ts:335 +#: packages/lib/utils/document-audit-logs.ts:351 msgid "{prefix} moved the document to team" msgstr "{prefix} movió el documento al equipo" -#: packages/lib/utils/document-audit-logs.ts:319 +#: packages/lib/utils/document-audit-logs.ts:335 msgid "{prefix} opened the document" msgstr "{prefix} abrió el documento" -#: packages/lib/utils/document-audit-logs.ts:267 +#: packages/lib/utils/document-audit-logs.ts:283 msgid "{prefix} removed a field" msgstr "{prefix} eliminó un campo" -#: packages/lib/utils/document-audit-logs.ts:279 +#: packages/lib/utils/document-audit-logs.ts:295 msgid "{prefix} removed a recipient" msgstr "{prefix} eliminó un destinatario" -#: packages/lib/utils/document-audit-logs.ts:365 +#: packages/lib/utils/document-audit-logs.ts:381 msgid "{prefix} resent an email to {0}" msgstr "{prefix} reenviaron un correo electrónico a {0}" -#: packages/lib/utils/document-audit-logs.ts:366 +#: packages/lib/utils/document-audit-logs.ts:382 msgid "{prefix} sent an email to {0}" msgstr "{prefix} envió un correo electrónico a {0}" -#: packages/lib/utils/document-audit-logs.ts:331 +#: packages/lib/utils/document-audit-logs.ts:347 msgid "{prefix} sent the document" msgstr "{prefix} envió el documento" -#: packages/lib/utils/document-audit-logs.ts:295 +#: packages/lib/utils/document-audit-logs.ts:311 msgid "{prefix} signed a field" msgstr "{prefix} firmó un campo" -#: packages/lib/utils/document-audit-logs.ts:299 +#: packages/lib/utils/document-audit-logs.ts:315 msgid "{prefix} unsigned a field" msgstr "{prefix} no firmó un campo" -#: packages/lib/utils/document-audit-logs.ts:271 +#: packages/lib/utils/document-audit-logs.ts:287 msgid "{prefix} updated a field" msgstr "{prefix} actualizó un campo" -#: packages/lib/utils/document-audit-logs.ts:283 +#: packages/lib/utils/document-audit-logs.ts:299 msgid "{prefix} updated a recipient" msgstr "{prefix} actualizó un destinatario" -#: packages/lib/utils/document-audit-logs.ts:315 +#: packages/lib/utils/document-audit-logs.ts:331 msgid "{prefix} updated the document" msgstr "{prefix} actualizó el documento" -#: packages/lib/utils/document-audit-logs.ts:307 +#: packages/lib/utils/document-audit-logs.ts:323 msgid "{prefix} updated the document access auth requirements" msgstr "{prefix} actualizó los requisitos de autorización de acceso al documento" -#: packages/lib/utils/document-audit-logs.ts:327 +#: packages/lib/utils/document-audit-logs.ts:343 msgid "{prefix} updated the document external ID" msgstr "{prefix} actualizó el ID externo del documento" -#: packages/lib/utils/document-audit-logs.ts:311 +#: packages/lib/utils/document-audit-logs.ts:327 msgid "{prefix} updated the document signing auth requirements" msgstr "{prefix} actualizó los requisitos de autenticación para la firma del documento" -#: packages/lib/utils/document-audit-logs.ts:323 +#: packages/lib/utils/document-audit-logs.ts:339 msgid "{prefix} updated the document title" msgstr "{prefix} actualizó el título del documento" -#: packages/lib/utils/document-audit-logs.ts:303 +#: packages/lib/utils/document-audit-logs.ts:319 msgid "{prefix} updated the document visibility" msgstr "{prefix} actualizó la visibilidad del documento" @@ -298,7 +298,7 @@ msgid "{recipientReference} has signed {documentName}" msgstr "{recipientReference} ha firmado {documentName}" #: apps/web/src/components/forms/public-profile-form.tsx:231 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:389 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:387 msgid "{remaningLength, plural, one {# character remaining} other {# characters remaining}}" msgstr "{remaningLength, plural, one {# carácter restante} other {# caracteres restantes}}" @@ -307,8 +307,8 @@ msgid "{signerName} has rejected the document \"{documentName}\"." msgstr "{signerName} ha rechazado el documento \"{documentName}\"." #: packages/email/template-components/template-document-invite.tsx:68 -msgid "{teamName} has invited you to {0}" -msgstr "{teamName} te ha invitado a {0}" +msgid "{teamName} has invited you to {0}<0/>\"{documentName}\"" +msgstr "" #: packages/email/templates/document-invite.tsx:46 msgid "{teamName} has invited you to {action} {documentName}" @@ -318,27 +318,27 @@ msgstr "{teamName} te ha invitado a {action} {documentName}" msgid "{teamName} ownership transfer request" msgstr "solicitud de transferencia de propiedad de {teamName}" -#: packages/lib/utils/document-audit-logs.ts:343 +#: packages/lib/utils/document-audit-logs.ts:359 msgid "{userName} approved the document" msgstr "{userName} aprobó el documento" -#: packages/lib/utils/document-audit-logs.ts:344 +#: packages/lib/utils/document-audit-logs.ts:360 msgid "{userName} CC'd the document" msgstr "{userName} envió una copia del documento" -#: packages/lib/utils/document-audit-logs.ts:345 +#: packages/lib/utils/document-audit-logs.ts:361 msgid "{userName} completed their task" msgstr "{userName} completó su tarea" -#: packages/lib/utils/document-audit-logs.ts:355 +#: packages/lib/utils/document-audit-logs.ts:371 msgid "{userName} rejected the document" msgstr "{userName} rechazó el documento" -#: packages/lib/utils/document-audit-logs.ts:341 +#: packages/lib/utils/document-audit-logs.ts:357 msgid "{userName} signed the document" msgstr "{userName} firmó el documento" -#: packages/lib/utils/document-audit-logs.ts:342 +#: packages/lib/utils/document-audit-logs.ts:358 msgid "{userName} viewed the document" msgstr "{userName} vio el documento" @@ -358,7 +358,11 @@ msgstr "<0>{senderName} ha solicitado que asumas la propiedad del siguiente msgid "<0>{teamName} has requested to use your email address for their team on Documenso." msgstr "<0>{teamName} ha solicitado usar tu dirección de correo electrónico para su equipo en Documenso." -#: packages/ui/primitives/template-flow/add-template-settings.tsx:241 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:463 +msgid "<0>Click to upload or drag and drop" +msgstr "<0>Haga clic para subir o arrastre y suelte" + +#: packages/ui/primitives/template-flow/add-template-settings.tsx:287 msgid "<0>Email - The recipient will be emailed the document to sign, approve, etc." msgstr "<0>Correo electrónico - Al destinatario se le enviará el documento para firmar, aprobar, etc." @@ -378,11 +382,11 @@ msgstr "<0>Sin restricciones - El documento se puede acceder directamente a msgid "<0>None - No authentication required" msgstr "<0>Ninguno - No se requiere autenticación" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:247 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:293 msgid "<0>None - We will generate links which you can send to the recipients manually." msgstr "<0>Ninguno - Generaremos enlaces que puedes enviar a los destinatarios manualmente." -#: packages/ui/primitives/template-flow/add-template-settings.tsx:254 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:300 msgid "<0>Note - If you use Links in combination with direct templates, you will need to manually send the links to the remaining recipients." msgstr "<0>Nota - Si usas Enlaces en combinación con plantillas directas, necesitarás enviar manualmente los enlaces a los destinatarios restantes." @@ -464,19 +468,19 @@ msgstr "Un dispositivo capaz de acceder, abrir y leer documentos" msgid "A document was created by your direct template that requires you to {recipientActionVerb} it." msgstr "Se creó un documento a partir de tu plantilla directa que requiere que {recipientActionVerb}." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:218 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:230 msgid "A draft document will be created" msgstr "Se creará un documento borrador" -#: packages/lib/utils/document-audit-logs.ts:262 +#: packages/lib/utils/document-audit-logs.ts:278 msgid "A field was added" msgstr "Se añadió un campo" -#: packages/lib/utils/document-audit-logs.ts:266 +#: packages/lib/utils/document-audit-logs.ts:282 msgid "A field was removed" msgstr "Se eliminó un campo" -#: packages/lib/utils/document-audit-logs.ts:270 +#: packages/lib/utils/document-audit-logs.ts:286 msgid "A field was updated" msgstr "Se actualizó un campo" @@ -488,7 +492,7 @@ msgstr "Un medio para imprimir o descargar documentos para sus registros" msgid "A new member has joined your team" msgstr "Un nuevo miembro se ha unido a tu equipo" -#: apps/web/src/components/forms/token.tsx:127 +#: apps/web/src/components/forms/token.tsx:128 msgid "A new token was created successfully." msgstr "Un nuevo token se ha creado con éxito." @@ -497,15 +501,15 @@ msgstr "Un nuevo token se ha creado con éxito." msgid "A password reset email has been sent, if you have an account you should see it in your inbox shortly." msgstr "Se ha enviado un correo electrónico para restablecer la contraseña, si tienes una cuenta deberías verlo en tu bandeja de entrada en breve." -#: packages/lib/utils/document-audit-logs.ts:274 +#: packages/lib/utils/document-audit-logs.ts:290 msgid "A recipient was added" msgstr "Se añadió un destinatario" -#: packages/lib/utils/document-audit-logs.ts:278 +#: packages/lib/utils/document-audit-logs.ts:294 msgid "A recipient was removed" msgstr "Se eliminó un destinatario" -#: packages/lib/utils/document-audit-logs.ts:282 +#: packages/lib/utils/document-audit-logs.ts:298 msgid "A recipient was updated" msgstr "Se actualizó un destinatario" @@ -591,7 +595,7 @@ msgstr "Invitación de equipo aceptada" msgid "Account Authentication" msgstr "Autenticación de Cuenta" -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:50 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:51 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:47 msgid "Account deleted" msgstr "Cuenta eliminada" @@ -612,20 +616,20 @@ msgstr "Re-autenticación de Cuenta" msgid "Acknowledgment" msgstr "Reconocimiento" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:108 -#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:98 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:123 -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:164 -#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:116 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:114 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:97 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:117 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:159 +#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:115 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:46 msgid "Action" msgstr "Acción" #: apps/web/src/app/(dashboard)/documents/data-table.tsx:79 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:177 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:175 #: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:140 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:131 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:140 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:130 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:139 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:116 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:125 msgid "Actions" @@ -650,16 +654,16 @@ msgid "Add a document" msgstr "Agregar un documento" #: packages/ui/primitives/document-flow/add-settings.tsx:390 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:468 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:514 msgid "Add a URL to redirect the user to once the document is signed" msgstr "Agregue una URL para redirigir al usuario una vez que se firme el documento" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:177 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:88 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:153 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:87 msgid "Add all relevant fields for each recipient." msgstr "Agrega todos los campos relevantes para cada destinatario." -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:83 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:82 msgid "Add all relevant placeholders for each recipient." msgstr "Agrega todos los marcadores de posición relevantes para cada destinatario." @@ -675,7 +679,7 @@ msgstr "Agrega un autenticador para servir como método de autenticación secund msgid "Add an external ID to the document. This can be used to identify the document in external systems." msgstr "Agregue un ID externo al documento. Esto se puede usar para identificar el documento en sistemas externos." -#: packages/ui/primitives/template-flow/add-template-settings.tsx:385 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:431 msgid "Add an external ID to the template. This can be used to identify in external systems." msgstr "Agregue un ID externo a la plantilla. Esto se puede usar para identificar en sistemas externos." @@ -692,8 +696,8 @@ msgstr "Agregar otro valor" msgid "Add email" msgstr "Agregar correo electrónico" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:176 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:87 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:152 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:86 msgid "Add Fields" msgstr "Agregar Campos" @@ -718,7 +722,7 @@ msgstr "Agregar clave" msgid "Add Placeholder Recipient" msgstr "Agregar destinatario de marcador de posición" -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:82 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:81 msgid "Add Placeholders" msgstr "Agregar Marcadores de posición" @@ -726,7 +730,7 @@ msgstr "Agregar Marcadores de posición" msgid "Add Signer" msgstr "Agregar firmante" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:171 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:147 msgid "Add Signers" msgstr "Agregar Firmantes" @@ -734,19 +738,19 @@ msgstr "Agregar Firmantes" msgid "Add team email" msgstr "Agregar correo electrónico del equipo" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:73 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:80 msgid "Add text" msgstr "Agregar texto" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:78 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:85 msgid "Add text to the field" msgstr "Agregar texto al campo" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:172 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:148 msgid "Add the people who will sign the document." msgstr "Agrega a las personas que firmarán el documento." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:220 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:232 msgid "Add the recipients to create the document with" msgstr "Agrega los destinatarios con los que crear el documento" @@ -771,12 +775,12 @@ msgid "Admin panel" msgstr "Panel administrativo" #: packages/ui/primitives/document-flow/add-settings.tsx:284 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:367 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:413 msgid "Advanced Options" msgstr "Opciones avanzadas" #: packages/ui/primitives/document-flow/add-fields.tsx:585 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:415 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:490 msgid "Advanced settings" msgstr "Configuraciones avanzadas" @@ -804,11 +808,11 @@ msgstr "Todos los documentos han sido procesados. Cualquier nuevo documento que msgid "All documents related to the electronic signing process will be provided to you electronically through our platform or via email. It is your responsibility to ensure that your email address is current and that you can receive and open our emails." msgstr "Todos los documentos relacionados con el proceso de firma electrónica se le proporcionarán electrónicamente a través de nuestra plataforma o por correo electrónico. Es su responsabilidad asegurarse de que su dirección de correo electrónico esté actualizada y que pueda recibir y abrir nuestros correos electrónicos." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:147 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:146 msgid "All inserted signatures will be voided" msgstr "Todas las firmas insertadas serán anuladas" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:150 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:149 msgid "All recipients will be notified" msgstr "Todos los destinatarios serán notificados" @@ -864,30 +868,26 @@ msgstr "Un correo electrónico que contiene una invitación se enviará a cada m msgid "An email requesting the transfer of this team has been sent." msgstr "Se ha enviado un correo electrónico solicitando la transferencia de este equipo." -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:60 -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:83 -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:59 #: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:100 #: apps/web/src/components/forms/avatar-image.tsx:122 #: apps/web/src/components/forms/password.tsx:92 -#: apps/web/src/components/forms/profile.tsx:81 #: apps/web/src/components/forms/reset-password.tsx:95 #: apps/web/src/components/forms/signup.tsx:112 -#: apps/web/src/components/forms/token.tsx:137 +#: apps/web/src/components/forms/token.tsx:146 #: apps/web/src/components/forms/v2/signup.tsx:166 msgid "An error occurred" msgstr "Ocurrió un error" -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:257 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:227 msgid "An error occurred while adding fields." msgstr "Ocurrió un error al agregar campos." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:269 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:218 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:243 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:187 msgid "An error occurred while adding signers." msgstr "Ocurrió un error al agregar firmantes." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:304 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:281 msgid "An error occurred while adding the fields." msgstr "Ocurrió un error al agregar los campos." @@ -895,7 +895,7 @@ msgstr "Ocurrió un error al agregar los campos." msgid "An error occurred while auto-signing the document, some fields may not be signed. Please review and manually sign any remaining fields." msgstr "Se produjo un error al firmar automáticamente el documento, es posible que algunos campos no estén firmados. Por favor, revise y firme manualmente cualquier campo restante." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:176 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:188 msgid "An error occurred while creating document from template." msgstr "Ocurrió un error al crear el documento a partir de la plantilla." @@ -903,7 +903,11 @@ msgstr "Ocurrió un error al crear el documento a partir de la plantilla." msgid "An error occurred while creating the webhook. Please try again." msgstr "Ocurrió un error al crear el webhook. Por favor, intenta de nuevo." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:124 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:63 +msgid "An error occurred while deleting the user." +msgstr "Se produjo un error al eliminar al usuario." + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:120 msgid "An error occurred while disabling direct link signing." msgstr "Ocurrió un error al desactivar la firma de enlace directo." @@ -911,18 +915,18 @@ msgstr "Ocurrió un error al desactivar la firma de enlace directo." msgid "An error occurred while disabling the user." msgstr "Se produjo un error al deshabilitar al usuario." -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:64 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:92 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:76 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:107 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:70 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:98 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:77 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:101 msgid "An error occurred while downloading your document." msgstr "Ocurrió un error al descargar tu documento." -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:52 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51 msgid "An error occurred while duplicating template." msgstr "Ocurrió un error al duplicar la plantilla." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:123 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:119 msgid "An error occurred while enabling direct link signing." msgstr "Ocurrió un error al habilitar la firma de enlace directo." @@ -951,21 +955,21 @@ msgid "An error occurred while removing the field." msgstr "Ocurrió un error mientras se eliminaba el campo." #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:154 -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:126 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:131 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:137 -#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:110 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:148 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:195 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:115 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:153 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:196 #: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:129 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:194 msgid "An error occurred while removing the signature." msgstr "Ocurrió un error al eliminar la firma." -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:196 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:197 msgid "An error occurred while removing the text." msgstr "Ocurrió un error al eliminar el texto." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:350 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:326 msgid "An error occurred while sending the document." msgstr "Ocurrió un error al enviar el documento." @@ -974,15 +978,15 @@ msgid "An error occurred while sending your confirmation email" msgstr "Ocurrió un error al enviar tu correo electrónico de confirmación" #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:125 -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:100 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:105 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:106 -#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:84 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:89 #: apps/web/src/app/(signing)/sign/[token]/initials-field.tsx:90 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:122 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:150 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:127 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:151 #: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:102 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:168 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:168 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:169 msgid "An error occurred while signing the document." msgstr "Ocurrió un error al firmar el documento." @@ -990,8 +994,8 @@ msgstr "Ocurrió un error al firmar el documento." msgid "An error occurred while trying to create a checkout session." msgstr "Ocurrió un error al intentar crear una sesión de pago." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:235 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:187 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:210 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:156 msgid "An error occurred while updating the document settings." msgstr "Ocurrió un error al actualizar la configuración del documento." @@ -1003,13 +1007,12 @@ msgstr "Ocurrió un error al actualizar la firma." msgid "An error occurred while updating your profile." msgstr "Ocurrió un error al actualizar tu perfil." -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:118 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:108 msgid "An error occurred while uploading your document." msgstr "Ocurrió un error al subir tu documento." -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:66 -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:89 -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:65 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:58 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:81 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:55 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:54 #: apps/web/src/components/(dashboard)/common/command-menu.tsx:301 @@ -1026,7 +1029,7 @@ msgstr "Ocurrió un error al subir tu documento." #: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:100 #: apps/web/src/components/(teams)/forms/update-team-form.tsx:93 #: apps/web/src/components/forms/avatar-image.tsx:94 -#: apps/web/src/components/forms/profile.tsx:87 +#: apps/web/src/components/forms/profile.tsx:79 #: apps/web/src/components/forms/public-profile-claim-dialog.tsx:113 #: apps/web/src/components/forms/public-profile-form.tsx:104 #: apps/web/src/components/forms/signin.tsx:249 @@ -1036,11 +1039,10 @@ msgstr "Ocurrió un error al subir tu documento." #: apps/web/src/components/forms/signin.tsx:302 #: apps/web/src/components/forms/signup.tsx:124 #: apps/web/src/components/forms/signup.tsx:138 -#: apps/web/src/components/forms/token.tsx:143 #: apps/web/src/components/forms/v2/signup.tsx:187 #: apps/web/src/components/forms/v2/signup.tsx:201 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:141 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:178 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:140 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:176 msgid "An unknown error occurred" msgstr "Ocurrió un error desconocido" @@ -1048,11 +1050,11 @@ msgstr "Ocurrió un error desconocido" msgid "Any payment methods attached to this team will remain attached to this team. Please contact us if you need to update this information." msgstr "Cualquier método de pago adjunto a este equipo permanecerá adjunto a este equipo. Por favor, contáctanos si necesitas actualizar esta información." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:221 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:219 msgid "Any Source" msgstr "Cualquier fuente" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:201 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:199 msgid "Any Status" msgstr "Cualquier estado" @@ -1070,16 +1072,16 @@ msgstr "Tokens de API" msgid "App Version" msgstr "Versión de la Aplicación" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:89 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:120 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:146 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:95 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:121 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:140 #: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:143 #: packages/lib/constants/recipient-roles.ts:8 msgid "Approve" msgstr "Aprobar" #: apps/web/src/app/(signing)/sign/[token]/form.tsx:142 -#: packages/email/template-components/template-document-invite.tsx:106 +#: packages/email/template-components/template-document-invite.tsx:105 msgid "Approve Document" msgstr "Aprobar Documento" @@ -1116,13 +1118,13 @@ msgstr "¿Está seguro de que desea eliminar la clave de acceso <0>{passkeyName} msgid "Are you sure you wish to delete this team?" msgstr "¿Estás seguro de que deseas eliminar este equipo?" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:100 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:99 #: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:94 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:455 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:449 #: apps/web/src/components/(teams)/dialogs/delete-team-member-dialog.tsx:81 #: apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx:81 #: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:116 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:439 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:437 msgid "Are you sure?" msgstr "¿Estás seguro?" @@ -1130,11 +1132,11 @@ msgstr "¿Estás seguro?" 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." -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:130 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:136 msgid "Audit Log" msgstr "Registro de Auditoría" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:198 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:200 msgid "Authentication Level" msgstr "Nivel de Autenticación" @@ -1165,7 +1167,7 @@ msgstr "Atrás" msgid "Back to Documents" msgstr "Volver a Documentos" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:146 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:137 msgid "Background Color" msgstr "Color de Fondo" @@ -1178,7 +1180,7 @@ msgstr "Código de respaldo" msgid "Backup codes" msgstr "Códigos de respaldo" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:74 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:73 msgid "Banner Updated" msgstr "Banner actualizado" @@ -1215,7 +1217,7 @@ msgstr "Preferencias de marca" msgid "Branding preferences updated" msgstr "Preferencias de marca actualizadas" -#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:97 +#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:96 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:48 msgid "Browser" msgstr "Navegador" @@ -1228,6 +1230,23 @@ msgstr "Copia masiva" msgid "Bulk Import" msgstr "Importación masiva" +#: packages/lib/jobs/definitions/internal/bulk-send-template.handler.ts:203 +msgid "Bulk Send Complete: {0}" +msgstr "" + +#: packages/email/templates/bulk-send-complete.tsx:30 +msgid "Bulk send operation complete for template \"{templateName}\"" +msgstr "" + +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:128 +msgid "Bulk Send Template via CSV" +msgstr "" + +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:97 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:120 +msgid "Bulk Send via CSV" +msgstr "" + #: packages/email/templates/team-invite.tsx:84 msgid "by <0>{senderName}" msgstr "por <0>{senderName}" @@ -1240,7 +1259,7 @@ msgstr "Al aceptar esta solicitud, estarás concediendo a <0>{teamName} acce msgid "By accepting this request, you will take responsibility for any billing items associated with this team." msgstr "Al aceptar esta solicitud, asumirás la responsabilidad de cualquier ítem de facturación asociado con este equipo." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:158 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:157 msgid "By deleting this document, the following will occur:" msgstr "Al eliminar este documento, ocurrirá lo siguiente:" @@ -1261,17 +1280,17 @@ msgid "By using the electronic signature feature, you are consenting to conduct 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." #: apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx:185 -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:192 -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:108 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:191 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:107 #: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:120 #: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:248 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:157 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:198 #: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:109 -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:81 -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:78 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:76 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:77 #: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:131 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:472 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:466 #: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:220 #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:178 #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:71 @@ -1279,12 +1298,12 @@ msgstr "Al utilizar la función de firma electrónica, usted está consintiendo #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:189 #: apps/web/src/app/(signing)/sign/[token]/form.tsx:164 #: apps/web/src/app/(signing)/sign/[token]/form.tsx:246 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:215 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:328 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:232 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:341 #: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:153 #: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:131 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:320 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:335 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:352 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121 #: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:176 #: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:242 @@ -1302,8 +1321,9 @@ msgstr "Al utilizar la función de firma electrónica, usted está consintiendo #: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:187 #: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:257 #: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:163 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:450 -#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:357 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:448 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:263 +#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:323 #: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:58 msgid "Cancel" msgstr "Cancelar" @@ -1318,22 +1338,22 @@ msgstr "No se puede eliminar el firmante" #: packages/lib/constants/recipient-roles.ts:18 msgid "Cc" -msgstr "" +msgstr "Cc" #: packages/lib/constants/recipient-roles.ts:15 #: packages/lib/constants/recipient-roles.ts:17 msgid "CC" -msgstr "" +msgstr "CC" #: packages/lib/constants/recipient-roles.ts:16 msgid "CC'd" -msgstr "" +msgstr "Con copia" #: packages/lib/constants/recipient-roles.ts:19 msgid "Ccers" msgstr "" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:86 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:93 msgid "Character Limit" msgstr "Límite de caracteres" @@ -1353,15 +1373,15 @@ msgstr "Valores de Checkbox" msgid "Checkout" msgstr "Checkout" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:271 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:266 msgid "Choose an existing recipient from below to continue" msgstr "Elija un destinatario existente de abajo para continuar" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:267 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:262 msgid "Choose Direct Link Recipient" msgstr "Elija el destinatario del enlace directo" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:182 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:158 msgid "Choose how the document will reach recipients" msgstr "Elige cómo el documento llegará a los destinatarios" @@ -1385,6 +1405,10 @@ msgstr "Reclame su perfil más tarde" msgid "Claim your username now" msgstr "Reclame su nombre de usuario ahora" +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:537 +msgid "Clear file" +msgstr "Limpiar archivo" + #: packages/ui/primitives/data-table.tsx:156 msgid "Clear filters" msgstr "Limpiar filtros" @@ -1393,13 +1417,13 @@ msgstr "Limpiar filtros" msgid "Clear Signature" msgstr "Limpiar firma" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:130 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:125 msgid "Click here to get started" msgstr "Haga clic aquí para comenzar" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recent-activity.tsx:76 -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:118 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:66 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:113 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:64 #: apps/web/src/components/document/document-history-sheet.tsx:133 msgid "Click here to retry" msgstr "Haga clic aquí para reintentar" @@ -1420,16 +1444,16 @@ msgstr "Haga clic para copiar el enlace de firma para enviar al destinatario" msgid "Click to insert field" msgstr "Haga clic para insertar campo" -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:126 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:388 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:125 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:556 #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:125 #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:138 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121 #: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:140 #: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:180 #: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:102 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:319 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:423 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:317 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:421 #: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx:44 msgid "Close" msgstr "Cerrar" @@ -1453,7 +1477,7 @@ msgstr "Completar Firmado" msgid "Complete Viewing" msgstr "Completar Visualización" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:204 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:202 #: apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx:77 #: apps/web/src/components/formatter/document-status.tsx:28 #: packages/email/template-components/template-document-completed.tsx:35 @@ -1480,25 +1504,25 @@ msgstr "Documentos Completados" msgid "Configure Direct Recipient" msgstr "Configurar destinatario directo" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:167 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:143 msgid "Configure general settings for the document." msgstr "Configurar ajustes generales para el documento." -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:78 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:77 msgid "Configure general settings for the template." msgstr "Configurar ajustes generales para la plantilla." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:337 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:335 msgid "Configure template" msgstr "Configurar plantilla" #: packages/ui/primitives/document-flow/add-fields.tsx:586 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:416 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:491 msgid "Configure the {0} field" msgstr "Configurar el campo {0}" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:481 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:460 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:475 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:458 msgid "Confirm" msgstr "Confirmar" @@ -1536,7 +1560,7 @@ msgstr "Consentimiento para Transacciones Electrónicas" msgid "Contact Information" msgstr "Información de Contacto" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:189 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:180 msgid "Content" msgstr "Contenido" @@ -1546,12 +1570,12 @@ msgstr "Contenido" #: apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx:143 #: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:72 #: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:122 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:328 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:326 #: packages/ui/primitives/document-flow/document-flow-root.tsx:141 msgid "Continue" msgstr "Continuar" -#: packages/email/template-components/template-document-invite.tsx:86 +#: packages/email/template-components/template-document-invite.tsx:85 msgid "Continue by approving the document." msgstr "Continúa aprobando el documento." @@ -1559,11 +1583,11 @@ msgstr "Continúa aprobando el documento." msgid "Continue by downloading the document." msgstr "Continúa descargando el documento." -#: packages/email/template-components/template-document-invite.tsx:84 +#: packages/email/template-components/template-document-invite.tsx:83 msgid "Continue by signing the document." msgstr "Continúa firmando el documento." -#: packages/email/template-components/template-document-invite.tsx:85 +#: packages/email/template-components/template-document-invite.tsx:84 msgid "Continue by viewing the document." msgstr "Continúa viendo el documento." @@ -1597,9 +1621,9 @@ msgid "Copied" msgstr "Copiado" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:162 -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:77 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:72 #: apps/web/src/app/(dashboard)/templates/template-direct-link-badge.tsx:31 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:163 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:159 #: apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx:40 #: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:61 #: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:117 @@ -1618,11 +1642,11 @@ msgstr "Copiar" msgid "Copy Link" msgstr "Copiar enlace" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:169 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:164 msgid "Copy sharable link" msgstr "Copiar enlace compartible" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:397 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:391 msgid "Copy Shareable Link" msgstr "Copiar enlace compartible" @@ -1657,15 +1681,15 @@ msgstr "Crea un equipo para colaborar con los miembros de tu equipo." msgid "Create account" msgstr "Crear cuenta" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:396 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:564 msgid "Create and send" msgstr "Crear y enviar" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:394 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:562 msgid "Create as draft" msgstr "Crear como borrador" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:354 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:365 msgid "Create as pending" msgstr "Crear como pendiente" @@ -1673,11 +1697,11 @@ msgstr "Crear como pendiente" msgid "Create Direct Link" msgstr "Crear enlace directo" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:202 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:197 msgid "Create Direct Signing Link" msgstr "Crear enlace de firma directo" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:214 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:226 msgid "Create document from template" msgstr "Crear documento a partir de la plantilla" @@ -1685,11 +1709,11 @@ msgstr "Crear documento a partir de la plantilla" msgid "Create now" msgstr "Crear ahora" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:352 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:346 msgid "Create one automatically" msgstr "Crear uno automáticamente" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:398 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:566 msgid "Create signing links" msgstr "Crear enlaces de firma" @@ -1704,7 +1728,7 @@ msgstr "Crear equipo" msgid "Create Team" msgstr "Crear Equipo" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:361 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:372 msgid "Create the document as pending and ready to sign." msgstr "Crear el documento como pendiente y listo para firmar." @@ -1730,19 +1754,19 @@ msgid "Create your account and start using state-of-the-art document signing. Op msgstr "Crea tu cuenta y comienza a utilizar la firma de documentos de última generación. La firma abierta y hermosa está al alcance de tu mano." #: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:62 -#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:96 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:35 +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:112 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:36 #: apps/web/src/app/(dashboard)/documents/data-table.tsx:48 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table.tsx:63 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:105 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:34 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:103 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:35 #: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:56 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:274 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:272 msgid "Created" msgstr "Creado" #: apps/web/src/app/(dashboard)/admin/subscriptions/page.tsx:35 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:111 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:112 msgid "Created At" msgstr "Creado En" @@ -1762,6 +1786,10 @@ msgstr "Creado el" msgid "Created on {0}" msgstr "Creado el {0}" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:143 +msgid "CSV Structure" +msgstr "" + #: apps/web/src/components/forms/password.tsx:112 msgid "Current Password" msgstr "Contraseña actual" @@ -1770,6 +1798,10 @@ msgstr "Contraseña actual" msgid "Current password is incorrect." msgstr "La contraseña actual es incorrecta." +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:154 +msgid "Current recipients:" +msgstr "" + #: apps/web/src/app/(dashboard)/settings/billing/billing-plans.tsx:28 msgid "Daily" msgstr "Diario" @@ -1778,11 +1810,11 @@ msgstr "Diario" msgid "Dark Mode" msgstr "Modo Oscuro" -#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:68 -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:148 +#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:67 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:153 #: packages/ui/primitives/document-flow/add-fields.tsx:945 #: packages/ui/primitives/document-flow/types.ts:53 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:732 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:810 msgid "Date" msgstr "Fecha" @@ -1791,7 +1823,7 @@ msgid "Date created" msgstr "Fecha de creación" #: packages/ui/primitives/document-flow/add-settings.tsx:325 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:408 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:454 msgid "Date Format" msgstr "Formato de fecha" @@ -1812,19 +1844,19 @@ msgstr "Idioma predeterminado del documento" msgid "Default Document Visibility" msgstr "Visibilidad predeterminada del documento" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:50 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:49 msgid "delete" msgstr "eliminar" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:144 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:189 -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:202 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:150 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:183 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:201 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:177 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:211 #: apps/web/src/app/(dashboard)/settings/tokens/page.tsx:83 #: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:100 -#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:94 -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:90 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:107 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:85 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:116 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/page.tsx:105 #: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:121 @@ -1843,25 +1875,25 @@ msgstr "eliminar {0}" msgid "delete {teamName}" msgstr "eliminar {teamName}" -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:136 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:133 msgid "Delete account" msgstr "Eliminar cuenta" -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:97 -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:104 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:94 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:101 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:72 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:86 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:93 msgid "Delete Account" msgstr "Eliminar Cuenta" -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:135 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:125 msgid "Delete document" msgstr "Eliminar documento" -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:85 -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:98 -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:105 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:75 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:88 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:95 msgid "Delete Document" msgstr "Eliminar Documento" @@ -1878,11 +1910,11 @@ msgstr "Eliminar equipo" msgid "Delete team member" msgstr "Eliminar miembro del equipo" -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:88 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:78 msgid "Delete the document. This action is irreversible so proceed with caution." msgstr "Eliminar el documento. Esta acción es irreversible, así que proceda con precaución." -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:86 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:83 msgid "Delete the users account and all its contents. This action is irreversible and will cancel their subscription, so proceed with caution." msgstr "Eliminar la cuenta de usuario y todo su contenido. Esta acción es irreversible y cancelará su suscripción, así que proceda con cautela." @@ -1895,7 +1927,7 @@ msgid "Delete your account and all its contents, including completed documents. msgstr "Eliminar su cuenta y todo su contenido, incluidos documentos completados. Esta acción es irreversible y cancelará su suscripción, así que proceda con cuidado." #: apps/web/src/app/(dashboard)/admin/documents/[id]/page.tsx:41 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:97 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:98 msgid "Deleted" msgstr "Eliminado" @@ -1903,12 +1935,12 @@ msgstr "Eliminado" msgid "Deleting account..." msgstr "Eliminando cuenta..." -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:178 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:180 msgid "Details" msgstr "Detalles" -#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:73 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:242 +#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:72 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:244 msgid "Device" msgstr "Dispositivo" @@ -1922,12 +1954,12 @@ msgid "direct link" msgstr "enlace directo" #: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:40 -#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:79 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:81 msgid "Direct link" msgstr "Enlace directo" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:156 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:227 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:154 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:225 msgid "Direct Link" msgstr "Enlace directo" @@ -1939,15 +1971,15 @@ msgstr "enlace directo deshabilitado" msgid "Direct link receiver" msgstr "Receptor de enlace directo" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:363 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:357 msgid "Direct Link Signing" msgstr "Firma de enlace directo" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:115 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:111 msgid "Direct link signing has been disabled" msgstr "La firma de enlace directo ha sido deshabilitada" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:114 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:110 msgid "Direct link signing has been enabled" msgstr "La firma de enlace directo ha sido habilitada" @@ -1955,15 +1987,15 @@ msgstr "La firma de enlace directo ha sido habilitada" msgid "Direct link templates contain one dynamic recipient placeholder. Anyone with access to this link can sign the document, and it will then appear on your documents page." msgstr "Las plantillas de enlace directo contienen un marcador de posición de destinatario dinámico. Cualquiera que tenga acceso a este enlace puede firmar el documento, y luego aparecerá en su página de documentos." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:142 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:138 msgid "Direct template link deleted" msgstr "Enlace de plantilla directo eliminado" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:228 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:223 msgid "Direct template link usage exceeded ({0}/{1})" msgstr "El uso de enlace de plantilla directo excedió ({0}/{1})" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:417 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:415 msgid "Disable" msgstr "Deshabilitar" @@ -1991,7 +2023,7 @@ msgstr "Deshabilite la Autenticación de Dos Factores antes de eliminar su cuent msgid "Disabled" msgstr "Deshabilitado" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:380 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:374 msgid "Disabling direct link signing will prevent anyone from accessing the link." msgstr "Deshabilitar la firma de enlace directo evitará que cualquiera acceda al enlace." @@ -2003,15 +2035,15 @@ msgstr "Deshabilitar al usuario implica que no podrá usar la cuenta. También d msgid "Display your name and email in documents" msgstr "Mostrar su nombre y correo electrónico en documentos" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:181 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:157 msgid "Distribute Document" msgstr "Distribuir documento" -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:63 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:58 msgid "Do you want to delete this template?" msgstr "¿Desea eliminar esta plantilla?" -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:63 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:62 msgid "Do you want to duplicate this template?" msgstr "¿Desea duplicar esta plantilla?" @@ -2034,11 +2066,11 @@ msgstr "Documento \"{0}\" - Rechazo confirmado" #: packages/ui/components/document/document-global-auth-access-select.tsx:62 #: packages/ui/primitives/document-flow/add-settings.tsx:227 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:202 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:224 msgid "Document access" msgstr "Acceso al documento" -#: packages/lib/utils/document-audit-logs.ts:306 +#: packages/lib/utils/document-audit-logs.ts:322 msgid "Document access auth updated" msgstr "Se actualizó la autenticación de acceso al documento" @@ -2051,14 +2083,14 @@ msgid "Document Approved" msgstr "Documento Aprobado" #: apps/web/src/app/(signing)/sign/[token]/no-longer-available.tsx:40 -#: packages/lib/server-only/document/delete-document.ts:246 -#: packages/lib/server-only/document/super-delete-document.ts:98 +#: packages/lib/server-only/document/delete-document.ts:263 +#: packages/lib/server-only/document/super-delete-document.ts:101 msgid "Document Cancelled" msgstr "Documento cancelado" #: apps/web/src/components/formatter/document-status.tsx:29 -#: packages/lib/utils/document-audit-logs.ts:369 -#: packages/lib/utils/document-audit-logs.ts:370 +#: packages/lib/utils/document-audit-logs.ts:385 +#: packages/lib/utils/document-audit-logs.ts:386 msgid "Document completed" msgstr "Documento completado" @@ -2071,21 +2103,21 @@ msgstr "Correo electrónico de documento completado" msgid "Document Completed!" msgstr "¡Documento completado!" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:156 -#: packages/lib/utils/document-audit-logs.ts:286 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:168 +#: packages/lib/utils/document-audit-logs.ts:302 msgid "Document created" msgstr "Documento creado" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:127 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:125 msgid "Document created by <0>{0}" msgstr "Documento creado por <0>{0}" #: packages/email/templates/document-created-from-direct-template.tsx:32 -#: packages/lib/server-only/template/create-document-from-direct-template.ts:585 +#: packages/lib/server-only/template/create-document-from-direct-template.ts:588 msgid "Document created from direct template" msgstr "Documento creado a partir de plantilla directa" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:132 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:130 msgid "Document created using a <0>direct link" msgstr "Documento creado usando un <0>enlace directo" @@ -2093,10 +2125,10 @@ msgstr "Documento creado usando un <0>enlace directo" msgid "Document Creation" msgstr "Creación de documento" -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:51 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:181 -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:61 -#: packages/lib/utils/document-audit-logs.ts:290 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:50 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:182 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:60 +#: packages/lib/utils/document-audit-logs.ts:306 msgid "Document deleted" msgstr "Documento eliminado" @@ -2104,12 +2136,12 @@ msgstr "Documento eliminado" msgid "Document deleted email" msgstr "Correo electrónico de documento eliminado" -#: packages/lib/server-only/document/send-delete-email.ts:82 +#: packages/lib/server-only/document/send-delete-email.ts:85 msgid "Document Deleted!" msgstr "¡Documento eliminado!" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:219 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:228 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:265 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:274 msgid "Document Distribution Method" msgstr "Método de distribución de documentos" @@ -2117,21 +2149,21 @@ msgstr "Método de distribución de documentos" msgid "Document draft" msgstr "Borrador de documento" -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:58 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:57 msgid "Document Duplicated" msgstr "Documento duplicado" -#: packages/lib/utils/document-audit-logs.ts:326 +#: packages/lib/utils/document-audit-logs.ts:342 msgid "Document external ID updated" msgstr "ID externo del documento actualizado" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:192 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:193 #: apps/web/src/components/document/document-history-sheet.tsx:104 msgid "Document history" msgstr "Historial de documentos" #: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-page-view.tsx:71 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:81 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:82 msgid "Document ID" msgstr "ID del documento" @@ -2151,7 +2183,7 @@ msgstr "Métricas de documento" msgid "Document moved" msgstr "Documento movido" -#: packages/lib/utils/document-audit-logs.ts:334 +#: packages/lib/utils/document-audit-logs.ts:350 msgid "Document moved to team" msgstr "Documento movido al equipo" @@ -2159,7 +2191,7 @@ msgstr "Documento movido al equipo" msgid "Document no longer available to sign" msgstr "El documento ya no está disponible para firmar" -#: packages/lib/utils/document-audit-logs.ts:318 +#: packages/lib/utils/document-audit-logs.ts:334 msgid "Document opened" msgstr "Documento abierto" @@ -2188,8 +2220,8 @@ msgstr "Documento Rechazado" msgid "Document resealed" msgstr "Documento sellado nuevamente" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:327 -#: packages/lib/utils/document-audit-logs.ts:330 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:303 +#: packages/lib/utils/document-audit-logs.ts:346 msgid "Document sent" msgstr "Documento enviado" @@ -2197,11 +2229,11 @@ msgstr "Documento enviado" msgid "Document Signed" msgstr "Documento firmado" -#: packages/lib/utils/document-audit-logs.ts:310 +#: packages/lib/utils/document-audit-logs.ts:326 msgid "Document signing auth updated" msgstr "Se actualizó la autenticación de firma del documento" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:144 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:143 msgid "Document signing process will be cancelled" msgstr "El proceso de firma del documento será cancelado" @@ -2213,11 +2245,11 @@ msgstr "Estado del documento" msgid "Document title" msgstr "Título del documento" -#: packages/lib/utils/document-audit-logs.ts:322 +#: packages/lib/utils/document-audit-logs.ts:338 msgid "Document title updated" msgstr "Título del documento actualizado" -#: packages/lib/utils/document-audit-logs.ts:314 +#: packages/lib/utils/document-audit-logs.ts:330 msgid "Document updated" msgstr "Documento actualizado" @@ -2225,7 +2257,7 @@ msgstr "Documento actualizado" msgid "Document upload disabled due to unpaid invoices" msgstr "La carga de documentos está deshabilitada debido a facturas impagadas" -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:86 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:85 msgid "Document uploaded" msgstr "Documento subido" @@ -2233,17 +2265,17 @@ msgstr "Documento subido" msgid "Document Viewed" msgstr "Documento visto" -#: packages/lib/utils/document-audit-logs.ts:302 +#: packages/lib/utils/document-audit-logs.ts:318 msgid "Document visibility updated" msgstr "Visibilidad del documento actualizada" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:141 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:140 msgid "Document will be permanently deleted" msgstr "El documento será eliminado permanentemente" #: apps/web/src/app/(dashboard)/admin/nav.tsx:65 #: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:92 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:144 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:145 #: apps/web/src/app/(dashboard)/documents/[id]/edit/document-edit-page-view.tsx:109 #: apps/web/src/app/(dashboard)/documents/[id]/loading.tsx:16 #: apps/web/src/app/(dashboard)/documents/[id]/sent/page.tsx:15 @@ -2257,7 +2289,7 @@ msgstr "El documento será eliminado permanentemente" msgid "Documents" msgstr "Documentos" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:197 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:200 msgid "Documents created from template" msgstr "Documentos creados a partir de la plantilla" @@ -2274,10 +2306,10 @@ msgstr "Documentos vistos" msgid "Don't have an account? <0>Sign up" msgstr "¿No tienes una cuenta? <0>Regístrate" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:111 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:123 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:141 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:162 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:117 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:129 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:142 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:156 #: apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx:110 #: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:185 #: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:107 @@ -2286,7 +2318,7 @@ msgstr "¿No tienes una cuenta? <0>Regístrate" msgid "Download" msgstr "Descargar" -#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:81 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:77 msgid "Download Audit Logs" msgstr "Descargar registros de auditoría" @@ -2294,7 +2326,11 @@ msgstr "Descargar registros de auditoría" msgid "Download Certificate" msgstr "Descargar certificado" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:210 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:168 +msgid "Download Template CSV" +msgstr "" + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:208 #: apps/web/src/components/formatter/document-status.tsx:34 #: packages/lib/constants/document.ts:13 msgid "Draft" @@ -2313,7 +2349,7 @@ msgid "Drag & drop your PDF here." msgstr "Arrastre y suelte su PDF aquí." #: packages/ui/primitives/document-flow/add-fields.tsx:1076 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:863 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:941 msgid "Dropdown" msgstr "Menú desplegable" @@ -2325,28 +2361,28 @@ msgstr "Opciones de menú desplegable" msgid "Due to an unpaid invoice, your team has been restricted. Please settle the payment to restore full access to your team." msgstr "Debido a una factura impaga, tu equipo ha sido restringido. Realiza el pago para restaurar el acceso completo a tu equipo." -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:136 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:167 -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:85 -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:118 -#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:74 -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:91 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:142 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:161 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:84 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:117 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:76 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:89 msgid "Duplicate" msgstr "Duplicar" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:104 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:115 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:102 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:156 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:110 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:121 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:103 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:150 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:111 #: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:95 -#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:65 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:67 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx:77 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/page.tsx:100 msgid "Edit" msgstr "Editar" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:117 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:120 msgid "Edit Template" msgstr "Editar plantilla" @@ -2366,18 +2402,18 @@ msgstr "Divulgación de Firma Electrónica" #: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:166 #: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:116 #: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:71 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:265 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:272 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:277 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:284 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:122 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:129 -#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:118 -#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:126 +#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:119 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:131 #: apps/web/src/app/embed/direct/[[...url]]/client.tsx:407 #: apps/web/src/app/embed/sign/[[...url]]/client.tsx:287 #: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:169 #: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:153 #: apps/web/src/components/forms/forgot-password.tsx:81 -#: apps/web/src/components/forms/profile.tsx:122 +#: apps/web/src/components/forms/profile.tsx:113 #: apps/web/src/components/forms/signin.tsx:339 #: apps/web/src/components/forms/signup.tsx:176 #: packages/lib/constants/document.ts:28 @@ -2385,7 +2421,7 @@ msgstr "Divulgación de Firma Electrónica" #: packages/ui/primitives/document-flow/add-signers.tsx:511 #: packages/ui/primitives/document-flow/add-signers.tsx:518 #: packages/ui/primitives/document-flow/types.ts:54 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:680 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:758 #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:470 #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:477 msgid "Email" @@ -2401,7 +2437,7 @@ msgstr "Dirección de correo electrónico" msgid "Email Address" msgstr "Dirección de correo electrónico" -#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:80 +#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:81 msgid "Email cannot already exist in the template" msgstr "El correo electrónico no puede existir ya en la plantilla" @@ -2409,15 +2445,15 @@ msgstr "El correo electrónico no puede existir ya en la plantilla" msgid "Email Confirmed!" msgstr "¡Correo electrónico confirmado!" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:307 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:353 msgid "Email Options" msgstr "Opciones de correo electrónico" -#: packages/lib/utils/document-audit-logs.ts:363 +#: packages/lib/utils/document-audit-logs.ts:379 msgid "Email resent" msgstr "Correo electrónico reeenviado" -#: packages/lib/utils/document-audit-logs.ts:363 +#: packages/lib/utils/document-audit-logs.ts:379 msgid "Email sent" msgstr "Correo electrónico enviado" @@ -2459,11 +2495,11 @@ msgstr "Habilitar aplicación autenticadora" msgid "Enable custom branding for all documents in this team." msgstr "Habilitar branding personalizado para todos los documentos en este equipo." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:251 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:246 msgid "Enable direct link signing" msgstr "Habilitar firma de enlace directo" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:374 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:368 #: packages/lib/constants/template.ts:8 msgid "Enable Direct Link Signing" msgstr "Habilitar firma de enlace directo" @@ -2478,11 +2514,11 @@ msgid "Enable Typed Signature" msgstr "Habilitar firma mecanografiada" #: packages/ui/primitives/document-flow/add-fields.tsx:813 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:600 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:678 msgid "Enable Typed Signatures" msgstr "Habilitar firmas escritas" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:123 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:114 #: apps/web/src/app/(dashboard)/settings/webhooks/[id]/page.tsx:138 #: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:74 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/[id]/page.tsx:142 @@ -2495,7 +2531,7 @@ msgstr "Habilitado" msgid "Enabling the account results in the user being able to use the account again, and all the related features such as webhooks, teams, and API keys for example." msgstr "Habilitar la cuenta permite al usuario usar la cuenta de nuevo, junto con todas las funciones relacionadas como webhooks, equipos y claves API, por ejemplo." -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:87 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:88 msgid "Enclosed Document" msgstr "Documento Adjunto" @@ -2515,7 +2551,7 @@ msgstr "Ingresa los detalles de tu marca" msgid "Enter your email" msgstr "Ingresa tu correo electrónico" -#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:135 +#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:136 msgid "Enter your email address to receive the completed document." msgstr "Ingresa tu dirección de correo electrónico para recibir el documento completado." @@ -2523,53 +2559,53 @@ msgstr "Ingresa tu dirección de correo electrónico para recibir el documento c msgid "Enter your name" msgstr "Ingresa tu nombre" -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:280 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:293 msgid "Enter your text here" msgstr "Ingresa tu texto aquí" #: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:41 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:66 #: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:60 #: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:60 #: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:80 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:234 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:268 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:303 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:349 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:209 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:242 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:280 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:325 #: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:57 #: apps/web/src/app/(dashboard)/documents/upload-document.tsx:111 -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:117 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:155 #: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:186 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:217 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:256 -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:226 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:50 #: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:68 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:175 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:187 #: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:152 #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:124 #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:153 #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:214 -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:99 -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:125 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:104 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:130 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:105 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:136 -#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:83 -#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:109 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:88 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:114 #: apps/web/src/app/(signing)/sign/[token]/initials-field.tsx:89 #: apps/web/src/app/(signing)/sign/[token]/initials-field.tsx:115 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:121 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:147 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:149 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:194 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:126 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:152 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:150 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:195 #: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:101 #: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:128 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:133 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:167 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:193 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:167 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:195 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:168 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:196 #: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:54 #: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:101 -#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:258 +#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:224 #: packages/ui/primitives/pdf-viewer.tsx:166 msgid "Error" msgstr "Error" @@ -2600,7 +2636,7 @@ msgid "Expires on {0}" msgstr "Expira el {0}" #: packages/ui/primitives/document-flow/add-settings.tsx:295 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:378 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:424 msgid "External ID" msgstr "ID externo" @@ -2608,7 +2644,7 @@ msgstr "ID externo" msgid "Failed to reseal document" msgstr "Falló al volver a sellar el documento" -#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:259 +#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:225 msgid "Failed to save settings." msgstr "Fallo al guardar configuraciones." @@ -2621,16 +2657,20 @@ msgstr "Falló al actualizar el destinatario" msgid "Failed to update webhook" msgstr "Falló al actualizar el webhook" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:93 +#: packages/email/templates/bulk-send-complete.tsx:55 +msgid "Failed: {failedCount}" +msgstr "" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:100 msgid "Field character limit" msgstr "Límite de caracteres del campo" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:62 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:44 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:44 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:44 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:69 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:51 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:46 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:51 #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:130 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:107 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:114 msgid "Field font size" msgstr "Tamaño de fuente del campo" @@ -2638,19 +2678,19 @@ msgstr "Tamaño de fuente del campo" msgid "Field format" msgstr "Formato de campo" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:53 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:60 msgid "Field label" msgstr "Etiqueta de campo" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:65 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:72 msgid "Field placeholder" msgstr "Marcador de posición de campo" -#: packages/lib/utils/document-audit-logs.ts:294 +#: packages/lib/utils/document-audit-logs.ts:310 msgid "Field signed" msgstr "Campo firmado" -#: packages/lib/utils/document-audit-logs.ts:298 +#: packages/lib/utils/document-audit-logs.ts:314 msgid "Field unsigned" msgstr "Campo no firmado" @@ -2658,16 +2698,20 @@ msgstr "Campo no firmado" msgid "Fields" msgstr "Campos" -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:130 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:124 msgid "File cannot be larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB" msgstr "El archivo no puede ser mayor a {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:56 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:38 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:38 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:38 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:513 +msgid "File size exceeds the limit of {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB" +msgstr "El tamaño del archivo excede el límite de {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:63 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:45 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:40 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:45 #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:124 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:101 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:108 msgid "Font Size" msgstr "Tamaño de fuente" @@ -2675,6 +2719,10 @@ msgstr "Tamaño de fuente" msgid "For any questions regarding this disclosure, electronic signatures, or any related process, please contact us at: <0>{SUPPORT_EMAIL}" msgstr "Si tiene alguna pregunta sobre esta divulgación, firmas electrónicas o cualquier proceso relacionado, comuníquese con nosotros en: <0>{SUPPORT_EMAIL}" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:147 +msgid "For each recipient, provide their email (required) and name (optional) in separate columns. Download the template CSV below for the correct format." +msgstr "" + #: packages/lib/server-only/auth/send-forgot-password.ts:61 msgid "Forgot Password?" msgstr "¿Olvidaste tu contraseña?" @@ -2691,16 +2739,16 @@ msgstr "Firma gratuita" #: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:330 #: apps/web/src/app/(signing)/sign/[token]/form.tsx:191 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:193 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:210 #: apps/web/src/app/embed/direct/[[...url]]/client.tsx:392 #: apps/web/src/app/embed/sign/[[...url]]/client.tsx:272 -#: apps/web/src/components/forms/profile.tsx:110 +#: apps/web/src/components/forms/profile.tsx:101 #: apps/web/src/components/forms/v2/signup.tsx:316 msgid "Full Name" msgstr "Nombre completo" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:166 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:77 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:142 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:76 #: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:62 #: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:44 #: apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx:52 @@ -2776,7 +2824,7 @@ msgstr "Aquí puedes establecer preferencias y valores predeterminados para la m msgid "Here you can set preferences and defaults for your team." msgstr "Aquí puedes establecer preferencias y valores predeterminados para tu equipo." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:206 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:201 msgid "Here's how it works:" msgstr "Así es como funciona:" @@ -2784,13 +2832,17 @@ msgstr "Así es como funciona:" msgid "Hey I’m Timur" msgstr "Hola, soy Timur" +#: packages/email/templates/bulk-send-complete.tsx:36 +msgid "Hi {userName}," +msgstr "" + #: packages/email/templates/reset-password.tsx:56 msgid "Hi, {userName} <0>({userEmail})" msgstr "Hola, {userName} <0>({userEmail})" -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:189 -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:202 -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:155 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:183 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:201 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:154 msgid "Hide" msgstr "Ocultar" @@ -2851,8 +2903,8 @@ msgstr "Documentos en bandeja de entrada" msgid "Include the Signing Certificate in the Document" msgstr "Incluir el certificado de firma en el documento" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:53 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:50 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:54 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:51 msgid "Information" msgstr "Información" @@ -2882,10 +2934,6 @@ msgstr "Código inválido. Por favor, intenta nuevamente." msgid "Invalid email" msgstr "Email inválido" -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:105 -msgid "Invalid file" -msgstr "Archivo inválido" - #: apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx:33 #: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:36 msgid "Invalid link" @@ -2908,11 +2956,11 @@ msgstr "¡Invitación aceptada!" msgid "Invitation declined" msgstr "Invitación rechazada" -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:78 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:77 msgid "Invitation has been deleted" msgstr "La invitación ha sido eliminada" -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:61 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:60 msgid "Invitation has been resent" msgstr "La invitación ha sido reenviada" @@ -2932,7 +2980,7 @@ msgstr "Invitar a miembros" msgid "Invite team members" msgstr "Invitar a miembros del equipo" -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:126 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:125 msgid "Invited At" msgstr "Invitado el" @@ -2941,7 +2989,7 @@ msgid "Invoice" msgstr "Factura" #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:47 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:235 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:237 msgid "IP Address" msgstr "Dirección IP" @@ -2975,13 +3023,13 @@ msgstr "Únete a {teamName} en Documenso" #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:67 #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:72 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:48 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:55 msgid "Label" msgstr "Etiqueta" #: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:286 #: packages/ui/primitives/document-flow/add-settings.tsx:187 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:162 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:184 msgid "Language" msgstr "Idioma" @@ -2997,8 +3045,8 @@ msgstr "Últimos 30 días" msgid "Last 7 days" msgstr "Últimos 7 días" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:41 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:38 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:42 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:39 msgid "Last modified" msgstr "Última modificación" @@ -3006,7 +3054,7 @@ msgstr "Última modificación" msgid "Last updated" msgstr "Última actualización" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:121 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:122 msgid "Last Updated" msgstr "Última Actualización" @@ -3048,11 +3096,11 @@ msgstr "¿Te gustaría tener tu propio perfil público con acuerdos?" msgid "Link expires in 1 hour." msgstr "El enlace expira en 1 hora." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:216 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:215 msgid "Link template" msgstr "Enlace de plantilla" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:338 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:314 msgid "Links Generated" msgstr "Enlaces generados" @@ -3073,7 +3121,7 @@ msgstr "Cargando documento..." #: apps/web/src/app/(dashboard)/documents/[id]/loading.tsx:20 #: apps/web/src/app/(dashboard)/documents/[id]/sent/page.tsx:19 -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:91 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:90 msgid "Loading Document..." msgstr "Cargando Documento..." @@ -3104,7 +3152,7 @@ msgstr "Gestionar el perfil de {0}" msgid "Manage all teams you are currently associated with." msgstr "Gestionar todos los equipos con los que estás asociado actualmente." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:161 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:164 msgid "Manage and view template" msgstr "Gestionar y ver plantilla" @@ -3112,7 +3160,7 @@ msgstr "Gestionar y ver plantilla" msgid "Manage billing" msgstr "Gestionar la facturación" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:341 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:339 msgid "Manage details for this public template" msgstr "Gestionar detalles de esta plantilla pública" @@ -3148,7 +3196,7 @@ msgstr "Gestionar suscripción de equipo." msgid "Manage teams" msgstr "Gestionar equipos" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:367 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:361 msgid "Manage the direct link signing for this template" msgstr "Gestionar la firma de enlace directo para esta plantilla" @@ -3184,10 +3232,14 @@ msgstr "MAU (documento creado)" msgid "MAU (had document completed)" msgstr "MAU (documento completado)" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:188 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:209 msgid "Max" msgstr "Máx" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:227 +msgid "Maximum file size: 4MB. Maximum 100 rows per upload. Blank values will use template defaults." +msgstr "" + #: packages/lib/constants/teams.ts:12 msgid "Member" msgstr "Miembro" @@ -3204,11 +3256,11 @@ msgid "Members" msgstr "Miembros" #: packages/ui/primitives/document-flow/add-subject.tsx:160 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:338 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:384 msgid "Message <0>(Optional)" msgstr "Mensaje <0>(Opcional)" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:176 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:197 msgid "Min" msgstr "Mín" @@ -3243,8 +3295,8 @@ msgstr "Mover documento al equipo" msgid "Move Template to Team" msgstr "Mover plantilla al equipo" -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:174 -#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:85 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:168 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:87 msgid "Move to Team" msgstr "Mover al equipo" @@ -3263,10 +3315,10 @@ msgstr "Mis plantillas" #: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:66 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:144 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table.tsx:59 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:287 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:294 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:299 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:306 #: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:118 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:170 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:175 #: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:153 #: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:141 #: apps/web/src/components/forms/signup.tsx:160 @@ -3274,7 +3326,7 @@ msgstr "Mis plantillas" #: packages/ui/primitives/document-flow/add-signers.tsx:549 #: packages/ui/primitives/document-flow/add-signers.tsx:555 #: packages/ui/primitives/document-flow/types.ts:55 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:706 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:784 #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:505 #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:511 msgid "Name" @@ -3308,8 +3360,8 @@ msgstr "Nunca expira" msgid "New team owner" msgstr "Nuevo propietario del equipo" -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:96 -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:103 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:95 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:102 msgid "New Template" msgstr "Nueva plantilla" @@ -3335,7 +3387,7 @@ msgstr "No further action is required from you at this time." msgid "No payment required" msgstr "No se requiere pago" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:125 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:120 msgid "No public profile templates found" msgstr "No se encontraron plantillas de perfil público" @@ -3343,12 +3395,12 @@ msgstr "No se encontraron plantillas de perfil público" msgid "No recent activity" msgstr "No hay actividad reciente" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:101 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:99 msgid "No recent documents" msgstr "No hay documentos recientes" #: packages/ui/primitives/document-flow/add-fields.tsx:705 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:520 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:598 msgid "No recipient matching this description was found." msgstr "No se encontró ningún destinatario que coincidiera con esta descripción." @@ -3360,7 +3412,7 @@ msgid "No recipients" msgstr "Sin destinatarios" #: packages/ui/primitives/document-flow/add-fields.tsx:720 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:535 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:613 msgid "No recipients with this role" msgstr "No hay destinatarios con este rol" @@ -3387,11 +3439,11 @@ msgstr "No se encontró campo de firma" msgid "No token provided" msgstr "No se proporcionó token" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:284 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:282 msgid "No valid direct templates found" msgstr "No se encontraron plantillas directas válidas" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:293 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:288 msgid "No valid recipients found" msgstr "No se encontraron destinatarios válidos" @@ -3419,10 +3471,10 @@ msgstr "No soportado" msgid "Nothing to do" msgstr "Nada que hacer" -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:271 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:284 #: packages/ui/primitives/document-flow/add-fields.tsx:997 #: packages/ui/primitives/document-flow/types.ts:56 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:784 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:862 msgid "Number" msgstr "Número" @@ -3464,7 +3516,7 @@ msgstr "En esta página, puedes editar el webhook y sus configuraciones." msgid "On this page, you can edit the webhook and its settings." msgstr "En esta página, puedes editar el webhook y su configuración." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:136 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:135 msgid "Once confirmed, the following will occur:" msgstr "Una vez confirmado, ocurrirá lo siguiente:" @@ -3504,7 +3556,7 @@ msgstr "¡Ups! Algo salió mal." msgid "Opened" msgstr "Abierto" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:337 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:332 #: apps/web/src/components/forms/signup.tsx:239 #: apps/web/src/components/forms/signup.tsx:263 #: apps/web/src/components/forms/v2/signup.tsx:387 @@ -3515,12 +3567,12 @@ msgstr "O" msgid "Or continue with" msgstr "O continúa con" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:340 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:351 msgid "Otherwise, the document will be created as a draft." msgstr "De lo contrario, el documento se creará como un borrador." #: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:86 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:103 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:104 #: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:81 #: apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx:84 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:107 @@ -3629,7 +3681,7 @@ msgid "Payment overdue" msgstr "Pago atrasado" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:131 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:207 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:205 #: apps/web/src/components/(teams)/tables/teams-member-page-data-table.tsx:82 #: apps/web/src/components/(teams)/tables/user-settings-teams-page-data-table.tsx:77 #: apps/web/src/components/document/document-read-only-fields.tsx:89 @@ -3680,11 +3732,11 @@ msgstr "Elige cualquiera de los siguientes acuerdos a continuación y comience a #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:79 #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:84 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:60 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:67 msgid "Placeholder" msgstr "Marcador de posición" -#: packages/email/template-components/template-document-invite.tsx:56 +#: packages/email/template-components/template-document-invite.tsx:55 msgid "Please {0} your document<0/>\"{documentName}\"" msgstr "Por favor {0} tu documento<0/>\"{documentName}\"" @@ -3724,7 +3776,7 @@ msgstr "Por favor confirma tu correo electrónico" msgid "Please confirm your email address" msgstr "Por favor confirma tu dirección de correo electrónico" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:176 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:175 msgid "Please contact support if you would like to revert this action." msgstr "Por favor, contacta al soporte si deseas revertir esta acción." @@ -3741,19 +3793,19 @@ msgstr "Por favor, introduce un nombre válido." msgid "Please mark as viewed to complete" msgstr "Por favor, marca como visto para completar" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:459 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:453 msgid "Please note that proceeding will remove direct linking recipient and turn it into a placeholder." msgstr "Por favor, ten en cuenta que proceder eliminará el destinatario de enlace directo y lo convertirá en un marcador de posición." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:130 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:129 msgid "Please note that this action is <0>irreversible." msgstr "Por favor, ten en cuenta que esta acción es <0>irreversible." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:121 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:120 msgid "Please note that this action is <0>irreversible. Once confirmed, this document will be permanently deleted." msgstr "Por favor, ten en cuenta que esta acción es <0>irreversible. Una vez confirmada, este documento será eliminado permanentemente." -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:67 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:62 msgid "Please note that this action is irreversible. Once confirmed, your template will be permanently deleted." msgstr "Por favor, ten en cuenta que esta acción es irreversible. Una vez confirmada, tu plantilla será eliminada permanentemente." @@ -3785,6 +3837,10 @@ msgstr "Por favor, proporciona un token de tu autenticador, o un código de resp msgid "Please review the document before signing." msgstr "Por favor, revise el documento antes de firmar." +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:503 +msgid "Please select a PDF file" +msgstr "Por favor seleccione un archivo PDF" + #: apps/web/src/components/forms/send-confirmation-email.tsx:64 msgid "Please try again and make sure you enter the correct email address." msgstr "Por favor, intenta de nuevo y asegúrate de ingresar la dirección de correo electrónico correcta." @@ -3793,7 +3849,7 @@ msgstr "Por favor, intenta de nuevo y asegúrate de ingresar la dirección de co msgid "Please try again later or login using your normal details" msgstr "Por favor, intenta de nuevo más tarde o inicia sesión utilizando tus datos normales" -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:80 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:79 msgid "Please try again later." msgstr "Por favor, intenta de nuevo más tarde." @@ -3802,7 +3858,7 @@ msgstr "Por favor, intenta de nuevo más tarde." msgid "Please try again or contact our support." msgstr "Por favor, inténtalo de nuevo o contacta a nuestro soporte." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:186 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:185 msgid "Please type {0} to confirm" msgstr "Por favor, escriba {0} para confirmar" @@ -3810,6 +3866,10 @@ msgstr "Por favor, escriba {0} para confirmar" msgid "Please type <0>{0} to confirm." msgstr "Por favor, escribe <0>{0} para confirmar." +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:172 +msgid "Pre-formatted CSV template with example data." +msgstr "" + #: apps/web/src/components/(dashboard)/common/command-menu.tsx:214 #: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:58 #: apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx:67 @@ -3840,16 +3900,16 @@ msgstr "Las plantillas privadas solo pueden ser modificadas y vistas por ti." msgid "Profile" msgstr "Perfil" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:184 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:183 msgid "Profile is currently <0>hidden." msgstr "El perfil está actualmente <0>oculto." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:172 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:171 msgid "Profile is currently <0>visible." msgstr "El perfil está actualmente <0>visible." #: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:74 -#: apps/web/src/components/forms/profile.tsx:72 +#: apps/web/src/components/forms/profile.tsx:71 msgid "Profile updated" msgstr "Perfil actualizado" @@ -3888,9 +3948,9 @@ msgstr "Valores de radio" #: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:186 #: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:147 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:156 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:177 #: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:122 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:133 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:161 msgid "Read only" msgstr "Solo lectura" @@ -3906,7 +3966,7 @@ msgstr "Lea la <0>divulgación de firma completa." msgid "Ready" msgstr "Listo" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:289 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:291 msgid "Reason" msgstr "Razón" @@ -3935,21 +3995,21 @@ msgstr "Recibe copia" msgid "Recent activity" msgstr "Actividad reciente" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:45 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:43 msgid "Recent documents" msgstr "Documentos recientes" #: apps/web/src/app/(dashboard)/documents/data-table.tsx:63 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:116 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:280 -#: packages/lib/utils/document-audit-logs.ts:338 -#: packages/lib/utils/document-audit-logs.ts:353 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:114 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:275 +#: packages/lib/utils/document-audit-logs.ts:354 +#: packages/lib/utils/document-audit-logs.ts:369 msgid "Recipient" msgstr "Destinatario" #: packages/ui/components/recipient/recipient-action-auth-select.tsx:39 #: packages/ui/primitives/document-flow/add-settings.tsx:269 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:291 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:337 msgid "Recipient action authentication" msgstr "Autenticación de acción de destinatario" @@ -3972,7 +4032,7 @@ msgstr "Destinatario actualizado" #: apps/web/src/app/(dashboard)/admin/documents/[id]/page.tsx:66 #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:49 #: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recipients.tsx:30 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:139 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:140 msgid "Recipients" msgstr "Destinatarios" @@ -3980,7 +4040,7 @@ msgstr "Destinatarios" msgid "Recipients metrics" msgstr "Métricas de destinatarios" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:166 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:165 msgid "Recipients will still retain their copy of the document" msgstr "Los destinatarios aún conservarán su copia del documento" @@ -3997,7 +4057,7 @@ msgid "Red" msgstr "Rojo" #: packages/ui/primitives/document-flow/add-settings.tsx:383 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:461 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:507 msgid "Redirect URL" msgstr "URL de redirección" @@ -4010,7 +4070,7 @@ msgstr "Registro exitoso" #: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:109 #: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:116 #: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:162 -#: packages/email/template-components/template-document-invite.tsx:96 +#: packages/email/template-components/template-document-invite.tsx:95 msgid "Reject Document" msgstr "Rechazar Documento" @@ -4047,17 +4107,18 @@ msgstr "Recordatorio: Por favor {recipientActionVerb} este documento" msgid "Reminder: Please {recipientActionVerb} your document" msgstr "Recordatorio: Por favor {recipientActionVerb} tu documento" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:193 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:431 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:188 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:425 #: apps/web/src/app/(signing)/sign/[token]/signing-field-container.tsx:156 #: apps/web/src/app/(signing)/sign/[token]/signing-field-container.tsx:180 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:250 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx:89 #: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:159 #: apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx:54 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:164 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:163 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:165 #: apps/web/src/components/forms/avatar-image.tsx:166 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:217 #: packages/ui/primitives/document-flow/add-fields.tsx:1128 msgid "Remove" msgstr "Eliminar" @@ -4085,9 +4146,9 @@ msgstr "Solicitar transferencia" #: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:176 #: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:137 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:146 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:167 #: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:112 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:123 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:151 msgid "Required field" msgstr "Campo obligatorio" @@ -4096,7 +4157,7 @@ msgid "Reseal document" msgstr "Re-sellar documento" #: apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx:118 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:152 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:151 #: packages/ui/primitives/document-flow/add-subject.tsx:84 msgid "Resend" msgstr "Reenviar" @@ -4177,11 +4238,11 @@ msgstr "Revocar" msgid "Revoke access" msgstr "Revocar acceso" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:283 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:278 #: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:318 #: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:163 #: apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx:80 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:121 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:120 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:103 msgid "Role" msgstr "Rol" @@ -4195,16 +4256,16 @@ msgstr "Roles" msgid "Rows per page" msgstr "Filas por página" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:446 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:337 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:344 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:440 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:350 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:361 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:312 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:305 -#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:356 +#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:322 msgid "Save" msgstr "Guardar" -#: packages/ui/primitives/template-flow/add-template-fields.tsx:896 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:974 msgid "Save Template" msgstr "Guardar plantilla" @@ -4219,7 +4280,7 @@ msgstr "Buscar" msgid "Search by document title" msgstr "Buscar por título del documento" -#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:147 +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:174 #: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:144 msgid "Search by name or email" msgstr "Buscar por nombre o correo electrónico" @@ -4266,11 +4327,11 @@ msgstr "Seleccionar un equipo para mover este documento. Esta acción no se pued msgid "Select a team to move this template to. This action cannot be undone." msgstr "Seleccionar un equipo para mover esta plantilla. Esta acción no se puede deshacer." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:261 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:259 msgid "Select a template you'd like to display on your public profile" msgstr "Seleccionar una plantilla que te gustaría mostrar en tu perfil público" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:257 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:255 msgid "Select a template you'd like to display on your team's public profile" msgstr "Seleccionar una plantilla que te gustaría mostrar en el perfil público de tu equipo" @@ -4301,7 +4362,7 @@ msgstr "Enviar" msgid "Send confirmation email" msgstr "Enviar correo de confirmación" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:325 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:336 msgid "Send document" msgstr "Enviar documento" @@ -4329,6 +4390,10 @@ msgstr "Enviar correo electrónico de documento pendiente" msgid "Send documents on behalf of the team using the email address" msgstr "Enviar documentos en nombre del equipo usando la dirección de correo electrónico" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:253 +msgid "Send documents to recipients immediately" +msgstr "" + #: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:200 msgid "Send on Behalf of Team" msgstr "Enviar en nombre del equipo" @@ -4362,7 +4427,7 @@ msgid "Sending..." msgstr "Enviando..." #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:101 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:256 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:258 msgid "Sent" msgstr "Enviado" @@ -4381,8 +4446,8 @@ msgstr "Configuraciones" msgid "Setup" msgstr "Configuración" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:148 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:193 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:154 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:187 msgid "Share" msgstr "Compartir" @@ -4390,8 +4455,8 @@ msgstr "Compartir" msgid "Share Signature Card" msgstr "Compartir tarjeta de firma" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:179 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:219 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:185 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:213 msgid "Share Signing Card" msgstr "Compartir tarjeta de firma" @@ -4403,7 +4468,7 @@ msgstr "Compartir el enlace" msgid "Share your signing experience!" msgstr "¡Comparte tu experiencia de firma!" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:163 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:162 msgid "Show" msgstr "Mostrar" @@ -4424,13 +4489,13 @@ msgstr "Mostrar plantillas en tu perfil público para que tu audiencia firme y c msgid "Show templates in your team public profile for your audience to sign and get started quickly" msgstr "Mostrar plantillas en el perfil público de tu equipo para que tu audiencia firme y comience rápidamente" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:83 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:114 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:139 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:89 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:115 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:133 #: apps/web/src/app/(profile)/p/[url]/page.tsx:192 #: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:229 #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:182 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:224 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:241 #: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:142 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:328 #: apps/web/src/components/ui/user-profile-skeleton.tsx:75 @@ -4443,7 +4508,7 @@ msgstr "Firmar" msgid "Sign as {0} <0>({1})" msgstr "Firmar como {0} <0>({1})" -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:183 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:200 msgid "Sign as<0>{0} <1>({1})" msgstr "Firmar como<0>{0} <1>({1})" @@ -4453,7 +4518,7 @@ msgid "Sign document" msgstr "Firmar documento" #: apps/web/src/app/(signing)/sign/[token]/form.tsx:141 -#: packages/email/template-components/template-document-invite.tsx:104 +#: packages/email/template-components/template-document-invite.tsx:103 msgid "Sign Document" msgstr "Firmar Documento" @@ -4506,22 +4571,22 @@ msgid "Sign Up with OIDC" msgstr "Regístrate con OIDC" #: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:88 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:177 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:179 #: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:342 #: apps/web/src/app/(signing)/sign/[token]/form.tsx:205 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:251 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:286 #: apps/web/src/app/embed/direct/[[...url]]/client.tsx:422 #: apps/web/src/app/embed/sign/[[...url]]/client.tsx:301 -#: apps/web/src/components/forms/profile.tsx:132 +#: apps/web/src/components/forms/profile.tsx:123 #: packages/ui/primitives/document-flow/add-fields.tsx:841 #: packages/ui/primitives/document-flow/field-icon.tsx:52 #: packages/ui/primitives/document-flow/types.ts:49 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:628 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:706 msgid "Signature" msgstr "Firma" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:228 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:230 msgid "Signature ID" msgstr "ID de Firma" @@ -4541,7 +4606,7 @@ msgid "Signatures will appear once the document has been completed" msgstr "Las firmas aparecerán una vez que el documento se haya completado" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:114 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:278 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:280 #: apps/web/src/components/document/document-read-only-fields.tsx:84 #: packages/lib/constants/recipient-roles.ts:23 msgid "Signed" @@ -4551,7 +4616,7 @@ msgstr "Firmado" msgid "Signer" msgstr "Firmante" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:176 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:178 msgid "Signer Events" msgstr "Eventos del Firmante" @@ -4567,11 +4632,11 @@ msgstr "Los firmantes deben tener correos electrónicos únicos" msgid "Signing" msgstr "Firmando" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:168 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:170 msgid "Signing Certificate" msgstr "Certificado de Firma" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:311 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:313 msgid "Signing certificate provided by" msgstr "Certificado de firma proporcionado por" @@ -4585,12 +4650,12 @@ msgstr "¡Firma completa!" msgid "Signing in..." msgstr "Iniciando sesión..." -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:160 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:203 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:166 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:197 msgid "Signing Links" msgstr "Enlaces de firma" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:339 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:315 msgid "Signing links have been generated for this document." msgstr "Se han generado enlaces de firma para este documento." @@ -4598,7 +4663,7 @@ msgstr "Se han generado enlaces de firma para este documento." msgid "Signing up..." msgstr "Registrándose..." -#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:82 +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:90 #: apps/web/src/app/(dashboard)/admin/leaderboard/page.tsx:46 msgid "Signing Volume" msgstr "Volumen de firmas" @@ -4611,7 +4676,7 @@ msgstr "Las inscripciones están deshabilitadas." msgid "Since {0}" msgstr "Desde {0}" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:102 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:93 msgid "Site Banner" msgstr "Banner del sitio" @@ -4625,27 +4690,27 @@ msgid "Some signers have not been assigned a signature field. Please assign at l msgstr "Algunos firmantes no han sido asignados a un campo de firma. Asigne al menos 1 campo de firma a cada firmante antes de continuar." #: apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx:105 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:63 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:91 -#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:65 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:69 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:97 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:61 #: apps/web/src/app/(dashboard)/documents/[id]/logs/download-certificate-button.tsx:68 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:75 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:106 -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:82 -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:72 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:76 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:100 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:81 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:71 #: apps/web/src/app/(dashboard)/settings/billing/billing-plans.tsx:62 #: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:51 -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:124 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:123 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:73 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:93 #: apps/web/src/app/(dashboard)/settings/teams/accept-team-invitation-button.tsx:32 #: apps/web/src/app/(dashboard)/settings/teams/decline-team-invitation-button.tsx:32 #: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:44 -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:50 -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:79 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:104 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:127 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:151 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:45 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:78 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:100 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:123 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:147 #: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:118 #: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:27 #: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:38 @@ -4661,8 +4726,8 @@ msgstr "Algunos firmantes no han sido asignados a un campo de firma. Asigne al m #: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:64 #: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:83 #: apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx:33 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:66 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:83 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:65 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:82 #: apps/web/src/components/(teams)/team-billing-portal-button.tsx:29 #: packages/ui/components/document/document-share-button.tsx:51 msgid "Something went wrong" @@ -4701,12 +4766,16 @@ msgstr "¡Algo salió mal!" msgid "Something went wrong." msgstr "Algo salió mal." +#: apps/web/src/components/forms/token.tsx:143 +msgid "Something went wrong. Please try again later." +msgstr "Algo salió mal. Por favor, inténtelo de nuevo más tarde." + #: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:240 #: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:154 msgid "Something went wrong. Please try again or contact support." msgstr "Algo salió mal. Por favor, intenta de nuevo o contacta al soporte." -#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:67 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:63 msgid "Sorry, we were unable to download the audit logs. Please try again later." msgstr "Lo sentimos, no pudimos descargar los registros de auditoría. Por favor, intenta de nuevo más tarde." @@ -4714,7 +4783,7 @@ msgstr "Lo sentimos, no pudimos descargar los registros de auditoría. Por favor msgid "Sorry, we were unable to download the certificate. Please try again later." msgstr "Lo sentimos, no pudimos descargar el certificado. Por favor, intenta de nuevo más tarde." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:134 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:132 msgid "Source" msgstr "Fuente" @@ -4725,8 +4794,8 @@ msgstr "Estadísticas" #: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:81 #: apps/web/src/app/(dashboard)/admin/subscriptions/page.tsx:32 #: apps/web/src/app/(dashboard)/documents/data-table.tsx:73 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:126 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:93 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:124 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:94 #: apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx:73 msgid "Status" msgstr "Estado" @@ -4736,7 +4805,7 @@ msgid "Step <0>{step} of {maxStep}" msgstr "Paso <0>{step} de {maxStep}" #: packages/ui/primitives/document-flow/add-subject.tsx:143 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:318 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:364 msgid "Subject <0>(Optional)" msgstr "Asunto <0>(Opcional)" @@ -4762,8 +4831,8 @@ msgstr "Suscripciones" #: apps/web/src/app/(dashboard)/settings/teams/accept-team-invitation-button.tsx:25 #: apps/web/src/app/(dashboard)/settings/teams/decline-team-invitation-button.tsx:25 #: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:37 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:118 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:141 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:114 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:137 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx:32 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:44 #: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:44 @@ -4780,11 +4849,12 @@ msgstr "Suscripciones" #: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:92 #: apps/web/src/components/(teams)/forms/update-team-form.tsx:67 #: apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx:27 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:60 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:77 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:59 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:76 #: apps/web/src/components/forms/public-profile-form.tsx:80 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:133 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:170 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:132 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:168 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:95 msgid "Success" msgstr "Éxito" @@ -4792,6 +4862,14 @@ msgstr "Éxito" msgid "Successfully created passkey" msgstr "Clave de acceso creada con éxito" +#: packages/email/templates/bulk-send-complete.tsx:52 +msgid "Successfully created: {successCount}" +msgstr "" + +#: packages/email/templates/bulk-send-complete.tsx:44 +msgid "Summary:" +msgstr "" + #: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:57 msgid "System Requirements" msgstr "Requisitos del Sistema" @@ -4863,7 +4941,7 @@ msgstr "Invitación del equipo" msgid "Team invitations have been sent." msgstr "Las invitaciones al equipo han sido enviadas." -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:107 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:106 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:84 msgid "Team Member" msgstr "Miembro del equipo" @@ -4940,31 +5018,31 @@ msgstr "Equipos restringidos" #: apps/web/src/app/(dashboard)/templates/[id]/edit/template-edit-page-view.tsx:64 #: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:39 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:144 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:224 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:148 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:142 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:222 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:151 #: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:408 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:271 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:269 msgid "Template" msgstr "Plantilla" -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:41 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:36 msgid "Template deleted" msgstr "Plantilla eliminada" -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:67 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:66 msgid "Template document uploaded" msgstr "Documento de plantilla subido" -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:42 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:41 msgid "Template duplicated" msgstr "Plantilla duplicada" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:134 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:133 msgid "Template has been removed from your public profile." msgstr "La plantilla ha sido eliminada de tu perfil público." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:171 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:169 msgid "Template has been updated." msgstr "La plantilla ha sido actualizada." @@ -4976,15 +5054,15 @@ msgstr "Plantilla movida" msgid "Template not found or already associated with a team." msgstr "Plantilla no encontrada o ya asociada con un equipo." -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:246 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:216 msgid "Template saved" msgstr "Plantilla guardada" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:145 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:167 msgid "Template title" msgstr "Título de plantilla" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:86 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:87 #: apps/web/src/app/(dashboard)/templates/templates-page-view.tsx:55 #: apps/web/src/components/(dashboard)/common/command-menu.tsx:208 #: apps/web/src/components/(dashboard)/layout/desktop-nav.tsx:22 @@ -4992,19 +5070,28 @@ msgstr "Título de plantilla" msgid "Templates" msgstr "Plantillas" -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:106 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:105 msgid "Templates allow you to quickly generate documents with pre-filled recipients and fields." msgstr "Las plantillas te permiten generar documentos rápidamente con destinatarios y campos prellenados." -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:257 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:274 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:258 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:287 #: packages/ui/primitives/document-flow/add-fields.tsx:971 #: packages/ui/primitives/document-flow/types.ts:52 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:758 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:836 msgid "Text" msgstr "Texto" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:166 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:79 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:61 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:56 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:61 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:140 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:124 +msgid "Text Align" +msgstr "" + +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:157 msgid "Text Color" msgstr "Color de texto" @@ -5016,7 +5103,7 @@ msgstr "Gracias por usar Documenso para realizar su firma electrónica de docume msgid "That's okay, it happens! Click the button below to reset your password." msgstr "Está bien, ¡sucede! Haz clic en el botón de abajo para restablecer tu contraseña." -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:51 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:52 msgid "The account has been deleted successfully." msgstr "La cuenta ha sido eliminada con éxito." @@ -5040,13 +5127,13 @@ msgstr "La autenticación requerida para que los destinatarios firmen el campo d msgid "The authentication required for recipients to view the document." msgstr "La autenticación requerida para que los destinatarios vean el documento." -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:197 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:188 msgid "The content to show in the banner, HTML is allowed" msgstr "El contenido que se mostrará en el banner, se permite HTML" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:78 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:73 #: apps/web/src/app/(dashboard)/templates/template-direct-link-badge.tsx:32 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:164 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:160 msgid "The direct link has been copied to your clipboard" msgstr "El enlace directo ha sido copiado a tu portapapeles" @@ -5066,15 +5153,15 @@ msgstr "El propietario del documento ha sido notificado de este rechazo. No se r msgid "The document owner has been notified of your decision. They may contact you with further instructions if necessary." msgstr "The document owner has been notified of your decision. They may contact you with further instructions if necessary." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:182 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:194 msgid "The document was created but could not be sent to recipients." msgstr "El documento fue creado pero no se pudo enviar a los destinatarios." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:163 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:162 msgid "The document will be hidden from your account" msgstr "El documento será ocultado de tu cuenta" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:333 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:344 msgid "The document will be immediately sent to recipients if this is checked." msgstr "El documento se enviará inmediatamente a los destinatarios si esto está marcado." @@ -5088,6 +5175,10 @@ msgstr "El nombre del documento" msgid "The events that will trigger a webhook to be sent to your URL." msgstr "Los eventos que activarán un webhook para ser enviado a tu URL." +#: packages/email/templates/bulk-send-complete.tsx:62 +msgid "The following errors occurred:" +msgstr "" + #: packages/email/templates/team-delete.tsx:37 msgid "The following team has been deleted by its owner. You will no longer be able to access this team and its documents" msgstr "El siguiente equipo ha sido eliminado por su propietario. Ya no podrás acceder a este equipo y sus documentos" @@ -5116,11 +5207,11 @@ msgstr "El enlace del perfil ha sido copiado a tu portapapeles" msgid "The profile you are looking for could not be found." msgstr "El perfil que estás buscando no se pudo encontrar." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:380 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:378 msgid "The public description that will be displayed with this template" msgstr "La descripción pública que se mostrará con esta plantilla" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:358 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:356 msgid "The public name for your template" msgstr "El nombre público de tu plantilla" @@ -5175,7 +5266,7 @@ msgstr "El nombre del firmante" msgid "The signing link has been copied to your clipboard." msgstr "El enlace de firma ha sido copiado a tu portapapeles." -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:105 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:96 msgid "The site banner is a message that is shown at the top of the site. It can be used to display important information to your users." msgstr "El banner del sitio es un mensaje que se muestra en la parte superior del sitio. Se puede usar para mostrar información importante a tus usuarios." @@ -5199,7 +5290,7 @@ msgstr "El equipo que buscas puede haber sido eliminado, renombrado o puede que msgid "The template has been successfully moved to the selected team." msgstr "La plantilla ha sido movida con éxito al equipo seleccionado." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:443 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:441 msgid "The template will be removed from your profile" msgstr "La plantilla será eliminada de tu perfil" @@ -5207,7 +5298,7 @@ msgstr "La plantilla será eliminada de tu perfil" msgid "The template you are looking for may have been disabled, deleted or may have never existed." msgstr "La plantilla que buscas puede haber sido desactivada, eliminada o puede que nunca haya existido." -#: apps/web/src/components/forms/token.tsx:106 +#: apps/web/src/components/forms/token.tsx:107 msgid "The token was copied to your clipboard." msgstr "El token fue copiado a tu portapapeles." @@ -5250,8 +5341,8 @@ msgstr "Aún no hay documentos completados. Los documentos que hayas creado o re msgid "They have permission on your behalf to:" msgstr "Tienen permiso en tu nombre para:" -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:110 -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:109 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:100 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:106 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:98 msgid "This action is not reversible. Please be certain." msgstr "Esta acción no es reversible. Por favor, asegúrate." @@ -5268,11 +5359,11 @@ msgstr "Esto se puede anular configurando los requisitos de autenticación direc msgid "This document can not be recovered, if you would like to dispute the reason for future documents please contact support." msgstr "Este documento no se puede recuperar, si deseas impugnar la razón para documentos futuros, por favor contacta con el soporte." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:83 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:82 msgid "This document could not be deleted at this time. Please try again." msgstr "Este documento no se pudo eliminar en este momento. Por favor, inténtalo de nuevo." -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:73 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:72 msgid "This document could not be duplicated at this time. Please try again." msgstr "Este documento no se pudo duplicar en este momento. Por favor, inténtalo de nuevo." @@ -5292,11 +5383,11 @@ 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/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:227 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:228 msgid "This document has been signed by all recipients" msgstr "Este documento ha sido firmado por todos los destinatarios" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:230 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:231 msgid "This document is currently a draft and has not been sent" msgstr "Este documento es actualmente un borrador y no ha sido enviado" @@ -5304,11 +5395,11 @@ msgstr "Este documento es actualmente un borrador y no ha sido enviado" msgid "This document is password protected. Please enter the password to view the document." msgstr "Este documento está protegido por contraseña. Por favor ingrese la contraseña para ver el documento." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:148 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:146 msgid "This document was created by you or a team member using the template above." msgstr "Este documento fue creado por ti o un miembro del equipo usando la plantilla anterior." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:160 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:158 msgid "This document was created using a direct link." msgstr "Este documento fue creado usando un enlace directo." @@ -5344,7 +5435,7 @@ msgstr "Este correo electrónico se enviará al destinatario que acaba de firmar msgid "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them." msgstr "Este campo no se puede modificar ni eliminar. Cuando comparta el enlace directo de esta plantilla o lo agregue a su perfil público, cualquiera que acceda podrá ingresar su nombre y correo electrónico, y completar los campos que se le hayan asignado." -#: packages/ui/primitives/template-flow/add-template-settings.tsx:233 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:279 msgid "This is how the document will reach the recipients once the document is ready for signing." msgstr "Así es como el documento llegará a los destinatarios una vez que esté listo para firmarse." @@ -5384,7 +5475,7 @@ msgstr "Este firmante ya ha firmado el documento." msgid "This team, and any associated data excluding billing invoices will be permanently deleted." msgstr "Este equipo, y cualquier dato asociado, excluyendo las facturas de facturación, serán eliminados permanentemente." -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:51 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:46 msgid "This template could not be deleted at this time. Please try again." msgstr "Esta plantilla no se pudo eliminar en este momento. Por favor, inténtalo de nuevo." @@ -5425,7 +5516,7 @@ msgstr "Esto se enviará al propietario del documento una vez que el documento s msgid "This will override any global settings." msgstr "Esto anulará cualquier configuración global." -#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:71 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:70 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:44 msgid "Time" msgstr "Hora" @@ -5434,15 +5525,15 @@ msgstr "Hora" msgid "Time zone" msgstr "Zona horaria" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:131 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:132 #: packages/ui/primitives/document-flow/add-settings.tsx:359 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:438 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:484 msgid "Time Zone" msgstr "Zona horaria" #: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:67 #: apps/web/src/app/(dashboard)/documents/data-table.tsx:54 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:111 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:109 #: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:61 #: packages/ui/primitives/document-flow/add-settings.tsx:166 msgid "Title" @@ -5456,13 +5547,13 @@ msgstr "Para aceptar esta invitación debes crear una cuenta." msgid "To change the email you must remove and add a new email address." msgstr "Para cambiar el correo electrónico debes eliminar y añadir una nueva dirección de correo electrónico." -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:116 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:113 #: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:111 #: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:101 msgid "To confirm, please enter the accounts email address <0/>({0})." msgstr "Para confirmar, por favor ingresa la dirección de correo electrónico de la cuenta <0/>({0})." -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:117 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:107 msgid "To confirm, please enter the reason" msgstr "Para confirmar, por favor ingresa la razón" @@ -5483,7 +5574,7 @@ msgid "To mark this document as viewed, you need to be logged in as <0>{0}" msgstr "Para marcar este documento como visto, debes iniciar sesión como <0>{0}" #: packages/ui/primitives/document-flow/add-fields.tsx:1091 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:876 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:954 msgid "To proceed further, please set at least one value for the {0} field." msgstr "Para continuar, por favor establezca al menos un valor para el campo {0}." @@ -5495,11 +5586,11 @@ msgstr "Para usar nuestro servicio de firma electrónica, debe tener acceso a:" msgid "To view this document you need to be signed into your account, please sign in to continue." msgstr "Para ver este documento debes iniciar sesión en tu cuenta, por favor inicia sesión para continuar." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:178 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:177 msgid "Toggle the switch to hide your profile from the public." msgstr "Activa el interruptor para ocultar tu perfil del público." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:190 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:189 msgid "Toggle the switch to show your profile to the public." msgstr "Activa el interruptor para mostrar tu perfil al público." @@ -5507,11 +5598,11 @@ msgstr "Activa el interruptor para mostrar tu perfil al público." msgid "Token" msgstr "Token" -#: apps/web/src/components/forms/token.tsx:105 +#: apps/web/src/components/forms/token.tsx:106 msgid "Token copied to clipboard" msgstr "Token copiado al portapapeles" -#: apps/web/src/components/forms/token.tsx:126 +#: apps/web/src/components/forms/token.tsx:127 msgid "Token created" msgstr "Token creado" @@ -5544,6 +5635,10 @@ msgstr "Total de documentos" msgid "Total Recipients" msgstr "Total de destinatarios" +#: packages/email/templates/bulk-send-complete.tsx:49 +msgid "Total rows processed: {totalProcessed}" +msgstr "" + #: apps/web/src/app/(dashboard)/admin/stats/page.tsx:150 msgid "Total Signers that Signed Up" msgstr "Total de firmantes que se registraron" @@ -5629,11 +5724,11 @@ msgstr "No se puede cambiar el idioma en este momento. Por favor intenta nuevame msgid "Unable to copy recovery code" msgstr "No se pudo copiar el código de recuperación" -#: apps/web/src/components/forms/token.tsx:110 +#: apps/web/src/components/forms/token.tsx:111 msgid "Unable to copy token" msgstr "No se pudo copiar el token" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:105 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:101 msgid "Unable to create direct template access. Please try again later." msgstr "No se pudo crear acceso directo a la plantilla. Por favor, inténtalo de nuevo más tarde." @@ -5641,7 +5736,7 @@ msgstr "No se pudo crear acceso directo a la plantilla. Por favor, inténtalo de msgid "Unable to decline this team invitation at this time." msgstr "No se pudo rechazar esta invitación al equipo en este momento." -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:84 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:83 msgid "Unable to delete invitation. Please try again." msgstr "No se pudo eliminar la invitación. Por favor, inténtalo de nuevo." @@ -5662,11 +5757,11 @@ msgstr "No se pudo unirte a este equipo en este momento." msgid "Unable to load document history" msgstr "No se pudo cargar el historial del documento" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:60 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:58 msgid "Unable to load documents" msgstr "No se pueden cargar documentos" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:111 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:106 msgid "Unable to load your public profile templates at this time" msgstr "No se pudo cargar tus plantillas de perfil público en este momento" @@ -5678,7 +5773,7 @@ msgstr "No se pudo eliminar la verificación de correo electrónico en este mome msgid "Unable to remove team email at this time. Please try again." msgstr "No se pudo eliminar el correo electrónico del equipo en este momento. Por favor, inténtalo de nuevo." -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:67 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:66 msgid "Unable to resend invitation. Please try again." msgstr "No se pudo reenviar la invitación. Por favor, inténtalo de nuevo." @@ -5709,10 +5804,10 @@ msgstr "No autorizado" msgid "Uncompleted" msgstr "Incompleto" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:237 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:262 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:273 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:284 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:239 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:264 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:275 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:286 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx:55 msgid "Unknown" msgstr "Desconocido" @@ -5725,17 +5820,17 @@ msgstr "Error desconocido" msgid "Unpaid" msgstr "No pagado" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:181 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:176 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:162 #: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:166 #: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:191 #: apps/web/src/components/forms/public-profile-form.tsx:279 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:428 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:426 #: packages/ui/primitives/document-flow/add-subject.tsx:86 msgid "Update" msgstr "Actualizar" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:211 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:202 msgid "Update Banner" msgstr "Actualizar banner" @@ -5747,7 +5842,7 @@ msgstr "Actualizar clave de acceso" msgid "Update password" msgstr "Actualizar contraseña" -#: apps/web/src/components/forms/profile.tsx:151 +#: apps/web/src/components/forms/profile.tsx:142 msgid "Update profile" msgstr "Actualizar perfil" @@ -5790,7 +5885,7 @@ msgstr "Actualizar webhook" msgid "Updating password..." msgstr "Actualizando contraseña..." -#: apps/web/src/components/forms/profile.tsx:151 +#: apps/web/src/components/forms/profile.tsx:142 msgid "Updating profile..." msgstr "Actualizando perfil..." @@ -5802,10 +5897,30 @@ msgstr "Actualizando Su Información" msgid "Upgrade" msgstr "Actualizar" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:132 +msgid "Upload a CSV file to create multiple documents from this template. Each row represents one document with its recipient details." +msgstr "" + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:426 +msgid "Upload a custom document to use instead of the template's default document" +msgstr "Sube un documento personalizado para usar en lugar del documento predeterminado de la plantilla" + +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:267 +msgid "Upload and Process" +msgstr "" + #: apps/web/src/components/forms/avatar-image.tsx:179 msgid "Upload Avatar" msgstr "Subir avatar" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:198 +msgid "Upload CSV" +msgstr "" + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:419 +msgid "Upload custom document" +msgstr "Subir documento personalizado" + #: packages/ui/primitives/signature-pad/signature-pad.tsx:529 msgid "Upload Signature" msgstr "Subir firma" @@ -5835,7 +5950,7 @@ msgstr "El archivo subido es demasiado pequeño" msgid "Uploaded file not an allowed file type" msgstr "El archivo subido no es un tipo de archivo permitido" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:172 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:175 msgid "Use" msgstr "Usar" @@ -5849,11 +5964,11 @@ msgstr "Usar Autenticador" msgid "Use Backup Code" msgstr "Usar Código de Respaldo" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:207 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:219 msgid "Use Template" msgstr "Usar Plantilla" -#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:76 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:75 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:45 msgid "User" msgstr "Usuario" @@ -5866,6 +5981,7 @@ msgstr "El usuario no tiene contraseña." msgid "User ID" msgstr "ID de Usuario" +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:61 #: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:55 #: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:55 msgid "User not found." @@ -5892,7 +6008,7 @@ msgid "Users" msgstr "Usuarios" #: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:132 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:167 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:188 msgid "Validation" msgstr "Validación" @@ -5930,14 +6046,14 @@ msgstr "Verifica tu correo electrónico para subir documentos." msgid "Verify your team email address" msgstr "Verifica tu dirección de correo electrónico del equipo" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:75 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:76 msgid "Version History" msgstr "Historial de Versiones" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:95 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:126 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:135 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:132 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:101 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:127 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:136 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:126 #: apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx:100 #: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:168 #: packages/lib/constants/recipient-roles.ts:29 @@ -5960,7 +6076,7 @@ msgstr "Ver todos los documentos enviados a tu cuenta" msgid "View all recent security activity related to your account." msgstr "Ver toda la actividad de seguridad reciente relacionada con tu cuenta." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:155 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:153 msgid "View all related documents" msgstr "Ver todos los documentos relacionados" @@ -5977,7 +6093,7 @@ msgid "View document" msgstr "Ver documento" #: apps/web/src/app/(signing)/sign/[token]/form.tsx:140 -#: packages/email/template-components/template-document-invite.tsx:105 +#: packages/email/template-components/template-document-invite.tsx:104 #: packages/email/template-components/template-document-rejected.tsx:44 #: packages/ui/primitives/document-flow/add-subject.tsx:90 #: packages/ui/primitives/document-flow/add-subject.tsx:91 @@ -5992,7 +6108,7 @@ msgstr "Ver documentos asociados con este correo electrónico" msgid "View invites" msgstr "Ver invitaciones" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:93 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:91 msgid "View more" msgstr "Ver más" @@ -6014,7 +6130,7 @@ msgid "View teams" msgstr "Ver equipos" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:120 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:267 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:269 #: packages/lib/constants/recipient-roles.ts:30 msgid "Viewed" msgstr "Visto" @@ -6073,7 +6189,7 @@ msgstr "No podemos eliminar esta clave de acceso en este momento. Por favor, int msgid "We are unable to update this passkey at the moment. Please try again later." msgstr "No podemos actualizar esta clave de acceso en este momento. Por favor, inténtalo de nuevo más tarde." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:153 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:149 msgid "We encountered an error while removing the direct template link. Please try again later." msgstr "Encontramos un error al eliminar el enlace directo de la plantilla. Por favor, inténtalo de nuevo más tarde." @@ -6082,10 +6198,6 @@ msgstr "Encontramos un error al eliminar el enlace directo de la plantilla. Por msgid "We encountered an error while updating the webhook. Please try again later." msgstr "Encontramos un error al actualizar el webhook. Por favor, inténtalo de nuevo más tarde." -#: apps/web/src/components/forms/token.tsx:145 -msgid "We encountered an unknown error while attempting create the new token. Please try again later." -msgstr "Encontramos un error desconocido al intentar crear el nuevo token. Por favor, inténtalo de nuevo más tarde." - #: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:102 msgid "We encountered an unknown error while attempting to add this email. Please try again later." msgstr "Encontramos un error desconocido al intentar añadir este correo electrónico. Por favor, inténtalo de nuevo más tarde." @@ -6110,7 +6222,6 @@ msgstr "Encontramos un error desconocido al intentar eliminar este equipo. Por f msgid "We encountered an unknown error while attempting to delete this token. Please try again later." msgstr "Encontramos un error desconocido al intentar eliminar este token. Por favor, inténtalo de nuevo más tarde." -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:70 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:58 msgid "We encountered an unknown error while attempting to delete your account. Please try again later." msgstr "Encontramos un error desconocido al intentar eliminar tu cuenta. Por favor, inténtalo de nuevo más tarde." @@ -6123,7 +6234,7 @@ msgstr "Encontramos un error desconocido al intentar invitar a miembros del equi msgid "We encountered an unknown error while attempting to leave this team. Please try again later." msgstr "Encontramos un error desconocido al intentar salir de este equipo. Por favor, inténtalo de nuevo más tarde." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:143 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:142 msgid "We encountered an unknown error while attempting to remove this template from your profile. Please try again later." msgstr "Encontramos un error desconocido al intentar eliminar esta plantilla de tu perfil. Por favor, inténtalo de nuevo más tarde." @@ -6151,7 +6262,6 @@ msgstr "Encontramos un error desconocido al intentar revocar el acceso. Por favo msgid "We encountered an unknown error while attempting to save your details. Please try again later." msgstr "Encontramos un error desconocido al intentar guardar tus datos. Por favor, inténtalo de nuevo más tarde." -#: apps/web/src/components/forms/profile.tsx:89 #: apps/web/src/components/forms/signin.tsx:273 #: apps/web/src/components/forms/signin.tsx:288 #: apps/web/src/components/forms/signin.tsx:304 @@ -6165,11 +6275,11 @@ msgstr "Encontramos un error desconocido al intentar iniciar sesión. Por favor, msgid "We encountered an unknown error while attempting to sign you Up. Please try again later." msgstr "Encontramos un error desconocido al intentar registrarte. Por favor, inténtalo de nuevo más tarde." -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:92 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:84 msgid "We encountered an unknown error while attempting to update the banner. Please try again later." msgstr "Encontramos un error desconocido al intentar actualizar el banner. Por favor, inténtalo de nuevo más tarde." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:180 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:178 msgid "We encountered an unknown error while attempting to update the template. Please try again later." msgstr "Encontramos un error desconocido al intentar actualizar la plantilla. Por favor, inténtalo de nuevo más tarde." @@ -6194,6 +6304,10 @@ msgstr "Encontramos un error desconocido al intentar actualizar tu equipo. Por f msgid "We encountered an unknown error while attempting update the team email. Please try again later." msgstr "Encontramos un error desconocido al intentar actualizar el correo electrónico del equipo. Por favor, inténtalo de nuevo más tarde." +#: apps/web/src/components/forms/profile.tsx:81 +msgid "We encountered an unknown error while attempting update your profile. Please try again later." +msgstr "Encontramos un error desconocido al intentar actualizar su perfil. Por favor, inténtelo de nuevo más tarde." + #: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:80 msgid "We have sent a confirmation email for verification." msgstr "Hemos enviado un correo electrónico de confirmación para la verificación." @@ -6206,7 +6320,7 @@ msgstr "Necesitamos un nombre de usuario para crear tu perfil" msgid "We need your signature to sign documents" msgstr "Necesitamos su firma para firmar documentos" -#: apps/web/src/components/forms/token.tsx:111 +#: apps/web/src/components/forms/token.tsx:112 msgid "We were unable to copy the token to your clipboard. Please try again." msgstr "No pudimos copiar el token en tu portapapeles. Por favor, inténtalo de nuevo." @@ -6231,7 +6345,7 @@ msgstr "No pudimos desactivar la autenticación de dos factores para tu cuenta. msgid "We were unable to log you out at this time." msgstr "No pudimos cerrar sesión en este momento." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:125 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:124 msgid "We were unable to set your public profile to public. Please try again." msgstr "No pudimos configurar tu perfil público como público. Por favor, inténtalo de nuevo." @@ -6266,11 +6380,11 @@ msgstr "No pudimos verificar tu correo electrónico. Si tu correo electrónico n msgid "We will generate signing links for with you, which you can send to the recipients through your method of choice." msgstr "Generaremos enlaces de firma para ti, que podrás enviar a los destinatarios a través de tu método preferido." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:369 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:382 msgid "We will generate signing links for you, which you can send to the recipients through your method of choice." msgstr "Generaremos enlaces de firma para ti, que podrás enviar a los destinatarios a través de tu método preferido." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:365 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:378 #: packages/ui/primitives/document-flow/add-subject.tsx:201 msgid "We won't send anything to notify recipients." msgstr "No enviaremos nada para notificar a los destinatarios." @@ -6376,13 +6490,13 @@ msgstr "Escribe sobre ti mismo" msgid "Yearly" msgstr "Anual" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:32 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:31 -#: packages/lib/utils/document-audit-logs.ts:258 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:33 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:32 +#: packages/lib/utils/document-audit-logs.ts:274 msgid "You" msgstr "Tú" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:105 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:104 msgid "You are about to delete <0>\"{documentTitle}\"" msgstr "Estás a punto de eliminar <0>\"{documentTitle}\"" @@ -6390,7 +6504,7 @@ msgstr "Estás a punto de eliminar <0>\"{documentTitle}\"" msgid "You are about to delete the following team email from <0>{teamName}." msgstr "Estás a punto de eliminar el siguiente correo electrónico del equipo de <0>{teamName}." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:109 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:108 msgid "You are about to hide <0>\"{documentTitle}\"" msgstr "Estás a punto de ocultar <0>\"{documentTitle}\"" @@ -6426,6 +6540,10 @@ msgstr "Actualmente estás actualizando la clave <0>{passkeyName}." msgid "You are not a member of this team." msgstr "No eres miembro de este equipo." +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:62 +msgid "You are not authorized to delete this user." +msgstr "No está autorizado para eliminar a este usuario." + #: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:56 msgid "You are not authorized to disable this user." msgstr "No estás autorizado para deshabilitar a este usuario." @@ -6474,6 +6592,10 @@ msgstr "Puede usar las siguientes variables en su mensaje:" msgid "You can view documents associated with this email and use this identity when sending documents." msgstr "Puedes ver documentos asociados a este correo electrónico y usar esta identidad al enviar documentos." +#: packages/email/templates/bulk-send-complete.tsx:76 +msgid "You can view the created documents in your dashboard under the \"Documents created from template\" section." +msgstr "" + #: packages/email/template-components/template-document-rejected.tsx:37 msgid "You can view the document and its status by clicking the button below." msgstr "Puede ver el documento y su estado haciendo clic en el botón de abajo." @@ -6490,7 +6612,7 @@ msgstr "No puedes modificar a un miembro del equipo que tenga un rol más alto q msgid "You cannot upload documents at this time." msgstr "No puede cargar documentos en este momento." -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:103 msgid "You cannot upload encrypted PDFs" msgstr "No puedes subir PDFs encriptados" @@ -6498,6 +6620,10 @@ msgstr "No puedes subir PDFs encriptados" msgid "You do not currently have a customer record, this should not happen. Please contact support for assistance." msgstr "Actualmente no tienes un registro de cliente, esto no debería suceder. Por favor contacta a soporte para obtener asistencia." +#: apps/web/src/components/forms/token.tsx:141 +msgid "You do not have permission to create a token for this team" +msgstr "No tiene permiso para crear un token para este equipo" + #: packages/email/template-components/template-document-cancel.tsx:35 msgid "You don't need to sign it anymore." msgstr "Ya no necesitas firmarlo." @@ -6527,7 +6653,8 @@ msgstr "Te han invitado a unirte a {0} en Documenso" msgid "You have been invited to join the following team" msgstr "Te han invitado a unirte al siguiente equipo" -#: packages/lib/server-only/recipient/set-recipients-for-document.ts:337 +#: packages/lib/server-only/recipient/delete-document-recipient.ts:156 +#: packages/lib/server-only/recipient/set-document-recipients.ts:326 msgid "You have been removed from a document" msgstr "Te han eliminado de un documento" @@ -6557,10 +6684,14 @@ msgstr "Aún no has creado plantillas. Para crear una plantilla, por favor carga msgid "You have not yet created or received any documents. To create a document please upload one." msgstr "Aún no has creado ni recibido documentos. Para crear un documento, por favor carga uno." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:234 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:229 msgid "You have reached the maximum limit of {0} direct templates. <0>Upgrade your account to continue!" msgstr "Has alcanzado el límite máximo de {0} plantillas directas. <0>¡Actualiza tu cuenta para continuar!" +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106 +msgid "You have reached your document limit for this month. Please upgrade your plan." +msgstr "Ha alcanzado su límite de documentos para este mes. Por favor, actualice su plan." + #: apps/web/src/app/(dashboard)/documents/upload-document.tsx:56 #: packages/ui/primitives/document-dropzone.tsx:69 msgid "You have reached your document limit." @@ -6626,7 +6757,7 @@ msgstr "Debes ingresar '{deleteMessage}' para continuar" msgid "You must have at least one other team member to transfer ownership." msgstr "Debes tener al menos otro miembro del equipo para transferir la propiedad." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:109 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:108 msgid "You must set a profile URL before enabling your public profile." msgstr "Debes establecer una URL de perfil antes de habilitar tu perfil público." @@ -6662,7 +6793,7 @@ msgstr "Tu cuenta ha sido eliminada con éxito." msgid "Your avatar has been updated successfully." msgstr "Tu avatar ha sido actualizado con éxito." -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:75 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:74 msgid "Your banner has been updated successfully." msgstr "Tu banner ha sido actualizado con éxito." @@ -6674,19 +6805,27 @@ msgstr "La URL de tu sitio web de marca" msgid "Your branding preferences have been updated" msgstr "Tus preferencias de marca han sido actualizadas" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:97 +msgid "Your bulk send has been initiated. You will receive an email notification upon completion." +msgstr "" + +#: packages/email/templates/bulk-send-complete.tsx:40 +msgid "Your bulk send operation for template \"{templateName}\" has completed." +msgstr "" + #: apps/web/src/app/(dashboard)/settings/billing/page.tsx:125 msgid "Your current plan is past due. Please update your payment information." msgstr "Tu plan actual está vencido. Por favor actualiza tu información de pago." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:251 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:249 msgid "Your direct signing templates" msgstr "Tus {0} plantillas de firma directa" -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:129 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:123 msgid "Your document failed to upload." msgstr "Tu documento no se pudo cargar." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:157 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:169 msgid "Your document has been created from the template successfully." msgstr "Tu documento se ha creado exitosamente a partir de la plantilla." @@ -6698,19 +6837,19 @@ msgstr "¡Tu documento ha sido eliminado por un administrador!" msgid "Your document has been re-sent successfully." msgstr "Tu documento ha sido reenviado con éxito." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:328 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:304 msgid "Your document has been sent successfully." msgstr "Tu documento ha sido enviado con éxito." -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:59 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:58 msgid "Your document has been successfully duplicated." msgstr "Tu documento ha sido duplicado con éxito." -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:87 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:86 msgid "Your document has been uploaded successfully." msgstr "Tu documento ha sido subido con éxito." -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:69 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:68 msgid "Your document has been uploaded successfully. You will be redirected to the template page." msgstr "Tu documento ha sido subido con éxito. Serás redirigido a la página de plantillas." @@ -6753,7 +6892,7 @@ msgstr "Tu contraseña ha sido actualizada." msgid "Your payment for teams is overdue. Please settle the payment to avoid any service disruptions." msgstr "Tu pago por equipos está vencido. Por favor, salda el pago para evitar interrupciones en el servicio." -#: apps/web/src/components/forms/profile.tsx:73 +#: apps/web/src/components/forms/profile.tsx:72 msgid "Your profile has been updated successfully." msgstr "Tu perfil ha sido actualizado con éxito." @@ -6795,19 +6934,19 @@ msgstr "Tu equipo ha sido eliminado con éxito." msgid "Your team has been successfully updated." msgstr "Tu equipo ha sido actualizado con éxito." -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:43 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:42 msgid "Your template has been duplicated successfully." msgstr "Tu plantilla ha sido duplicada con éxito." -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:42 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:37 msgid "Your template has been successfully deleted." msgstr "Tu plantilla ha sido eliminada con éxito." -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:67 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:66 msgid "Your template will be duplicated." msgstr "Tu plantilla será duplicada." -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:247 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:217 msgid "Your templates has been saved successfully." msgstr "Tus plantillas han sido guardadas con éxito." @@ -6823,4 +6962,3 @@ msgstr "¡Tu token se creó con éxito! ¡Asegúrate de copiarlo porque no podr #: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:86 msgid "Your tokens will be shown here once you create them." msgstr "Tus tokens se mostrarán aquí una vez que los crees." - diff --git a/packages/lib/translations/fr/web.po b/packages/lib/translations/fr/web.po index 8f500df70..f89dd52a3 100644 --- a/packages/lib/translations/fr/web.po +++ b/packages/lib/translations/fr/web.po @@ -8,7 +8,7 @@ msgstr "" "Language: fr\n" "Project-Id-Version: documenso-app\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2024-12-31 08:04\n" +"PO-Revision-Date: 2025-01-30 03:57\n" "Last-Translator: \n" "Language-Team: French\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" @@ -22,7 +22,7 @@ msgstr "" msgid "\"{0}\" has invited you to sign \"example document\"." msgstr "\"{0}\" vous a invité à signer \"example document\"." -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:69 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:74 msgid "\"{0}\" will appear on the document as it has a timezone of \"{timezone}\"." msgstr "\"{0}\" apparaîtra sur le document car il a un fuseau horaire de \"{timezone}\"." @@ -38,7 +38,7 @@ msgstr "« {documentName} » a été signé" msgid "“{documentName}” was signed by all signers" msgstr "“{documentName}” a été signé par tous les signataires" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:62 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:61 msgid "\"{documentTitle}\" has been successfully deleted" msgstr "\"{documentTitle}\" a été supprimé avec succès" @@ -46,12 +46,12 @@ msgstr "\"{documentTitle}\" a été supprimé avec succès" msgid "\"{placeholderEmail}\" on behalf of \"{0}\" has invited you to sign \"example document\"." msgstr "\"{placeholderEmail}\" au nom de \"{0}\" vous a invité à signer \"exemple de document\"." -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:313 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:330 msgid "{0, plural, one {(1 character over)} other {(# characters over)}}" msgstr "{0, plural, one {(1 caractère de trop)} other {(# caractères de trop)}}" #: apps/web/src/components/forms/public-profile-form.tsx:237 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:395 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:393 msgid "{0, plural, one {# character over the limit} other {# characters over the limit}}" msgstr "{0, plural, one {# caractère au-dessus de la limite} other {# caractères au-dessus de la limite}}" @@ -76,7 +76,7 @@ msgstr "{0, plural, one {1 champ correspondant} other {# champs correspondants}} msgid "{0, plural, one {1 Recipient} other {# Recipients}}" msgstr "{0, plural, one {1 Destinataire} other {# Destinataires}}" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:238 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:239 msgid "{0, plural, one {Waiting on 1 recipient} other {Waiting on # recipients}}" msgstr "{0, plural, one {En attente d'1 destinataire} other {En attente de # destinataires}}" @@ -88,7 +88,7 @@ msgstr "{0, plural, zero {Sélectionner des valeurs} other {# sélectionnées... msgid "{0}" msgstr "{0}" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:249 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:247 msgid "{0} direct signing templates" msgstr "{0} modèles de signature directe" @@ -108,7 +108,7 @@ msgstr "{0} a rejoint l'équipe {teamName} sur Documenso" msgid "{0} left the team {teamName} on Documenso" msgstr "{0} a quitté l'équipe {teamName} sur Documenso" -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:151 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:145 msgid "{0} of {1} documents remaining this month." msgstr "{0} des {1} documents restants ce mois-ci." @@ -121,11 +121,11 @@ msgstr "{0} sur {1} ligne(s) sélectionnée(s)." msgid "{0} on behalf of \"{1}\" has invited you to {recipientActionVerb} the document \"{2}\"." msgstr "{0} représentant \"{1}\" vous a invité à {recipientActionVerb} le document \"{2}\"." -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:173 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:174 msgid "{0} Recipient(s)" msgstr "{0} Destinataire(s)" -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:294 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:311 msgid "{charactersRemaining, plural, one {1 character remaining} other {{charactersRemaining} characters remaining}}" msgstr "{charactersRemaining, plural, one {1 caractère restant} other {{charactersRemaining} caractères restants}}" @@ -141,7 +141,7 @@ msgstr "{inviterName} a annulé le document {documentName}, vous n'avez plus bes msgid "{inviterName} has cancelled the document<0/>\"{documentName}\"" msgstr "{inviterName} a annulé le document<0/>\"{documentName}\"" -#: packages/email/template-components/template-document-invite.tsx:75 +#: packages/email/template-components/template-document-invite.tsx:74 msgid "{inviterName} has invited you to {0}<0/>\"{documentName}\"" msgstr "{inviterName} vous a invité à {0}<0/>\"{documentName}\"" @@ -161,9 +161,9 @@ msgstr "{inviterName} vous a retiré du document {documentName}." msgid "{inviterName} has removed you from the document<0/>\"{documentName}\"" msgstr "{inviterName} vous a retiré du document<0/>\"{documentName}\"" -#: packages/email/template-components/template-document-invite.tsx:63 -msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {0}" -msgstr "{inviterName} représentant \"{teamName}\" vous a invité à {0}" +#: packages/email/template-components/template-document-invite.tsx:61 +msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {0}<0/>\"{documentName}\"" +msgstr "" #: packages/email/templates/document-invite.tsx:45 msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {action} {documentName}" @@ -181,87 +181,87 @@ msgstr "{memberEmail} a quitté l'équipe suivante" msgid "{numberOfSeats, plural, one {# member} other {# members}}" msgstr "{numberOfSeats, plural, one {# membre} other {# membres}}" -#: packages/lib/utils/document-audit-logs.ts:263 +#: packages/lib/utils/document-audit-logs.ts:279 msgid "{prefix} added a field" msgstr "{prefix} a ajouté un champ" -#: packages/lib/utils/document-audit-logs.ts:275 +#: packages/lib/utils/document-audit-logs.ts:291 msgid "{prefix} added a recipient" msgstr "{prefix} a ajouté un destinataire" -#: packages/lib/utils/document-audit-logs.ts:287 +#: packages/lib/utils/document-audit-logs.ts:303 msgid "{prefix} created the document" msgstr "{prefix} a créé le document" -#: packages/lib/utils/document-audit-logs.ts:291 +#: packages/lib/utils/document-audit-logs.ts:307 msgid "{prefix} deleted the document" msgstr "{prefix} a supprimé le document" -#: packages/lib/utils/document-audit-logs.ts:335 +#: packages/lib/utils/document-audit-logs.ts:351 msgid "{prefix} moved the document to team" msgstr "{prefix} a déplacé le document vers l'équipe" -#: packages/lib/utils/document-audit-logs.ts:319 +#: packages/lib/utils/document-audit-logs.ts:335 msgid "{prefix} opened the document" msgstr "{prefix} a ouvert le document" -#: packages/lib/utils/document-audit-logs.ts:267 +#: packages/lib/utils/document-audit-logs.ts:283 msgid "{prefix} removed a field" msgstr "{prefix} a supprimé un champ" -#: packages/lib/utils/document-audit-logs.ts:279 +#: packages/lib/utils/document-audit-logs.ts:295 msgid "{prefix} removed a recipient" msgstr "{prefix} a supprimé un destinataire" -#: packages/lib/utils/document-audit-logs.ts:365 +#: packages/lib/utils/document-audit-logs.ts:381 msgid "{prefix} resent an email to {0}" msgstr "{prefix} a renvoyé un e-mail à {0}" -#: packages/lib/utils/document-audit-logs.ts:366 +#: packages/lib/utils/document-audit-logs.ts:382 msgid "{prefix} sent an email to {0}" msgstr "{prefix} a envoyé un email à {0}" -#: packages/lib/utils/document-audit-logs.ts:331 +#: packages/lib/utils/document-audit-logs.ts:347 msgid "{prefix} sent the document" msgstr "{prefix} a envoyé le document" -#: packages/lib/utils/document-audit-logs.ts:295 +#: packages/lib/utils/document-audit-logs.ts:311 msgid "{prefix} signed a field" msgstr "{prefix} a signé un champ" -#: packages/lib/utils/document-audit-logs.ts:299 +#: packages/lib/utils/document-audit-logs.ts:315 msgid "{prefix} unsigned a field" msgstr "{prefix} n'a pas signé un champ" -#: packages/lib/utils/document-audit-logs.ts:271 +#: packages/lib/utils/document-audit-logs.ts:287 msgid "{prefix} updated a field" msgstr "{prefix} a mis à jour un champ" -#: packages/lib/utils/document-audit-logs.ts:283 +#: packages/lib/utils/document-audit-logs.ts:299 msgid "{prefix} updated a recipient" msgstr "{prefix} a mis à jour un destinataire" -#: packages/lib/utils/document-audit-logs.ts:315 +#: packages/lib/utils/document-audit-logs.ts:331 msgid "{prefix} updated the document" msgstr "{prefix} a mis à jour le document" -#: packages/lib/utils/document-audit-logs.ts:307 +#: packages/lib/utils/document-audit-logs.ts:323 msgid "{prefix} updated the document access auth requirements" msgstr "{prefix} a mis à jour les exigences d'authentification d'accès au document" -#: packages/lib/utils/document-audit-logs.ts:327 +#: packages/lib/utils/document-audit-logs.ts:343 msgid "{prefix} updated the document external ID" msgstr "{prefix} a mis à jour l'ID externe du document" -#: packages/lib/utils/document-audit-logs.ts:311 +#: packages/lib/utils/document-audit-logs.ts:327 msgid "{prefix} updated the document signing auth requirements" msgstr "{prefix} a mis à jour les exigences d'authentification pour la signature des documents" -#: packages/lib/utils/document-audit-logs.ts:323 +#: packages/lib/utils/document-audit-logs.ts:339 msgid "{prefix} updated the document title" msgstr "{prefix} a mis à jour le titre du document" -#: packages/lib/utils/document-audit-logs.ts:303 +#: packages/lib/utils/document-audit-logs.ts:319 msgid "{prefix} updated the document visibility" msgstr "{prefix} a mis à jour la visibilité du document" @@ -298,7 +298,7 @@ msgid "{recipientReference} has signed {documentName}" msgstr "{recipientReference} a signé {documentName}" #: apps/web/src/components/forms/public-profile-form.tsx:231 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:389 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:387 msgid "{remaningLength, plural, one {# character remaining} other {# characters remaining}}" msgstr "{remaningLength, plural, one {# caractère restant} other {# caractères restants}}" @@ -307,8 +307,8 @@ msgid "{signerName} has rejected the document \"{documentName}\"." msgstr "{signerName} a rejeté le document \"{documentName}\"." #: packages/email/template-components/template-document-invite.tsx:68 -msgid "{teamName} has invited you to {0}" -msgstr "{teamName} vous a invité à {0}" +msgid "{teamName} has invited you to {0}<0/>\"{documentName}\"" +msgstr "" #: packages/email/templates/document-invite.tsx:46 msgid "{teamName} has invited you to {action} {documentName}" @@ -318,27 +318,27 @@ msgstr "{teamName} vous a invité à {action} {documentName}" msgid "{teamName} ownership transfer request" msgstr "Demande de transfert de propriété de {teamName}" -#: packages/lib/utils/document-audit-logs.ts:343 +#: packages/lib/utils/document-audit-logs.ts:359 msgid "{userName} approved the document" msgstr "{userName} a approuvé le document" -#: packages/lib/utils/document-audit-logs.ts:344 +#: packages/lib/utils/document-audit-logs.ts:360 msgid "{userName} CC'd the document" msgstr "{userName} a mis en copie le document" -#: packages/lib/utils/document-audit-logs.ts:345 +#: packages/lib/utils/document-audit-logs.ts:361 msgid "{userName} completed their task" msgstr "{userName} a terminé sa tâche" -#: packages/lib/utils/document-audit-logs.ts:355 +#: packages/lib/utils/document-audit-logs.ts:371 msgid "{userName} rejected the document" msgstr "{userName} a rejeté le document" -#: packages/lib/utils/document-audit-logs.ts:341 +#: packages/lib/utils/document-audit-logs.ts:357 msgid "{userName} signed the document" msgstr "{userName} a signé le document" -#: packages/lib/utils/document-audit-logs.ts:342 +#: packages/lib/utils/document-audit-logs.ts:358 msgid "{userName} viewed the document" msgstr "{userName} a consulté le document" @@ -358,7 +358,11 @@ msgstr "<0>{senderName} a demandé que vous preniez en charge l'équipe suiv msgid "<0>{teamName} has requested to use your email address for their team on Documenso." msgstr "<0>{teamName} a demandé à utiliser votre adresse e-mail pour leur équipe sur Documenso." -#: packages/ui/primitives/template-flow/add-template-settings.tsx:241 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:463 +msgid "<0>Click to upload or drag and drop" +msgstr "<0>Cliquez pour télécharger ou faites glisser et déposez" + +#: packages/ui/primitives/template-flow/add-template-settings.tsx:287 msgid "<0>Email - The recipient will be emailed the document to sign, approve, etc." msgstr "<0>Email - Le destinataire recevra le document par e-mail pour signer, approuver, etc." @@ -378,11 +382,11 @@ msgstr "<0>Aucune restriction - Le document peut être consulté directement msgid "<0>None - No authentication required" msgstr "<0>Aucun - Aucune authentification requise" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:247 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:293 msgid "<0>None - We will generate links which you can send to the recipients manually." msgstr "<0>Aucun - Nous générerons des liens que vous pourrez envoyer aux destinataires manuellement." -#: packages/ui/primitives/template-flow/add-template-settings.tsx:254 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:300 msgid "<0>Note - If you use Links in combination with direct templates, you will need to manually send the links to the remaining recipients." msgstr "<0>Remarque - Si vous utilisez des liens en combinaison avec des modèles directs, vous devrez envoyer manuellement les liens aux destinataires restants." @@ -464,19 +468,19 @@ msgstr "Un appareil capable d'accéder, d'ouvrir et de lire des documents" msgid "A document was created by your direct template that requires you to {recipientActionVerb} it." msgstr "Un document a été créé par votre modèle direct qui vous oblige à {recipientActionVerb}." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:218 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:230 msgid "A draft document will be created" msgstr "Un document brouillon sera créé" -#: packages/lib/utils/document-audit-logs.ts:262 +#: packages/lib/utils/document-audit-logs.ts:278 msgid "A field was added" msgstr "Un champ a été ajouté" -#: packages/lib/utils/document-audit-logs.ts:266 +#: packages/lib/utils/document-audit-logs.ts:282 msgid "A field was removed" msgstr "Un champ a été supprimé" -#: packages/lib/utils/document-audit-logs.ts:270 +#: packages/lib/utils/document-audit-logs.ts:286 msgid "A field was updated" msgstr "Un champ a été mis à jour" @@ -488,7 +492,7 @@ msgstr "Un moyen d'imprimer ou de télécharger des documents pour vos dossiers" msgid "A new member has joined your team" msgstr "Un nouveau membre a rejoint votre équipe" -#: apps/web/src/components/forms/token.tsx:127 +#: apps/web/src/components/forms/token.tsx:128 msgid "A new token was created successfully." msgstr "Un nouveau token a été créé avec succès." @@ -497,15 +501,15 @@ msgstr "Un nouveau token a été créé avec succès." msgid "A password reset email has been sent, if you have an account you should see it in your inbox shortly." msgstr "Un e-mail de réinitialisation de mot de passe a été envoyé, si vous avez un compte vous devriez le voir dans votre boîte de réception sous peu." -#: packages/lib/utils/document-audit-logs.ts:274 +#: packages/lib/utils/document-audit-logs.ts:290 msgid "A recipient was added" msgstr "Un destinataire a été ajouté" -#: packages/lib/utils/document-audit-logs.ts:278 +#: packages/lib/utils/document-audit-logs.ts:294 msgid "A recipient was removed" msgstr "Un destinataire a été supprimé" -#: packages/lib/utils/document-audit-logs.ts:282 +#: packages/lib/utils/document-audit-logs.ts:298 msgid "A recipient was updated" msgstr "Un destinataire a été mis à jour" @@ -591,7 +595,7 @@ msgstr "Invitation d'équipe acceptée" msgid "Account Authentication" msgstr "Authentification de compte" -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:50 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:51 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:47 msgid "Account deleted" msgstr "Compte supprimé" @@ -612,20 +616,20 @@ msgstr "Ré-authentification de compte" msgid "Acknowledgment" msgstr "Reconnaissance" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:108 -#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:98 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:123 -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:164 -#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:116 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:114 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:97 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:117 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:159 +#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:115 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:46 msgid "Action" msgstr "Action" #: apps/web/src/app/(dashboard)/documents/data-table.tsx:79 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:177 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:175 #: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:140 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:131 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:140 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:130 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:139 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:116 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:125 msgid "Actions" @@ -650,16 +654,16 @@ msgid "Add a document" msgstr "Ajouter un document" #: packages/ui/primitives/document-flow/add-settings.tsx:390 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:468 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:514 msgid "Add a URL to redirect the user to once the document is signed" msgstr "Ajouter une URL pour rediriger l'utilisateur une fois le document signé" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:177 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:88 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:153 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:87 msgid "Add all relevant fields for each recipient." msgstr "Ajouter tous les champs pertinents pour chaque destinataire." -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:83 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:82 msgid "Add all relevant placeholders for each recipient." msgstr "Ajouter tous les espaces réservés pertinents pour chaque destinataire." @@ -675,7 +679,7 @@ msgstr "Ajouter un authentificateur pour servir de méthode d'authentification s msgid "Add an external ID to the document. This can be used to identify the document in external systems." msgstr "Ajouter un ID externe au document. Cela peut être utilisé pour identifier le document dans les systèmes externes." -#: packages/ui/primitives/template-flow/add-template-settings.tsx:385 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:431 msgid "Add an external ID to the template. This can be used to identify in external systems." msgstr "Ajouter un ID externe au modèle. Cela peut être utilisé pour l'identifier dans les systèmes externes." @@ -692,8 +696,8 @@ msgstr "Ajouter une autre valeur" msgid "Add email" msgstr "Ajouter un e-mail" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:176 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:87 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:152 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:86 msgid "Add Fields" msgstr "Ajouter des champs" @@ -718,7 +722,7 @@ msgstr "Ajouter une clé de passe" msgid "Add Placeholder Recipient" msgstr "Ajouter un destinataire fictif" -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:82 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:81 msgid "Add Placeholders" msgstr "Ajouter des espaces réservés" @@ -726,7 +730,7 @@ msgstr "Ajouter des espaces réservés" msgid "Add Signer" msgstr "Ajouter un signataire" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:171 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:147 msgid "Add Signers" msgstr "Ajouter des signataires" @@ -734,19 +738,19 @@ msgstr "Ajouter des signataires" msgid "Add team email" msgstr "Ajouter un e-mail d'équipe" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:73 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:80 msgid "Add text" msgstr "Ajouter du texte" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:78 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:85 msgid "Add text to the field" msgstr "Ajouter du texte au champ" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:172 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:148 msgid "Add the people who will sign the document." msgstr "Ajouter les personnes qui signeront le document." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:220 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:232 msgid "Add the recipients to create the document with" msgstr "Ajouter les destinataires pour créer le document avec" @@ -771,12 +775,12 @@ msgid "Admin panel" msgstr "Panneau d'administration" #: packages/ui/primitives/document-flow/add-settings.tsx:284 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:367 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:413 msgid "Advanced Options" msgstr "Options avancées" #: packages/ui/primitives/document-flow/add-fields.tsx:585 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:415 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:490 msgid "Advanced settings" msgstr "Paramètres avancés" @@ -804,11 +808,11 @@ msgstr "Tous les documents ont été traités. Tous nouveaux documents envoyés msgid "All documents related to the electronic signing process will be provided to you electronically through our platform or via email. It is your responsibility to ensure that your email address is current and that you can receive and open our emails." msgstr "Tous les documents relatifs au processus de signature électronique vous seront fournis électroniquement via notre plateforme ou par e-mail. Il est de votre responsabilité de vous assurer que votre adresse e-mail est à jour et que vous pouvez recevoir et ouvrir nos e-mails." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:147 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:146 msgid "All inserted signatures will be voided" msgstr "Toutes les signatures insérées seront annulées" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:150 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:149 msgid "All recipients will be notified" msgstr "Tous les destinataires seront notifiés" @@ -864,30 +868,26 @@ msgstr "Un e-mail contenant une invitation sera envoyé à chaque membre." msgid "An email requesting the transfer of this team has been sent." msgstr "Un e-mail demandant le transfert de cette équipe a été envoyé." -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:60 -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:83 -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:59 #: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:100 #: apps/web/src/components/forms/avatar-image.tsx:122 #: apps/web/src/components/forms/password.tsx:92 -#: apps/web/src/components/forms/profile.tsx:81 #: apps/web/src/components/forms/reset-password.tsx:95 #: apps/web/src/components/forms/signup.tsx:112 -#: apps/web/src/components/forms/token.tsx:137 +#: apps/web/src/components/forms/token.tsx:146 #: apps/web/src/components/forms/v2/signup.tsx:166 msgid "An error occurred" msgstr "Une erreur est survenue" -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:257 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:227 msgid "An error occurred while adding fields." msgstr "Une erreur est survenue lors de l'ajout des champs." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:269 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:218 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:243 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:187 msgid "An error occurred while adding signers." msgstr "Une erreur est survenue lors de l'ajout de signataires." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:304 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:281 msgid "An error occurred while adding the fields." msgstr "Une erreur est survenue lors de l'ajout des champs." @@ -895,7 +895,7 @@ msgstr "Une erreur est survenue lors de l'ajout des champs." msgid "An error occurred while auto-signing the document, some fields may not be signed. Please review and manually sign any remaining fields." msgstr "Une erreur est survenue lors de la signature automatique du document, certains champs peuvent ne pas être signés. Veuillez vérifier et signer manuellement tous les champs restants." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:176 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:188 msgid "An error occurred while creating document from template." msgstr "Une erreur est survenue lors de la création du document à partir d'un modèle." @@ -903,7 +903,11 @@ msgstr "Une erreur est survenue lors de la création du document à partir d'un msgid "An error occurred while creating the webhook. Please try again." msgstr "Une erreur est survenue lors de la création du webhook. Veuillez réessayer." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:124 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:63 +msgid "An error occurred while deleting the user." +msgstr "Une erreur s'est produite lors de la suppression de l'utilisateur." + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:120 msgid "An error occurred while disabling direct link signing." msgstr "Une erreur est survenue lors de la désactivation de la signature par lien direct." @@ -911,18 +915,18 @@ msgstr "Une erreur est survenue lors de la désactivation de la signature par li msgid "An error occurred while disabling the user." msgstr "Une erreur est survenue lors de la désactivation de l'utilisateur." -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:64 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:92 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:76 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:107 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:70 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:98 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:77 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:101 msgid "An error occurred while downloading your document." msgstr "Une erreur est survenue lors du téléchargement de votre document." -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:52 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51 msgid "An error occurred while duplicating template." msgstr "Une erreur est survenue lors de la duplication du modèle." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:123 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:119 msgid "An error occurred while enabling direct link signing." msgstr "Une erreur est survenue lors de l'activation de la signature par lien direct." @@ -951,21 +955,21 @@ msgid "An error occurred while removing the field." msgstr "Une erreur est survenue lors de la suppression du champ." #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:154 -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:126 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:131 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:137 -#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:110 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:148 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:195 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:115 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:153 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:196 #: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:129 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:194 msgid "An error occurred while removing the signature." msgstr "Une erreur est survenue lors de la suppression de la signature." -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:196 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:197 msgid "An error occurred while removing the text." msgstr "Une erreur est survenue lors de la suppression du texte." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:350 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:326 msgid "An error occurred while sending the document." msgstr "Une erreur est survenue lors de l'envoi du document." @@ -974,15 +978,15 @@ msgid "An error occurred while sending your confirmation email" msgstr "Une erreur est survenue lors de l'envoi de votre e-mail de confirmation" #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:125 -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:100 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:105 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:106 -#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:84 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:89 #: apps/web/src/app/(signing)/sign/[token]/initials-field.tsx:90 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:122 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:150 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:127 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:151 #: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:102 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:168 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:168 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:169 msgid "An error occurred while signing the document." msgstr "Une erreur est survenue lors de la signature du document." @@ -990,8 +994,8 @@ msgstr "Une erreur est survenue lors de la signature du document." msgid "An error occurred while trying to create a checkout session." msgstr "Une erreur est survenue lors de la création d'une session de paiement." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:235 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:187 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:210 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:156 msgid "An error occurred while updating the document settings." msgstr "Une erreur est survenue lors de la mise à jour des paramètres du document." @@ -1003,13 +1007,12 @@ msgstr "Une erreur est survenue lors de la mise à jour de la signature." msgid "An error occurred while updating your profile." msgstr "Une erreur est survenue lors de la mise à jour de votre profil." -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:118 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:108 msgid "An error occurred while uploading your document." msgstr "Une erreur est survenue lors du téléchargement de votre document." -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:66 -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:89 -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:65 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:58 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:81 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:55 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:54 #: apps/web/src/components/(dashboard)/common/command-menu.tsx:301 @@ -1026,7 +1029,7 @@ msgstr "Une erreur est survenue lors du téléchargement de votre document." #: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:100 #: apps/web/src/components/(teams)/forms/update-team-form.tsx:93 #: apps/web/src/components/forms/avatar-image.tsx:94 -#: apps/web/src/components/forms/profile.tsx:87 +#: apps/web/src/components/forms/profile.tsx:79 #: apps/web/src/components/forms/public-profile-claim-dialog.tsx:113 #: apps/web/src/components/forms/public-profile-form.tsx:104 #: apps/web/src/components/forms/signin.tsx:249 @@ -1036,11 +1039,10 @@ msgstr "Une erreur est survenue lors du téléchargement de votre document." #: apps/web/src/components/forms/signin.tsx:302 #: apps/web/src/components/forms/signup.tsx:124 #: apps/web/src/components/forms/signup.tsx:138 -#: apps/web/src/components/forms/token.tsx:143 #: apps/web/src/components/forms/v2/signup.tsx:187 #: apps/web/src/components/forms/v2/signup.tsx:201 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:141 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:178 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:140 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:176 msgid "An unknown error occurred" msgstr "Une erreur inconnue est survenue" @@ -1048,11 +1050,11 @@ msgstr "Une erreur inconnue est survenue" msgid "Any payment methods attached to this team will remain attached to this team. Please contact us if you need to update this information." msgstr "Tous les moyens de paiement associés à cette équipe resteront associés à cette équipe. Veuillez nous contacter si vous avez besoin de mettre à jour ces informations." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:221 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:219 msgid "Any Source" msgstr "Toute source" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:201 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:199 msgid "Any Status" msgstr "Tout statut" @@ -1070,16 +1072,16 @@ msgstr "Tokens API" msgid "App Version" msgstr "Version de l'application" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:89 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:120 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:146 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:95 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:121 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:140 #: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:143 #: packages/lib/constants/recipient-roles.ts:8 msgid "Approve" msgstr "Approuver" #: apps/web/src/app/(signing)/sign/[token]/form.tsx:142 -#: packages/email/template-components/template-document-invite.tsx:106 +#: packages/email/template-components/template-document-invite.tsx:105 msgid "Approve Document" msgstr "Approuver le document" @@ -1116,13 +1118,13 @@ msgstr "Êtes-vous sûr de vouloir supprimer la clé de passe <0>{passkeyName}{senderName}" msgstr "par <0>{senderName}" @@ -1240,7 +1259,7 @@ msgstr "En acceptant cette demande, vous accorderez à <0>{teamName} l'accè msgid "By accepting this request, you will take responsibility for any billing items associated with this team." msgstr "En acceptant cette demande, vous assumerez la responsabilité de tous les éléments de facturation associés à cette équipe." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:158 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:157 msgid "By deleting this document, the following will occur:" msgstr "En supprimant ce document, les éléments suivants se produiront :" @@ -1261,17 +1280,17 @@ msgid "By using the electronic signature feature, you are consenting to conduct 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." #: apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx:185 -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:192 -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:108 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:191 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:107 #: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:120 #: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:248 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:157 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:198 #: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:109 -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:81 -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:78 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:76 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:77 #: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:131 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:472 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:466 #: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:220 #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:178 #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:71 @@ -1279,12 +1298,12 @@ msgstr "En utilisant la fonctionnalité de signature électronique, vous consent #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:189 #: apps/web/src/app/(signing)/sign/[token]/form.tsx:164 #: apps/web/src/app/(signing)/sign/[token]/form.tsx:246 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:215 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:328 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:232 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:341 #: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:153 #: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:131 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:320 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:335 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:352 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121 #: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:176 #: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:242 @@ -1302,8 +1321,9 @@ msgstr "En utilisant la fonctionnalité de signature électronique, vous consent #: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:187 #: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:257 #: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:163 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:450 -#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:357 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:448 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:263 +#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:323 #: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:58 msgid "Cancel" msgstr "Annuler" @@ -1333,7 +1353,7 @@ msgstr "" msgid "Ccers" msgstr "Copie Carboneurs" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:86 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:93 msgid "Character Limit" msgstr "Limite de caractères" @@ -1353,15 +1373,15 @@ msgstr "Valeurs de la case à cocher" msgid "Checkout" msgstr "Passer à la caisse" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:271 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:266 msgid "Choose an existing recipient from below to continue" msgstr "Choisissez un destinataire existant ci-dessous pour continuer" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:267 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:262 msgid "Choose Direct Link Recipient" msgstr "Choisissez un destinataire pour le lien direct" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:182 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:158 msgid "Choose how the document will reach recipients" msgstr "Choisissez comment le document atteindra les destinataires" @@ -1385,6 +1405,10 @@ msgstr "Revendiquer votre profil plus tard" msgid "Claim your username now" msgstr "Revendiquer votre nom d'utilisateur maintenant" +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:537 +msgid "Clear file" +msgstr "Effacer le fichier" + #: packages/ui/primitives/data-table.tsx:156 msgid "Clear filters" msgstr "Effacer les filtres" @@ -1393,13 +1417,13 @@ msgstr "Effacer les filtres" msgid "Clear Signature" msgstr "Effacer la signature" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:130 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:125 msgid "Click here to get started" msgstr "Cliquez ici pour commencer" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recent-activity.tsx:76 -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:118 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:66 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:113 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:64 #: apps/web/src/components/document/document-history-sheet.tsx:133 msgid "Click here to retry" msgstr "Cliquez ici pour réessayer" @@ -1420,16 +1444,16 @@ msgstr "Cliquez pour copier le lien de signature à envoyer au destinataire" msgid "Click to insert field" msgstr "Cliquez pour insérer un champ" -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:126 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:388 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:125 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:556 #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:125 #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:138 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121 #: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:140 #: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:180 #: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:102 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:319 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:423 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:317 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:421 #: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx:44 msgid "Close" msgstr "Fermer" @@ -1453,7 +1477,7 @@ msgstr "Compléter la signature" msgid "Complete Viewing" msgstr "Compléter la visualisation" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:204 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:202 #: apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx:77 #: apps/web/src/components/formatter/document-status.tsx:28 #: packages/email/template-components/template-document-completed.tsx:35 @@ -1480,25 +1504,25 @@ msgstr "Documents Complétés" msgid "Configure Direct Recipient" msgstr "Configurer le destinataire direct" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:167 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:143 msgid "Configure general settings for the document." msgstr "Configurer les paramètres généraux pour le document." -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:78 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:77 msgid "Configure general settings for the template." msgstr "Configurer les paramètres généraux pour le modèle." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:337 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:335 msgid "Configure template" msgstr "Configurer le modèle" #: packages/ui/primitives/document-flow/add-fields.tsx:586 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:416 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:491 msgid "Configure the {0} field" msgstr "Configurer le champ {0}" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:481 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:460 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:475 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:458 msgid "Confirm" msgstr "Confirmer" @@ -1536,7 +1560,7 @@ msgstr "Consentement aux transactions électroniques" msgid "Contact Information" msgstr "Coordonnées" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:189 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:180 msgid "Content" msgstr "Contenu" @@ -1546,12 +1570,12 @@ msgstr "Contenu" #: apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx:143 #: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:72 #: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:122 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:328 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:326 #: packages/ui/primitives/document-flow/document-flow-root.tsx:141 msgid "Continue" msgstr "Continuer" -#: packages/email/template-components/template-document-invite.tsx:86 +#: packages/email/template-components/template-document-invite.tsx:85 msgid "Continue by approving the document." msgstr "Continuer en approuvant le document." @@ -1559,11 +1583,11 @@ msgstr "Continuer en approuvant le document." msgid "Continue by downloading the document." msgstr "Continuer en téléchargeant le document." -#: packages/email/template-components/template-document-invite.tsx:84 +#: packages/email/template-components/template-document-invite.tsx:83 msgid "Continue by signing the document." msgstr "Continuer en signant le document." -#: packages/email/template-components/template-document-invite.tsx:85 +#: packages/email/template-components/template-document-invite.tsx:84 msgid "Continue by viewing the document." msgstr "Continuer en consultant le document." @@ -1597,9 +1621,9 @@ msgid "Copied" msgstr "Copié" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:162 -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:77 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:72 #: apps/web/src/app/(dashboard)/templates/template-direct-link-badge.tsx:31 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:163 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:159 #: apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx:40 #: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:61 #: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:117 @@ -1618,11 +1642,11 @@ msgstr "Copier" msgid "Copy Link" msgstr "Copier le lien" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:169 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:164 msgid "Copy sharable link" msgstr "Copier le lien partageable" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:397 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:391 msgid "Copy Shareable Link" msgstr "Copier le lien partageable" @@ -1657,15 +1681,15 @@ msgstr "Créer une équipe pour collaborer avec vos membres." msgid "Create account" msgstr "Créer un compte" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:396 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:564 msgid "Create and send" msgstr "Créer et envoyer" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:394 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:562 msgid "Create as draft" msgstr "Créer en tant que brouillon" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:354 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:365 msgid "Create as pending" msgstr "Créer comme en attente" @@ -1673,11 +1697,11 @@ msgstr "Créer comme en attente" msgid "Create Direct Link" msgstr "Créer un lien direct" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:202 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:197 msgid "Create Direct Signing Link" msgstr "Créer un lien de signature directe" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:214 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:226 msgid "Create document from template" msgstr "Créer un document à partir du modèle" @@ -1685,11 +1709,11 @@ msgstr "Créer un document à partir du modèle" msgid "Create now" msgstr "Créer maintenant" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:352 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:346 msgid "Create one automatically" msgstr "Créer un automatiquement" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:398 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:566 msgid "Create signing links" msgstr "Créer des liens de signature" @@ -1704,7 +1728,7 @@ msgstr "Créer une équipe" msgid "Create Team" msgstr "Créer une équipe" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:361 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:372 msgid "Create the document as pending and ready to sign." msgstr "Créer le document comme en attente et prêt à signer." @@ -1730,19 +1754,19 @@ msgid "Create your account and start using state-of-the-art document signing. Op msgstr "Créez votre compte et commencez à utiliser la signature de documents à la pointe de la technologie. Une signature ouverte et magnifique est à votre portée." #: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:62 -#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:96 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:35 +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:112 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:36 #: apps/web/src/app/(dashboard)/documents/data-table.tsx:48 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table.tsx:63 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:105 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:34 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:103 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:35 #: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:56 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:274 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:272 msgid "Created" msgstr "Créé" #: apps/web/src/app/(dashboard)/admin/subscriptions/page.tsx:35 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:111 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:112 msgid "Created At" msgstr "Créé le" @@ -1762,6 +1786,10 @@ msgstr "Créé le" msgid "Created on {0}" msgstr "Créé le {0}" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:143 +msgid "CSV Structure" +msgstr "" + #: apps/web/src/components/forms/password.tsx:112 msgid "Current Password" msgstr "Mot de passe actuel" @@ -1770,6 +1798,10 @@ msgstr "Mot de passe actuel" msgid "Current password is incorrect." msgstr "Le mot de passe actuel est incorrect." +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:154 +msgid "Current recipients:" +msgstr "" + #: apps/web/src/app/(dashboard)/settings/billing/billing-plans.tsx:28 msgid "Daily" msgstr "Quotidien" @@ -1778,11 +1810,11 @@ msgstr "Quotidien" msgid "Dark Mode" msgstr "Mode sombre" -#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:68 -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:148 +#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:67 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:153 #: packages/ui/primitives/document-flow/add-fields.tsx:945 #: packages/ui/primitives/document-flow/types.ts:53 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:732 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:810 msgid "Date" msgstr "Date" @@ -1791,7 +1823,7 @@ msgid "Date created" msgstr "Date de création" #: packages/ui/primitives/document-flow/add-settings.tsx:325 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:408 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:454 msgid "Date Format" msgstr "Format de date" @@ -1812,19 +1844,19 @@ msgstr "Langue par défaut du document" msgid "Default Document Visibility" msgstr "Visibilité par défaut du document" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:50 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:49 msgid "delete" msgstr "supprimer" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:144 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:189 -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:202 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:150 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:183 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:201 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:177 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:211 #: apps/web/src/app/(dashboard)/settings/tokens/page.tsx:83 #: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:100 -#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:94 -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:90 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:107 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:85 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:116 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/page.tsx:105 #: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:121 @@ -1843,25 +1875,25 @@ msgstr "supprimer {0}" msgid "delete {teamName}" msgstr "supprimer {teamName}" -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:136 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:133 msgid "Delete account" msgstr "Supprimer le compte" -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:97 -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:104 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:94 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:101 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:72 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:86 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:93 msgid "Delete Account" msgstr "Supprimer le compte" -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:135 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:125 msgid "Delete document" msgstr "Supprimer le document" -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:85 -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:98 -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:105 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:75 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:88 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:95 msgid "Delete Document" msgstr "Supprimer le document" @@ -1878,11 +1910,11 @@ msgstr "Supprimer l'équipe" msgid "Delete team member" msgstr "Supprimer le membre de l'équipe" -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:88 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:78 msgid "Delete the document. This action is irreversible so proceed with caution." msgstr "Supprimez le document. Cette action est irréversible, soyez prudent." -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:86 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:83 msgid "Delete the users account and all its contents. This action is irreversible and will cancel their subscription, so proceed with caution." msgstr "Supprimez le compte de l'utilisateur et tout son contenu. Cette action est irréversible et annulera son abonnement, soyez prudent." @@ -1895,7 +1927,7 @@ msgid "Delete your account and all its contents, including completed documents. msgstr "Supprimez votre compte et tout son contenu, y compris les documents complétés. Cette action est irréversible et annulera votre abonnement, soyez prudent." #: apps/web/src/app/(dashboard)/admin/documents/[id]/page.tsx:41 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:97 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:98 msgid "Deleted" msgstr "Supprimé" @@ -1903,12 +1935,12 @@ msgstr "Supprimé" msgid "Deleting account..." msgstr "Suppression du compte..." -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:178 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:180 msgid "Details" msgstr "Détails" -#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:73 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:242 +#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:72 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:244 msgid "Device" msgstr "Appareil" @@ -1922,12 +1954,12 @@ msgid "direct link" msgstr "lien direct" #: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:40 -#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:79 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:81 msgid "Direct link" msgstr "Lien direct" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:156 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:227 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:154 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:225 msgid "Direct Link" msgstr "Lien direct" @@ -1939,15 +1971,15 @@ msgstr "lien direct désactivé" msgid "Direct link receiver" msgstr "Receveur de lien direct" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:363 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:357 msgid "Direct Link Signing" msgstr "Signature de lien direct" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:115 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:111 msgid "Direct link signing has been disabled" msgstr "La signature de lien direct a été désactivée" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:114 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:110 msgid "Direct link signing has been enabled" msgstr "La signature de lien direct a été activée" @@ -1955,15 +1987,15 @@ msgstr "La signature de lien direct a été activée" msgid "Direct link templates contain one dynamic recipient placeholder. Anyone with access to this link can sign the document, and it will then appear on your documents page." msgstr "Les modèles de lien direct contiennent un espace réservé de destinataire dynamique. Quiconque ayant accès à ce lien peut signer le document, et il apparaîtra ensuite sur votre page de documents." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:142 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:138 msgid "Direct template link deleted" msgstr "Modèle de lien direct supprimé" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:228 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:223 msgid "Direct template link usage exceeded ({0}/{1})" msgstr "L'utilisation du lien de modèle direct a été dépassée ({0}/{1})" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:417 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:415 msgid "Disable" msgstr "Désactiver" @@ -1975,12 +2007,12 @@ msgstr "Désactiver 2FA" #: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:132 msgid "Disable account" -msgstr "" +msgstr "Désactiver le compte" #: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:88 #: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:95 msgid "Disable Account" -msgstr "" +msgstr "Désactiver le Compte" #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:105 msgid "Disable Two Factor Authentication before deleting your account." @@ -1991,7 +2023,7 @@ msgstr "Désactiver l'authentification à deux facteurs avant de supprimer votre msgid "Disabled" msgstr "Désactivé" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:380 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:374 msgid "Disabling direct link signing will prevent anyone from accessing the link." msgstr "Désactiver la signature de lien direct empêchera quiconque d'accéder au lien." @@ -2003,15 +2035,15 @@ msgstr "Désactiver l'utilisateur a pour résultat que l'utilisateur ne peut pas msgid "Display your name and email in documents" msgstr "Afficher votre nom et votre email dans les documents" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:181 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:157 msgid "Distribute Document" msgstr "Distribuer le document" -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:63 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:58 msgid "Do you want to delete this template?" msgstr "Voulez-vous supprimer ce modèle ?" -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:63 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:62 msgid "Do you want to duplicate this template?" msgstr "Voulez-vous dupliquer ce modèle ?" @@ -2034,11 +2066,11 @@ msgstr "Document \"{0}\" - Rejet Confirmé" #: packages/ui/components/document/document-global-auth-access-select.tsx:62 #: packages/ui/primitives/document-flow/add-settings.tsx:227 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:202 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:224 msgid "Document access" msgstr "Accès au document" -#: packages/lib/utils/document-audit-logs.ts:306 +#: packages/lib/utils/document-audit-logs.ts:322 msgid "Document access auth updated" msgstr "L'authentification d'accès au document a été mise à jour" @@ -2051,14 +2083,14 @@ msgid "Document Approved" msgstr "Document Approuvé" #: apps/web/src/app/(signing)/sign/[token]/no-longer-available.tsx:40 -#: packages/lib/server-only/document/delete-document.ts:246 -#: packages/lib/server-only/document/super-delete-document.ts:98 +#: packages/lib/server-only/document/delete-document.ts:263 +#: packages/lib/server-only/document/super-delete-document.ts:101 msgid "Document Cancelled" msgstr "Document Annulé" #: apps/web/src/components/formatter/document-status.tsx:29 -#: packages/lib/utils/document-audit-logs.ts:369 -#: packages/lib/utils/document-audit-logs.ts:370 +#: packages/lib/utils/document-audit-logs.ts:385 +#: packages/lib/utils/document-audit-logs.ts:386 msgid "Document completed" msgstr "Document terminé" @@ -2071,21 +2103,21 @@ msgstr "E-mail de document complété" msgid "Document Completed!" msgstr "Document Complété !" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:156 -#: packages/lib/utils/document-audit-logs.ts:286 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:168 +#: packages/lib/utils/document-audit-logs.ts:302 msgid "Document created" msgstr "Document créé" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:127 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:125 msgid "Document created by <0>{0}" msgstr "Document créé par <0>{0}" #: packages/email/templates/document-created-from-direct-template.tsx:32 -#: packages/lib/server-only/template/create-document-from-direct-template.ts:585 +#: packages/lib/server-only/template/create-document-from-direct-template.ts:588 msgid "Document created from direct template" msgstr "Document créé à partir d'un modèle direct" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:132 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:130 msgid "Document created using a <0>direct link" msgstr "Document créé en utilisant un <0>lien direct" @@ -2093,10 +2125,10 @@ msgstr "Document créé en utilisant un <0>lien direct" msgid "Document Creation" msgstr "Création de document" -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:51 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:181 -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:61 -#: packages/lib/utils/document-audit-logs.ts:290 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:50 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:182 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:60 +#: packages/lib/utils/document-audit-logs.ts:306 msgid "Document deleted" msgstr "Document supprimé" @@ -2104,12 +2136,12 @@ msgstr "Document supprimé" msgid "Document deleted email" msgstr "E-mail de document supprimé" -#: packages/lib/server-only/document/send-delete-email.ts:82 +#: packages/lib/server-only/document/send-delete-email.ts:85 msgid "Document Deleted!" msgstr "Document Supprimé !" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:219 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:228 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:265 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:274 msgid "Document Distribution Method" msgstr "Méthode de distribution du document" @@ -2117,21 +2149,21 @@ msgstr "Méthode de distribution du document" msgid "Document draft" msgstr "Brouillon de document" -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:58 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:57 msgid "Document Duplicated" msgstr "Document dupliqué" -#: packages/lib/utils/document-audit-logs.ts:326 +#: packages/lib/utils/document-audit-logs.ts:342 msgid "Document external ID updated" msgstr "ID externe du document mis à jour" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:192 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:193 #: apps/web/src/components/document/document-history-sheet.tsx:104 msgid "Document history" msgstr "Historique du document" #: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-page-view.tsx:71 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:81 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:82 msgid "Document ID" msgstr "ID du document" @@ -2151,7 +2183,7 @@ msgstr "Métriques du document" msgid "Document moved" msgstr "Document déplacé" -#: packages/lib/utils/document-audit-logs.ts:334 +#: packages/lib/utils/document-audit-logs.ts:350 msgid "Document moved to team" msgstr "Document déplacé vers l'équipe" @@ -2159,7 +2191,7 @@ msgstr "Document déplacé vers l'équipe" msgid "Document no longer available to sign" msgstr "Document non disponible pour signature" -#: packages/lib/utils/document-audit-logs.ts:318 +#: packages/lib/utils/document-audit-logs.ts:334 msgid "Document opened" msgstr "Document ouvert" @@ -2188,8 +2220,8 @@ msgstr "Document Rejeté" msgid "Document resealed" msgstr "Document resealé" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:327 -#: packages/lib/utils/document-audit-logs.ts:330 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:303 +#: packages/lib/utils/document-audit-logs.ts:346 msgid "Document sent" msgstr "Document envoyé" @@ -2197,11 +2229,11 @@ msgstr "Document envoyé" msgid "Document Signed" msgstr "Document signé" -#: packages/lib/utils/document-audit-logs.ts:310 +#: packages/lib/utils/document-audit-logs.ts:326 msgid "Document signing auth updated" msgstr "Authentification de signature de document mise à jour" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:144 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:143 msgid "Document signing process will be cancelled" msgstr "Le processus de signature du document sera annulé" @@ -2213,11 +2245,11 @@ msgstr "Statut du document" msgid "Document title" msgstr "Titre du document" -#: packages/lib/utils/document-audit-logs.ts:322 +#: packages/lib/utils/document-audit-logs.ts:338 msgid "Document title updated" msgstr "Titre du document mis à jour" -#: packages/lib/utils/document-audit-logs.ts:314 +#: packages/lib/utils/document-audit-logs.ts:330 msgid "Document updated" msgstr "Document mis à jour" @@ -2225,7 +2257,7 @@ msgstr "Document mis à jour" msgid "Document upload disabled due to unpaid invoices" msgstr "Téléchargement du document désactivé en raison de factures impayées" -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:86 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:85 msgid "Document uploaded" msgstr "Document téléchargé" @@ -2233,17 +2265,17 @@ msgstr "Document téléchargé" msgid "Document Viewed" msgstr "Document consulté" -#: packages/lib/utils/document-audit-logs.ts:302 +#: packages/lib/utils/document-audit-logs.ts:318 msgid "Document visibility updated" msgstr "Visibilité du document mise à jour" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:141 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:140 msgid "Document will be permanently deleted" msgstr "Le document sera supprimé de manière permanente" #: apps/web/src/app/(dashboard)/admin/nav.tsx:65 #: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:92 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:144 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:145 #: apps/web/src/app/(dashboard)/documents/[id]/edit/document-edit-page-view.tsx:109 #: apps/web/src/app/(dashboard)/documents/[id]/loading.tsx:16 #: apps/web/src/app/(dashboard)/documents/[id]/sent/page.tsx:15 @@ -2257,7 +2289,7 @@ msgstr "Le document sera supprimé de manière permanente" msgid "Documents" msgstr "Documents" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:197 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:200 msgid "Documents created from template" msgstr "Documents créés à partir du modèle" @@ -2274,10 +2306,10 @@ msgstr "Documents consultés" msgid "Don't have an account? <0>Sign up" msgstr "Vous n'avez pas de compte? <0>Inscrivez-vous" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:111 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:123 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:141 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:162 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:117 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:129 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:142 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:156 #: apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx:110 #: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:185 #: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:107 @@ -2286,7 +2318,7 @@ msgstr "Vous n'avez pas de compte? <0>Inscrivez-vous" msgid "Download" msgstr "Télécharger" -#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:81 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:77 msgid "Download Audit Logs" msgstr "Télécharger les journaux d'audit" @@ -2294,7 +2326,11 @@ msgstr "Télécharger les journaux d'audit" msgid "Download Certificate" msgstr "Télécharger le certificat" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:210 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:168 +msgid "Download Template CSV" +msgstr "" + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:208 #: apps/web/src/components/formatter/document-status.tsx:34 #: packages/lib/constants/document.ts:13 msgid "Draft" @@ -2313,7 +2349,7 @@ msgid "Drag & drop your PDF here." msgstr "Faites glisser et déposez votre PDF ici." #: packages/ui/primitives/document-flow/add-fields.tsx:1076 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:863 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:941 msgid "Dropdown" msgstr "Liste déroulante" @@ -2325,28 +2361,28 @@ msgstr "Options de liste déroulante" msgid "Due to an unpaid invoice, your team has been restricted. Please settle the payment to restore full access to your team." msgstr "En raison d'une facture impayée, votre équipe a été restreinte. Veuillez régler le paiement pour rétablir l'accès complet à votre équipe." -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:136 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:167 -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:85 -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:118 -#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:74 -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:91 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:142 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:161 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:84 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:117 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:76 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:89 msgid "Duplicate" msgstr "Dupliquer" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:104 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:115 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:102 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:156 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:110 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:121 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:103 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:150 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:111 #: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:95 -#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:65 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:67 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx:77 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/page.tsx:100 msgid "Edit" msgstr "Modifier" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:117 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:120 msgid "Edit Template" msgstr "Modifier le modèle" @@ -2366,18 +2402,18 @@ msgstr "Divulgation de signature électronique" #: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:166 #: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:116 #: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:71 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:265 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:272 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:277 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:284 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:122 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:129 -#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:118 -#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:126 +#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:119 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:131 #: apps/web/src/app/embed/direct/[[...url]]/client.tsx:407 #: apps/web/src/app/embed/sign/[[...url]]/client.tsx:287 #: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:169 #: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:153 #: apps/web/src/components/forms/forgot-password.tsx:81 -#: apps/web/src/components/forms/profile.tsx:122 +#: apps/web/src/components/forms/profile.tsx:113 #: apps/web/src/components/forms/signin.tsx:339 #: apps/web/src/components/forms/signup.tsx:176 #: packages/lib/constants/document.ts:28 @@ -2385,7 +2421,7 @@ msgstr "Divulgation de signature électronique" #: packages/ui/primitives/document-flow/add-signers.tsx:511 #: packages/ui/primitives/document-flow/add-signers.tsx:518 #: packages/ui/primitives/document-flow/types.ts:54 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:680 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:758 #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:470 #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:477 msgid "Email" @@ -2401,7 +2437,7 @@ msgstr "Adresse email" msgid "Email Address" msgstr "Adresse e-mail" -#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:80 +#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:81 msgid "Email cannot already exist in the template" msgstr "L'e-mail ne peut déjà exister dans le modèle" @@ -2409,15 +2445,15 @@ msgstr "L'e-mail ne peut déjà exister dans le modèle" msgid "Email Confirmed!" msgstr "Email confirmé !" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:307 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:353 msgid "Email Options" msgstr "Options d'email" -#: packages/lib/utils/document-audit-logs.ts:363 +#: packages/lib/utils/document-audit-logs.ts:379 msgid "Email resent" msgstr "Email renvoyé" -#: packages/lib/utils/document-audit-logs.ts:363 +#: packages/lib/utils/document-audit-logs.ts:379 msgid "Email sent" msgstr "Email envoyé" @@ -2444,12 +2480,12 @@ msgstr "Activer 2FA" #: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:121 msgid "Enable account" -msgstr "" +msgstr "Activer le compte" #: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:88 #: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:95 msgid "Enable Account" -msgstr "" +msgstr "Activer le Compte" #: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:194 msgid "Enable Authenticator App" @@ -2459,11 +2495,11 @@ msgstr "Activer l'application Authenticator" msgid "Enable custom branding for all documents in this team." msgstr "Activer la personnalisation de la marque pour tous les documents de cette équipe." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:251 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:246 msgid "Enable direct link signing" msgstr "Activer la signature par lien direct" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:374 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:368 #: packages/lib/constants/template.ts:8 msgid "Enable Direct Link Signing" msgstr "Activer la signature de lien direct" @@ -2478,11 +2514,11 @@ msgid "Enable Typed Signature" msgstr "Activer la signature dactylographiée" #: packages/ui/primitives/document-flow/add-fields.tsx:813 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:600 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:678 msgid "Enable Typed Signatures" msgstr "Activer les signatures tapées" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:123 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:114 #: apps/web/src/app/(dashboard)/settings/webhooks/[id]/page.tsx:138 #: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:74 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/[id]/page.tsx:142 @@ -2495,7 +2531,7 @@ msgstr "Activé" msgid "Enabling the account results in the user being able to use the account again, and all the related features such as webhooks, teams, and API keys for example." msgstr "Activer le compte permet à l'utilisateur de pouvoir utiliser le compte à nouveau, ainsi que toutes les fonctionnalités associées telles que les webhooks, les équipes et les clés API par exemple." -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:87 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:88 msgid "Enclosed Document" msgstr "Document joint" @@ -2515,7 +2551,7 @@ msgstr "Entrez les informations de votre marque" msgid "Enter your email" msgstr "Entrez votre email" -#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:135 +#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:136 msgid "Enter your email address to receive the completed document." msgstr "Entrez votre adresse e-mail pour recevoir le document complété." @@ -2523,53 +2559,53 @@ msgstr "Entrez votre adresse e-mail pour recevoir le document complété." msgid "Enter your name" msgstr "Entrez votre nom" -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:280 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:293 msgid "Enter your text here" msgstr "Entrez votre texte ici" #: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:41 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:66 #: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:60 #: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:60 #: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:80 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:234 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:268 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:303 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:349 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:209 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:242 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:280 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:325 #: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:57 #: apps/web/src/app/(dashboard)/documents/upload-document.tsx:111 -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:117 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:155 #: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:186 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:217 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:256 -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:226 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:50 #: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:68 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:175 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:187 #: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:152 #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:124 #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:153 #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:214 -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:99 -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:125 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:104 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:130 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:105 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:136 -#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:83 -#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:109 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:88 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:114 #: apps/web/src/app/(signing)/sign/[token]/initials-field.tsx:89 #: apps/web/src/app/(signing)/sign/[token]/initials-field.tsx:115 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:121 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:147 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:149 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:194 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:126 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:152 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:150 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:195 #: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:101 #: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:128 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:133 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:167 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:193 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:167 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:195 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:168 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:196 #: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:54 #: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:101 -#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:258 +#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:224 #: packages/ui/primitives/pdf-viewer.tsx:166 msgid "Error" msgstr "Erreur" @@ -2600,7 +2636,7 @@ msgid "Expires on {0}" msgstr "Expire le {0}" #: packages/ui/primitives/document-flow/add-settings.tsx:295 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:378 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:424 msgid "External ID" msgstr "ID externe" @@ -2608,7 +2644,7 @@ msgstr "ID externe" msgid "Failed to reseal document" msgstr "Échec du reseal du document" -#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:259 +#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:225 msgid "Failed to save settings." msgstr "Échec de l'enregistrement des paramètres." @@ -2621,16 +2657,20 @@ msgstr "Échec de la mise à jour du destinataire" msgid "Failed to update webhook" msgstr "Échec de la mise à jour du webhook" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:93 +#: packages/email/templates/bulk-send-complete.tsx:55 +msgid "Failed: {failedCount}" +msgstr "" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:100 msgid "Field character limit" msgstr "Limite de caractères du champ" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:62 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:44 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:44 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:44 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:69 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:51 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:46 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:51 #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:130 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:107 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:114 msgid "Field font size" msgstr "Taille de police du champ" @@ -2638,19 +2678,19 @@ msgstr "Taille de police du champ" msgid "Field format" msgstr "Format du champ" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:53 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:60 msgid "Field label" msgstr "Étiquette du champ" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:65 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:72 msgid "Field placeholder" msgstr "Espace réservé du champ" -#: packages/lib/utils/document-audit-logs.ts:294 +#: packages/lib/utils/document-audit-logs.ts:310 msgid "Field signed" msgstr "Champ signé" -#: packages/lib/utils/document-audit-logs.ts:298 +#: packages/lib/utils/document-audit-logs.ts:314 msgid "Field unsigned" msgstr "Champ non signé" @@ -2658,16 +2698,20 @@ msgstr "Champ non signé" msgid "Fields" msgstr "Champs" -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:130 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:124 msgid "File cannot be larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB" msgstr "Le fichier ne peut pas dépasser {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} Mo" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:56 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:38 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:38 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:38 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:513 +msgid "File size exceeds the limit of {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB" +msgstr "La taille du fichier dépasse la limite de {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:63 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:45 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:40 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:45 #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:124 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:101 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:108 msgid "Font Size" msgstr "Taille de Police" @@ -2675,6 +2719,10 @@ msgstr "Taille de Police" msgid "For any questions regarding this disclosure, electronic signatures, or any related process, please contact us at: <0>{SUPPORT_EMAIL}" msgstr "Pour toute question concernant cette divulgation, les signatures électroniques ou tout processus y afférent, veuillez nous contacter à : <0>{SUPPORT_EMAIL}" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:147 +msgid "For each recipient, provide their email (required) and name (optional) in separate columns. Download the template CSV below for the correct format." +msgstr "" + #: packages/lib/server-only/auth/send-forgot-password.ts:61 msgid "Forgot Password?" msgstr "Mot de passe oublié ?" @@ -2691,16 +2739,16 @@ msgstr "Signature gratuite" #: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:330 #: apps/web/src/app/(signing)/sign/[token]/form.tsx:191 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:193 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:210 #: apps/web/src/app/embed/direct/[[...url]]/client.tsx:392 #: apps/web/src/app/embed/sign/[[...url]]/client.tsx:272 -#: apps/web/src/components/forms/profile.tsx:110 +#: apps/web/src/components/forms/profile.tsx:101 #: apps/web/src/components/forms/v2/signup.tsx:316 msgid "Full Name" msgstr "Nom complet" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:166 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:77 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:142 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:76 #: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:62 #: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:44 #: apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx:52 @@ -2776,7 +2824,7 @@ msgstr "Ici, vous pouvez définir des préférences et des valeurs par défaut p msgid "Here you can set preferences and defaults for your team." msgstr "Ici, vous pouvez définir des préférences et des valeurs par défaut pour votre équipe." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:206 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:201 msgid "Here's how it works:" msgstr "Voici comment cela fonctionne :" @@ -2784,13 +2832,17 @@ msgstr "Voici comment cela fonctionne :" msgid "Hey I’m Timur" msgstr "Salut, je suis Timur" +#: packages/email/templates/bulk-send-complete.tsx:36 +msgid "Hi {userName}," +msgstr "" + #: packages/email/templates/reset-password.tsx:56 msgid "Hi, {userName} <0>({userEmail})" msgstr "Bonjour, {userName} <0>({userEmail})" -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:189 -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:202 -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:155 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:183 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:201 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:154 msgid "Hide" msgstr "Cacher" @@ -2851,8 +2903,8 @@ msgstr "Documents de la boîte de réception" msgid "Include the Signing Certificate in the Document" msgstr "Includez le certificat de signature dans le document" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:53 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:50 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:54 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:51 msgid "Information" msgstr "Information" @@ -2882,10 +2934,6 @@ msgstr "Code invalide. Veuillez réessayer." msgid "Invalid email" msgstr "Email invalide" -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:105 -msgid "Invalid file" -msgstr "Fichier invalide" - #: apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx:33 #: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:36 msgid "Invalid link" @@ -2908,11 +2956,11 @@ msgstr "Invitation acceptée !" msgid "Invitation declined" msgstr "Invitation refusée" -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:78 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:77 msgid "Invitation has been deleted" msgstr "L'invitation a été supprimée" -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:61 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:60 msgid "Invitation has been resent" msgstr "L'invitation a été renvoyée" @@ -2932,7 +2980,7 @@ msgstr "Inviter des membres" msgid "Invite team members" msgstr "Inviter des membres d'équipe" -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:126 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:125 msgid "Invited At" msgstr "Invité à" @@ -2941,7 +2989,7 @@ msgid "Invoice" msgstr "Facture" #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:47 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:235 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:237 msgid "IP Address" msgstr "Adresse IP" @@ -2975,13 +3023,13 @@ msgstr "Rejoindre {teamName} sur Documenso" #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:67 #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:72 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:48 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:55 msgid "Label" msgstr "Étiquette" #: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:286 #: packages/ui/primitives/document-flow/add-settings.tsx:187 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:162 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:184 msgid "Language" msgstr "Langue" @@ -2997,8 +3045,8 @@ msgstr "30 derniers jours" msgid "Last 7 days" msgstr "7 derniers jours" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:41 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:38 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:42 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:39 msgid "Last modified" msgstr "Dernière modification" @@ -3006,7 +3054,7 @@ msgstr "Dernière modification" msgid "Last updated" msgstr "Dernière mise à jour" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:121 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:122 msgid "Last Updated" msgstr "Dernière mise à jour" @@ -3048,11 +3096,11 @@ msgstr "Vous voulez avoir votre propre profil public avec des accords ?" msgid "Link expires in 1 hour." msgstr "Le lien expire dans 1 heure." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:216 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:215 msgid "Link template" msgstr "Modèle de lien" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:338 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:314 msgid "Links Generated" msgstr "Liens générés" @@ -3073,7 +3121,7 @@ msgstr "Chargement du document..." #: apps/web/src/app/(dashboard)/documents/[id]/loading.tsx:20 #: apps/web/src/app/(dashboard)/documents/[id]/sent/page.tsx:19 -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:91 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:90 msgid "Loading Document..." msgstr "Chargement du Document..." @@ -3104,7 +3152,7 @@ msgstr "Gérer le profil de {0}" msgid "Manage all teams you are currently associated with." msgstr "Gérer toutes les équipes avec lesquelles vous êtes actuellement associé." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:161 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:164 msgid "Manage and view template" msgstr "Gérer et afficher le modèle" @@ -3112,7 +3160,7 @@ msgstr "Gérer et afficher le modèle" msgid "Manage billing" msgstr "Gérer la facturation" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:341 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:339 msgid "Manage details for this public template" msgstr "Gérer les détails de ce modèle public" @@ -3148,7 +3196,7 @@ msgstr "Gérer l'abonnement de l'équipe." msgid "Manage teams" msgstr "Gérer les équipes" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:367 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:361 msgid "Manage the direct link signing for this template" msgstr "Gérer la signature de lien direct pour ce modèle" @@ -3184,10 +3232,14 @@ msgstr "MAU (document créé)" msgid "MAU (had document completed)" msgstr "MAU (document terminé)" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:188 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:209 msgid "Max" msgstr "" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:227 +msgid "Maximum file size: 4MB. Maximum 100 rows per upload. Blank values will use template defaults." +msgstr "" + #: packages/lib/constants/teams.ts:12 msgid "Member" msgstr "Membre" @@ -3204,11 +3256,11 @@ msgid "Members" msgstr "Membres" #: packages/ui/primitives/document-flow/add-subject.tsx:160 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:338 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:384 msgid "Message <0>(Optional)" msgstr "Message <0>(Optionnel)" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:176 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:197 msgid "Min" msgstr "" @@ -3243,8 +3295,8 @@ msgstr "Déplacer le document vers l'équipe" msgid "Move Template to Team" msgstr "Déplacer le modèle vers l'équipe" -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:174 -#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:85 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:168 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:87 msgid "Move to Team" msgstr "Déplacer vers l'équipe" @@ -3263,10 +3315,10 @@ msgstr "Mes modèles" #: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:66 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:144 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table.tsx:59 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:287 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:294 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:299 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:306 #: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:118 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:170 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:175 #: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:153 #: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:141 #: apps/web/src/components/forms/signup.tsx:160 @@ -3274,7 +3326,7 @@ msgstr "Mes modèles" #: packages/ui/primitives/document-flow/add-signers.tsx:549 #: packages/ui/primitives/document-flow/add-signers.tsx:555 #: packages/ui/primitives/document-flow/types.ts:55 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:706 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:784 #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:505 #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:511 msgid "Name" @@ -3308,8 +3360,8 @@ msgstr "Ne jamais expirer" msgid "New team owner" msgstr "Nouveau propriétaire d'équipe" -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:96 -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:103 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:95 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:102 msgid "New Template" msgstr "Nouveau modèle" @@ -3335,7 +3387,7 @@ msgstr "Aucune autre action n'est requise de votre part pour le moment." msgid "No payment required" msgstr "Aucun paiement requis" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:125 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:120 msgid "No public profile templates found" msgstr "Aucun modèle de profil public trouvé" @@ -3343,12 +3395,12 @@ msgstr "Aucun modèle de profil public trouvé" msgid "No recent activity" msgstr "Aucune activité récente" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:101 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:99 msgid "No recent documents" msgstr "Aucun document récent" #: packages/ui/primitives/document-flow/add-fields.tsx:705 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:520 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:598 msgid "No recipient matching this description was found." msgstr "Aucun destinataire correspondant à cette description n'a été trouvé." @@ -3360,7 +3412,7 @@ msgid "No recipients" msgstr "Aucun destinataire" #: packages/ui/primitives/document-flow/add-fields.tsx:720 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:535 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:613 msgid "No recipients with this role" msgstr "Aucun destinataire avec ce rôle" @@ -3387,11 +3439,11 @@ msgstr "Aucun champ de signature trouvé" msgid "No token provided" msgstr "Aucun token fourni" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:284 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:282 msgid "No valid direct templates found" msgstr "Aucun modèle direct valide trouvé" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:293 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:288 msgid "No valid recipients found" msgstr "Aucun destinataire valide trouvé" @@ -3419,10 +3471,10 @@ msgstr "Non pris en charge" msgid "Nothing to do" msgstr "Rien à faire" -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:271 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:284 #: packages/ui/primitives/document-flow/add-fields.tsx:997 #: packages/ui/primitives/document-flow/types.ts:56 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:784 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:862 msgid "Number" msgstr "Numéro" @@ -3464,7 +3516,7 @@ msgstr "Sur cette page, vous pouvez créer de nouveaux webhooks et gérer ceux e msgid "On this page, you can edit the webhook and its settings." msgstr "Sur cette page, vous pouvez modifier le webhook et ses paramètres." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:136 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:135 msgid "Once confirmed, the following will occur:" msgstr "Une fois confirmé, les éléments suivants se produiront :" @@ -3504,7 +3556,7 @@ msgstr "Oups ! Quelque chose a mal tourné." msgid "Opened" msgstr "Ouvert" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:337 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:332 #: apps/web/src/components/forms/signup.tsx:239 #: apps/web/src/components/forms/signup.tsx:263 #: apps/web/src/components/forms/v2/signup.tsx:387 @@ -3515,12 +3567,12 @@ msgstr "Ou" msgid "Or continue with" msgstr "Ou continuez avec" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:340 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:351 msgid "Otherwise, the document will be created as a draft." msgstr "Sinon, le document sera créé sous forme de brouillon." #: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:86 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:103 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:104 #: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:81 #: apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx:84 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:107 @@ -3629,7 +3681,7 @@ msgid "Payment overdue" msgstr "Paiement en retard" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:131 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:207 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:205 #: apps/web/src/components/(teams)/tables/teams-member-page-data-table.tsx:82 #: apps/web/src/components/(teams)/tables/user-settings-teams-page-data-table.tsx:77 #: apps/web/src/components/document/document-read-only-fields.tsx:89 @@ -3680,11 +3732,11 @@ msgstr "Choisissez l'un des accords suivants ci-dessous et commencez à signer p #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:79 #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:84 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:60 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:67 msgid "Placeholder" msgstr "Espace réservé" -#: packages/email/template-components/template-document-invite.tsx:56 +#: packages/email/template-components/template-document-invite.tsx:55 msgid "Please {0} your document<0/>\"{documentName}\"" msgstr "Veuillez {0} votre document<0/>\"{documentName}\"" @@ -3724,7 +3776,7 @@ msgstr "Veuillez confirmer votre email" msgid "Please confirm your email address" msgstr "Veuillez confirmer votre adresse email" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:176 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:175 msgid "Please contact support if you would like to revert this action." msgstr "Veuillez contacter le support si vous souhaitez annuler cette action." @@ -3741,19 +3793,19 @@ msgstr "Veuiillez entrer un nom valide." msgid "Please mark as viewed to complete" msgstr "Veuillez marquer comme vu pour terminer" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:459 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:453 msgid "Please note that proceeding will remove direct linking recipient and turn it into a placeholder." msgstr "Veuillez noter que la poursuite supprimera le destinataire de lien direct et le transformera en espace réservé." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:130 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:129 msgid "Please note that this action is <0>irreversible." msgstr "Veuillez noter que cette action est <0>irréversible." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:121 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:120 msgid "Please note that this action is <0>irreversible. Once confirmed, this document will be permanently deleted." msgstr "Veuillez noter que cette action est <0>irréversible. Une fois confirmée, ce document sera définitivement supprimé." -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:67 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:62 msgid "Please note that this action is irreversible. Once confirmed, your template will be permanently deleted." msgstr "Veuillez noter que cette action est irréversible. Une fois confirmée, votre modèle sera définitivement supprimé." @@ -3785,6 +3837,10 @@ msgstr "Veuillez fournir un token de votre authentificateur, ou un code de secou msgid "Please review the document before signing." msgstr "Veuillez examiner le document avant de signer." +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:503 +msgid "Please select a PDF file" +msgstr "Veuillez sélectionner un fichier PDF" + #: apps/web/src/components/forms/send-confirmation-email.tsx:64 msgid "Please try again and make sure you enter the correct email address." msgstr "Veuillez réessayer et assurez-vous d'entrer la bonne adresse email." @@ -3793,7 +3849,7 @@ msgstr "Veuillez réessayer et assurez-vous d'entrer la bonne adresse email." msgid "Please try again later or login using your normal details" msgstr "Veuillez réessayer plus tard ou connectez-vous avec vos informations normales" -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:80 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:79 msgid "Please try again later." msgstr "Veuillez réessayer plus tard." @@ -3802,7 +3858,7 @@ msgstr "Veuillez réessayer plus tard." msgid "Please try again or contact our support." msgstr "Veuillez réessayer ou contacter notre support." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:186 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:185 msgid "Please type {0} to confirm" msgstr "Veuiillez taper {0} pour confirmer" @@ -3810,6 +3866,10 @@ msgstr "Veuiillez taper {0} pour confirmer" msgid "Please type <0>{0} to confirm." msgstr "Veuillez taper <0>{0} pour confirmer." +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:172 +msgid "Pre-formatted CSV template with example data." +msgstr "" + #: apps/web/src/components/(dashboard)/common/command-menu.tsx:214 #: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:58 #: apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx:67 @@ -3840,16 +3900,16 @@ msgstr "Les modèles privés ne peuvent être modifiés et consultés que par vo msgid "Profile" msgstr "Profil" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:184 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:183 msgid "Profile is currently <0>hidden." msgstr "Le profil est actuellement <0>caché." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:172 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:171 msgid "Profile is currently <0>visible." msgstr "Le profil est actuellement <0>visible." #: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:74 -#: apps/web/src/components/forms/profile.tsx:72 +#: apps/web/src/components/forms/profile.tsx:71 msgid "Profile updated" msgstr "Profil mis à jour" @@ -3888,9 +3948,9 @@ msgstr "Valeurs radio" #: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:186 #: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:147 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:156 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:177 #: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:122 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:133 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:161 msgid "Read only" msgstr "Lecture seule" @@ -3906,7 +3966,7 @@ msgstr "Lisez l'intégralité de la <0>divulgation de signature." msgid "Ready" msgstr "Prêt" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:289 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:291 msgid "Reason" msgstr "Raison" @@ -3935,21 +3995,21 @@ msgstr "Recevoir une copie" msgid "Recent activity" msgstr "Activité récente" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:45 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:43 msgid "Recent documents" msgstr "Documents récents" #: apps/web/src/app/(dashboard)/documents/data-table.tsx:63 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:116 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:280 -#: packages/lib/utils/document-audit-logs.ts:338 -#: packages/lib/utils/document-audit-logs.ts:353 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:114 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:275 +#: packages/lib/utils/document-audit-logs.ts:354 +#: packages/lib/utils/document-audit-logs.ts:369 msgid "Recipient" msgstr "Destinataire" #: packages/ui/components/recipient/recipient-action-auth-select.tsx:39 #: packages/ui/primitives/document-flow/add-settings.tsx:269 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:291 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:337 msgid "Recipient action authentication" msgstr "Authentification d'action de destinataire" @@ -3959,7 +4019,7 @@ msgstr "E-mail de destinataire supprimé" #: packages/ui/components/document/document-email-checkboxes.tsx:50 msgid "Recipient signed email" -msgstr "" +msgstr "E-mail signé par le destinataire" #: packages/ui/components/document/document-email-checkboxes.tsx:88 msgid "Recipient signing request email" @@ -3972,7 +4032,7 @@ msgstr "Destinataire mis à jour" #: apps/web/src/app/(dashboard)/admin/documents/[id]/page.tsx:66 #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:49 #: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recipients.tsx:30 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:139 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:140 msgid "Recipients" msgstr "Destinataires" @@ -3980,7 +4040,7 @@ msgstr "Destinataires" msgid "Recipients metrics" msgstr "Métriques des destinataires" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:166 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:165 msgid "Recipients will still retain their copy of the document" msgstr "Les destinataires conservent toujours leur copie du document" @@ -3997,7 +4057,7 @@ msgid "Red" msgstr "Rouge" #: packages/ui/primitives/document-flow/add-settings.tsx:383 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:461 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:507 msgid "Redirect URL" msgstr "URL de redirection" @@ -4010,7 +4070,7 @@ msgstr "Inscription réussie" #: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:109 #: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:116 #: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:162 -#: packages/email/template-components/template-document-invite.tsx:96 +#: packages/email/template-components/template-document-invite.tsx:95 msgid "Reject Document" msgstr "Rejeter le Document" @@ -4047,17 +4107,18 @@ msgstr "Rappel : Veuillez {recipientActionVerb} ce document" msgid "Reminder: Please {recipientActionVerb} your document" msgstr "Rappel : Veuillez {recipientActionVerb} votre document" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:193 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:431 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:188 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:425 #: apps/web/src/app/(signing)/sign/[token]/signing-field-container.tsx:156 #: apps/web/src/app/(signing)/sign/[token]/signing-field-container.tsx:180 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:250 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx:89 #: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:159 #: apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx:54 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:164 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:163 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:165 #: apps/web/src/components/forms/avatar-image.tsx:166 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:217 #: packages/ui/primitives/document-flow/add-fields.tsx:1128 msgid "Remove" msgstr "Retirer" @@ -4085,9 +4146,9 @@ msgstr "Demander le transfert" #: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:176 #: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:137 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:146 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:167 #: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:112 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:123 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:151 msgid "Required field" msgstr "Champ requis" @@ -4096,7 +4157,7 @@ msgid "Reseal document" msgstr "Rescellage du document" #: apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx:118 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:152 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:151 #: packages/ui/primitives/document-flow/add-subject.tsx:84 msgid "Resend" msgstr "Renvoyer" @@ -4177,11 +4238,11 @@ msgstr "Révoquer" msgid "Revoke access" msgstr "Révoquer l'accès" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:283 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:278 #: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:318 #: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:163 #: apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx:80 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:121 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:120 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:103 msgid "Role" msgstr "Rôle" @@ -4195,16 +4256,16 @@ msgstr "Rôles" msgid "Rows per page" msgstr "Lignes par page" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:446 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:337 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:344 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:440 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:350 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:361 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:312 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:305 -#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:356 +#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:322 msgid "Save" msgstr "Sauvegarder" -#: packages/ui/primitives/template-flow/add-template-fields.tsx:896 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:974 msgid "Save Template" msgstr "Sauvegarder le modèle" @@ -4219,7 +4280,7 @@ msgstr "Recherche" msgid "Search by document title" msgstr "Recherche par titre de document" -#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:147 +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:174 #: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:144 msgid "Search by name or email" msgstr "Recherche par nom ou e-mail" @@ -4266,11 +4327,11 @@ msgstr "Sélectionnez une équipe pour déplacer ce document. Cette action ne pe msgid "Select a team to move this template to. This action cannot be undone." msgstr "Sélectionnez une équipe pour déplacer ce modèle. Cette action ne peut pas être annulée." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:261 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:259 msgid "Select a template you'd like to display on your public profile" msgstr "Sélectionnez un modèle que vous souhaitez afficher sur votre profil public" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:257 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:255 msgid "Select a template you'd like to display on your team's public profile" msgstr "Sélectionnez un modèle que vous souhaitez afficher sur le profil public de votre équipe" @@ -4301,7 +4362,7 @@ msgstr "Envoyer" msgid "Send confirmation email" msgstr "Envoyer l'e-mail de confirmation" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:325 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:336 msgid "Send document" msgstr "Envoyer le document" @@ -4315,7 +4376,7 @@ msgstr "Envoyer l'e-mail de document complété" #: packages/ui/components/document/document-email-checkboxes.tsx:269 msgid "Send document completed email to the owner" -msgstr "" +msgstr "Envoyer l'e-mail de document complété au propriétaire" #: packages/ui/components/document/document-email-checkboxes.tsx:231 msgid "Send document deleted email" @@ -4329,6 +4390,10 @@ msgstr "Envoyer l'e-mail de document en attente" msgid "Send documents on behalf of the team using the email address" msgstr "Envoyer des documents au nom de l'équipe en utilisant l'adresse e-mail" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:253 +msgid "Send documents to recipients immediately" +msgstr "" + #: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:200 msgid "Send on Behalf of Team" msgstr "Envoyer au nom de l'équipe" @@ -4339,7 +4404,7 @@ msgstr "Envoyer l'e-mail de destinataire supprimé" #: packages/ui/components/document/document-email-checkboxes.tsx:40 msgid "Send recipient signed email" -msgstr "" +msgstr "Envoyer l'e-mail signé par le destinataire" #: packages/ui/components/document/document-email-checkboxes.tsx:78 msgid "Send recipient signing request email" @@ -4362,7 +4427,7 @@ msgid "Sending..." msgstr "Envoi..." #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:101 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:256 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:258 msgid "Sent" msgstr "Envoyé" @@ -4381,8 +4446,8 @@ msgstr "Paramètres" msgid "Setup" msgstr "Configuration" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:148 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:193 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:154 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:187 msgid "Share" msgstr "Partager" @@ -4390,8 +4455,8 @@ msgstr "Partager" msgid "Share Signature Card" msgstr "Partager la carte de signature" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:179 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:219 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:185 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:213 msgid "Share Signing Card" msgstr "Partager la carte de signature" @@ -4403,7 +4468,7 @@ msgstr "Partager le lien" msgid "Share your signing experience!" msgstr "Partagez votre expérience de signature !" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:163 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:162 msgid "Show" msgstr "Afficher" @@ -4424,13 +4489,13 @@ msgstr "Afficher des modèles dans votre profil public pour que votre audience p msgid "Show templates in your team public profile for your audience to sign and get started quickly" msgstr "Afficher des modèles dans le profil public de votre équipe pour que votre audience puisse signer et commencer rapidement" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:83 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:114 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:139 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:89 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:115 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:133 #: apps/web/src/app/(profile)/p/[url]/page.tsx:192 #: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:229 #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:182 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:224 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:241 #: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:142 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:328 #: apps/web/src/components/ui/user-profile-skeleton.tsx:75 @@ -4443,7 +4508,7 @@ msgstr "Signer" msgid "Sign as {0} <0>({1})" msgstr "Signer comme {0} <0>({1})" -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:183 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:200 msgid "Sign as<0>{0} <1>({1})" msgstr "Signer comme<0>{0} <1>({1})" @@ -4453,7 +4518,7 @@ msgid "Sign document" msgstr "Signer le document" #: apps/web/src/app/(signing)/sign/[token]/form.tsx:141 -#: packages/email/template-components/template-document-invite.tsx:104 +#: packages/email/template-components/template-document-invite.tsx:103 msgid "Sign Document" msgstr "Signer le document" @@ -4506,22 +4571,22 @@ msgid "Sign Up with OIDC" msgstr "S'inscrire avec OIDC" #: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:88 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:177 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:179 #: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:342 #: apps/web/src/app/(signing)/sign/[token]/form.tsx:205 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:251 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:286 #: apps/web/src/app/embed/direct/[[...url]]/client.tsx:422 #: apps/web/src/app/embed/sign/[[...url]]/client.tsx:301 -#: apps/web/src/components/forms/profile.tsx:132 +#: apps/web/src/components/forms/profile.tsx:123 #: packages/ui/primitives/document-flow/add-fields.tsx:841 #: packages/ui/primitives/document-flow/field-icon.tsx:52 #: packages/ui/primitives/document-flow/types.ts:49 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:628 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:706 msgid "Signature" msgstr "Signature" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:228 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:230 msgid "Signature ID" msgstr "ID de signature" @@ -4541,7 +4606,7 @@ msgid "Signatures will appear once the document has been completed" msgstr "Les signatures apparaîtront une fois le document complété" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:114 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:278 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:280 #: apps/web/src/components/document/document-read-only-fields.tsx:84 #: packages/lib/constants/recipient-roles.ts:23 msgid "Signed" @@ -4551,7 +4616,7 @@ msgstr "Signé" msgid "Signer" msgstr "Signataire" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:176 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:178 msgid "Signer Events" msgstr "Événements de signataire" @@ -4567,11 +4632,11 @@ msgstr "Les signataires doivent avoir des e-mails uniques" msgid "Signing" msgstr "Signature en cours" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:168 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:170 msgid "Signing Certificate" msgstr "Certificat de signature" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:311 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:313 msgid "Signing certificate provided by" msgstr "Certificat de signature fourni par" @@ -4585,12 +4650,12 @@ msgstr "Signature Complète !" msgid "Signing in..." msgstr "Connexion en cours..." -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:160 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:203 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:166 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:197 msgid "Signing Links" msgstr "Liens de signature" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:339 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:315 msgid "Signing links have been generated for this document." msgstr "Des liens de signature ont été générés pour ce document." @@ -4598,7 +4663,7 @@ msgstr "Des liens de signature ont été générés pour ce document." msgid "Signing up..." msgstr "Inscription en cours..." -#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:82 +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:90 #: apps/web/src/app/(dashboard)/admin/leaderboard/page.tsx:46 msgid "Signing Volume" msgstr "Volume de signatures" @@ -4611,7 +4676,7 @@ msgstr "Les inscriptions sont désactivées." msgid "Since {0}" msgstr "Depuis {0}" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:102 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:93 msgid "Site Banner" msgstr "Bannière du site" @@ -4625,27 +4690,27 @@ msgid "Some signers have not been assigned a signature field. Please assign at l msgstr "Certains signataires n'ont pas été assignés à un champ de signature. Veuillez assigner au moins 1 champ de signature à chaque signataire avant de continuer." #: apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx:105 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:63 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:91 -#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:65 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:69 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:97 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:61 #: apps/web/src/app/(dashboard)/documents/[id]/logs/download-certificate-button.tsx:68 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:75 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:106 -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:82 -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:72 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:76 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:100 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:81 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:71 #: apps/web/src/app/(dashboard)/settings/billing/billing-plans.tsx:62 #: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:51 -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:124 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:123 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:73 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:93 #: apps/web/src/app/(dashboard)/settings/teams/accept-team-invitation-button.tsx:32 #: apps/web/src/app/(dashboard)/settings/teams/decline-team-invitation-button.tsx:32 #: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:44 -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:50 -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:79 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:104 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:127 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:151 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:45 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:78 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:100 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:123 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:147 #: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:118 #: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:27 #: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:38 @@ -4661,8 +4726,8 @@ msgstr "Certains signataires n'ont pas été assignés à un champ de signature. #: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:64 #: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:83 #: apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx:33 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:66 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:83 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:65 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:82 #: apps/web/src/components/(teams)/team-billing-portal-button.tsx:29 #: packages/ui/components/document/document-share-button.tsx:51 msgid "Something went wrong" @@ -4701,12 +4766,16 @@ msgstr "Quelque chose a mal tourné !" msgid "Something went wrong." msgstr "Quelque chose a mal tourné." +#: apps/web/src/components/forms/token.tsx:143 +msgid "Something went wrong. Please try again later." +msgstr "Quelque chose a mal tourné. Veuillez réessayer plus tard." + #: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:240 #: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:154 msgid "Something went wrong. Please try again or contact support." msgstr "Quelque chose a mal tourné. Veuillez réessayer ou contacter le support." -#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:67 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:63 msgid "Sorry, we were unable to download the audit logs. Please try again later." msgstr "Désolé, nous n'avons pas pu télécharger les journaux d'audit. Veuillez réessayer plus tard." @@ -4714,7 +4783,7 @@ msgstr "Désolé, nous n'avons pas pu télécharger les journaux d'audit. Veuill msgid "Sorry, we were unable to download the certificate. Please try again later." msgstr "Désolé, nous n'avons pas pu télécharger le certificat. Veuillez réessayer plus tard." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:134 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:132 msgid "Source" msgstr "Source" @@ -4725,8 +4794,8 @@ msgstr "Statistiques" #: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:81 #: apps/web/src/app/(dashboard)/admin/subscriptions/page.tsx:32 #: apps/web/src/app/(dashboard)/documents/data-table.tsx:73 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:126 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:93 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:124 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:94 #: apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx:73 msgid "Status" msgstr "Statut" @@ -4736,7 +4805,7 @@ msgid "Step <0>{step} of {maxStep}" msgstr "Étape <0>{step} sur {maxStep}" #: packages/ui/primitives/document-flow/add-subject.tsx:143 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:318 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:364 msgid "Subject <0>(Optional)" msgstr "Objet <0>(Optionnel)" @@ -4762,8 +4831,8 @@ msgstr "Abonnements" #: apps/web/src/app/(dashboard)/settings/teams/accept-team-invitation-button.tsx:25 #: apps/web/src/app/(dashboard)/settings/teams/decline-team-invitation-button.tsx:25 #: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:37 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:118 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:141 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:114 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:137 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx:32 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:44 #: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:44 @@ -4780,11 +4849,12 @@ msgstr "Abonnements" #: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:92 #: apps/web/src/components/(teams)/forms/update-team-form.tsx:67 #: apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx:27 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:60 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:77 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:59 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:76 #: apps/web/src/components/forms/public-profile-form.tsx:80 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:133 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:170 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:132 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:168 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:95 msgid "Success" msgstr "Succès" @@ -4792,6 +4862,14 @@ msgstr "Succès" msgid "Successfully created passkey" msgstr "Clé d'authentification créée avec succès" +#: packages/email/templates/bulk-send-complete.tsx:52 +msgid "Successfully created: {successCount}" +msgstr "" + +#: packages/email/templates/bulk-send-complete.tsx:44 +msgid "Summary:" +msgstr "" + #: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:57 msgid "System Requirements" msgstr "Exigences du système" @@ -4863,7 +4941,7 @@ msgstr "Invitation d'équipe" msgid "Team invitations have been sent." msgstr "Les invitations d'équipe ont été envoyées." -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:107 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:106 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:84 msgid "Team Member" msgstr "Membre de l'équipe" @@ -4940,31 +5018,31 @@ msgstr "Équipes restreintes" #: apps/web/src/app/(dashboard)/templates/[id]/edit/template-edit-page-view.tsx:64 #: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:39 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:144 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:224 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:148 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:142 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:222 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:151 #: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:408 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:271 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:269 msgid "Template" msgstr "Modèle" -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:41 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:36 msgid "Template deleted" msgstr "Modèle supprimé" -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:67 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:66 msgid "Template document uploaded" msgstr "Document modèle téléchargé" -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:42 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:41 msgid "Template duplicated" msgstr "Modèle dupliqué" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:134 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:133 msgid "Template has been removed from your public profile." msgstr "Le modèle a été retiré de votre profil public." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:171 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:169 msgid "Template has been updated." msgstr "Le modèle a été mis à jour." @@ -4976,15 +5054,15 @@ msgstr "Modèle déplacé" msgid "Template not found or already associated with a team." msgstr "Modèle introuvable ou déjà associé à une équipe." -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:246 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:216 msgid "Template saved" msgstr "Modèle enregistré" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:145 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:167 msgid "Template title" msgstr "Titre du modèle" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:86 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:87 #: apps/web/src/app/(dashboard)/templates/templates-page-view.tsx:55 #: apps/web/src/components/(dashboard)/common/command-menu.tsx:208 #: apps/web/src/components/(dashboard)/layout/desktop-nav.tsx:22 @@ -4992,19 +5070,28 @@ msgstr "Titre du modèle" msgid "Templates" msgstr "Modèles" -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:106 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:105 msgid "Templates allow you to quickly generate documents with pre-filled recipients and fields." msgstr "Les modèles vous permettent de générer rapidement des documents avec des destinataires et des champs pré-remplis." -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:257 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:274 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:258 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:287 #: packages/ui/primitives/document-flow/add-fields.tsx:971 #: packages/ui/primitives/document-flow/types.ts:52 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:758 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:836 msgid "Text" msgstr "Texte" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:166 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:79 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:61 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:56 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:61 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:140 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:124 +msgid "Text Align" +msgstr "" + +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:157 msgid "Text Color" msgstr "Couleur du texte" @@ -5016,7 +5103,7 @@ msgstr "Merci d'utiliser Documenso pour signer vos documents électroniquement. msgid "That's okay, it happens! Click the button below to reset your password." msgstr "C'est d'accord, cela arrive ! Cliquez sur le bouton ci-dessous pour réinitialiser votre mot de passe." -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:51 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:52 msgid "The account has been deleted successfully." msgstr "Le compte a été supprimé avec succès." @@ -5040,13 +5127,13 @@ msgstr "L'authentification requise pour que les destinataires signent le champ d msgid "The authentication required for recipients to view the document." msgstr "L'authentification requise pour que les destinataires visualisent le document." -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:197 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:188 msgid "The content to show in the banner, HTML is allowed" msgstr "Le contenu à afficher dans la bannière, le HTML est autorisé" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:78 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:73 #: apps/web/src/app/(dashboard)/templates/template-direct-link-badge.tsx:32 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:164 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:160 msgid "The direct link has been copied to your clipboard" msgstr "Le lien direct a été copié dans votre presse-papiers" @@ -5066,15 +5153,15 @@ msgstr "Le propriétaire du document a été informé de ce rejet. Aucune action msgid "The document owner has been notified of your decision. They may contact you with further instructions if necessary." msgstr "Le propriétaire du document a été informé de votre décision. Il peut vous contacter pour des instructions supplémentaires si nécessaire." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:182 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:194 msgid "The document was created but could not be sent to recipients." msgstr "Le document a été créé mais n'a pas pu être envoyé aux destinataires." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:163 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:162 msgid "The document will be hidden from your account" msgstr "Le document sera caché de votre compte" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:333 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:344 msgid "The document will be immediately sent to recipients if this is checked." msgstr "Le document sera immédiatement envoyé aux destinataires si cela est coché." @@ -5088,6 +5175,10 @@ msgstr "Le nom du document" msgid "The events that will trigger a webhook to be sent to your URL." msgstr "Les événements qui déclencheront un webhook à envoyer à votre URL." +#: packages/email/templates/bulk-send-complete.tsx:62 +msgid "The following errors occurred:" +msgstr "" + #: packages/email/templates/team-delete.tsx:37 msgid "The following team has been deleted by its owner. You will no longer be able to access this team and its documents" msgstr "L'équipe suivante a été supprimée par son propriétaire. Vous ne pourrez plus accéder à cette équipe et à ses documents" @@ -5116,11 +5207,11 @@ msgstr "Le lien de profil a été copié dans votre presse-papiers" msgid "The profile you are looking for could not be found." msgstr "Le profil que vous recherchez n'a pas pu être trouvé." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:380 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:378 msgid "The public description that will be displayed with this template" msgstr "La description publique qui sera affichée avec ce modèle" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:358 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:356 msgid "The public name for your template" msgstr "Le nom public pour votre modèle" @@ -5175,7 +5266,7 @@ msgstr "Le nom du signataire" msgid "The signing link has been copied to your clipboard." msgstr "Le lien de signature a été copié dans votre presse-papiers." -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:105 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:96 msgid "The site banner is a message that is shown at the top of the site. It can be used to display important information to your users." msgstr "La bannière du site est un message affiché en haut du site. Elle peut être utilisée pour afficher des informations importantes à vos utilisateurs." @@ -5199,7 +5290,7 @@ msgstr "L'équipe que vous recherchez a peut-être été supprimée, renommée o msgid "The template has been successfully moved to the selected team." msgstr "Le modèle a été déplacé avec succès vers l'équipe sélectionnée." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:443 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:441 msgid "The template will be removed from your profile" msgstr "Le modèle sera retiré de votre profil" @@ -5207,7 +5298,7 @@ msgstr "Le modèle sera retiré de votre profil" msgid "The template you are looking for may have been disabled, deleted or may have never existed." msgstr "Le modèle que vous recherchez a peut-être été désactivé, supprimé ou n'a peut-être jamais existé." -#: apps/web/src/components/forms/token.tsx:106 +#: apps/web/src/components/forms/token.tsx:107 msgid "The token was copied to your clipboard." msgstr "Le token a été copié dans votre presse-papiers." @@ -5250,8 +5341,8 @@ msgstr "Il n'y a pas encore de documents complétés. Les documents que vous ave msgid "They have permission on your behalf to:" msgstr "Ils ont la permission en votre nom de:" -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:110 -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:109 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:100 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:106 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:98 msgid "This action is not reversible. Please be certain." msgstr "Cette action n'est pas réversible. Veuillez être sûr." @@ -5268,11 +5359,11 @@ msgstr "Cela peut être remplacé par le paramétrage direct des exigences d'aut msgid "This document can not be recovered, if you would like to dispute the reason for future documents please contact support." msgstr "Ce document ne peut pas être récupéré, si vous souhaitez contester la raison des documents futurs, veuillez contacter le support." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:83 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:82 msgid "This document could not be deleted at this time. Please try again." msgstr "Ce document n'a pas pu être supprimé pour le moment. Veuillez réessayer." -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:73 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:72 msgid "This document could not be duplicated at this time. Please try again." msgstr "Ce document n'a pas pu être dupliqué pour le moment. Veuillez réessayer." @@ -5292,11 +5383,11 @@ 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/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:227 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:228 msgid "This document has been signed by all recipients" msgstr "Ce document a été signé par tous les destinataires" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:230 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:231 msgid "This document is currently a draft and has not been sent" msgstr "Ce document est actuellement un brouillon et n'a pas été envoyé" @@ -5304,11 +5395,11 @@ msgstr "Ce document est actuellement un brouillon et n'a pas été envoyé" msgid "This document is password protected. Please enter the password to view the document." msgstr "Ce document est protégé par mot de passe. Veuillez entrer le mot de passe pour visualiser le document." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:148 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:146 msgid "This document was created by you or a team member using the template above." msgstr "Ce document a été créé par vous ou un membre de l'équipe en utilisant le modèle ci-dessus." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:160 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:158 msgid "This document was created using a direct link." msgstr "Ce document a été créé en utilisant un lien direct." @@ -5344,7 +5435,7 @@ msgstr "Cet e-mail sera envoyé au destinataire qui vient de signer le document, msgid "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them." msgstr "Ce champ ne peut pas être modifié ou supprimé. Lorsque vous partagez le lien direct de ce modèle ou l'ajoutez à votre profil public, toute personne qui y accède peut saisir son nom et son email, et remplir les champs qui lui sont attribués." -#: packages/ui/primitives/template-flow/add-template-settings.tsx:233 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:279 msgid "This is how the document will reach the recipients once the document is ready for signing." msgstr "Voici comment le document atteindra les destinataires une fois qu'il sera prêt à être signé." @@ -5384,7 +5475,7 @@ msgstr "Ce signataire a déjà signé le document." msgid "This team, and any associated data excluding billing invoices will be permanently deleted." msgstr "Cette équipe, et toutes les données associées à l'exception des factures de facturation, seront définitivement supprimées." -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:51 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:46 msgid "This template could not be deleted at this time. Please try again." msgstr "Ce modèle n'a pas pu être supprimé pour le moment. Veuillez réessayer." @@ -5425,7 +5516,7 @@ msgstr "Cela sera envoyé au propriétaire du document une fois que le document msgid "This will override any global settings." msgstr "Cela remplacera tous les paramètres globaux." -#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:71 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:70 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:44 msgid "Time" msgstr "Temps" @@ -5434,15 +5525,15 @@ msgstr "Temps" msgid "Time zone" msgstr "Fuseau horaire" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:131 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:132 #: packages/ui/primitives/document-flow/add-settings.tsx:359 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:438 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:484 msgid "Time Zone" msgstr "Fuseau horaire" #: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:67 #: apps/web/src/app/(dashboard)/documents/data-table.tsx:54 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:111 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:109 #: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:61 #: packages/ui/primitives/document-flow/add-settings.tsx:166 msgid "Title" @@ -5456,13 +5547,13 @@ msgstr "Pour accepter cette invitation, vous devez créer un compte." msgid "To change the email you must remove and add a new email address." msgstr "Pour changer l'e-mail, vous devez supprimer et ajouter une nouvelle adresse e-mail." -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:116 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:113 #: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:111 #: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:101 msgid "To confirm, please enter the accounts email address <0/>({0})." msgstr "Pour confirmer, veuillez entrer l'adresse e-mail du compte <0/>({0})." -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:117 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:107 msgid "To confirm, please enter the reason" msgstr "Pour confirmer, veuillez entrer la raison" @@ -5483,7 +5574,7 @@ msgid "To mark this document as viewed, you need to be logged in as <0>{0}" msgstr "Pour marquer ce document comme consulté, vous devez être connecté en tant que <0>{0}" #: packages/ui/primitives/document-flow/add-fields.tsx:1091 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:876 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:954 msgid "To proceed further, please set at least one value for the {0} field." msgstr "Pour continuer, veuillez définir au moins une valeur pour le champ {0}." @@ -5495,11 +5586,11 @@ msgstr "Pour utiliser notre service de signature électronique, vous devez avoir msgid "To view this document you need to be signed into your account, please sign in to continue." msgstr "Pour afficher ce document, vous devez être connecté à votre compte, veuillez vous connecter pour continuer." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:178 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:177 msgid "Toggle the switch to hide your profile from the public." msgstr "Basculer l'interrupteur pour cacher votre profil du public." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:190 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:189 msgid "Toggle the switch to show your profile to the public." msgstr "Basculer l'interrupteur pour afficher votre profil au public." @@ -5507,11 +5598,11 @@ msgstr "Basculer l'interrupteur pour afficher votre profil au public." msgid "Token" msgstr "Jeton" -#: apps/web/src/components/forms/token.tsx:105 +#: apps/web/src/components/forms/token.tsx:106 msgid "Token copied to clipboard" msgstr "Token copié dans le presse-papiers" -#: apps/web/src/components/forms/token.tsx:126 +#: apps/web/src/components/forms/token.tsx:127 msgid "Token created" msgstr "Token créé" @@ -5544,6 +5635,10 @@ msgstr "Total des documents" msgid "Total Recipients" msgstr "Total des destinataires" +#: packages/email/templates/bulk-send-complete.tsx:49 +msgid "Total rows processed: {totalProcessed}" +msgstr "" + #: apps/web/src/app/(dashboard)/admin/stats/page.tsx:150 msgid "Total Signers that Signed Up" msgstr "Total des signataires qui se sont inscrits" @@ -5629,11 +5724,11 @@ msgstr "Impossible de changer la langue pour le moment. Veuillez réessayer plus msgid "Unable to copy recovery code" msgstr "Impossible de copier le code de récupération" -#: apps/web/src/components/forms/token.tsx:110 +#: apps/web/src/components/forms/token.tsx:111 msgid "Unable to copy token" msgstr "Impossible de copier le token" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:105 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:101 msgid "Unable to create direct template access. Please try again later." msgstr "Impossible de créer un accès direct au modèle. Veuillez réessayer plus tard." @@ -5641,7 +5736,7 @@ msgstr "Impossible de créer un accès direct au modèle. Veuillez réessayer pl msgid "Unable to decline this team invitation at this time." msgstr "Impossible de refuser cette invitation d'équipe pour le moment." -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:84 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:83 msgid "Unable to delete invitation. Please try again." msgstr "Impossible de supprimer l'invitation. Veuillez réessayer." @@ -5662,11 +5757,11 @@ msgstr "Impossible de rejoindre cette équipe pour le moment." msgid "Unable to load document history" msgstr "Impossible de charger l'historique des documents" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:60 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:58 msgid "Unable to load documents" msgstr "Impossible de charger les documents" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:111 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:106 msgid "Unable to load your public profile templates at this time" msgstr "Impossible de charger vos modèles de profil public pour le moment" @@ -5678,7 +5773,7 @@ msgstr "Impossible de retirer la vérification par e-mail pour le moment. Veuill msgid "Unable to remove team email at this time. Please try again." msgstr "Impossible de retirer l'e-mail de l'équipe pour le moment. Veuillez réessayer." -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:67 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:66 msgid "Unable to resend invitation. Please try again." msgstr "Impossible de renvoyer l'invitation. Veuillez réessayer." @@ -5709,10 +5804,10 @@ msgstr "Non autorisé" msgid "Uncompleted" msgstr "Non complet" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:237 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:262 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:273 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:284 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:239 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:264 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:275 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:286 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx:55 msgid "Unknown" msgstr "Inconnu" @@ -5725,17 +5820,17 @@ msgstr "Erreur inconnue" msgid "Unpaid" msgstr "Non payé" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:181 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:176 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:162 #: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:166 #: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:191 #: apps/web/src/components/forms/public-profile-form.tsx:279 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:428 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:426 #: packages/ui/primitives/document-flow/add-subject.tsx:86 msgid "Update" msgstr "Mettre à jour" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:211 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:202 msgid "Update Banner" msgstr "Mettre à jour la bannière" @@ -5747,7 +5842,7 @@ msgstr "Mettre à jour la clé d'accès" msgid "Update password" msgstr "Mettre à jour le mot de passe" -#: apps/web/src/components/forms/profile.tsx:151 +#: apps/web/src/components/forms/profile.tsx:142 msgid "Update profile" msgstr "Mettre à jour le profil" @@ -5790,7 +5885,7 @@ msgstr "Mettre à jour le webhook" msgid "Updating password..." msgstr "Mise à jour du mot de passe..." -#: apps/web/src/components/forms/profile.tsx:151 +#: apps/web/src/components/forms/profile.tsx:142 msgid "Updating profile..." msgstr "Mise à jour du profil..." @@ -5802,10 +5897,30 @@ msgstr "Mise à jour de vos informations" msgid "Upgrade" msgstr "Améliorer" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:132 +msgid "Upload a CSV file to create multiple documents from this template. Each row represents one document with its recipient details." +msgstr "" + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:426 +msgid "Upload a custom document to use instead of the template's default document" +msgstr "Téléchargez un document personnalisé à utiliser à la place du document par défaut du modèle" + +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:267 +msgid "Upload and Process" +msgstr "" + #: apps/web/src/components/forms/avatar-image.tsx:179 msgid "Upload Avatar" msgstr "Télécharger un avatar" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:198 +msgid "Upload CSV" +msgstr "" + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:419 +msgid "Upload custom document" +msgstr "Télécharger un document personnalisé" + #: packages/ui/primitives/signature-pad/signature-pad.tsx:529 msgid "Upload Signature" msgstr "Importer une signature" @@ -5835,7 +5950,7 @@ msgstr "Le fichier téléchargé est trop petit" msgid "Uploaded file not an allowed file type" msgstr "Le fichier téléchargé n'est pas un type de fichier autorisé" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:172 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:175 msgid "Use" msgstr "Utiliser" @@ -5849,11 +5964,11 @@ msgstr "Utiliser l'authentificateur" msgid "Use Backup Code" msgstr "Utiliser le code de secours" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:207 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:219 msgid "Use Template" msgstr "Utiliser le modèle" -#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:76 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:75 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:45 msgid "User" msgstr "Utilisateur" @@ -5866,6 +5981,7 @@ msgstr "L'utilisateur n'a pas de mot de passe." msgid "User ID" msgstr "ID utilisateur" +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:61 #: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:55 #: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:55 msgid "User not found." @@ -5892,7 +6008,7 @@ msgid "Users" msgstr "Utilisateurs" #: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:132 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:167 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:188 msgid "Validation" msgstr "Validation" @@ -5930,14 +6046,14 @@ msgstr "Vérifiez votre e-mail pour télécharger des documents." msgid "Verify your team email address" msgstr "Vérifiez votre adresse e-mail d'équipe" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:75 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:76 msgid "Version History" msgstr "Historique des versions" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:95 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:126 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:135 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:132 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:101 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:127 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:136 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:126 #: apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx:100 #: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:168 #: packages/lib/constants/recipient-roles.ts:29 @@ -5960,7 +6076,7 @@ msgstr "Voir tous les documents envoyés à votre compte" msgid "View all recent security activity related to your account." msgstr "Voir toute l'activité de sécurité récente liée à votre compte." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:155 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:153 msgid "View all related documents" msgstr "Voir tous les documents associés" @@ -5977,7 +6093,7 @@ msgid "View document" msgstr "Voir le document" #: apps/web/src/app/(signing)/sign/[token]/form.tsx:140 -#: packages/email/template-components/template-document-invite.tsx:105 +#: packages/email/template-components/template-document-invite.tsx:104 #: packages/email/template-components/template-document-rejected.tsx:44 #: packages/ui/primitives/document-flow/add-subject.tsx:90 #: packages/ui/primitives/document-flow/add-subject.tsx:91 @@ -5992,7 +6108,7 @@ msgstr "Voir les documents associés à cet e-mail" msgid "View invites" msgstr "Voir les invitations" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:93 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:91 msgid "View more" msgstr "Voir plus" @@ -6014,7 +6130,7 @@ msgid "View teams" msgstr "Voir les équipes" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:120 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:267 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:269 #: packages/lib/constants/recipient-roles.ts:30 msgid "Viewed" msgstr "Vu" @@ -6073,7 +6189,7 @@ msgstr "Nous ne pouvons pas supprimer cette clé de passkey pour le moment. Veui msgid "We are unable to update this passkey at the moment. Please try again later." msgstr "Nous ne pouvons pas mettre à jour cette clé de passkey pour le moment. Veuillez réessayer plus tard." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:153 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:149 msgid "We encountered an error while removing the direct template link. Please try again later." msgstr "Une erreur s'est produite lors de la suppression du lien direct vers le modèle. Veuillez réessayer plus tard." @@ -6082,10 +6198,6 @@ msgstr "Une erreur s'est produite lors de la suppression du lien direct vers le msgid "We encountered an error while updating the webhook. Please try again later." msgstr "Une erreur s'est produite lors de la mise à jour du webhook. Veuillez réessayer plus tard." -#: apps/web/src/components/forms/token.tsx:145 -msgid "We encountered an unknown error while attempting create the new token. Please try again later." -msgstr "Une erreur inconnue s'est produite lors de la création de la nouvelle clé. Veuillez réessayer plus tard." - #: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:102 msgid "We encountered an unknown error while attempting to add this email. Please try again later." msgstr "Une erreur inconnue s'est produite lors de l'ajout de cet e-mail. Veuillez réessayer plus tard." @@ -6110,7 +6222,6 @@ msgstr "Une erreur inconnue s'est produite lors de la suppression de cette équi msgid "We encountered an unknown error while attempting to delete this token. Please try again later." msgstr "Une erreur inconnue s'est produite lors de la suppression de ce token. Veuillez réessayer plus tard." -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:70 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:58 msgid "We encountered an unknown error while attempting to delete your account. Please try again later." msgstr "Une erreur inconnue s'est produite lors de la suppression de votre compte. Veuillez réessayer plus tard." @@ -6123,7 +6234,7 @@ msgstr "Une erreur inconnue s'est produite lors de l'invitation de membres de l' msgid "We encountered an unknown error while attempting to leave this team. Please try again later." msgstr "Une erreur inconnue s'est produite lors de votre départ de cette équipe. Veuillez réessayer plus tard." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:143 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:142 msgid "We encountered an unknown error while attempting to remove this template from your profile. Please try again later." msgstr "Une erreur inconnue s'est produite lors de la suppression de ce modèle de votre profil. Veuillez réessayer plus tard." @@ -6151,7 +6262,6 @@ msgstr "Une erreur inconnue s'est produite lors de la révocation de l'accès. V msgid "We encountered an unknown error while attempting to save your details. Please try again later." msgstr "Une erreur inconnue s'est produite lors de l'enregistrement de vos détails. Veuillez réessayer plus tard." -#: apps/web/src/components/forms/profile.tsx:89 #: apps/web/src/components/forms/signin.tsx:273 #: apps/web/src/components/forms/signin.tsx:288 #: apps/web/src/components/forms/signin.tsx:304 @@ -6165,11 +6275,11 @@ msgstr "Une erreur inconnue s'est produite lors de la connexion. Veuillez réess msgid "We encountered an unknown error while attempting to sign you Up. Please try again later." msgstr "Une erreur inconnue s'est produite lors de l'inscription. Veuillez réessayer plus tard." -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:92 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:84 msgid "We encountered an unknown error while attempting to update the banner. Please try again later." msgstr "Une erreur inconnue s'est produite lors de la mise à jour de la bannière. Veuillez réessayer plus tard." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:180 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:178 msgid "We encountered an unknown error while attempting to update the template. Please try again later." msgstr "Une erreur inconnue s'est produite lors de la mise à jour du modèle. Veuillez réessayer plus tard." @@ -6194,6 +6304,10 @@ msgstr "Une erreur inconnue s'est produite lors de la mise à jour de votre équ msgid "We encountered an unknown error while attempting update the team email. Please try again later." msgstr "Une erreur inconnue s'est produite lors de la mise à jour de l'e-mail de l'équipe. Veuillez réessayer plus tard." +#: apps/web/src/components/forms/profile.tsx:81 +msgid "We encountered an unknown error while attempting update your profile. Please try again later." +msgstr "Nous avons rencontré une erreur inconnue lors de la tentative de mise à jour de votre profil. Veuillez réessayer plus tard." + #: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:80 msgid "We have sent a confirmation email for verification." msgstr "Nous avons envoyé un e-mail de confirmation pour vérification." @@ -6206,7 +6320,7 @@ msgstr "Nous avons besoin d'un nom d'utilisateur pour créer votre profil" msgid "We need your signature to sign documents" msgstr "Nous avons besoin de votre signature pour signer des documents" -#: apps/web/src/components/forms/token.tsx:111 +#: apps/web/src/components/forms/token.tsx:112 msgid "We were unable to copy the token to your clipboard. Please try again." msgstr "Nous n'avons pas pu copier le token dans votre presse-papiers. Veuillez réessayer." @@ -6231,7 +6345,7 @@ msgstr "Nous n'avons pas pu désactiver l'authentification à deux facteurs pour msgid "We were unable to log you out at this time." msgstr "Nous n'avons pas pu vous déconnecter pour le moment." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:125 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:124 msgid "We were unable to set your public profile to public. Please try again." msgstr "Nous n'avons pas pu définir votre profil public comme public. Veuillez réessayer." @@ -6266,11 +6380,11 @@ msgstr "Nous n'avons pas pu vérifier votre e-mail. Si votre e-mail n'est pas d msgid "We will generate signing links for with you, which you can send to the recipients through your method of choice." msgstr "Nous générerons des liens de signature pour vous, que vous pourrez envoyer aux destinataires par votre méthode de choix." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:369 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:382 msgid "We will generate signing links for you, which you can send to the recipients through your method of choice." msgstr "Nous allons générer des liens de signature pour vous, que vous pouvez envoyer aux destinataires par votre méthode de choix." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:365 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:378 #: packages/ui/primitives/document-flow/add-subject.tsx:201 msgid "We won't send anything to notify recipients." msgstr "Nous n'enverrons rien pour notifier les destinataires." @@ -6376,13 +6490,13 @@ msgstr "Écrivez sur vous-même" msgid "Yearly" msgstr "Annuel" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:32 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:31 -#: packages/lib/utils/document-audit-logs.ts:258 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:33 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:32 +#: packages/lib/utils/document-audit-logs.ts:274 msgid "You" msgstr "Vous" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:105 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:104 msgid "You are about to delete <0>\"{documentTitle}\"" msgstr "Vous êtes sur le point de supprimer <0>\"{documentTitle}\"" @@ -6390,7 +6504,7 @@ msgstr "Vous êtes sur le point de supprimer <0>\"{documentTitle}\"" msgid "You are about to delete the following team email from <0>{teamName}." msgstr "Vous êtes sur le point de supprimer l'e-mail d'équipe suivant de <0>{teamName}." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:109 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:108 msgid "You are about to hide <0>\"{documentTitle}\"" msgstr "Vous êtes sur le point de cacher <0>\"{documentTitle}\"" @@ -6426,6 +6540,10 @@ msgstr "Vous mettez à jour actuellement la clé de passkey <0>{passkeyName} msgid "You are not a member of this team." msgstr "Vous n'êtes pas membre de cette équipe." +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:62 +msgid "You are not authorized to delete this user." +msgstr "Vous n'êtes pas autorisé à supprimer cet utilisateur." + #: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:56 msgid "You are not authorized to disable this user." msgstr "Vous n'êtes pas autorisé à désactiver cet utilisateur." @@ -6474,6 +6592,10 @@ msgstr "Vous pouvez utiliser les variables suivantes dans votre message :" msgid "You can view documents associated with this email and use this identity when sending documents." msgstr "Vous pouvez voir les documents associés à cet e-mail et utiliser cette identité lors de l'envoi de documents." +#: packages/email/templates/bulk-send-complete.tsx:76 +msgid "You can view the created documents in your dashboard under the \"Documents created from template\" section." +msgstr "" + #: packages/email/template-components/template-document-rejected.tsx:37 msgid "You can view the document and its status by clicking the button below." msgstr "Vous pouvez voir le document et son statut en cliquant sur le bouton ci-dessous." @@ -6490,7 +6612,7 @@ msgstr "Vous ne pouvez pas modifier un membre de l'équipe qui a un rôle plus msgid "You cannot upload documents at this time." msgstr "Vous ne pouvez pas télécharger de documents pour le moment." -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:103 msgid "You cannot upload encrypted PDFs" msgstr "Vous ne pouvez pas télécharger de PDF cryptés" @@ -6498,6 +6620,10 @@ msgstr "Vous ne pouvez pas télécharger de PDF cryptés" msgid "You do not currently have a customer record, this should not happen. Please contact support for assistance." msgstr "Vous n'avez actuellement pas de dossier client, cela ne devrait pas se produire. Veuillez contacter le support pour obtenir de l'aide." +#: apps/web/src/components/forms/token.tsx:141 +msgid "You do not have permission to create a token for this team" +msgstr "Vous n'avez pas la permission de créer un jeton pour cette équipe" + #: packages/email/template-components/template-document-cancel.tsx:35 msgid "You don't need to sign it anymore." msgstr "Vous n'avez plus besoin de le signer." @@ -6527,7 +6653,8 @@ msgstr "Vous avez été invité à rejoindre {0} sur Documenso" msgid "You have been invited to join the following team" msgstr "Vous avez été invité à rejoindre l'équipe suivante" -#: packages/lib/server-only/recipient/set-recipients-for-document.ts:337 +#: packages/lib/server-only/recipient/delete-document-recipient.ts:156 +#: packages/lib/server-only/recipient/set-document-recipients.ts:326 msgid "You have been removed from a document" msgstr "Vous avez été supprimé d'un document" @@ -6557,10 +6684,14 @@ msgstr "Vous n'avez pas encore créé de modèles. Pour créer un modèle, veuil msgid "You have not yet created or received any documents. To create a document please upload one." msgstr "Vous n'avez pas encore créé ou reçu de documents. Pour créer un document, veuillez en télécharger un." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:234 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:229 msgid "You have reached the maximum limit of {0} direct templates. <0>Upgrade your account to continue!" msgstr "Vous avez atteint la limite maximale de {0} modèles directs. <0>Mettez à niveau votre compte pour continuer !" +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106 +msgid "You have reached your document limit for this month. Please upgrade your plan." +msgstr "Vous avez atteint votre limite de documents pour ce mois. Veuillez passer à un plan supérieur." + #: apps/web/src/app/(dashboard)/documents/upload-document.tsx:56 #: packages/ui/primitives/document-dropzone.tsx:69 msgid "You have reached your document limit." @@ -6626,7 +6757,7 @@ msgstr "Vous devez entrer '{deleteMessage}' pour continuer" msgid "You must have at least one other team member to transfer ownership." msgstr "Vous devez avoir au moins un autre membre de l'équipe pour transférer la propriété." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:109 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:108 msgid "You must set a profile URL before enabling your public profile." msgstr "Vous devez définir une URL de profil avant d'activer votre profil public." @@ -6662,7 +6793,7 @@ msgstr "Votre compte a été supprimé avec succès." msgid "Your avatar has been updated successfully." msgstr "Votre avatar a été mis à jour avec succès." -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:75 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:74 msgid "Your banner has been updated successfully." msgstr "Votre bannière a été mise à jour avec succès." @@ -6674,19 +6805,27 @@ msgstr "L'URL de votre site web de marque" msgid "Your branding preferences have been updated" msgstr "Vos préférences de branding ont été mises à jour" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:97 +msgid "Your bulk send has been initiated. You will receive an email notification upon completion." +msgstr "" + +#: packages/email/templates/bulk-send-complete.tsx:40 +msgid "Your bulk send operation for template \"{templateName}\" has completed." +msgstr "" + #: apps/web/src/app/(dashboard)/settings/billing/page.tsx:125 msgid "Your current plan is past due. Please update your payment information." msgstr "Votre plan actuel est en retard. Veuillez mettre à jour vos informations de paiement." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:251 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:249 msgid "Your direct signing templates" msgstr "Vos modèles de signature directe" -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:129 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:123 msgid "Your document failed to upload." msgstr "Votre document a échoué à se télécharger." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:157 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:169 msgid "Your document has been created from the template successfully." msgstr "Votre document a été créé à partir du modèle avec succès." @@ -6698,19 +6837,19 @@ msgstr "Votre document a été supprimé par un administrateur !" msgid "Your document has been re-sent successfully." msgstr "Votre document a été renvoyé avec succès." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:328 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:304 msgid "Your document has been sent successfully." msgstr "Votre document a été envoyé avec succès." -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:59 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:58 msgid "Your document has been successfully duplicated." msgstr "Votre document a été dupliqué avec succès." -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:87 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:86 msgid "Your document has been uploaded successfully." msgstr "Votre document a été téléchargé avec succès." -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:69 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:68 msgid "Your document has been uploaded successfully. You will be redirected to the template page." msgstr "Votre document a été téléchargé avec succès. Vous serez redirigé vers la page de modèle." @@ -6753,7 +6892,7 @@ msgstr "Votre mot de passe a été mis à jour." msgid "Your payment for teams is overdue. Please settle the payment to avoid any service disruptions." msgstr "Votre paiement pour les équipes est en retard. Veuillez régler le paiement pour éviter toute interruption de service." -#: apps/web/src/components/forms/profile.tsx:73 +#: apps/web/src/components/forms/profile.tsx:72 msgid "Your profile has been updated successfully." msgstr "Votre profil a été mis à jour avec succès." @@ -6795,19 +6934,19 @@ msgstr "Votre équipe a été supprimée avec succès." msgid "Your team has been successfully updated." msgstr "Votre équipe a été mise à jour avec succès." -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:43 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:42 msgid "Your template has been duplicated successfully." msgstr "Votre modèle a été dupliqué avec succès." -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:42 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:37 msgid "Your template has been successfully deleted." msgstr "Votre modèle a été supprimé avec succès." -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:67 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:66 msgid "Your template will be duplicated." msgstr "Votre modèle sera dupliqué." -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:247 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:217 msgid "Your templates has been saved successfully." msgstr "Vos modèles ont été enregistrés avec succès." @@ -6823,4 +6962,3 @@ msgstr "Votre token a été créé avec succès ! Assurez-vous de le copier car #: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:86 msgid "Your tokens will be shown here once you create them." msgstr "Vos tokens seront affichés ici une fois que vous les aurez créés." - diff --git a/packages/lib/translations/it/web.po b/packages/lib/translations/it/web.po new file mode 100644 index 000000000..c45d0f4df --- /dev/null +++ b/packages/lib/translations/it/web.po @@ -0,0 +1,6964 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-07-24 13:01+1000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: it\n" +"Project-Id-Version: documenso-app\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-01-30 03:57\n" +"Last-Translator: \n" +"Language-Team: Italian\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: documenso-app\n" +"X-Crowdin-Project-ID: 694691\n" +"X-Crowdin-Language: it\n" +"X-Crowdin-File: web.po\n" +"X-Crowdin-File-ID: 8\n" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:226 +msgid "\"{0}\" has invited you to sign \"example document\"." +msgstr "\"{0}\" ti ha invitato a firmare \"documento di esempio\"." + +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:74 +msgid "\"{0}\" will appear on the document as it has a timezone of \"{timezone}\"." +msgstr "\"{0}\" apparirà sul documento poiché ha un fuso orario di \"{timezone}\"." + +#: packages/email/template-components/template-document-super-delete.tsx:27 +msgid "\"{documentName}\" has been deleted by an admin." +msgstr "\"{documentName}\" è stato eliminato da un amministratore." + +#: packages/email/template-components/template-document-pending.tsx:37 +msgid "“{documentName}” has been signed" +msgstr "“{documentName}” è stato firmato" + +#: packages/email/template-components/template-document-completed.tsx:41 +msgid "“{documentName}” was signed by all signers" +msgstr "“{documentName}” è stato firmato da tutti i firmatari" + +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:61 +msgid "\"{documentTitle}\" has been successfully deleted" +msgstr "\"{documentTitle}\" è stato eliminato con successo" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:221 +msgid "\"{placeholderEmail}\" on behalf of \"{0}\" has invited you to sign \"example document\"." +msgstr "\"{placeholderEmail}\" per conto di \"{0}\" ti ha invitato a firmare \"documento di esempio\"." + +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:330 +msgid "{0, plural, one {(1 character over)} other {(# characters over)}}" +msgstr "{0, plural, one {(1 carattere in eccesso)} other {(# caratteri in eccesso)}}" + +#: apps/web/src/components/forms/public-profile-form.tsx:237 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:393 +msgid "{0, plural, one {# character over the limit} other {# characters over the limit}}" +msgstr "{0, plural, one {# carattere oltre il limite} other {# caratteri oltre il limite}}" + +#: apps/web/src/app/(recipient)/d/[token]/page.tsx:84 +msgid "{0, plural, one {# recipient} other {# recipients}}" +msgstr "{0, plural, one {# destinatario} other {# destinatari}}" + +#: apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx:66 +msgid "{0, plural, one {# Seat} other {# Seats}}" +msgstr "{0, plural, one {# posto} other {# posti}}" + +#: apps/web/src/app/(dashboard)/settings/teams/team-invitations.tsx:37 +#: apps/web/src/app/(dashboard)/settings/teams/team-invitations.tsx:66 +msgid "{0, plural, one {<0>You have <1>1 pending team invitation} other {<2>You have <3># pending team invitations}}" +msgstr "{0, plural, one {<0>Hai <1>1 invito in sospeso alla squadra} other {<2>Hai <3># inviti in sospeso alla squadra}}" + +#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:196 +msgid "{0, plural, one {1 matching field} other {# matching fields}}" +msgstr "{0, plural, one {1 campo corrispondente} other {# campi corrispondenti}}" + +#: apps/web/src/app/(dashboard)/documents/[id]/edit/document-edit-page-view.tsx:132 +msgid "{0, plural, one {1 Recipient} other {# Recipients}}" +msgstr "{0, plural, one {1 destinatario} other {# destinatari}}" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:239 +msgid "{0, plural, one {Waiting on 1 recipient} other {Waiting on # recipients}}" +msgstr "{0, plural, one {In attesa di 1 destinatario} other {In attesa di # destinatari}}" + +#: apps/web/src/components/(dashboard)/settings/webhooks/trigger-multiselect-combobox.tsx:64 +msgid "{0, plural, zero {Select values} other {# selected...}}" +msgstr "{0, plural, zero {Seleziona valori} other {# selezionati...}}" + +#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:193 +msgid "{0}" +msgstr "" + +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:247 +msgid "{0} direct signing templates" +msgstr "{0} modelli di firma diretta" + +#: packages/lib/jobs/definitions/emails/send-signing-email.handler.ts:125 +msgid "{0} has invited you to {recipientActionVerb} the document \"{1}\"." +msgstr "{0} ti ha invitato a {recipientActionVerb} il documento \"{1}\"." + +#: packages/lib/jobs/definitions/emails/send-signing-email.handler.ts:118 +msgid "{0} invited you to {recipientActionVerb} a document" +msgstr "{0} ti ha invitato a {recipientActionVerb} un documento" + +#: packages/email/templates/team-join.tsx:61 +msgid "{0} joined the team {teamName} on Documenso" +msgstr "{0} si è unito al team {teamName} su Documenso" + +#: packages/email/templates/team-leave.tsx:61 +msgid "{0} left the team {teamName} on Documenso" +msgstr "{0} ha lasciato il team {teamName} su Documenso" + +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:145 +msgid "{0} of {1} documents remaining this month." +msgstr "{0} di {1} documenti rimanenti questo mese." + +#: packages/ui/primitives/data-table-pagination.tsx:30 +msgid "{0} of {1} row(s) selected." +msgstr "{0} di {1} riga selezionata." + +#: packages/lib/jobs/definitions/emails/send-signing-email.handler.ts:124 +#: packages/lib/server-only/document/resend-document.tsx:137 +msgid "{0} on behalf of \"{1}\" has invited you to {recipientActionVerb} the document \"{2}\"." +msgstr "{0} per conto di \"{1}\" ti ha invitato a {recipientActionVerb} il documento \"{2}\"." + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:174 +msgid "{0} Recipient(s)" +msgstr "{0} Destinatario(i)" + +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:311 +msgid "{charactersRemaining, plural, one {1 character remaining} other {{charactersRemaining} characters remaining}}" +msgstr "{charactersRemaining, plural, one {1 carattere rimanente} other {{charactersRemaining} caratteri rimanenti}}" + +#: packages/email/templates/document-invite.tsx:95 +msgid "{inviterName} <0>({inviterEmail})" +msgstr "{inviterName} <0>({inviterEmail})" + +#: packages/email/templates/document-cancel.tsx:21 +msgid "{inviterName} has cancelled the document {documentName}, you don't need to sign it anymore." +msgstr "{inviterName} ha annullato il documento {documentName}, non è più necessario firmarlo." + +#: packages/email/template-components/template-document-cancel.tsx:24 +msgid "{inviterName} has cancelled the document<0/>\"{documentName}\"" +msgstr "{inviterName} ha annullato il documento<0/>\"{documentName}\"" + +#: packages/email/template-components/template-document-invite.tsx:74 +msgid "{inviterName} has invited you to {0}<0/>\"{documentName}\"" +msgstr "{inviterName} ti ha invitato a {0}<0/>\"{documentName}\"" + +#: packages/email/templates/document-invite.tsx:41 +msgid "{inviterName} has invited you to {action} {documentName}" +msgstr "{inviterName} ti ha invitato a {action} {documentName}" + +#: packages/email/templates/document-invite.tsx:108 +msgid "{inviterName} has invited you to {action} the document \"{documentName}\"." +msgstr "{inviterName} ti ha invitato a {action} il documento \"{documentName}\"." + +#: packages/email/templates/recipient-removed-from-document.tsx:20 +msgid "{inviterName} has removed you from the document {documentName}." +msgstr "{inviterName} ti ha rimosso dal documento {documentName}." + +#: packages/email/templates/recipient-removed-from-document.tsx:49 +msgid "{inviterName} has removed you from the document<0/>\"{documentName}\"" +msgstr "{inviterName} ti ha rimosso dal documento<0/>\"{documentName}\"" + +#: packages/email/template-components/template-document-invite.tsx:61 +msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {0}<0/>\"{documentName}\"" +msgstr "" + +#: packages/email/templates/document-invite.tsx:45 +msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {action} {documentName}" +msgstr "{inviterName} per conto di \"{teamName}\" ti ha invitato a {action} {documentName}" + +#: packages/email/templates/team-join.tsx:67 +msgid "{memberEmail} joined the following team" +msgstr "{memberEmail} si è unito al seguente team" + +#: packages/email/templates/team-leave.tsx:67 +msgid "{memberEmail} left the following team" +msgstr "{memberEmail} ha lasciato il seguente team" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx:59 +msgid "{numberOfSeats, plural, one {# member} other {# members}}" +msgstr "{numberOfSeats, plural, one {# membro} other {# membri}}" + +#: packages/lib/utils/document-audit-logs.ts:279 +msgid "{prefix} added a field" +msgstr "{prefix} ha aggiunto un campo" + +#: packages/lib/utils/document-audit-logs.ts:291 +msgid "{prefix} added a recipient" +msgstr "{prefix} ha aggiunto un destinatario" + +#: packages/lib/utils/document-audit-logs.ts:303 +msgid "{prefix} created the document" +msgstr "{prefix} ha creato il documento" + +#: packages/lib/utils/document-audit-logs.ts:307 +msgid "{prefix} deleted the document" +msgstr "{prefix} ha eliminato il documento" + +#: packages/lib/utils/document-audit-logs.ts:351 +msgid "{prefix} moved the document to team" +msgstr "{prefix} ha spostato il documento al team" + +#: packages/lib/utils/document-audit-logs.ts:335 +msgid "{prefix} opened the document" +msgstr "{prefix} ha aperto il documento" + +#: packages/lib/utils/document-audit-logs.ts:283 +msgid "{prefix} removed a field" +msgstr "{prefix} ha rimosso un campo" + +#: packages/lib/utils/document-audit-logs.ts:295 +msgid "{prefix} removed a recipient" +msgstr "{prefix} ha rimosso un destinatario" + +#: packages/lib/utils/document-audit-logs.ts:381 +msgid "{prefix} resent an email to {0}" +msgstr "{prefix} ha rinviato un'email a {0}" + +#: packages/lib/utils/document-audit-logs.ts:382 +msgid "{prefix} sent an email to {0}" +msgstr "{prefix} ha inviato un'email a {0}" + +#: packages/lib/utils/document-audit-logs.ts:347 +msgid "{prefix} sent the document" +msgstr "{prefix} ha inviato il documento" + +#: packages/lib/utils/document-audit-logs.ts:311 +msgid "{prefix} signed a field" +msgstr "{prefix} ha firmato un campo" + +#: packages/lib/utils/document-audit-logs.ts:315 +msgid "{prefix} unsigned a field" +msgstr "{prefix} ha annullato la firma di un campo" + +#: packages/lib/utils/document-audit-logs.ts:287 +msgid "{prefix} updated a field" +msgstr "{prefix} ha aggiornato un campo" + +#: packages/lib/utils/document-audit-logs.ts:299 +msgid "{prefix} updated a recipient" +msgstr "{prefix} ha aggiornato un destinatario" + +#: packages/lib/utils/document-audit-logs.ts:331 +msgid "{prefix} updated the document" +msgstr "{prefix} ha aggiornato il documento" + +#: packages/lib/utils/document-audit-logs.ts:323 +msgid "{prefix} updated the document access auth requirements" +msgstr "{prefix} ha aggiornato i requisiti di autenticazione per l'accesso al documento" + +#: packages/lib/utils/document-audit-logs.ts:343 +msgid "{prefix} updated the document external ID" +msgstr "{prefix} ha aggiornato l'ID esterno del documento" + +#: packages/lib/utils/document-audit-logs.ts:327 +msgid "{prefix} updated the document signing auth requirements" +msgstr "{prefix} ha aggiornato i requisiti di autenticazione per la firma del documento" + +#: packages/lib/utils/document-audit-logs.ts:339 +msgid "{prefix} updated the document title" +msgstr "{prefix} ha aggiornato il titolo del documento" + +#: packages/lib/utils/document-audit-logs.ts:319 +msgid "{prefix} updated the document visibility" +msgstr "{prefix} ha aggiornato la visibilità del documento" + +#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:67 +msgid "{recipientActionVerb} document" +msgstr "{recipientActionVerb} documento" + +#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:68 +msgid "{recipientActionVerb} the document to complete the process." +msgstr "{recipientActionVerb} il documento per completare il processo." + +#: packages/email/templates/document-created-from-direct-template.tsx:61 +msgid "{recipientName} {action} a document by using one of your direct links" +msgstr "{recipientName} {action} un documento utilizzando uno dei tuoi link diretti" + +#: packages/email/templates/document-rejected.tsx:27 +msgid "{recipientName} has rejected the document '{documentName}'" +msgstr "{recipientName} ha rifiutato il documento '{documentName}'" + +#: packages/email/template-components/template-document-recipient-signed.tsx:49 +msgid "{recipientReference} has completed signing the document." +msgstr "{recipientReference} ha completato la firma del documento." + +#: packages/lib/jobs/definitions/emails/send-recipient-signed-email.ts:121 +msgid "{recipientReference} has signed \"{0}\"" +msgstr "{recipientReference} ha firmato \"{0}\"" + +#: packages/email/template-components/template-document-recipient-signed.tsx:43 +msgid "{recipientReference} has signed \"{documentName}\"" +msgstr "{recipientReference} ha firmato \"{documentName}\"" + +#: packages/email/templates/document-recipient-signed.tsx:27 +msgid "{recipientReference} has signed {documentName}" +msgstr "{recipientReference} ha firmato {documentName}" + +#: apps/web/src/components/forms/public-profile-form.tsx:231 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:387 +msgid "{remaningLength, plural, one {# character remaining} other {# characters remaining}}" +msgstr "{remaningLength, plural, one {# carattere rimanente} other {# caratteri rimanenti}}" + +#: packages/email/template-components/template-document-rejected.tsx:25 +msgid "{signerName} has rejected the document \"{documentName}\"." +msgstr "{signerName} ha rifiutato il documento \"{documentName}\"." + +#: packages/email/template-components/template-document-invite.tsx:68 +msgid "{teamName} has invited you to {0}<0/>\"{documentName}\"" +msgstr "" + +#: packages/email/templates/document-invite.tsx:46 +msgid "{teamName} has invited you to {action} {documentName}" +msgstr "{teamName} ti ha invitato a {action} {documentName}" + +#: packages/email/templates/team-transfer-request.tsx:55 +msgid "{teamName} ownership transfer request" +msgstr "richiesta di trasferimento di proprietà di {teamName}" + +#: packages/lib/utils/document-audit-logs.ts:359 +msgid "{userName} approved the document" +msgstr "{userName} ha approvato il documento" + +#: packages/lib/utils/document-audit-logs.ts:360 +msgid "{userName} CC'd the document" +msgstr "{userName} ha inoltrato il documento" + +#: packages/lib/utils/document-audit-logs.ts:361 +msgid "{userName} completed their task" +msgstr "{userName} ha completato il suo compito" + +#: packages/lib/utils/document-audit-logs.ts:371 +msgid "{userName} rejected the document" +msgstr "{userName} ha rifiutato il documento" + +#: packages/lib/utils/document-audit-logs.ts:357 +msgid "{userName} signed the document" +msgstr "{userName} ha firmato il documento" + +#: packages/lib/utils/document-audit-logs.ts:358 +msgid "{userName} viewed the document" +msgstr "{userName} ha visualizzato il documento" + +#: packages/ui/primitives/data-table-pagination.tsx:41 +msgid "{visibleRows, plural, one {Showing # result.} other {Showing # results.}}" +msgstr "{visibleRows, plural, one {Visualizzazione di # risultato.} other {Visualizzazione di # risultati.}}" + +#: apps/web/src/app/(signing)/sign/[token]/no-longer-available.tsx:45 +msgid "<0>\"{0}\"is no longer available to sign" +msgstr "<0>\"{0}\"non è più disponibile per la firma" + +#: packages/email/templates/team-transfer-request.tsx:59 +msgid "<0>{senderName} has requested that you take ownership of the following team" +msgstr "<0>{senderName} ha richiesto di prendere in carico il seguente team" + +#: packages/email/templates/confirm-team-email.tsx:75 +msgid "<0>{teamName} has requested to use your email address for their team on Documenso." +msgstr "<0>{teamName} ha richiesto di utilizzare il tuo indirizzo email per il loro team su Documenso." + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:463 +msgid "<0>Click to upload or drag and drop" +msgstr "<0>Fai clic per caricare o trascina e rilascia" + +#: packages/ui/primitives/template-flow/add-template-settings.tsx:287 +msgid "<0>Email - The recipient will be emailed the document to sign, approve, etc." +msgstr "<0>Email - Al destinatario verrà inviato il documento tramite email per firmare, approvare, ecc." + +#: packages/ui/components/recipient/recipient-action-auth-select.tsx:53 +msgid "<0>Inherit authentication method - Use the global action signing authentication method configured in the \"General Settings\" step" +msgstr "<0>Eredita metodo di autenticazione - Usa il metodo globale di autenticazione della firma configurato nel passaggio \"Impostazioni generali\"" + +#: packages/ui/components/document/document-global-auth-action-select.tsx:95 +msgid "<0>No restrictions - No authentication required" +msgstr "<0>Nessuna restrizione - Non è richiesta autenticazione" + +#: packages/ui/components/document/document-global-auth-access-select.tsx:77 +msgid "<0>No restrictions - The document can be accessed directly by the URL sent to the recipient" +msgstr "<0>Nessuna restrizione - Il documento può essere accessibile direttamente tramite l'URL inviato al destinatario" + +#: packages/ui/components/recipient/recipient-action-auth-select.tsx:75 +msgid "<0>None - No authentication required" +msgstr "<0>Nessuno - Non è richiesta autenticazione" + +#: packages/ui/primitives/template-flow/add-template-settings.tsx:293 +msgid "<0>None - We will generate links which you can send to the recipients manually." +msgstr "<0>Nessuno - Genereremo i link che potrai inviare manualmente ai destinatari." + +#: packages/ui/primitives/template-flow/add-template-settings.tsx:300 +msgid "<0>Note - If you use Links in combination with direct templates, you will need to manually send the links to the remaining recipients." +msgstr "<0>Nota - Se usi i link in combinazione con modelli diretti, dovrai inviare manualmente i link ai destinatari rimanenti." + +#: packages/ui/components/document/document-global-auth-action-select.tsx:89 +#: packages/ui/components/recipient/recipient-action-auth-select.tsx:69 +msgid "<0>Require 2FA - The recipient must have an account and 2FA enabled via their settings" +msgstr "<0>Richiedi 2FA - Il destinatario deve avere un account e 2FA abilitato tramite le sue impostazioni" + +#: packages/ui/components/document/document-global-auth-access-select.tsx:72 +msgid "<0>Require account - The recipient must be signed in to view the document" +msgstr "<0>Richiede account - Il destinatario deve essere connesso per visualizzare il documento" + +#: packages/ui/components/document/document-global-auth-action-select.tsx:83 +#: packages/ui/components/recipient/recipient-action-auth-select.tsx:63 +msgid "<0>Require passkey - The recipient must have an account and passkey configured via their settings" +msgstr "<0>Richiede passkey - Il destinatario deve avere un account e una passkey configurati tramite le sue impostazioni" + +#: apps/web/src/app/(dashboard)/documents/data-table-sender-filter.tsx:57 +msgid "<0>Sender: All" +msgstr "<0>Mittente: Tutti" + +#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:105 +msgid "<0>You are about to complete approving <1>\"{documentTitle}\".<2/> Are you sure?" +msgstr "<0>Stai per completare l'approvazione di <1>\"{documentTitle}\".<2/> Sei sicuro?" + +#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:91 +msgid "<0>You are about to complete signing \"<1>{documentTitle}\".<2/> Are you sure?" +msgstr "<0>Stai per completare la firma di \"<1>{documentTitle}\".<2/> Sei sicuro?" + +#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:77 +msgid "<0>You are about to complete viewing \"<1>{documentTitle}\".<2/> Are you sure?" +msgstr "<0>Stai per completare la visualizzazione di \"<1>{documentTitle}\".<2/> Sei sicuro?" + +#: apps/web/src/components/(dashboard)/settings/token/contants.ts:5 +msgid "1 month" +msgstr "{VAR_PLURAL, select, one {1 mese} other {# mesi}}" + +#: apps/web/src/components/(dashboard)/settings/token/contants.ts:8 +msgid "12 months" +msgstr "{VAR_PLURAL, select, one {1 mese} other {12 mesi}}" + +#: apps/web/src/components/(dashboard)/settings/token/contants.ts:6 +msgid "3 months" +msgstr "{VAR_PLURAL, select, one {1 mese} other {3 mesi}}" + +#: apps/web/src/components/partials/not-found.tsx:45 +msgid "404 Page not found" +msgstr "404 Pagina non trovata" + +#: apps/web/src/app/(profile)/p/[url]/not-found.tsx:15 +msgid "404 Profile not found" +msgstr "404 Profilo non trovato" + +#: apps/web/src/app/(teams)/t/[teamUrl]/not-found.tsx:15 +msgid "404 Team not found" +msgstr "404 Squadra non trovata" + +#: apps/web/src/app/(recipient)/d/[token]/not-found.tsx:15 +msgid "404 Template not found" +msgstr "404 Modello non trovato" + +#: apps/web/src/components/(dashboard)/settings/token/contants.ts:7 +msgid "6 months" +msgstr "{VAR_PLURAL, select, one {1 mese} other {6 mesi}}" + +#: apps/web/src/components/(dashboard)/settings/token/contants.ts:4 +msgid "7 days" +msgstr "{VAR_PLURAL, select, one {1 giorno} other {7 giorni}}" + +#: apps/web/src/components/forms/send-confirmation-email.tsx:55 +msgid "A confirmation email has been sent, and it should arrive in your inbox shortly." +msgstr "È stata inviata un'e-mail di conferma e dovrebbe arrivare nella tua casella di posta a breve." + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:70 +msgid "A device capable of accessing, opening, and reading documents" +msgstr "Un dispositivo in grado di accedere, aprire e leggere documenti" + +#: packages/lib/jobs/definitions/emails/send-signing-email.handler.ts:110 +msgid "A document was created by your direct template that requires you to {recipientActionVerb} it." +msgstr "Un documento è stato creato dal tuo modello diretto che richiede di {recipientActionVerb}." + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:230 +msgid "A draft document will be created" +msgstr "Verrà creato un documento bozza" + +#: packages/lib/utils/document-audit-logs.ts:278 +msgid "A field was added" +msgstr "Un campo è stato aggiunto" + +#: packages/lib/utils/document-audit-logs.ts:282 +msgid "A field was removed" +msgstr "Un campo è stato rimosso" + +#: packages/lib/utils/document-audit-logs.ts:286 +msgid "A field was updated" +msgstr "Un campo è stato aggiornato" + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:73 +msgid "A means to print or download documents for your records" +msgstr "Un mezzo per stampare o scaricare documenti per i tuoi archivi" + +#: packages/lib/jobs/definitions/emails/send-team-member-joined-email.handler.ts:98 +msgid "A new member has joined your team" +msgstr "Un nuovo membro si è unito al tuo team" + +#: apps/web/src/components/forms/token.tsx:128 +msgid "A new token was created successfully." +msgstr "Un nuovo token è stato creato con successo." + +#: apps/web/src/app/(unauthenticated)/check-email/page.tsx:24 +#: apps/web/src/components/forms/forgot-password.tsx:58 +msgid "A password reset email has been sent, if you have an account you should see it in your inbox shortly." +msgstr "È stata inviata un'e-mail per il reset della password; se hai un account dovresti vederla nella tua casella di posta a breve." + +#: packages/lib/utils/document-audit-logs.ts:290 +msgid "A recipient was added" +msgstr "Un destinatario è stato aggiunto" + +#: packages/lib/utils/document-audit-logs.ts:294 +msgid "A recipient was removed" +msgstr "Un destinatario è stato rimosso" + +#: packages/lib/utils/document-audit-logs.ts:298 +msgid "A recipient was updated" +msgstr "Un destinatario è stato aggiornato" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:94 +msgid "A request to transfer the ownership of this team has been sent to <0>{0} ({1})" +msgstr "Una richiesta per trasferire la proprietà di questa squadra è stata inviata a <0>{0} ({1})" + +#: packages/lib/server-only/team/create-team-email-verification.ts:159 +msgid "A request to use your email has been initiated by {0} on Documenso" +msgstr "Una richiesta per utilizzare la tua email è stata avviata da {0} su Documenso" + +#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:228 +msgid "A secret that will be sent to your URL so you can verify that the request has been sent by Documenso" +msgstr "Un codice segreto che verrà inviato al tuo URL in modo che tu possa verificare che la richiesta sia stata inviata da Documenso" + +#: apps/web/src/app/(dashboard)/settings/webhooks/[id]/page.tsx:196 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/[id]/page.tsx:198 +msgid "A secret that will be sent to your URL so you can verify that the request has been sent by Documenso." +msgstr "Un codice segreto che verrà inviato al tuo URL in modo che tu possa verificare che la richiesta sia stata inviata da Documenso." + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:64 +msgid "A stable internet connection" +msgstr "Una connessione Internet stabile" + +#: packages/email/templates/team-join.tsx:31 +msgid "A team member has joined a team on Documenso" +msgstr "Un membro del team si è unito a un team su Documenso" + +#: packages/lib/jobs/definitions/emails/send-team-member-left-email.handler.ts:87 +msgid "A team member has left {0}" +msgstr "Un membro del team ha lasciato {0}" + +#: packages/email/templates/team-leave.tsx:31 +msgid "A team member has left a team on Documenso" +msgstr "Un membro del team ha lasciato un team su Documenso" + +#: packages/email/templates/team-delete.tsx:29 +#: packages/email/templates/team-delete.tsx:33 +msgid "A team you were a part of has been deleted" +msgstr "Un team di cui facevi parte è stato eliminato" + +#: apps/web/src/components/forms/public-profile-form.tsx:198 +msgid "A unique URL to access your profile" +msgstr "Un URL univoco per accedere al tuo profilo" + +#: apps/web/src/components/(teams)/dialogs/create-team-dialog.tsx:206 +#: apps/web/src/components/(teams)/forms/update-team-form.tsx:138 +msgid "A unique URL to identify your team" +msgstr "Un URL univoco per identificare la tua squadra" + +#: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:137 +msgid "A verification email will be sent to the provided email." +msgstr "Un'email di verifica sarà inviata all'email fornita." + +#: apps/web/src/app/(dashboard)/settings/teams/accept-team-invitation-button.tsx:46 +#: packages/email/templates/confirm-team-email.tsx:118 +#: packages/email/templates/team-invite.tsx:94 +#: packages/email/templates/team-transfer-request.tsx:81 +msgid "Accept" +msgstr "Accetta" + +#: packages/email/templates/team-invite.tsx:42 +msgid "Accept invitation to join a team on Documenso" +msgstr "Accetta l'invito a unirti a un team su Documenso" + +#: packages/email/templates/confirm-team-email.tsx:41 +msgid "Accept team email request for {teamName} on Documenso" +msgstr "Accetta la richiesta di email per il team {teamName} su Documenso" + +#: packages/email/templates/team-transfer-request.tsx:29 +msgid "Accept team transfer request on Documenso" +msgstr "Accetta la richiesta di trasferimento di team su Documenso" + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:33 +msgid "Acceptance and Consent" +msgstr "Accettazione e Consenso" + +#: apps/web/src/app/(dashboard)/settings/teams/accept-team-invitation-button.tsx:26 +msgid "Accepted team invitation" +msgstr "Invito alla squadra accettato" + +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:128 +msgid "Account Authentication" +msgstr "Autenticazione dell'account" + +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:51 +#: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:47 +msgid "Account deleted" +msgstr "Account eliminato" + +#: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:47 +msgid "Account disabled" +msgstr "Account disabilitato" + +#: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:47 +msgid "Account enabled" +msgstr "Account abilitato" + +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:119 +msgid "Account Re-Authentication" +msgstr "Ri-autenticazione dell'account" + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:139 +msgid "Acknowledgment" +msgstr "Riconoscimento" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:114 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:97 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:117 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:159 +#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:115 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:46 +msgid "Action" +msgstr "Azione" + +#: apps/web/src/app/(dashboard)/documents/data-table.tsx:79 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:175 +#: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:140 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:130 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:139 +#: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:116 +#: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:125 +msgid "Actions" +msgstr "Azioni" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/page.tsx:101 +#: apps/web/src/components/(teams)/tables/teams-member-page-data-table.tsx:76 +#: apps/web/src/components/(teams)/tables/user-settings-teams-page-data-table.tsx:71 +msgid "Active" +msgstr "Attivo" + +#: apps/web/src/app/(dashboard)/admin/stats/page.tsx:68 +msgid "Active Subscriptions" +msgstr "Abbonamenti attivi" + +#: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:189 +msgid "Add" +msgstr "Aggiungi" + +#: packages/ui/primitives/document-dropzone.tsx:69 +msgid "Add a document" +msgstr "Aggiungi un documento" + +#: packages/ui/primitives/document-flow/add-settings.tsx:390 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:514 +msgid "Add a URL to redirect the user to once the document is signed" +msgstr "Aggiungi un URL per reindirizzare l'utente una volta firmato il documento" + +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:153 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:87 +msgid "Add all relevant fields for each recipient." +msgstr "Aggiungi tutti i campi rilevanti per ciascun destinatario." + +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:82 +msgid "Add all relevant placeholders for each recipient." +msgstr "Aggiungi tutti i segnaposto pertinenti per ciascun destinatario." + +#: apps/web/src/app/(dashboard)/settings/security/page.tsx:62 +msgid "Add an authenticator to serve as a secondary authentication method for signing documents." +msgstr "Aggiungi un autenticatore come metodo di autenticazione secondario per firmare documenti." + +#: apps/web/src/app/(dashboard)/settings/security/page.tsx:57 +msgid "Add an authenticator to serve as a secondary authentication method when signing in, or when signing documents." +msgstr "Aggiungi un autenticatore come metodo di autenticazione secondario al momento dell'accesso o durante la firma di documenti." + +#: packages/ui/primitives/document-flow/add-settings.tsx:302 +msgid "Add an external ID to the document. This can be used to identify the document in external systems." +msgstr "Aggiungi un ID esterno al documento. Questo può essere usato per identificare il documento in sistemi esterni." + +#: packages/ui/primitives/template-flow/add-template-settings.tsx:431 +msgid "Add an external ID to the template. This can be used to identify in external systems." +msgstr "Aggiungi un ID esterno al modello. Questo può essere usato per identificare in sistemi esterni." + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:187 +msgid "Add another option" +msgstr "Aggiungi un'altra opzione" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:231 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:167 +msgid "Add another value" +msgstr "Aggiungi un altro valore" + +#: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:125 +msgid "Add email" +msgstr "Aggiungi email" + +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:152 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:86 +msgid "Add Fields" +msgstr "Aggiungi campi" + +#: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:364 +msgid "Add more" +msgstr "Aggiungi altro" + +#: packages/ui/primitives/document-flow/add-signers.tsx:690 +msgid "Add myself" +msgstr "Aggiungi me stesso" + +#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:644 +msgid "Add Myself" +msgstr "Aggiungi me stesso" + +#: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:146 +#: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:154 +msgid "Add passkey" +msgstr "Aggiungi chiave d'accesso" + +#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:630 +msgid "Add Placeholder Recipient" +msgstr "Aggiungi un destinatario segnaposto" + +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:81 +msgid "Add Placeholders" +msgstr "Aggiungi segnaposto" + +#: packages/ui/primitives/document-flow/add-signers.tsx:679 +msgid "Add Signer" +msgstr "Aggiungi un firmatario" + +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:147 +msgid "Add Signers" +msgstr "Aggiungi firmatari" + +#: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:133 +msgid "Add team email" +msgstr "Aggiungi email del team" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:80 +msgid "Add text" +msgstr "Aggiungi testo" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:85 +msgid "Add text to the field" +msgstr "Aggiungi testo al campo" + +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:148 +msgid "Add the people who will sign the document." +msgstr "Aggiungi le persone che firmeranno il documento." + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:232 +msgid "Add the recipients to create the document with" +msgstr "Aggiungi i destinatari con cui creare il documento" + +#: apps/web/src/components/(teams)/dialogs/create-team-checkout-dialog.tsx:152 +msgid "Adding and removing seats will adjust your invoice accordingly." +msgstr "Aggiungere e rimuovere posti adeguerà di conseguenza la tua fattura." + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:303 +msgid "Additional brand information to display at the bottom of emails" +msgstr "Informazioni aggiuntive sul marchio da mostrare in fondo alle email" + +#: packages/lib/constants/teams.ts:10 +msgid "Admin" +msgstr "Amministratore" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/page.tsx:59 +msgid "Admin Actions" +msgstr "Azioni amministrative" + +#: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:262 +msgid "Admin panel" +msgstr "Pannello admin" + +#: packages/ui/primitives/document-flow/add-settings.tsx:284 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:413 +msgid "Advanced Options" +msgstr "Opzioni avanzate" + +#: packages/ui/primitives/document-flow/add-fields.tsx:585 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:490 +msgid "Advanced settings" +msgstr "Impostazioni avanzate" + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:129 +msgid "After signing a document electronically, you will be provided the opportunity to view, download, and print the document for your records. It is highly recommended that you retain a copy of all electronically signed documents for your personal records. We will also retain a copy of the signed document for our records however we may not be able to provide you with a copy of the signed document after a certain period of time." +msgstr "Dopo aver firmato un documento elettronicamente, avrai la possibilità di visualizzare, scaricare e stampare il documento per i tuoi archivi. È altamente consigliato conservare una copia di tutti i documenti firmati elettronicamente per i tuoi archivi personali. Noi conserveremo anche una copia del documento firmato per i nostri archivi, tuttavia potremmo non essere in grado di fornirti una copia del documento firmato dopo un certo periodo di tempo." + +#: packages/lib/constants/template.ts:21 +msgid "After submission, a document will be automatically generated and added to your documents page. You will also receive a notification via email." +msgstr "Dopo l'invio, un documento verrà generato automaticamente e aggiunto alla tua pagina dei documenti. Riceverai anche una notifica via email." + +#: apps/web/src/components/formatter/document-status.tsx:46 +msgid "All" +msgstr "Tutto" + +#: apps/web/src/components/(dashboard)/common/command-menu.tsx:42 +msgid "All documents" +msgstr "Tutti i documenti" + +#: apps/web/src/app/(dashboard)/documents/empty-state.tsx:35 +msgid "All documents have been processed. Any new documents that are sent or received will show here." +msgstr "Tutti i documenti sono stati elaborati. Eventuali nuovi documenti inviati o ricevuti verranno mostrati qui." + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:81 +msgid "All documents related to the electronic signing process will be provided to you electronically through our platform or via email. It is your responsibility to ensure that your email address is current and that you can receive and open our emails." +msgstr "Tutti i documenti relativi al processo di firma elettronica ti saranno forniti elettronicamente tramite la nostra piattaforma o via email. È tua responsabilità assicurarti che il tuo indirizzo email sia attuale e che tu possa ricevere e aprire le nostre email." + +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:146 +msgid "All inserted signatures will be voided" +msgstr "Tutte le firme inserite saranno annullate" + +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:149 +msgid "All recipients will be notified" +msgstr "Tutti i destinatari saranno notificati" + +#: packages/email/template-components/template-document-cancel.tsx:31 +msgid "All signatures have been voided." +msgstr "Tutte le firme sono state annullate." + +#: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:62 +msgid "All signing links have been copied to your clipboard." +msgstr "Tutti i link di firma sono stati copiati negli Appunti." + +#: apps/web/src/components/(dashboard)/common/command-menu.tsx:57 +msgid "All templates" +msgstr "Tutti i modelli" + +#: apps/web/src/components/(dashboard)/period-selector/period-selector.tsx:55 +msgid "All Time" +msgstr "Tutto il tempo" + +#: packages/email/templates/confirm-team-email.tsx:98 +msgid "Allow document recipients to reply directly to this email address" +msgstr "Consenti ai destinatari del documento di rispondere direttamente a questo indirizzo email" + +#: apps/web/src/app/(dashboard)/settings/security/page.tsx:110 +msgid "Allows authenticating using biometrics, password managers, hardware keys, etc." +msgstr "Consente di autenticare utilizzando biometria, gestori di password, chiavi hardware, ecc." + +#: apps/web/src/components/forms/v2/signup.tsx:427 +msgid "Already have an account? <0>Sign in instead" +msgstr "Hai già un account? <0>Accedi al posto" + +#: apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx:86 +msgid "Amount" +msgstr "Importo" + +#: packages/email/templates/document-super-delete.tsx:22 +msgid "An admin has deleted your document \"{documentName}\"." +msgstr "Un amministratore ha eliminato il tuo documento \"{documentName}\"." + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:48 +msgid "An electronic signature provided by you on our platform, achieved through clicking through to a document and entering your name, or any other electronic signing method we provide, is legally binding. It carries the same weight and enforceability as a manual signature written with ink on paper." +msgstr "Una firma elettronica fornita da te sulla nostra piattaforma, ottenuta cliccando su un documento e inserendo il tuo nome, o qualsiasi altro metodo di firma elettronica che forniamo, è legalmente vincolante. Ha lo stesso peso e validità giuridica di una firma manuale scritta con inchiostro su carta." + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:67 +msgid "An email account" +msgstr "Un account email" + +#: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:262 +msgid "An email containing an invitation will be sent to each member." +msgstr "Verrà inviato un'email contenente un invito a ciascun membro." + +#: apps/web/src/components/(teams)/dialogs/transfer-team-dialog.tsx:109 +msgid "An email requesting the transfer of this team has been sent." +msgstr "È stata inviata un'email per richiedere il trasferimento di questo team." + +#: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:100 +#: apps/web/src/components/forms/avatar-image.tsx:122 +#: apps/web/src/components/forms/password.tsx:92 +#: apps/web/src/components/forms/reset-password.tsx:95 +#: apps/web/src/components/forms/signup.tsx:112 +#: apps/web/src/components/forms/token.tsx:146 +#: apps/web/src/components/forms/v2/signup.tsx:166 +msgid "An error occurred" +msgstr "Si è verificato un errore" + +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:227 +msgid "An error occurred while adding fields." +msgstr "Si è verificato un errore durante l'aggiunta dei campi." + +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:243 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:187 +msgid "An error occurred while adding signers." +msgstr "Si è verificato un errore durante l'aggiunta di firmatari." + +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:281 +msgid "An error occurred while adding the fields." +msgstr "Si è verificato un errore durante l'aggiunta dei campi." + +#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:154 +msgid "An error occurred while auto-signing the document, some fields may not be signed. Please review and manually sign any remaining fields." +msgstr "Si è verificato un errore durante la firma automatica del documento, alcuni campi potrebbero non essere firmati. Si prega di controllare e firmare manualmente eventuali campi rimanenti." + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:188 +msgid "An error occurred while creating document from template." +msgstr "Si è verificato un errore durante la creazione del documento dal modello." + +#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:102 +msgid "An error occurred while creating the webhook. Please try again." +msgstr "Si è verificato un errore durante la creazione del webhook. Prova di nuovo." + +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:63 +msgid "An error occurred while deleting the user." +msgstr "Si è verificato un errore durante l'eliminazione dell'utente." + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:120 +msgid "An error occurred while disabling direct link signing." +msgstr "Si è verificato un errore durante la disabilitazione della firma tramite link diretto." + +#: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:57 +msgid "An error occurred while disabling the user." +msgstr "Si è verificato un errore durante la disabilitazione dell'utente." + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:70 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:98 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:77 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:101 +msgid "An error occurred while downloading your document." +msgstr "Si è verificato un errore durante il download del tuo documento." + +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51 +msgid "An error occurred while duplicating template." +msgstr "Si è verificato un errore durante la duplicazione del modello." + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:119 +msgid "An error occurred while enabling direct link signing." +msgstr "Si è verificato un errore durante l'abilitazione della firma del link diretto." + +#: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:57 +msgid "An error occurred while enabling the user." +msgstr "Si è verificato un errore durante l'abilitazione dell'utente." + +#: apps/web/src/components/(teams)/dialogs/transfer-team-dialog.tsx:264 +msgid "An error occurred while loading team members. Please try again later." +msgstr "Si è verificato un errore durante il caricamento dei membri del team. Per favore riprova più tardi." + +#: packages/ui/primitives/pdf-viewer.tsx:167 +msgid "An error occurred while loading the document." +msgstr "Si è verificato un errore durante il caricamento del documento." + +#: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:58 +msgid "An error occurred while moving the document." +msgstr "Si è verificato un errore durante lo spostamento del documento." + +#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:65 +msgid "An error occurred while moving the template." +msgstr "Si è verificato un errore durante lo spostamento del modello." + +#: apps/web/src/app/(signing)/sign/[token]/initials-field.tsx:116 +msgid "An error occurred while removing the field." +msgstr "Si è verificato un errore durante la rimozione del campo." + +#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:154 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:131 +#: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:137 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:115 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:153 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:196 +#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:129 +#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:194 +msgid "An error occurred while removing the signature." +msgstr "Si è verificato un errore durante la rimozione della firma." + +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:197 +msgid "An error occurred while removing the text." +msgstr "Si è verificato un errore durante la rimozione del testo." + +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:326 +msgid "An error occurred while sending the document." +msgstr "Si è verificato un errore durante l'invio del documento." + +#: apps/web/src/components/forms/send-confirmation-email.tsx:63 +msgid "An error occurred while sending your confirmation email" +msgstr "Si è verificato un errore durante l'invio della tua email di conferma" + +#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:125 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:105 +#: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:106 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:89 +#: apps/web/src/app/(signing)/sign/[token]/initials-field.tsx:90 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:127 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:151 +#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:102 +#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:168 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:169 +msgid "An error occurred while signing the document." +msgstr "Si è verificato un errore durante la firma del documento." + +#: apps/web/src/app/(dashboard)/settings/billing/billing-plans.tsx:63 +msgid "An error occurred while trying to create a checkout session." +msgstr "Si è verificato un errore durante il tentativo di creare una sessione di pagamento." + +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:210 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:156 +msgid "An error occurred while updating the document settings." +msgstr "Si è verificato un errore durante l'aggiornamento delle impostazioni del documento." + +#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:215 +msgid "An error occurred while updating the signature." +msgstr "Si è verificato un errore durante l'aggiornamento della firma." + +#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:81 +msgid "An error occurred while updating your profile." +msgstr "Si è verificato un errore durante l'aggiornamento del tuo profilo." + +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:108 +msgid "An error occurred while uploading your document." +msgstr "Si è verificato un errore durante il caricamento del tuo documento." + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:58 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:81 +#: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:55 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:54 +#: apps/web/src/components/(dashboard)/common/command-menu.tsx:301 +#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:97 +#: apps/web/src/components/(dashboard)/settings/webhooks/delete-webhook-dialog.tsx:88 +#: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:100 +#: apps/web/src/components/(teams)/dialogs/create-team-dialog.tsx:105 +#: apps/web/src/components/(teams)/dialogs/delete-team-dialog.tsx:84 +#: apps/web/src/components/(teams)/dialogs/delete-team-member-dialog.tsx:58 +#: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:158 +#: apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx:58 +#: apps/web/src/components/(teams)/dialogs/transfer-team-dialog.tsx:116 +#: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:89 +#: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:100 +#: apps/web/src/components/(teams)/forms/update-team-form.tsx:93 +#: apps/web/src/components/forms/avatar-image.tsx:94 +#: apps/web/src/components/forms/profile.tsx:79 +#: apps/web/src/components/forms/public-profile-claim-dialog.tsx:113 +#: apps/web/src/components/forms/public-profile-form.tsx:104 +#: apps/web/src/components/forms/signin.tsx:249 +#: apps/web/src/components/forms/signin.tsx:257 +#: apps/web/src/components/forms/signin.tsx:271 +#: apps/web/src/components/forms/signin.tsx:286 +#: apps/web/src/components/forms/signin.tsx:302 +#: apps/web/src/components/forms/signup.tsx:124 +#: apps/web/src/components/forms/signup.tsx:138 +#: apps/web/src/components/forms/v2/signup.tsx:187 +#: apps/web/src/components/forms/v2/signup.tsx:201 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:140 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:176 +msgid "An unknown error occurred" +msgstr "Si è verificato un errore sconosciuto" + +#: apps/web/src/components/(teams)/dialogs/transfer-team-dialog.tsx:225 +msgid "Any payment methods attached to this team will remain attached to this team. Please contact us if you need to update this information." +msgstr "Qualsiasi metodo di pagamento associato a questo team rimarrà associato a questo team. Si prega di contattarci se necessario per aggiornare queste informazioni." + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:219 +msgid "Any Source" +msgstr "Qualsiasi fonte" + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:199 +msgid "Any Status" +msgstr "Qualsiasi stato" + +#: apps/web/src/app/(dashboard)/settings/tokens/page.tsx:22 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:42 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:56 +#: apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx:90 +#: apps/web/src/components/(dashboard)/settings/layout/mobile-nav.tsx:93 +#: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:96 +#: apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx:105 +msgid "API Tokens" +msgstr "Token API" + +#: apps/web/src/app/(dashboard)/admin/stats/page.tsx:74 +msgid "App Version" +msgstr "Versione dell'app" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:95 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:121 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:140 +#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:143 +#: packages/lib/constants/recipient-roles.ts:8 +msgid "Approve" +msgstr "Approvare" + +#: apps/web/src/app/(signing)/sign/[token]/form.tsx:142 +#: packages/email/template-components/template-document-invite.tsx:105 +msgid "Approve Document" +msgstr "Approva Documento" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:94 +#: packages/lib/constants/recipient-roles.ts:9 +msgid "Approved" +msgstr "Approvato" + +#: packages/lib/constants/recipient-roles.ts:11 +msgid "Approver" +msgstr "Approvante" + +#: packages/lib/constants/recipient-roles.ts:12 +msgid "Approvers" +msgstr "Approvanti" + +#: packages/lib/constants/recipient-roles.ts:10 +msgid "Approving" +msgstr "Approvazione in corso" + +#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:129 +msgid "Are you sure you want to delete this token?" +msgstr "Sei sicuro di voler eliminare questo token?" + +#: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:120 +msgid "Are you sure you want to reject this document? This action cannot be undone." +msgstr "Sei sicuro di voler rifiutare questo documento? Questa azione non può essere annullata." + +#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:188 +msgid "Are you sure you want to remove the <0>{passkeyName} passkey." +msgstr "Sei sicuro di voler rimuovere la chiave di accesso <0>{passkeyName}." + +#: apps/web/src/components/(teams)/dialogs/delete-team-dialog.tsx:126 +msgid "Are you sure you wish to delete this team?" +msgstr "Sei sicuro di voler eliminare questo team?" + +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:99 +#: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:94 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:449 +#: apps/web/src/components/(teams)/dialogs/delete-team-member-dialog.tsx:81 +#: apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx:81 +#: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:116 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:437 +msgid "Are you sure?" +msgstr "Sei sicuro?" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:66 +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." + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:136 +msgid "Audit Log" +msgstr "Registro di controllo" + +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:200 +msgid "Authentication Level" +msgstr "Livello di Autenticazione" + +#: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:41 +#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:52 +msgid "Authentication required" +msgstr "Autenticazione richiesta" + +#: apps/web/src/components/forms/avatar-image.tsx:142 +msgid "Avatar" +msgstr "Avatar" + +#: apps/web/src/components/forms/avatar-image.tsx:107 +msgid "Avatar Updated" +msgstr "Avatar aggiornato" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/page.tsx:121 +msgid "Awaiting email confirmation" +msgstr "In attesa della conferma email" + +#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:373 +#: apps/web/src/components/(dashboard)/settings/layout/activity-back.tsx:20 +#: apps/web/src/components/forms/v2/signup.tsx:513 +msgid "Back" +msgstr "Indietro" + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:164 +msgid "Back to Documents" +msgstr "Torna ai Documenti" + +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:137 +msgid "Background Color" +msgstr "Colore di Sfondo" + +#: apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx:167 +#: apps/web/src/components/forms/signin.tsx:486 +msgid "Backup Code" +msgstr "Codice di Backup" + +#: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:164 +msgid "Backup codes" +msgstr "Codici di Backup" + +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:73 +msgid "Banner Updated" +msgstr "Banner Aggiornato" + +#: apps/web/src/components/forms/v2/signup.tsx:476 +msgid "Basic details" +msgstr "Dettagli di Base" + +#: packages/email/template-components/template-confirmation-email.tsx:25 +msgid "Before you get started, please confirm your email address by clicking the button below:" +msgstr "Prima di iniziare, conferma il tuo indirizzo email facendo clic sul pulsante qui sotto:" + +#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:74 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx:71 +#: apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx:117 +#: apps/web/src/components/(dashboard)/settings/layout/mobile-nav.tsx:120 +#: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:123 +#: apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx:132 +msgid "Billing" +msgstr "Fatturazione" + +#: packages/ui/primitives/signature-pad/signature-pad.tsx:544 +msgid "Black" +msgstr "Nero" + +#: packages/ui/primitives/signature-pad/signature-pad.tsx:558 +msgid "Blue" +msgstr "Blu" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/page.tsx:42 +msgid "Branding Preferences" +msgstr "Preferenze per il branding" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:102 +msgid "Branding preferences updated" +msgstr "Preferenze di branding aggiornate" + +#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:96 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:48 +msgid "Browser" +msgstr "Browser" + +#: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:145 +msgid "Bulk Copy" +msgstr "Copia massiva" + +#: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:279 +msgid "Bulk Import" +msgstr "Importazione Massiva" + +#: packages/lib/jobs/definitions/internal/bulk-send-template.handler.ts:203 +msgid "Bulk Send Complete: {0}" +msgstr "" + +#: packages/email/templates/bulk-send-complete.tsx:30 +msgid "Bulk send operation complete for template \"{templateName}\"" +msgstr "" + +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:128 +msgid "Bulk Send Template via CSV" +msgstr "" + +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:97 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:120 +msgid "Bulk Send via CSV" +msgstr "" + +#: packages/email/templates/team-invite.tsx:84 +msgid "by <0>{senderName}" +msgstr "da <0>{senderName}" + +#: packages/email/templates/confirm-team-email.tsx:87 +msgid "By accepting this request, you will be granting <0>{teamName} access to:" +msgstr "Accettando questa richiesta, concederai l'accesso a <0>{teamName} a:" + +#: packages/email/templates/team-transfer-request.tsx:70 +msgid "By accepting this request, you will take responsibility for any billing items associated with this team." +msgstr "Accettando questa richiesta, ti assumerai la responsabilità di qualsiasi voce di fatturazione associata a questo team." + +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:157 +msgid "By deleting this document, the following will occur:" +msgstr "Eliminando questo documento, si verificherà quanto segue:" + +#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:114 +msgid "By enabling 2FA, you will be required to enter a code from your authenticator app every time you sign in." +msgstr "Attivando 2FA, sarà necessario inserire un codice dalla tua app di autenticazione ogni volta che accedi." + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:142 +msgid "By proceeding to use the electronic signature service provided by Documenso, you affirm that you have read and understood this disclosure. You agree to all terms and conditions related to the use of electronic signatures and electronic transactions as outlined herein." +msgstr "Procedendo con l'utilizzo del servizio di firma elettronica fornito da Documenso, affermi di aver letto e compreso questa divulgazione. Accetti tutti i termini e le condizioni relativi all'uso delle firme elettroniche e delle transazioni elettroniche come descritto in questo documento." + +#: apps/web/src/components/general/signing-disclosure.tsx:14 +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/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:92 +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." + +#: apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx:185 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:191 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:107 +#: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:120 +#: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:248 +#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:157 +#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:198 +#: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:109 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:76 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:77 +#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:131 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:466 +#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:220 +#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:178 +#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:71 +#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:164 +#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:189 +#: apps/web/src/app/(signing)/sign/[token]/form.tsx:164 +#: apps/web/src/app/(signing)/sign/[token]/form.tsx:246 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:232 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:341 +#: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:153 +#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:131 +#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:320 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:352 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121 +#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:176 +#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:242 +#: apps/web/src/components/(dashboard)/settings/webhooks/delete-webhook-dialog.tsx:163 +#: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:185 +#: apps/web/src/components/(teams)/dialogs/create-team-checkout-dialog.tsx:166 +#: apps/web/src/components/(teams)/dialogs/create-team-dialog.tsx:218 +#: apps/web/src/components/(teams)/dialogs/delete-team-dialog.tsx:163 +#: apps/web/src/components/(teams)/dialogs/delete-team-member-dialog.tsx:104 +#: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:369 +#: apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx:102 +#: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:150 +#: apps/web/src/components/(teams)/dialogs/transfer-team-dialog.tsx:243 +#: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:162 +#: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:187 +#: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:257 +#: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:163 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:448 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:263 +#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:323 +#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:58 +msgid "Cancel" +msgstr "Annulla" + +#: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:226 +msgid "Cancelled by user" +msgstr "Annullato dall'utente" + +#: packages/ui/primitives/document-flow/add-signers.tsx:193 +msgid "Cannot remove signer" +msgstr "Impossibile rimuovere il firmatario" + +#: packages/lib/constants/recipient-roles.ts:18 +msgid "Cc" +msgstr "Cc" + +#: packages/lib/constants/recipient-roles.ts:15 +#: packages/lib/constants/recipient-roles.ts:17 +msgid "CC" +msgstr "CC" + +#: packages/lib/constants/recipient-roles.ts:16 +msgid "CC'd" +msgstr "CC'd" + +#: packages/lib/constants/recipient-roles.ts:19 +msgid "Ccers" +msgstr "" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:93 +msgid "Character Limit" +msgstr "Limite di caratteri" + +#: apps/web/src/app/(dashboard)/admin/stats/page.tsx:132 +msgid "Charts" +msgstr "Grafici" + +#: packages/ui/primitives/document-flow/types.ts:58 +msgid "Checkbox" +msgstr "Casella di controllo" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:197 +msgid "Checkbox values" +msgstr "Valori della casella di controllo" + +#: apps/web/src/components/(teams)/dialogs/create-team-checkout-dialog.tsx:179 +msgid "Checkout" +msgstr "Pagamento" + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:266 +msgid "Choose an existing recipient from below to continue" +msgstr "Scegli un destinatario esistente qui sotto per continuare" + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:262 +msgid "Choose Direct Link Recipient" +msgstr "Scegli Destinatario Link Diretto" + +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:158 +msgid "Choose how the document will reach recipients" +msgstr "Scegli come il documento verrà inviato ai destinatari" + +#: apps/web/src/components/forms/token.tsx:200 +msgid "Choose..." +msgstr "Scegli..." + +#: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:159 +msgid "Claim account" +msgstr "Rivendica account" + +#: apps/web/src/components/forms/v2/signup.tsx:485 +msgid "Claim username" +msgstr "Rivendica nome utente" + +#: apps/web/src/app/(dashboard)/documents/upcoming-profile-claim-teaser.tsx:28 +msgid "Claim your profile later" +msgstr "Rivendica il tuo profilo più tardi" + +#: apps/web/src/components/forms/v2/signup.tsx:283 +msgid "Claim your username now" +msgstr "Rivendica il tuo nome utente ora" + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:537 +msgid "Clear file" +msgstr "Rimuovi file" + +#: packages/ui/primitives/data-table.tsx:156 +msgid "Clear filters" +msgstr "Cancella filtri" + +#: packages/ui/primitives/signature-pad/signature-pad.tsx:578 +msgid "Clear Signature" +msgstr "Cancella firma" + +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:125 +msgid "Click here to get started" +msgstr "Clicca qui per iniziare" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recent-activity.tsx:76 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:113 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:64 +#: apps/web/src/components/document/document-history-sheet.tsx:133 +msgid "Click here to retry" +msgstr "Clicca qui per riprovare" + +#: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:392 +msgid "Click here to upload" +msgstr "Clicca qui per caricare" + +#: apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx:52 +#: apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx:65 +msgid "Click to copy signing link for sending to recipient" +msgstr "Clicca per copiare il link di firma da inviare al destinatario" + +#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:179 +#: apps/web/src/app/(signing)/sign/[token]/form.tsx:128 +#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:481 +#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:360 +msgid "Click to insert field" +msgstr "Clicca per inserire il campo" + +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:125 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:556 +#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:125 +#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:138 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121 +#: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:140 +#: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:180 +#: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:102 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:317 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:421 +#: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx:44 +msgid "Close" +msgstr "Chiudi" + +#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:61 +#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:471 +#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:350 +#: apps/web/src/components/forms/v2/signup.tsx:538 +msgid "Complete" +msgstr "Completa" + +#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:70 +msgid "Complete Approval" +msgstr "Completa l'Approvazione" + +#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:69 +msgid "Complete Signing" +msgstr "Completa la Firma" + +#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:68 +msgid "Complete Viewing" +msgstr "Completa la Visualizzazione" + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:202 +#: apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx:77 +#: apps/web/src/components/formatter/document-status.tsx:28 +#: packages/email/template-components/template-document-completed.tsx:35 +#: packages/email/template-components/template-document-recipient-signed.tsx:37 +#: packages/email/template-components/template-document-self-signed.tsx:36 +#: packages/lib/constants/document.ts:10 +msgid "Completed" +msgstr "Completato" + +#: packages/email/templates/document-completed.tsx:23 +#: packages/email/templates/document-self-signed.tsx:19 +msgid "Completed Document" +msgstr "Documento completato" + +#: apps/web/src/components/(dashboard)/common/command-menu.tsx:48 +msgid "Completed documents" +msgstr "Documenti Completati" + +#: apps/web/src/app/(dashboard)/admin/stats/page.tsx:94 +msgid "Completed Documents" +msgstr "Documenti Completati" + +#: packages/lib/constants/template.ts:12 +msgid "Configure Direct Recipient" +msgstr "Configura destinatario diretto" + +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:143 +msgid "Configure general settings for the document." +msgstr "Configura le impostazioni generali per il documento." + +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:77 +msgid "Configure general settings for the template." +msgstr "Configura le impostazioni generali per il modello." + +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:335 +msgid "Configure template" +msgstr "Configura il modello" + +#: packages/ui/primitives/document-flow/add-fields.tsx:586 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:491 +msgid "Configure the {0} field" +msgstr "Configura il campo {0}" + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:475 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:458 +msgid "Confirm" +msgstr "Conferma" + +#: apps/web/src/components/(teams)/dialogs/transfer-team-dialog.tsx:207 +msgid "Confirm by typing <0>{confirmTransferMessage}" +msgstr "Conferma digitando <0>{confirmTransferMessage}" + +#: apps/web/src/components/(teams)/dialogs/delete-team-dialog.tsx:149 +msgid "Confirm by typing <0>{deleteMessage}" +msgstr "Conferma digitando <0>{deleteMessage}" + +#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:152 +#: apps/web/src/components/(dashboard)/settings/webhooks/delete-webhook-dialog.tsx:140 +msgid "Confirm by typing: <0>{deleteMessage}" +msgstr "Conferma digitando: <0>{deleteMessage}" + +#: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:146 +msgid "Confirm Deletion" +msgstr "Conferma eliminazione" + +#: apps/web/src/app/(unauthenticated)/unverified-account/page.tsx:19 +#: packages/email/template-components/template-confirmation-email.tsx:35 +msgid "Confirm email" +msgstr "Conferma email" + +#: apps/web/src/components/forms/send-confirmation-email.tsx:53 +msgid "Confirmation email sent" +msgstr "Email di conferma inviato" + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:89 +msgid "Consent to Electronic Transactions" +msgstr "Consenso alle transazioni elettroniche" + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:151 +msgid "Contact Information" +msgstr "Informazioni di contatto" + +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:180 +msgid "Content" +msgstr "Contenuto" + +#: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:252 +#: apps/web/src/app/(unauthenticated)/team/invite/[token]/page.tsx:135 +#: apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx:69 +#: apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx:143 +#: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:72 +#: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:122 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:326 +#: packages/ui/primitives/document-flow/document-flow-root.tsx:141 +msgid "Continue" +msgstr "Continua" + +#: packages/email/template-components/template-document-invite.tsx:85 +msgid "Continue by approving the document." +msgstr "Continua approvando il documento." + +#: packages/email/template-components/template-document-completed.tsx:45 +msgid "Continue by downloading the document." +msgstr "Continua scaricando il documento." + +#: packages/email/template-components/template-document-invite.tsx:83 +msgid "Continue by signing the document." +msgstr "Continua firmando il documento." + +#: packages/email/template-components/template-document-invite.tsx:84 +msgid "Continue by viewing the document." +msgstr "Continua visualizzando il documento." + +#: apps/web/src/app/(unauthenticated)/team/invite/[token]/page.tsx:141 +msgid "Continue to login" +msgstr "Continua per accedere" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:185 +msgid "Controls the default language of an uploaded document. This will be used as the language in email communications with the recipients." +msgstr "Controlla la lingua predefinita di un documento caricato. Questa verrà usata come lingua nelle comunicazioni email con i destinatari." + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:153 +msgid "Controls the default visibility of an uploaded document." +msgstr "Controlla la visibilità predefinita di un documento caricato." + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:232 +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/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:263 +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." + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:293 +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/web/src/components/document/document-recipient-link-copy-dialog.tsx:128 +#: packages/ui/primitives/document-flow/add-subject.tsx:254 +msgid "Copied" +msgstr "Copiato" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:162 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:72 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-badge.tsx:31 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:159 +#: apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx:40 +#: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:61 +#: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:117 +#: apps/web/src/components/forms/public-profile-form.tsx:117 +#: packages/ui/components/document/document-share-button.tsx:46 +#: packages/ui/primitives/document-flow/add-subject.tsx:241 +msgid "Copied to clipboard" +msgstr "Copiato negli appunti" + +#: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:123 +#: packages/ui/primitives/document-flow/add-subject.tsx:249 +msgid "Copy" +msgstr "Copia" + +#: packages/ui/components/document/document-share-button.tsx:194 +msgid "Copy Link" +msgstr "Copia il link" + +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:164 +msgid "Copy sharable link" +msgstr "Copia il link condivisibile" + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:391 +msgid "Copy Shareable Link" +msgstr "Copia il Link Condivisibile" + +#: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:83 +msgid "Copy Signing Links" +msgstr "Copia link di firma" + +#: apps/web/src/components/forms/token.tsx:288 +msgid "Copy token" +msgstr "Copia il token" + +#: apps/web/src/app/(profile)/profile-header.tsx:83 +#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:245 +msgid "Create" +msgstr "Crea" + +#: packages/email/template-components/template-document-self-signed.tsx:46 +msgid "Create a <0>free account to access your signed documents at any time." +msgstr "Crea un <0>account gratuito per accedere ai tuoi documenti firmati in qualsiasi momento." + +#: apps/web/src/components/forms/v2/signup.tsx:268 +msgid "Create a new account" +msgstr "Crea un nuovo account" + +#: apps/web/src/components/(teams)/dialogs/create-team-dialog.tsx:150 +msgid "Create a team to collaborate with your team members." +msgstr "Crea un team per collaborare con i membri del tuo team." + +#: apps/web/src/app/(unauthenticated)/team/decline/[token]/page.tsx:106 +#: apps/web/src/app/(unauthenticated)/team/invite/[token]/page.tsx:111 +#: packages/email/template-components/template-document-self-signed.tsx:68 +msgid "Create account" +msgstr "Crea un account" + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:564 +msgid "Create and send" +msgstr "Crea e invia" + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:562 +msgid "Create as draft" +msgstr "Crea come bozza" + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:365 +msgid "Create as pending" +msgstr "Crea come in attesa" + +#: apps/web/src/app/(dashboard)/templates/[id]/template-direct-link-dialog-wrapper.tsx:37 +msgid "Create Direct Link" +msgstr "Crea Link Diretto" + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:197 +msgid "Create Direct Signing Link" +msgstr "Crea Link di Firma Diretto" + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:226 +msgid "Create document from template" +msgstr "Crea documento da modello" + +#: apps/web/src/app/(profile)/profile-header.tsx:79 +msgid "Create now" +msgstr "Crea ora" + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:346 +msgid "Create one automatically" +msgstr "Crea uno automaticamente" + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:566 +msgid "Create signing links" +msgstr "Crea link di firma" + +#: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:181 +#: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:251 +#: apps/web/src/components/(teams)/dialogs/create-team-dialog.tsx:138 +#: apps/web/src/components/(teams)/dialogs/create-team-dialog.tsx:146 +msgid "Create team" +msgstr "Crea team" + +#: apps/web/src/components/(teams)/dialogs/create-team-dialog.tsx:226 +msgid "Create Team" +msgstr "Crea Team" + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:372 +msgid "Create the document as pending and ready to sign." +msgstr "Crea il documento come in attesa e pronto per la firma." + +#: apps/web/src/components/forms/token.tsx:250 +#: apps/web/src/components/forms/token.tsx:259 +msgid "Create token" +msgstr "Crea token" + +#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:125 +msgid "Create webhook" +msgstr "Crea webhook" + +#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:117 +msgid "Create Webhook" +msgstr "Crea Webhook" + +#: apps/web/src/app/(signing)/sign/[token]/complete/page.tsx:213 +msgid "Create your account and start using state-of-the-art document signing." +msgstr "Crea il tuo account e inizia a utilizzare firme digitali all'avanguardia." + +#: apps/web/src/components/forms/v2/signup.tsx:272 +msgid "Create your account and start using state-of-the-art document signing. Open and beautiful signing is within your grasp." +msgstr "Crea il tuo account e inizia a utilizzare firme digitali all'avanguardia. Una firma aperta e bella è a tua portata." + +#: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:62 +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:112 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:36 +#: apps/web/src/app/(dashboard)/documents/data-table.tsx:48 +#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table.tsx:63 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:103 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:35 +#: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:56 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:272 +msgid "Created" +msgstr "Creato" + +#: apps/web/src/app/(dashboard)/admin/subscriptions/page.tsx:35 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:112 +msgid "Created At" +msgstr "Creato il" + +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-page-view.tsx:79 +msgid "Created by" +msgstr "Creato da" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/page.tsx:48 +#: apps/web/src/components/(teams)/tables/pending-user-teams-data-table.tsx:76 +msgid "Created on" +msgstr "Creato il" + +#: apps/web/src/app/(dashboard)/settings/tokens/page.tsx:67 +#: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:88 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:100 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/page.tsx:93 +msgid "Created on {0}" +msgstr "Creato il {0}" + +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:143 +msgid "CSV Structure" +msgstr "" + +#: apps/web/src/components/forms/password.tsx:112 +msgid "Current Password" +msgstr "Password attuale" + +#: apps/web/src/components/forms/password.tsx:81 +msgid "Current password is incorrect." +msgstr "La password corrente è errata." + +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:154 +msgid "Current recipients:" +msgstr "" + +#: apps/web/src/app/(dashboard)/settings/billing/billing-plans.tsx:28 +msgid "Daily" +msgstr "Giornaliero" + +#: apps/web/src/components/(dashboard)/common/command-menu.tsx:265 +msgid "Dark Mode" +msgstr "Modalità Scura" + +#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:67 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:153 +#: packages/ui/primitives/document-flow/add-fields.tsx:945 +#: packages/ui/primitives/document-flow/types.ts:53 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:810 +msgid "Date" +msgstr "Data" + +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-page-view.tsx:85 +msgid "Date created" +msgstr "Data di creazione" + +#: packages/ui/primitives/document-flow/add-settings.tsx:325 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:454 +msgid "Date Format" +msgstr "Formato data" + +#: apps/web/src/app/(dashboard)/settings/teams/decline-team-invitation-button.tsx:47 +#: packages/email/templates/team-invite.tsx:100 +msgid "Decline" +msgstr "Declina" + +#: apps/web/src/app/(dashboard)/settings/teams/decline-team-invitation-button.tsx:26 +msgid "Declined team invitation" +msgstr "Invito al team rifiutato" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:165 +msgid "Default Document Language" +msgstr "Lingua predefinita del documento" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:129 +msgid "Default Document Visibility" +msgstr "Visibilità predefinita del documento" + +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:49 +msgid "delete" +msgstr "elimina" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:150 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:183 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:201 +#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:177 +#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:211 +#: apps/web/src/app/(dashboard)/settings/tokens/page.tsx:83 +#: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:100 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:107 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:85 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:116 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/page.tsx:105 +#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:121 +#: apps/web/src/components/(dashboard)/settings/webhooks/delete-webhook-dialog.tsx:109 +#: apps/web/src/components/(teams)/dialogs/delete-team-dialog.tsx:167 +#: apps/web/src/components/(teams)/dialogs/delete-team-member-dialog.tsx:113 +msgid "Delete" +msgstr "Elimina" + +#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:56 +#: apps/web/src/components/(dashboard)/settings/webhooks/delete-webhook-dialog.tsx:54 +msgid "delete {0}" +msgstr "elimina {0}" + +#: apps/web/src/components/(teams)/dialogs/delete-team-dialog.tsx:50 +msgid "delete {teamName}" +msgstr "elimina {teamName}" + +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:133 +msgid "Delete account" +msgstr "Elimina account" + +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:94 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:101 +#: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:72 +#: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:86 +#: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:93 +msgid "Delete Account" +msgstr "Elimina Account" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:125 +msgid "Delete document" +msgstr "Elimina documento" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:75 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:88 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:95 +msgid "Delete Document" +msgstr "Elimina Documento" + +#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:184 +msgid "Delete passkey" +msgstr "Elimina chiave d'accesso" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/page.tsx:191 +#: apps/web/src/components/(teams)/dialogs/delete-team-dialog.tsx:118 +msgid "Delete team" +msgstr "Elimina squadra" + +#: apps/web/src/components/(teams)/dialogs/delete-team-member-dialog.tsx:73 +msgid "Delete team member" +msgstr "Elimina membro del team" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:78 +msgid "Delete the document. This action is irreversible so proceed with caution." +msgstr "Elimina il documento. Questa azione è irreversibile quindi procedi con cautela." + +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:83 +msgid "Delete the users account and all its contents. This action is irreversible and will cancel their subscription, so proceed with caution." +msgstr "Elimina l'account utente e tutti i suoi contenuti. Questa azione è irreversibile e annullerà l'abbonamento, quindi procedi con cautela." + +#: apps/web/src/components/(dashboard)/settings/webhooks/delete-webhook-dialog.tsx:117 +msgid "Delete Webhook" +msgstr "Elimina Webhook" + +#: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:75 +msgid "Delete your account and all its contents, including completed documents. This action is irreversible and will cancel your subscription, so proceed with caution." +msgstr "Elimina il tuo account e tutti i suoi contenuti, inclusi i documenti completati. Questa azione è irreversibile e annullerà l'abbonamento, quindi procedi con cautela." + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/page.tsx:41 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:98 +msgid "Deleted" +msgstr "Eliminato" + +#: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:146 +msgid "Deleting account..." +msgstr "Eliminazione account..." + +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:180 +msgid "Details" +msgstr "Dettagli" + +#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:72 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:244 +msgid "Device" +msgstr "Dispositivo" + +#: packages/email/templates/reset-password.tsx:71 +msgid "Didn't request a password change? We are here to help you secure your account, just <0>contact us." +msgstr "Non hai richiesto un cambio di password? Siamo qui per aiutarti a proteggere il tuo account, basta <0>contattarci." + +#: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:91 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-badge.tsx:46 +msgid "direct link" +msgstr "collegamento diretto" + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:40 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:81 +msgid "Direct link" +msgstr "Collegamento diretto" + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:154 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:225 +msgid "Direct Link" +msgstr "Collegamento diretto" + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-badge.tsx:46 +msgid "direct link disabled" +msgstr "collegamento diretto disabilitato" + +#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:577 +msgid "Direct link receiver" +msgstr "Ricevitore del link diretto" + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:357 +msgid "Direct Link Signing" +msgstr "Firma del collegamento diretto" + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:111 +msgid "Direct link signing has been disabled" +msgstr "La firma del collegamento diretto è stata disabilitata" + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:110 +msgid "Direct link signing has been enabled" +msgstr "La firma del collegamento diretto è stata abilitata" + +#: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:95 +msgid "Direct link templates contain one dynamic recipient placeholder. Anyone with access to this link can sign the document, and it will then appear on your documents page." +msgstr "I modelli di collegamento diretto contengono un segnaposto per un destinatario dinamico. Chiunque abbia accesso a questo link può firmare il documento e apparirà successivamente nella tua pagina dei documenti." + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:138 +msgid "Direct template link deleted" +msgstr "Collegamento diretto al modello eliminato" + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:223 +msgid "Direct template link usage exceeded ({0}/{1})" +msgstr "Utilizzo del collegamento diretto al modello superato ({0}/{1})" + +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:415 +msgid "Disable" +msgstr "Disabilita" + +#: apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx:116 +#: apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx:123 +#: apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx:192 +msgid "Disable 2FA" +msgstr "Disabilita 2FA" + +#: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:132 +msgid "Disable account" +msgstr "Disabilita account" + +#: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:88 +#: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:95 +msgid "Disable Account" +msgstr "Disabilita Account" + +#: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:105 +msgid "Disable Two Factor Authentication before deleting your account." +msgstr "Disabilita l'Autenticazione a Due Fattori prima di eliminare il tuo account." + +#: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:74 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/page.tsx:79 +msgid "Disabled" +msgstr "Disabilitato" + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:374 +msgid "Disabling direct link signing will prevent anyone from accessing the link." +msgstr "Disabilitare la firma del collegamento diretto impedirà a chiunque di accedere al collegamento." + +#: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:77 +msgid "Disabling the user results in the user not being able to use the account. It also disables all the related contents such as subscription, webhooks, teams, and API keys." +msgstr "Disabilitare l'utente porta all'impossibilità per l'utente di usare l'account. Disabilita anche tutti i contenuti correlati come abbonamento, webhook, team e chiavi API." + +#: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:75 +msgid "Display your name and email in documents" +msgstr "Mostra il tuo nome e email nei documenti" + +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:157 +msgid "Distribute Document" +msgstr "Distribuire il documento" + +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:58 +msgid "Do you want to delete this template?" +msgstr "Vuoi eliminare questo modello?" + +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:62 +msgid "Do you want to duplicate this template?" +msgstr "Vuoi duplicare questo modello?" + +#: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:111 +msgid "Documenso will delete <0>all of your documents, along with all of your completed documents, signatures, and all other resources belonging to your Account." +msgstr "Documenso eliminerà <0>tutti i tuoi documenti, insieme a tutti i tuoi documenti completati, firme e tutte le altre risorse appartenenti al tuo account." + +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-page-view.tsx:119 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:38 +msgid "Document" +msgstr "Documento" + +#: packages/lib/jobs/definitions/emails/send-rejection-emails.handler.ts:140 +msgid "Document \"{0}\" - Rejected by {1}" +msgstr "Documento \"{0}\" - Rifiutato da {1}" + +#: packages/lib/jobs/definitions/emails/send-rejection-emails.handler.ts:100 +msgid "Document \"{0}\" - Rejection Confirmed" +msgstr "Documento \"{0}\" - Rifiuto Confermato" + +#: packages/ui/components/document/document-global-auth-access-select.tsx:62 +#: packages/ui/primitives/document-flow/add-settings.tsx:227 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:224 +msgid "Document access" +msgstr "Accesso al documento" + +#: packages/lib/utils/document-audit-logs.ts:322 +msgid "Document access auth updated" +msgstr "Autenticazione di accesso al documento aggiornata" + +#: apps/web/src/components/formatter/document-status.tsx:47 +msgid "Document All" +msgstr "Documenta Tutto" + +#: apps/web/src/app/(signing)/sign/[token]/complete/page.tsx:132 +msgid "Document Approved" +msgstr "Documento Approvato" + +#: apps/web/src/app/(signing)/sign/[token]/no-longer-available.tsx:40 +#: packages/lib/server-only/document/delete-document.ts:263 +#: packages/lib/server-only/document/super-delete-document.ts:101 +msgid "Document Cancelled" +msgstr "Documento Annullato" + +#: apps/web/src/components/formatter/document-status.tsx:29 +#: packages/lib/utils/document-audit-logs.ts:385 +#: packages/lib/utils/document-audit-logs.ts:386 +msgid "Document completed" +msgstr "Documento completato" + +#: packages/ui/components/document/document-email-checkboxes.tsx:203 +#: packages/ui/components/document/document-email-checkboxes.tsx:279 +msgid "Document completed email" +msgstr "Email documento completato" + +#: apps/web/src/app/embed/completed.tsx:17 +msgid "Document Completed!" +msgstr "Documento completato!" + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:168 +#: packages/lib/utils/document-audit-logs.ts:302 +msgid "Document created" +msgstr "Documento creato" + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:125 +msgid "Document created by <0>{0}" +msgstr "Documento creato da <0>{0}" + +#: packages/email/templates/document-created-from-direct-template.tsx:32 +#: packages/lib/server-only/template/create-document-from-direct-template.ts:588 +msgid "Document created from direct template" +msgstr "Documento creato da modello diretto" + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:130 +msgid "Document created using a <0>direct link" +msgstr "Documento creato usando un <0>link diretto" + +#: packages/lib/constants/template.ts:20 +msgid "Document Creation" +msgstr "Creazione del documento" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:50 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:182 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:60 +#: packages/lib/utils/document-audit-logs.ts:306 +msgid "Document deleted" +msgstr "Documento eliminato" + +#: packages/ui/components/document/document-email-checkboxes.tsx:241 +msgid "Document deleted email" +msgstr "Email documento eliminato" + +#: packages/lib/server-only/document/send-delete-email.ts:85 +msgid "Document Deleted!" +msgstr "Documento Eliminato!" + +#: packages/ui/primitives/template-flow/add-template-settings.tsx:265 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:274 +msgid "Document Distribution Method" +msgstr "Metodo di distribuzione del documento" + +#: apps/web/src/components/formatter/document-status.tsx:35 +msgid "Document draft" +msgstr "Bozza del documento" + +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:57 +msgid "Document Duplicated" +msgstr "Documento Duplicato" + +#: packages/lib/utils/document-audit-logs.ts:342 +msgid "Document external ID updated" +msgstr "ID esterno del documento aggiornato" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:193 +#: apps/web/src/components/document/document-history-sheet.tsx:104 +msgid "Document history" +msgstr "Cronologia del documento" + +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-page-view.tsx:71 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:82 +msgid "Document ID" +msgstr "ID del documento" + +#: apps/web/src/components/formatter/document-status.tsx:41 +msgid "Document inbox" +msgstr "Posta in arrivo del documento" + +#: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:180 +msgid "Document Limit Exceeded!" +msgstr "Limite di documenti superato!" + +#: apps/web/src/app/(dashboard)/admin/stats/page.tsx:82 +msgid "Document metrics" +msgstr "Metriche del documento" + +#: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:49 +msgid "Document moved" +msgstr "Documento spostato" + +#: packages/lib/utils/document-audit-logs.ts:350 +msgid "Document moved to team" +msgstr "Documento spostato al team" + +#: apps/web/src/app/(signing)/sign/[token]/complete/page.tsx:156 +msgid "Document no longer available to sign" +msgstr "Documento non più disponibile per la firma" + +#: packages/lib/utils/document-audit-logs.ts:334 +msgid "Document opened" +msgstr "Documento aperto" + +#: apps/web/src/components/formatter/document-status.tsx:23 +msgid "Document pending" +msgstr "Documento in sospeso" + +#: packages/ui/components/document/document-email-checkboxes.tsx:164 +msgid "Document pending email" +msgstr "Email documento in attesa" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:103 +msgid "Document preferences updated" +msgstr "Preferenze del documento aggiornate" + +#: apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx:97 +msgid "Document re-sent" +msgstr "Documento rinviato" + +#: apps/web/src/app/(signing)/sign/[token]/rejected/page.tsx:83 +#: packages/email/template-components/template-document-rejected.tsx:21 +msgid "Document Rejected" +msgstr "Documento Rifiutato" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:36 +msgid "Document resealed" +msgstr "Documento risigillato" + +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:303 +#: packages/lib/utils/document-audit-logs.ts:346 +msgid "Document sent" +msgstr "Documento inviato" + +#: apps/web/src/app/(signing)/sign/[token]/complete/page.tsx:130 +msgid "Document Signed" +msgstr "Documento firmato" + +#: packages/lib/utils/document-audit-logs.ts:326 +msgid "Document signing auth updated" +msgstr "Autenticazione firma documento aggiornata" + +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:143 +msgid "Document signing process will be cancelled" +msgstr "Il processo di firma del documento sarà annullato" + +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-page-view.tsx:75 +msgid "Document status" +msgstr "Stato del documento" + +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-page-view.tsx:67 +msgid "Document title" +msgstr "Titolo del documento" + +#: packages/lib/utils/document-audit-logs.ts:338 +msgid "Document title updated" +msgstr "Titolo documento aggiornato" + +#: packages/lib/utils/document-audit-logs.ts:330 +msgid "Document updated" +msgstr "Documento aggiornato" + +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:55 +msgid "Document upload disabled due to unpaid invoices" +msgstr "Caricamento del documento disabilitato a causa di fatture non pagate" + +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:85 +msgid "Document uploaded" +msgstr "Documento caricato" + +#: apps/web/src/app/(signing)/sign/[token]/complete/page.tsx:131 +msgid "Document Viewed" +msgstr "Documento visualizzato" + +#: packages/lib/utils/document-audit-logs.ts:318 +msgid "Document visibility updated" +msgstr "Visibilità del documento aggiornata" + +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:140 +msgid "Document will be permanently deleted" +msgstr "Il documento sarà eliminato definitivamente" + +#: apps/web/src/app/(dashboard)/admin/nav.tsx:65 +#: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:92 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:145 +#: apps/web/src/app/(dashboard)/documents/[id]/edit/document-edit-page-view.tsx:109 +#: apps/web/src/app/(dashboard)/documents/[id]/loading.tsx:16 +#: apps/web/src/app/(dashboard)/documents/[id]/sent/page.tsx:15 +#: apps/web/src/app/(dashboard)/documents/documents-page-view.tsx:119 +#: apps/web/src/app/(profile)/p/[url]/page.tsx:166 +#: apps/web/src/app/not-found.tsx:21 +#: apps/web/src/components/(dashboard)/common/command-menu.tsx:205 +#: apps/web/src/components/(dashboard)/layout/desktop-nav.tsx:18 +#: apps/web/src/components/(dashboard)/layout/mobile-navigation.tsx:35 +#: apps/web/src/components/ui/user-profile-timur.tsx:60 +msgid "Documents" +msgstr "Documenti" + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:200 +msgid "Documents created from template" +msgstr "Documenti creati da modello" + +#: apps/web/src/app/(dashboard)/admin/stats/page.tsx:113 +msgid "Documents Received" +msgstr "Documenti ricevuti" + +#: apps/web/src/app/(dashboard)/admin/stats/page.tsx:118 +msgid "Documents Viewed" +msgstr "Documenti visualizzati" + +#: apps/web/src/app/(unauthenticated)/reset-password/[token]/page.tsx:40 +#: apps/web/src/app/(unauthenticated)/signin/page.tsx:45 +msgid "Don't have an account? <0>Sign up" +msgstr "Non hai un account? <0>Registrati" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:117 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:129 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:142 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:156 +#: apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx:110 +#: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:185 +#: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:107 +#: packages/email/template-components/template-document-completed.tsx:57 +#: packages/ui/components/document/document-download-button.tsx:68 +msgid "Download" +msgstr "Scarica" + +#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:77 +msgid "Download Audit Logs" +msgstr "Scarica i log di audit" + +#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-certificate-button.tsx:86 +msgid "Download Certificate" +msgstr "Scarica il certificato" + +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:168 +msgid "Download Template CSV" +msgstr "" + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:208 +#: apps/web/src/components/formatter/document-status.tsx:34 +#: packages/lib/constants/document.ts:13 +msgid "Draft" +msgstr "Bozza" + +#: apps/web/src/components/(dashboard)/common/command-menu.tsx:46 +msgid "Draft documents" +msgstr "Documenti in bozza" + +#: apps/web/src/app/(dashboard)/admin/stats/page.tsx:86 +msgid "Drafted Documents" +msgstr "Documenti redatti" + +#: packages/ui/primitives/document-dropzone.tsx:162 +msgid "Drag & drop your PDF here." +msgstr "Trascina e rilascia il tuo PDF qui." + +#: packages/ui/primitives/document-flow/add-fields.tsx:1076 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:941 +msgid "Dropdown" +msgstr "Menu a tendina" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:158 +msgid "Dropdown options" +msgstr "Opzioni del menu a tendina" + +#: apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx:121 +msgid "Due to an unpaid invoice, your team has been restricted. Please settle the payment to restore full access to your team." +msgstr "A causa di una fattura non pagata, il vostro team è stato limitato. Si prega di effettuare il pagamento per ripristinare l'accesso completo al team." + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:142 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:161 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:84 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:117 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:76 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:89 +msgid "Duplicate" +msgstr "Duplica" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:110 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:121 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:103 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:150 +#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:111 +#: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:95 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:67 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx:77 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/page.tsx:100 +msgid "Edit" +msgstr "Modifica" + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:120 +msgid "Edit Template" +msgstr "Modifica Modello" + +#: apps/web/src/app/(dashboard)/settings/webhooks/[id]/page.tsx:94 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/[id]/page.tsx:100 +msgid "Edit webhook" +msgstr "Modifica webhook" + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:78 +msgid "Electronic Delivery of Documents" +msgstr "Consegna elettronica dei documenti" + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:17 +msgid "Electronic Signature Disclosure" +msgstr "Divulgazione della firma elettronica" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:166 +#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:116 +#: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:71 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:277 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:284 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:122 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:129 +#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:119 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:131 +#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:407 +#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:287 +#: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:169 +#: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:153 +#: apps/web/src/components/forms/forgot-password.tsx:81 +#: apps/web/src/components/forms/profile.tsx:113 +#: apps/web/src/components/forms/signin.tsx:339 +#: apps/web/src/components/forms/signup.tsx:176 +#: packages/lib/constants/document.ts:28 +#: packages/ui/primitives/document-flow/add-fields.tsx:893 +#: packages/ui/primitives/document-flow/add-signers.tsx:511 +#: packages/ui/primitives/document-flow/add-signers.tsx:518 +#: packages/ui/primitives/document-flow/types.ts:54 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:758 +#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:470 +#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:477 +msgid "Email" +msgstr "Email" + +#: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:133 +#: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:300 +#: apps/web/src/components/forms/send-confirmation-email.tsx:82 +msgid "Email address" +msgstr "Indirizzo email" + +#: apps/web/src/components/forms/v2/signup.tsx:332 +msgid "Email Address" +msgstr "Indirizzo Email" + +#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:81 +msgid "Email cannot already exist in the template" +msgstr "L'email non può già esistere nel modello" + +#: apps/web/src/app/(unauthenticated)/verify-email/[token]/client.tsx:36 +msgid "Email Confirmed!" +msgstr "Email confermato!" + +#: packages/ui/primitives/template-flow/add-template-settings.tsx:353 +msgid "Email Options" +msgstr "Opzioni email" + +#: packages/lib/utils/document-audit-logs.ts:379 +msgid "Email resent" +msgstr "Email rinviato" + +#: packages/lib/utils/document-audit-logs.ts:379 +msgid "Email sent" +msgstr "Email inviato" + +#: apps/web/src/app/(unauthenticated)/check-email/page.tsx:20 +msgid "Email sent!" +msgstr "Email inviato!" + +#: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:77 +msgid "Email verification has been removed" +msgstr "Verifica email rimossa" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx:33 +msgid "Email verification has been resent" +msgstr "Verifica email rinviata" + +#: packages/ui/primitives/document-flow/add-fields.tsx:1141 +msgid "Empty field" +msgstr "Campo vuoto" + +#: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:153 +#: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:262 +msgid "Enable 2FA" +msgstr "Abilita 2FA" + +#: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:121 +msgid "Enable account" +msgstr "Abilita account" + +#: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:88 +#: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:95 +msgid "Enable Account" +msgstr "Abilita Account" + +#: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:194 +msgid "Enable Authenticator App" +msgstr "Abilita l'app Authenticator" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:170 +msgid "Enable custom branding for all documents in this team." +msgstr "Abilita il branding personalizzato per tutti i documenti in questo team." + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:246 +msgid "Enable direct link signing" +msgstr "Abilita la firma tramite link diretto" + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:368 +#: packages/lib/constants/template.ts:8 +msgid "Enable Direct Link Signing" +msgstr "Abilita la firma di link diretto" + +#: packages/ui/primitives/document-flow/add-signers.tsx:400 +#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:369 +msgid "Enable signing order" +msgstr "Abilita ordine di firma" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:248 +msgid "Enable Typed Signature" +msgstr "Abilita firma digitata" + +#: packages/ui/primitives/document-flow/add-fields.tsx:813 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:678 +msgid "Enable Typed Signatures" +msgstr "Abilita firme digitate" + +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:114 +#: apps/web/src/app/(dashboard)/settings/webhooks/[id]/page.tsx:138 +#: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:74 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/[id]/page.tsx:142 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/page.tsx:79 +#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:166 +msgid "Enabled" +msgstr "Abilitato" + +#: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:77 +msgid "Enabling the account results in the user being able to use the account again, and all the related features such as webhooks, teams, and API keys for example." +msgstr "Abilitare l'account consente all'utente di utilizzare nuovamente l'account, così come tutte le funzionalità correlate come webhook, team e chiavi API, per esempio." + +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:88 +msgid "Enclosed Document" +msgstr "Documento Allegato" + +#: apps/web/src/app/(dashboard)/admin/subscriptions/page.tsx:38 +msgid "Ends On" +msgstr "Termina il" + +#: packages/ui/primitives/document-password-dialog.tsx:84 +msgid "Enter password" +msgstr "Inserisci la password" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:295 +msgid "Enter your brand details" +msgstr "Inserisci i dettagli del tuo marchio" + +#: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:136 +msgid "Enter your email" +msgstr "Inserisci la tua email" + +#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:136 +msgid "Enter your email address to receive the completed document." +msgstr "Inserisci il tuo indirizzo email per ricevere il documento completato." + +#: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:121 +msgid "Enter your name" +msgstr "Inserisci il tuo nome" + +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:293 +msgid "Enter your text here" +msgstr "Inserisci il tuo testo qui" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:41 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:66 +#: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:60 +#: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:60 +#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:80 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:209 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:242 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:280 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:325 +#: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:57 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:111 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:155 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:186 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:226 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:50 +#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:68 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:187 +#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:152 +#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:124 +#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:153 +#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:214 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:104 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:130 +#: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:105 +#: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:136 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:88 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:114 +#: apps/web/src/app/(signing)/sign/[token]/initials-field.tsx:89 +#: apps/web/src/app/(signing)/sign/[token]/initials-field.tsx:115 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:126 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:152 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:150 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:195 +#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:101 +#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:128 +#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:133 +#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:167 +#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:193 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:168 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:196 +#: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:54 +#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:101 +#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:224 +#: packages/ui/primitives/pdf-viewer.tsx:166 +msgid "Error" +msgstr "Errore" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:140 +msgid "Everyone can access and view the document" +msgstr "Tutti possono accedere e visualizzare il documento" + +#: apps/web/src/app/(signing)/sign/[token]/complete/page.tsx:140 +msgid "Everyone has signed" +msgstr "Hanno firmato tutti" + +#: apps/web/src/app/(signing)/sign/[token]/complete/page.tsx:164 +msgid "Everyone has signed! You will receive an Email copy of the signed document." +msgstr "Hanno firmato tutti! Riceverai una copia via email del documento firmato." + +#: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:232 +msgid "Exceeded timeout" +msgstr "Tempo scaduto" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/page.tsx:114 +msgid "Expired" +msgstr "Scaduto" + +#: apps/web/src/app/(dashboard)/settings/tokens/page.tsx:71 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:104 +msgid "Expires on {0}" +msgstr "Scade il {0}" + +#: packages/ui/primitives/document-flow/add-settings.tsx:295 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:424 +msgid "External ID" +msgstr "ID esterno" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:42 +msgid "Failed to reseal document" +msgstr "Fallito il risigillo del documento" + +#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:225 +msgid "Failed to save settings." +msgstr "Impossibile salvare le impostazioni." + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:125 +msgid "Failed to update recipient" +msgstr "Aggiornamento destinario fallito" + +#: apps/web/src/app/(dashboard)/settings/webhooks/[id]/page.tsx:82 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/[id]/page.tsx:88 +msgid "Failed to update webhook" +msgstr "Aggiornamento webhook fallito" + +#: packages/email/templates/bulk-send-complete.tsx:55 +msgid "Failed: {failedCount}" +msgstr "" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:100 +msgid "Field character limit" +msgstr "Limite di caratteri del campo" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:69 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:51 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:46 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:51 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:130 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:114 +msgid "Field font size" +msgstr "Dimensione del carattere del campo" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:110 +msgid "Field format" +msgstr "Formato del campo" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:60 +msgid "Field label" +msgstr "Etichetta del campo" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:72 +msgid "Field placeholder" +msgstr "Segnaposto del campo" + +#: packages/lib/utils/document-audit-logs.ts:310 +msgid "Field signed" +msgstr "Campo firmato" + +#: packages/lib/utils/document-audit-logs.ts:314 +msgid "Field unsigned" +msgstr "Campo non firmato" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:190 +msgid "Fields" +msgstr "Campi" + +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:124 +msgid "File cannot be larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB" +msgstr "Il file non può essere più grande di {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB" + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:513 +msgid "File size exceeds the limit of {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB" +msgstr "La dimensione del file supera il limite di {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:63 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:45 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:40 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:45 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:124 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:108 +msgid "Font Size" +msgstr "Dimensione carattere" + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:154 +msgid "For any questions regarding this disclosure, electronic signatures, or any related process, please contact us at: <0>{SUPPORT_EMAIL}" +msgstr "Per qualsiasi domanda riguardante questa divulgazione, le firme elettroniche o qualsiasi processo correlato, contattaci all'indirizzo: <0>{SUPPORT_EMAIL}" + +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:147 +msgid "For each recipient, provide their email (required) and name (optional) in separate columns. Download the template CSV below for the correct format." +msgstr "" + +#: packages/lib/server-only/auth/send-forgot-password.ts:61 +msgid "Forgot Password?" +msgstr "Password dimenticata?" + +#: apps/web/src/app/(unauthenticated)/forgot-password/page.tsx:21 +#: apps/web/src/components/forms/signin.tsx:371 +#: packages/email/template-components/template-forgot-password.tsx:21 +msgid "Forgot your password?" +msgstr "Hai dimenticato la tua password?" + +#: packages/ui/primitives/document-flow/types.ts:50 +msgid "Free Signature" +msgstr "Firma gratuita" + +#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:330 +#: apps/web/src/app/(signing)/sign/[token]/form.tsx:191 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:210 +#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:392 +#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:272 +#: apps/web/src/components/forms/profile.tsx:101 +#: apps/web/src/components/forms/v2/signup.tsx:316 +msgid "Full Name" +msgstr "Nome completo" + +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:142 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:76 +#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:62 +#: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:44 +#: apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx:52 +msgid "General" +msgstr "Generale" + +#: packages/ui/primitives/document-flow/add-subject.tsx:89 +msgid "Generate Links" +msgstr "Genera link" + +#: packages/ui/components/document/document-global-auth-action-select.tsx:64 +msgid "Global recipient action authentication" +msgstr "Autenticazione globale del destinatario" + +#: apps/web/src/app/(profile)/p/[url]/not-found.tsx:30 +#: apps/web/src/app/(recipient)/d/[token]/not-found.tsx:33 +#: apps/web/src/app/(teams)/t/[teamUrl]/error.tsx:51 +#: apps/web/src/app/(teams)/t/[teamUrl]/not-found.tsx:32 +#: apps/web/src/components/partials/not-found.tsx:67 +#: packages/ui/primitives/document-flow/document-flow-root.tsx:142 +msgid "Go Back" +msgstr "Torna indietro" + +#: apps/web/src/app/(unauthenticated)/verify-email/[token]/client.tsx:48 +#: apps/web/src/app/(unauthenticated)/verify-email/[token]/page.tsx:73 +#: apps/web/src/app/(unauthenticated)/verify-email/[token]/page.tsx:101 +#: apps/web/src/app/(unauthenticated)/verify-email/page.tsx:38 +msgid "Go back home" +msgstr "Torna alla home" + +#: apps/web/src/app/(signing)/sign/[token]/complete/page.tsx:224 +#: apps/web/src/app/(signing)/sign/[token]/no-longer-available.tsx:57 +msgid "Go Back Home" +msgstr "Torna alla home" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:76 +msgid "Go to owner" +msgstr "Vai al proprietario" + +#: apps/web/src/app/(profile)/p/[url]/page.tsx:147 +msgid "Go to your <0>public profile settings to add documents." +msgstr "Vai alle tue <0>impostazioni del profilo pubblico per aggiungere documenti." + +#: packages/ui/primitives/signature-pad/signature-pad.tsx:565 +msgid "Green" +msgstr "Verde" + +#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:107 +msgid "has invited you to approve this document" +msgstr "ti ha invitato ad approvare questo documento" + +#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:98 +msgid "has invited you to sign this document" +msgstr "ti ha invitato a firmare questo documento" + +#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:89 +msgid "has invited you to view this document" +msgstr "ti ha invitato a visualizzare questo documento" + +#: apps/web/src/app/(dashboard)/settings/profile/page.tsx:29 +msgid "Here you can edit your personal details." +msgstr "Qui puoi modificare i tuoi dati personali." + +#: apps/web/src/app/(dashboard)/settings/security/page.tsx:35 +msgid "Here you can manage your password and security settings." +msgstr "Qui puoi gestire la tua password e le impostazioni di sicurezza." + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/page.tsx:43 +msgid "Here you can set preferences and defaults for branding." +msgstr "Qui puoi impostare preferenze e valori predefiniti per il branding." + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/page.tsx:34 +msgid "Here you can set preferences and defaults for your team." +msgstr "Qui puoi impostare preferenze e valori predefiniti per il tuo team." + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:201 +msgid "Here's how it works:" +msgstr "Ecco come funziona:" + +#: apps/web/src/components/ui/user-profile-timur.tsx:49 +msgid "Hey I’m Timur" +msgstr "Ciao, sono Timur" + +#: packages/email/templates/bulk-send-complete.tsx:36 +msgid "Hi {userName}," +msgstr "" + +#: packages/email/templates/reset-password.tsx:56 +msgid "Hi, {userName} <0>({userEmail})" +msgstr "Ciao, {userName} <0>({userEmail})" + +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:183 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:201 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:154 +msgid "Hide" +msgstr "Nascondi" + +#: apps/web/src/components/document/document-history-sheet.tsx:111 +msgid "Hide additional information" +msgstr "Nascondi informazioni aggiuntive" + +#: packages/lib/constants/recipient-roles.ts:44 +msgid "I am a signer of this document" +msgstr "Sono un firmatario di questo documento" + +#: packages/lib/constants/recipient-roles.ts:47 +msgid "I am a viewer of this document" +msgstr "Sono un visualizzatore di questo documento" + +#: packages/lib/constants/recipient-roles.ts:45 +msgid "I am an approver of this document" +msgstr "Sono un approvatore di questo documento" + +#: packages/lib/constants/recipient-roles.ts:46 +msgid "I am required to receive a copy of this document" +msgstr "Sono tenuto a ricevere una copia di questo documento" + +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:43 +msgid "I am the owner of this document" +msgstr "Sono il proprietario di questo documento" + +#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:186 +#: apps/web/src/components/(dashboard)/settings/webhooks/delete-webhook-dialog.tsx:173 +msgid "I'm sure! Delete it" +msgstr "Sono sicuro! Eliminalo" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:103 +msgid "If they accept this request, the team will be transferred to their account." +msgstr "Se accettano questa richiesta, il team sarà trasferito sul loro account." + +#: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:196 +msgid "If you do not want to use the authenticator prompted, you can close it, which will then display the next available authenticator." +msgstr "Se non vuoi utilizzare l'autenticatore richiesto, puoi chiuderlo, dopodiché verrà mostrato il successivo disponibile." + +#: apps/web/src/app/(unauthenticated)/unverified-account/page.tsx:30 +msgid "If you don't find the confirmation link in your inbox, you can request a new one below." +msgstr "Se non trovi il link di conferma nella tua casella di posta, puoi richiederne uno nuovo qui sotto." + +#: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:213 +msgid "If your authenticator app does not support QR codes, you can use the following code instead:" +msgstr "Se la tua app autenticatrice non supporta i codici QR, puoi usare il seguente codice:" + +#: apps/web/src/components/formatter/document-status.tsx:40 +msgid "Inbox" +msgstr "Posta in arrivo" + +#: apps/web/src/components/(dashboard)/common/command-menu.tsx:52 +msgid "Inbox documents" +msgstr "Documenti in arrivo" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:278 +msgid "Include the Signing Certificate in the Document" +msgstr "Includi il certificato di firma nel documento" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:54 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:51 +msgid "Information" +msgstr "Informazioni" + +#: packages/ui/components/recipient/recipient-action-auth-select.tsx:29 +#: packages/ui/components/recipient/recipient-action-auth-select.tsx:87 +msgid "Inherit authentication method" +msgstr "Ereditare metodo di autenticazione" + +#: apps/web/src/app/(signing)/sign/[token]/initials-field.tsx:132 +#: packages/ui/primitives/document-flow/types.ts:51 +msgid "Initials" +msgstr "Iniziali" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:78 +msgid "Inserted" +msgstr "Inserito" + +#: apps/web/src/app/(dashboard)/admin/stats/page.tsx:60 +msgid "Instance Stats" +msgstr "Statistiche istanze" + +#: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:151 +msgid "Invalid code. Please try again." +msgstr "Codice non valido. Riprova." + +#: packages/ui/primitives/document-flow/add-signers.types.ts:17 +msgid "Invalid email" +msgstr "Email non valida" + +#: apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx:33 +#: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:36 +msgid "Invalid link" +msgstr "Link non valido" + +#: apps/web/src/app/(unauthenticated)/team/decline/[token]/page.tsx:39 +#: apps/web/src/app/(unauthenticated)/team/invite/[token]/page.tsx:39 +msgid "Invalid token" +msgstr "Token non valido" + +#: apps/web/src/components/forms/reset-password.tsx:84 +msgid "Invalid token provided. Please try again." +msgstr "Token non valido fornito. Per favore riprova." + +#: apps/web/src/app/(unauthenticated)/team/invite/[token]/page.tsx:123 +msgid "Invitation accepted!" +msgstr "Invito accettato!" + +#: apps/web/src/app/(unauthenticated)/team/decline/[token]/page.tsx:118 +msgid "Invitation declined" +msgstr "Invito rifiutato" + +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:77 +msgid "Invitation has been deleted" +msgstr "L'invito è stato eliminato" + +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:60 +msgid "Invitation has been resent" +msgstr "L'invito è stato inviato nuovamente" + +#: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:374 +msgid "Invite" +msgstr "Invita" + +#: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:250 +msgid "Invite member" +msgstr "Invita un membro" + +#: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:275 +msgid "Invite Members" +msgstr "Invita membri" + +#: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:258 +msgid "Invite team members" +msgstr "Invita membri del team" + +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:125 +msgid "Invited At" +msgstr "Invitato il" + +#: apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx:55 +msgid "Invoice" +msgstr "Fattura" + +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:47 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:237 +msgid "IP Address" +msgstr "Indirizzo IP" + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:118 +msgid "It is crucial to keep your contact information, especially your email address, up to date with us. Please notify us immediately of any changes to ensure that you continue to receive all necessary communications." +msgstr "È fondamentale mantenere aggiornate le tue informazioni di contatto, in particolare il tuo indirizzo email. Ti preghiamo di notificarci immediatamente qualsiasi modifica per assicurarti di continuare a ricevere tutte le comunicazioni necessarie." + +#: apps/web/src/app/(profile)/p/[url]/page.tsx:134 +msgid "It looks like {0} hasn't added any documents to their profile yet." +msgstr "Sembra che {0} non abbia ancora aggiunto documenti al proprio profilo." + +#: apps/web/src/app/(unauthenticated)/verify-email/[token]/page.tsx:93 +msgid "It seems that the provided token has expired. We've just sent you another token, please check your email and try again." +msgstr "Sembra che il token fornito sia scaduto. Ti abbiamo appena inviato un altro token, controlla la tua email e riprova." + +#: apps/web/src/app/(unauthenticated)/verify-email/page.tsx:30 +msgid "It seems that there is no token provided, if you are trying to verify your email please follow the link in your email." +msgstr "Sembra che non sia stato fornito alcun token, se stai cercando di verificare la tua email, segui il link nella tua email." + +#: apps/web/src/app/(unauthenticated)/verify-email/[token]/page.tsx:40 +msgid "It seems that there is no token provided. Please check your email and try again." +msgstr "Sembra che non sia stato fornito alcun token. Controlla la tua email e riprova." + +#: apps/web/src/app/(signing)/sign/[token]/waiting/page.tsx:74 +msgid "It's currently not your turn to sign. You will receive an email with instructions once it's your turn to sign the document." +msgstr "Al momento, non è il tuo turno di firmare. Riceverai un'email con le istruzioni quando sarà il tuo turno di firmare il documento." + +#: packages/email/templates/team-invite.tsx:72 +msgid "Join {teamName} on Documenso" +msgstr "Unisci a {teamName} su Documenso" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:67 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:72 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:55 +msgid "Label" +msgstr "Etichetta" + +#: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:286 +#: packages/ui/primitives/document-flow/add-settings.tsx:187 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:184 +msgid "Language" +msgstr "Lingua" + +#: apps/web/src/components/(dashboard)/period-selector/period-selector.tsx:61 +msgid "Last 14 days" +msgstr "Ultimi 14 giorni" + +#: apps/web/src/components/(dashboard)/period-selector/period-selector.tsx:64 +msgid "Last 30 days" +msgstr "Ultimi 30 giorni" + +#: apps/web/src/components/(dashboard)/period-selector/period-selector.tsx:58 +msgid "Last 7 days" +msgstr "Ultimi 7 giorni" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:42 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:39 +msgid "Last modified" +msgstr "Ultima modifica" + +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-page-view.tsx:91 +msgid "Last updated" +msgstr "Ultimo aggiornamento" + +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:122 +msgid "Last Updated" +msgstr "Ultimo aggiornamento" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/page.tsx:52 +msgid "Last updated at" +msgstr "Ultimo aggiornamento il" + +#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table.tsx:69 +msgid "Last used" +msgstr "Ultimo utilizzo" + +#: apps/web/src/app/(dashboard)/admin/nav.tsx:93 +msgid "Leaderboard" +msgstr "Classifica" + +#: apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx:111 +#: apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx:115 +msgid "Leave" +msgstr "Lascia" + +#: apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx:73 +msgid "Leave team" +msgstr "Lascia il team" + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:45 +msgid "Legality of Electronic Signatures" +msgstr "Legalità delle firme elettroniche" + +#: apps/web/src/components/(dashboard)/common/command-menu.tsx:264 +msgid "Light Mode" +msgstr "Modalità chiara" + +#: apps/web/src/app/(profile)/profile-header.tsx:71 +msgid "Like to have your own public profile with agreements?" +msgstr "Ti piacerebbe avere il tuo profilo pubblico con accordi?" + +#: packages/email/templates/confirm-team-email.tsx:124 +#: packages/email/templates/team-transfer-request.tsx:87 +msgid "Link expires in 1 hour." +msgstr "Il link scade tra 1 ora." + +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:215 +msgid "Link template" +msgstr "Collega modello" + +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:314 +msgid "Links Generated" +msgstr "Link Generati" + +#: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:79 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/page.tsx:84 +msgid "Listening to {0}" +msgstr "Ascoltando {0}" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recent-activity.tsx:98 +msgid "Load older activity" +msgstr "Carica attività precedente" + +#: apps/web/src/app/(dashboard)/documents/[id]/loading.tsx:33 +#: packages/ui/primitives/lazy-pdf-viewer.tsx:15 +#: packages/ui/primitives/pdf-viewer.tsx:44 +msgid "Loading document..." +msgstr "Caricamento del documento..." + +#: apps/web/src/app/(dashboard)/documents/[id]/loading.tsx:20 +#: apps/web/src/app/(dashboard)/documents/[id]/sent/page.tsx:19 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:90 +msgid "Loading Document..." +msgstr "Caricamento Documento..." + +#: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:92 +#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:103 +msgid "Loading teams..." +msgstr "Caricamento dei team..." + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recent-activity.tsx:98 +msgid "Loading..." +msgstr "Caricamento in corso..." + +#: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:54 +#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:75 +#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:67 +msgid "Login" +msgstr "Accedi" + +#: apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx:99 +msgid "Manage" +msgstr "Gestisci" + +#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:90 +msgid "Manage {0}'s profile" +msgstr "Gestisci il profilo di {0}" + +#: apps/web/src/app/(dashboard)/settings/teams/page.tsx:26 +msgid "Manage all teams you are currently associated with." +msgstr "Gestisci tutti i team a cui sei attualmente associato." + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:164 +msgid "Manage and view template" +msgstr "Gestisci e visualizza il modello" + +#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:136 +msgid "Manage billing" +msgstr "Gestisci la fatturazione" + +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:339 +msgid "Manage details for this public template" +msgstr "Gestisci i dettagli per questo modello pubblico" + +#: apps/web/src/app/(dashboard)/templates/[id]/template-direct-link-dialog-wrapper.tsx:35 +msgid "Manage Direct Link" +msgstr "Gestisci Link Diretto" + +#: apps/web/src/app/(dashboard)/admin/documents/page.tsx:13 +msgid "Manage documents" +msgstr "Gestisci documenti" + +#: apps/web/src/app/(dashboard)/settings/security/page.tsx:118 +msgid "Manage passkeys" +msgstr "Gestisci chiavi di accesso" + +#: apps/web/src/components/(teams)/team-billing-portal-button.tsx:41 +msgid "Manage subscription" +msgstr "Gestisci abbonamento" + +#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:67 +msgid "Manage Subscription" +msgstr "Gestisci Abbonamento" + +#: apps/web/src/app/(dashboard)/admin/subscriptions/page.tsx:24 +msgid "Manage subscriptions" +msgstr "Gestisci abbonamenti" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx:87 +msgid "Manage team subscription." +msgstr "Gestisci abbonamento del team." + +#: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:168 +msgid "Manage teams" +msgstr "Gestisci gruppi" + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:361 +msgid "Manage the direct link signing for this template" +msgstr "Gestisci la firma del link diretto per questo modello" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/members/page.tsx:32 +msgid "Manage the members or invite new members." +msgstr "Gestisci i membri o invita nuovi membri." + +#: apps/web/src/app/(dashboard)/admin/users/page.tsx:35 +msgid "Manage users" +msgstr "Gestisci utenti" + +#: apps/web/src/app/(dashboard)/settings/security/passkeys/page.tsx:33 +msgid "Manage your passkeys." +msgstr "Gestisci le tue chiavi di accesso." + +#: apps/web/src/app/(dashboard)/admin/site-settings/page.tsx:27 +msgid "Manage your site settings here" +msgstr "Gestisci le impostazioni del tuo sito qui" + +#: packages/lib/constants/teams.ts:11 +msgid "Manager" +msgstr "Responsabile" + +#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:141 +msgid "Mark as Viewed" +msgstr "Segna come visto" + +#: apps/web/src/app/(dashboard)/admin/stats/page.tsx:137 +msgid "MAU (created document)" +msgstr "MAU (documento creato)" + +#: apps/web/src/app/(dashboard)/admin/stats/page.tsx:143 +msgid "MAU (had document completed)" +msgstr "MAU (ha completato il documento)" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:209 +msgid "Max" +msgstr "" + +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:227 +msgid "Maximum file size: 4MB. Maximum 100 rows per upload. Blank values will use template defaults." +msgstr "" + +#: packages/lib/constants/teams.ts:12 +msgid "Member" +msgstr "Membro" + +#: apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx:88 +#: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:111 +msgid "Member Since" +msgstr "Membro dal" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/members/page.tsx:31 +#: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:86 +#: apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx:95 +msgid "Members" +msgstr "Membri" + +#: packages/ui/primitives/document-flow/add-subject.tsx:160 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:384 +msgid "Message <0>(Optional)" +msgstr "Messaggio <0>(Opzionale)" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:197 +msgid "Min" +msgstr "" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:55 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recipients.tsx:35 +msgid "Modify recipients" +msgstr "Modifica destinatari" + +#: apps/web/src/app/(dashboard)/settings/billing/billing-plans.tsx:30 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx:54 +msgid "Monthly" +msgstr "Mensile" + +#: apps/web/src/app/(dashboard)/admin/stats/page.tsx:138 +msgid "Monthly Active Users: Users that created at least one Document" +msgstr "Utenti attivi mensili: Utenti che hanno creato almeno un documento" + +#: apps/web/src/app/(dashboard)/admin/stats/page.tsx:145 +msgid "Monthly Active Users: Users that had at least one of their documents completed" +msgstr "Utenti attivi mensili: Utenti con almeno uno dei loro documenti completati" + +#: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:123 +#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:134 +msgid "Move" +msgstr "Sposta" + +#: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:78 +msgid "Move Document to Team" +msgstr "Sposta documento al team" + +#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:89 +msgid "Move Template to Team" +msgstr "Sposta modello al team" + +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:168 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:87 +msgid "Move to Team" +msgstr "Sposta nel team" + +#: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:123 +#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:134 +msgid "Moving..." +msgstr "Spostamento..." + +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:44 +msgid "My templates" +msgstr "I miei modelli" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:148 +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:56 +#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:101 +#: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:66 +#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:144 +#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table.tsx:59 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:299 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:306 +#: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:118 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:175 +#: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:153 +#: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:141 +#: apps/web/src/components/forms/signup.tsx:160 +#: packages/ui/primitives/document-flow/add-fields.tsx:919 +#: packages/ui/primitives/document-flow/add-signers.tsx:549 +#: packages/ui/primitives/document-flow/add-signers.tsx:555 +#: packages/ui/primitives/document-flow/types.ts:55 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:784 +#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:505 +#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:511 +msgid "Name" +msgstr "Nome" + +#: apps/web/src/app/(signing)/sign/[token]/complete/page.tsx:209 +msgid "Need to sign documents?" +msgstr "Hai bisogno di firmare documenti?" + +#: packages/ui/components/recipient/recipient-role-select.tsx:52 +msgid "Needs to approve" +msgstr "Necessita di approvazione" + +#: packages/ui/components/recipient/recipient-role-select.tsx:31 +msgid "Needs to sign" +msgstr "Necessita di firma" + +#: packages/ui/components/recipient/recipient-role-select.tsx:73 +msgid "Needs to view" +msgstr "Necessita di visualizzazione" + +#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table.tsx:74 +msgid "Never" +msgstr "Mai" + +#: apps/web/src/components/forms/token.tsx:224 +msgid "Never expire" +msgstr "Mai scadere" + +#: apps/web/src/components/(teams)/dialogs/transfer-team-dialog.tsx:176 +msgid "New team owner" +msgstr "Nuovo proprietario del team" + +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:95 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:102 +msgid "New Template" +msgstr "Nuovo modello" + +#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:462 +#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:341 +#: apps/web/src/components/forms/v2/signup.tsx:525 +msgid "Next" +msgstr "Successivo" + +#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:61 +msgid "Next field" +msgstr "Campo successivo" + +#: apps/web/src/app/(dashboard)/documents/empty-state.tsx:24 +msgid "No active drafts" +msgstr "Nessuna bozza attiva" + +#: apps/web/src/app/(signing)/sign/[token]/rejected/page.tsx:99 +msgid "No further action is required from you at this time." +msgstr "Non sono richieste ulteriori azioni da parte tua in questo momento." + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx:43 +msgid "No payment required" +msgstr "Nessun pagamento richiesto" + +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:120 +msgid "No public profile templates found" +msgstr "Nessun modello di profilo pubblico trovato" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recent-activity.tsx:106 +msgid "No recent activity" +msgstr "Nessuna attività recente" + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:99 +msgid "No recent documents" +msgstr "Nessun documento recente" + +#: packages/ui/primitives/document-flow/add-fields.tsx:705 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:598 +msgid "No recipient matching this description was found." +msgstr "Nessun destinatario corrispondente a questa descrizione è stato trovato." + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:70 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recipients.tsx:49 +#: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:96 +#: packages/ui/primitives/document-flow/add-subject.tsx:215 +msgid "No recipients" +msgstr "Nessun destinatario" + +#: packages/ui/primitives/document-flow/add-fields.tsx:720 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:613 +msgid "No recipients with this role" +msgstr "Nessun destinatario con questo ruolo" + +#: packages/ui/components/document/document-global-auth-access-select.tsx:30 +#: packages/ui/components/document/document-global-auth-access-select.tsx:43 +#: packages/ui/components/document/document-global-auth-action-select.tsx:31 +#: packages/ui/components/document/document-global-auth-action-select.tsx:46 +msgid "No restrictions" +msgstr "Nessuna restrizione" + +#: packages/ui/primitives/data-table.tsx:148 +msgid "No results found" +msgstr "Nessun risultato trovato" + +#: apps/web/src/components/(dashboard)/common/command-menu.tsx:200 +msgid "No results found." +msgstr "Nessun risultato trovato." + +#: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx:30 +msgid "No signature field found" +msgstr "Nessun campo di firma trovato" + +#: apps/web/src/app/(unauthenticated)/verify-email/[token]/page.tsx:37 +msgid "No token provided" +msgstr "Nessun token fornito" + +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:282 +msgid "No valid direct templates found" +msgstr "Nessun modello diretto valido trovato" + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:288 +msgid "No valid recipients found" +msgstr "Nessun destinatario valido trovato" + +#: apps/web/src/app/(dashboard)/admin/users/[id]/multiselect-role-combobox.tsx:64 +#: apps/web/src/components/(dashboard)/settings/webhooks/trigger-multiselect-combobox.tsx:77 +#: packages/ui/primitives/combobox.tsx:60 +#: packages/ui/primitives/multi-select-combobox.tsx:153 +msgid "No value found." +msgstr "Nessun valore trovato." + +#: apps/web/src/app/(unauthenticated)/forgot-password/page.tsx:25 +msgid "No worries, it happens! Enter your email and we'll email you a special link to reset your password." +msgstr "Non ti preoccupare, succede! Inserisci la tua email e ti invieremo un link speciale per reimpostare la tua password." + +#: packages/lib/constants/document.ts:32 +msgid "None" +msgstr "Nessuno" + +#: apps/web/src/components/forms/signin.tsx:161 +msgid "Not supported" +msgstr "Non supportato" + +#: apps/web/src/app/(dashboard)/documents/empty-state.tsx:19 +#: apps/web/src/app/(dashboard)/documents/empty-state.tsx:34 +msgid "Nothing to do" +msgstr "Niente da fare" + +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:284 +#: packages/ui/primitives/document-flow/add-fields.tsx:997 +#: packages/ui/primitives/document-flow/types.ts:56 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:862 +msgid "Number" +msgstr "Numero" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:103 +msgid "Number format" +msgstr "Formato numero" + +#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:103 +msgid "on behalf of \"{0}\" has invited you to approve this document" +msgstr "per conto di \"{0}\" ti ha invitato ad approvare questo documento" + +#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:94 +msgid "on behalf of \"{0}\" has invited you to sign this document" +msgstr "per conto di \"{0}\" ti ha invitato a firmare questo documento" + +#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:85 +msgid "on behalf of \"{0}\" has invited you to view this document" +msgstr "per conto di \"{0}\" ti ha invitato a visualizzare questo documento" + +#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:128 +msgid "On this page, you can create a new webhook." +msgstr "In questa pagina, puoi creare un nuovo webhook." + +#: apps/web/src/app/(dashboard)/settings/tokens/page.tsx:26 +msgid "On this page, you can create new API tokens and manage the existing ones. <0/>Also see our <1>Documentation." +msgstr "In questa pagina, puoi creare nuovi token API e gestire quelli esistenti. <0/>Consulta anche la nostra <1>Documentazione." + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:60 +msgid "On this page, you can create new API tokens and manage the existing ones. <0/>You can view our swagger docs <1>here" +msgstr "In questa pagina, puoi creare nuovi token API e gestire quelli esistenti. <0/>Puoi visualizzare la nostra documentazione swagger <1>qui" + +#: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:29 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/page.tsx:34 +msgid "On this page, you can create new Webhooks and manage the existing ones." +msgstr "In questa pagina, puoi creare nuovi Webhook e gestire quelli esistenti." + +#: apps/web/src/app/(dashboard)/settings/webhooks/[id]/page.tsx:95 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/[id]/page.tsx:101 +msgid "On this page, you can edit the webhook and its settings." +msgstr "In questa pagina, puoi modificare il webhook e le sue impostazioni." + +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:135 +msgid "Once confirmed, the following will occur:" +msgstr "Una volta confermato, si verificherà quanto segue:" + +#: packages/lib/constants/template.ts:9 +msgid "Once enabled, you can select any active recipient to be a direct link signing recipient, or create a new one. This recipient type cannot be edited or deleted." +msgstr "Una volta abilitato, puoi selezionare qualsiasi destinatario attivo per essere un destinatario di firma a link diretto, o crearne uno nuovo. Questo tipo di destinatario non può essere modificato o eliminato." + +#: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:224 +msgid "Once you have scanned the QR code or entered the code manually, enter the code provided by your authenticator app below." +msgstr "Una volta scansionato il codice QR o inserito manualmente il codice, inserisci il codice fornito dalla tua app di autenticazione qui sotto." + +#: packages/lib/constants/template.ts:17 +msgid "Once your template is set up, share the link anywhere you want. The person who opens the link will be able to enter their information in the direct link recipient field and complete any other fields assigned to them." +msgstr "Una volta configurato il tuo modello, condividi il link ovunque tu voglia. La persona che apre il link potrà inserire le proprie informazioni nel campo destinatario del link diretto e completare qualsiasi altro campo assegnato a loro." + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:146 +msgid "Only admins can access and view the document" +msgstr "Solo gli amministratori possono accedere e visualizzare il documento" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:143 +msgid "Only managers and above can access and view the document" +msgstr "Solo i manager e superiori possono accedere e visualizzare il documento" + +#: apps/web/src/components/forms/v2/signup.tsx:82 +msgid "Only subscribers can have a username shorter than 6 characters" +msgstr "Solo gli abbonati possono avere un nome utente più corto di 6 caratteri" + +#: apps/web/src/app/(profile)/p/[url]/not-found.tsx:19 +#: apps/web/src/app/(recipient)/d/[token]/not-found.tsx:19 +#: apps/web/src/app/(teams)/t/[teamUrl]/error.tsx:37 +#: apps/web/src/app/(teams)/t/[teamUrl]/not-found.tsx:19 +#: apps/web/src/components/partials/not-found.tsx:49 +msgid "Oops! Something went wrong." +msgstr "Ops! Qualcosa è andato storto." + +#: apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx:140 +msgid "Opened" +msgstr "Aperto" + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:332 +#: apps/web/src/components/forms/signup.tsx:239 +#: apps/web/src/components/forms/signup.tsx:263 +#: apps/web/src/components/forms/v2/signup.tsx:387 +msgid "Or" +msgstr "Oppure" + +#: apps/web/src/components/forms/signin.tsx:391 +msgid "Or continue with" +msgstr "Oppure continua con" + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:351 +msgid "Otherwise, the document will be created as a draft." +msgstr "Altrimenti, il documento sarà creato come bozza." + +#: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:86 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:104 +#: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:81 +#: apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx:84 +#: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:107 +msgid "Owner" +msgstr "Proprietario" + +#: packages/ui/primitives/data-table-pagination.tsx:77 +msgid "Page {0} of {1}" +msgstr "Pagina {0} di {1}" + +#: packages/ui/primitives/pdf-viewer.tsx:259 +msgid "Page {0} of {numPages}" +msgstr "Pagina {0} di {numPages}" + +#: apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx:79 +msgid "Paid" +msgstr "Pagato" + +#: apps/web/src/components/forms/signin.tsx:436 +msgid "Passkey" +msgstr "Password" + +#: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:229 +msgid "Passkey already exists for the provided authenticator" +msgstr "Una passkey esiste già per l'autenticatore fornito" + +#: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:219 +msgid "Passkey creation cancelled due to one of the following reasons:" +msgstr "Creazione della passkey annullata per uno dei seguenti motivi:" + +#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:88 +msgid "Passkey has been removed" +msgstr "La passkey è stata rimossa" + +#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:68 +msgid "Passkey has been updated" +msgstr "La passkey è stata aggiornata" + +#: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:177 +msgid "Passkey name" +msgstr "Nome della passkey" + +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:121 +msgid "Passkey Re-Authentication" +msgstr "Ri-autenticazione con chiave di accesso" + +#: apps/web/src/app/(dashboard)/settings/security/page.tsx:106 +#: apps/web/src/app/(dashboard)/settings/security/passkeys/page.tsx:32 +msgid "Passkeys" +msgstr "Passkey" + +#: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:158 +msgid "Passkeys allow you to sign in and authenticate using biometrics, password managers, etc." +msgstr "Le passkey permettono di autenticarsi usando dati biometrici, gestori di password, ecc." + +#: apps/web/src/components/forms/signin.tsx:162 +msgid "Passkeys are not supported on this browser" +msgstr "Le passkey non sono supportate su questo browser" + +#: apps/web/src/components/(dashboard)/common/command-menu.tsx:70 +#: apps/web/src/components/forms/password.tsx:128 +#: apps/web/src/components/forms/reset-password.tsx:115 +#: apps/web/src/components/forms/signin.tsx:357 +#: apps/web/src/components/forms/signup.tsx:192 +#: apps/web/src/components/forms/v2/signup.tsx:348 +msgid "Password" +msgstr "\"Password\"" + +#: packages/ui/primitives/document-password-dialog.tsx:62 +msgid "Password Required" +msgstr "Password richiesta" + +#: packages/email/templates/forgot-password.tsx:19 +msgid "Password Reset Requested" +msgstr "Richiesta di reimpostazione password" + +#: packages/email/templates/reset-password.tsx:20 +msgid "Password Reset Successful" +msgstr "Reimpostazione password riuscita" + +#: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:51 +#: apps/web/src/components/forms/v2/signup.tsx:72 +msgid "Password should not be common or based on personal information" +msgstr "La password non deve essere comune o basata su informazioni personali" + +#: apps/web/src/components/forms/password.tsx:72 +#: apps/web/src/components/forms/reset-password.tsx:73 +msgid "Password updated" +msgstr "Password aggiornato" + +#: packages/email/template-components/template-reset-password.tsx:22 +msgid "Password updated!" +msgstr "Password aggiornata!" + +#: apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx:46 +msgid "Pay" +msgstr "Paga" + +#: apps/web/src/components/(teams)/dialogs/create-team-checkout-dialog.tsx:89 +msgid "Payment is required to finalise the creation of your team." +msgstr "È necessario il pagamento per completare la creazione del tuo team." + +#: apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx:82 +#: apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx:107 +msgid "Payment overdue" +msgstr "Pagamento scaduto" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:131 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:205 +#: apps/web/src/components/(teams)/tables/teams-member-page-data-table.tsx:82 +#: apps/web/src/components/(teams)/tables/user-settings-teams-page-data-table.tsx:77 +#: apps/web/src/components/document/document-read-only-fields.tsx:89 +#: apps/web/src/components/formatter/document-status.tsx:22 +#: packages/lib/constants/document.ts:16 +msgid "Pending" +msgstr "In sospeso" + +#: packages/email/templates/document-pending.tsx:19 +msgid "Pending Document" +msgstr "Documento in sospeso" + +#: apps/web/src/components/(dashboard)/common/command-menu.tsx:51 +msgid "Pending documents" +msgstr "Documenti in sospeso" + +#: apps/web/src/app/(dashboard)/admin/stats/page.tsx:89 +msgid "Pending Documents" +msgstr "Documenti in sospeso" + +#: apps/web/src/app/(dashboard)/settings/teams/team-invitations.tsx:62 +msgid "Pending invitations" +msgstr "Inviti in sospeso" + +#: apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx:28 +msgid "Pending team deleted." +msgstr "Team in sospeso eliminato." + +#: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:134 +msgid "Personal" +msgstr "Personale" + +#: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:77 +msgid "Personal Account" +msgstr "Account personale" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:156 +msgid "Pick a number" +msgstr "Scegli un numero" + +#: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:151 +msgid "Pick a password" +msgstr "Inserisci una password" + +#: apps/web/src/components/ui/user-profile-timur.tsx:53 +msgid "Pick any of the following agreements below and start signing to get started" +msgstr "Scegli uno dei seguenti accordi e inizia a firmare per iniziare" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:79 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:84 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:67 +msgid "Placeholder" +msgstr "Segnaposto" + +#: packages/email/template-components/template-document-invite.tsx:55 +msgid "Please {0} your document<0/>\"{documentName}\"" +msgstr "Per favore {0} il tuo documento<0/>\"{documentName}\"" + +#: packages/email/templates/document-invite.tsx:50 +msgid "Please {action} your document {documentName}" +msgstr "Per favore {action} il tuo documento {documentName}" + +#: packages/lib/jobs/definitions/emails/send-signing-email.handler.ts:99 +msgid "Please {recipientActionVerb} this document" +msgstr "Per favore {recipientActionVerb} questo documento" + +#: packages/lib/jobs/definitions/emails/send-signing-email.handler.ts:113 +msgid "Please {recipientActionVerb} this document created by your direct template" +msgstr "Per favore {recipientActionVerb} questo documento creato dal tuo modello diretto" + +#: packages/lib/jobs/definitions/emails/send-signing-email.handler.ts:105 +msgid "Please {recipientActionVerb} your document" +msgstr "Per favore {recipientActionVerb} il tuo documento" + +#: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:212 +msgid "Please check the CSV file and make sure it is according to our format" +msgstr "Si prega di controllare il file CSV e assicurarsi che sia conforme al nostro formato" + +#: apps/web/src/app/(signing)/sign/[token]/waiting/page.tsx:81 +msgid "Please check your email for updates." +msgstr "Per favore controlla la tua email per aggiornamenti." + +#: apps/web/src/app/(unauthenticated)/reset-password/[token]/page.tsx:34 +msgid "Please choose your new password" +msgstr "Per favore scegli la tua nuova password" + +#: packages/lib/server-only/auth/send-confirmation-email.ts:67 +msgid "Please confirm your email" +msgstr "Per favore conferma la tua email" + +#: packages/email/templates/confirm-email.tsx:17 +msgid "Please confirm your email address" +msgstr "Per favore conferma il tuo indirizzo email" + +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:175 +msgid "Please contact support if you would like to revert this action." +msgstr "Si prega di contattare il supporto se si desidera annullare questa azione." + +#: apps/web/src/components/forms/token.tsx:175 +msgid "Please enter a meaningful name for your token. This will help you identify it later." +msgstr "Si prega di inserire un nome significativo per il proprio token. Questo ti aiuterà a identificarlo più tardi." + +#: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:41 +#: apps/web/src/components/forms/v2/signup.tsx:53 +msgid "Please enter a valid name." +msgstr "Per favore inserisci un nome valido." + +#: apps/web/src/app/(signing)/sign/[token]/form.tsx:148 +msgid "Please mark as viewed to complete" +msgstr "Si prega di segnare come visualizzato per completare" + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:453 +msgid "Please note that proceeding will remove direct linking recipient and turn it into a placeholder." +msgstr "Si prega di notare che procedendo si rimuoverà il destinatario del link diretto e si trasformerà in un segnaposto." + +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:129 +msgid "Please note that this action is <0>irreversible." +msgstr "Si prega di notare che questa azione è <0>irreversibile." + +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:120 +msgid "Please note that this action is <0>irreversible. Once confirmed, this document will be permanently deleted." +msgstr "Si prega di notare che questa azione è <0>irreversibile. Una volta confermato, questo documento sarà eliminato permanentemente." + +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:62 +msgid "Please note that this action is irreversible. Once confirmed, your template will be permanently deleted." +msgstr "Si prega di notare che questa azione è irreversibile. Una volta confermato, il tuo modello sarà eliminato permanentemente." + +#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:133 +msgid "Please note that this action is irreversible. Once confirmed, your token will be permanently deleted." +msgstr "Si prega di notare che questa azione è irreversibile. Una volta confermato, il tuo token sarà eliminato permanentemente." + +#: apps/web/src/components/(dashboard)/settings/webhooks/delete-webhook-dialog.tsx:121 +msgid "Please note that this action is irreversible. Once confirmed, your webhook will be permanently deleted." +msgstr "Si prega di notare che questa azione è irreversibile. Una volta confermato, il tuo webhook sarà eliminato permanentemente." + +#: apps/web/src/components/(teams)/dialogs/delete-team-dialog.tsx:130 +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/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:37 +msgid "Please provide a reason" +msgstr "Per favore, fornire una ragione" + +#: apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx:127 +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." + +#: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:120 +msgid "Please provide a token from your authenticator, or a backup code." +msgstr "Si prega di fornire un token dal tuo autenticatore, o un codice di backup." + +#: apps/web/src/app/(signing)/sign/[token]/form.tsx:182 +msgid "Please review the document before signing." +msgstr "Rivedi il documento prima di firmare." + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:503 +msgid "Please select a PDF file" +msgstr "Seleziona un file PDF" + +#: apps/web/src/components/forms/send-confirmation-email.tsx:64 +msgid "Please try again and make sure you enter the correct email address." +msgstr "Si prega di riprovare assicurandosi di inserire l'indirizzo email corretto." + +#: apps/web/src/components/forms/signin.tsx:204 +msgid "Please try again later or login using your normal details" +msgstr "Si prega di riprovare più tardi o accedi utilizzando i tuoi dettagli normali" + +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:79 +msgid "Please try again later." +msgstr "Si prega di riprovare più tardi." + +#: packages/ui/primitives/pdf-viewer.tsx:223 +#: packages/ui/primitives/pdf-viewer.tsx:238 +msgid "Please try again or contact our support." +msgstr "Per favore, riprova o contatta il nostro supporto." + +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:185 +msgid "Please type {0} to confirm" +msgstr "Per favore, digita {0} per confermare" + +#: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:123 +msgid "Please type <0>{0} to confirm." +msgstr "Si prega di digitare <0>{0} per confermare." + +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:172 +msgid "Pre-formatted CSV template with example data." +msgstr "" + +#: apps/web/src/components/(dashboard)/common/command-menu.tsx:214 +#: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:58 +#: apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx:67 +msgid "Preferences" +msgstr "Preferenze" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:216 +msgid "Preview" +msgstr "Anteprima" + +#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:63 +msgid "Preview and configure template." +msgstr "Anteprima e configurazione del modello." + +#: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:105 +#: apps/web/src/components/formatter/template-type.tsx:22 +msgid "Private" +msgstr "Privato" + +#: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:115 +msgid "Private templates can only be modified and viewed by you." +msgstr "I modelli privati possono essere modificati e visualizzati solo da te." + +#: apps/web/src/app/(dashboard)/settings/profile/page.tsx:28 +#: apps/web/src/components/(dashboard)/common/command-menu.tsx:69 +#: apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx:36 +#: apps/web/src/components/(dashboard)/settings/layout/mobile-nav.tsx:39 +msgid "Profile" +msgstr "Profilo" + +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:183 +msgid "Profile is currently <0>hidden." +msgstr "Il profilo è attualmente <0>nascosto." + +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:171 +msgid "Profile is currently <0>visible." +msgstr "Il profilo è attualmente <0>visibile." + +#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:74 +#: apps/web/src/components/forms/profile.tsx:71 +msgid "Profile updated" +msgstr "Profilo aggiornato" + +#: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:78 +#: apps/web/src/components/formatter/template-type.tsx:27 +msgid "Public" +msgstr "Pubblico" + +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:42 +#: apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx:50 +#: apps/web/src/components/(dashboard)/settings/layout/mobile-nav.tsx:53 +#: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:72 +#: apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx:81 +msgid "Public Profile" +msgstr "Profilo pubblico" + +#: apps/web/src/components/forms/public-profile-form.tsx:146 +msgid "Public profile URL" +msgstr "URL del profilo pubblico" + +#: apps/web/src/components/forms/v2/signup.tsx:454 +msgid "Public profile username" +msgstr "Nome utente del profilo pubblico" + +#: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:82 +msgid "Public templates are connected to your public profile. Any modifications to public templates will also appear in your public profile." +msgstr "I modelli pubblici sono collegati al tuo profilo pubblico. Ogni modifica ai modelli pubblici apparirà anche nel tuo profilo pubblico." + +#: packages/ui/primitives/document-flow/types.ts:57 +msgid "Radio" +msgstr "Radio" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:133 +msgid "Radio values" +msgstr "Valori radio" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:186 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:147 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:177 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:122 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:161 +msgid "Read only" +msgstr "Sola lettura" + +#: apps/web/src/app/(signing)/sign/[token]/signing-field-container.tsx:144 +msgid "Read only field" +msgstr "Campo di sola lettura" + +#: apps/web/src/components/general/signing-disclosure.tsx:21 +msgid "Read the full <0>signature disclosure." +msgstr "Leggi l'intera <0>divulgazione della firma." + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:106 +msgid "Ready" +msgstr "Pronto" + +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:291 +msgid "Reason" +msgstr "Motivo" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:146 +msgid "Reason for rejection:" +msgstr "Motivo del rifiuto:" + +#: packages/email/template-components/template-document-rejected.tsx:32 +msgid "Reason for rejection: {rejectionReason}" +msgstr "Motivo del rifiuto: {rejectionReason}" + +#: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:38 +msgid "Reason must be less than 500 characters" +msgstr "Il motivo deve essere inferiore a 500 caratteri" + +#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-dialog.tsx:62 +msgid "Reauthentication is required to sign this field" +msgstr "È richiesta una riautenticazione per firmare questo campo" + +#: packages/ui/components/recipient/recipient-role-select.tsx:95 +msgid "Receives copy" +msgstr "Riceve copia" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recent-activity.tsx:55 +#: apps/web/src/app/(dashboard)/settings/security/page.tsx:130 +msgid "Recent activity" +msgstr "Attività recenti" + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:43 +msgid "Recent documents" +msgstr "Documenti recenti" + +#: apps/web/src/app/(dashboard)/documents/data-table.tsx:63 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:114 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:275 +#: packages/lib/utils/document-audit-logs.ts:354 +#: packages/lib/utils/document-audit-logs.ts:369 +msgid "Recipient" +msgstr "Destinatario" + +#: packages/ui/components/recipient/recipient-action-auth-select.tsx:39 +#: packages/ui/primitives/document-flow/add-settings.tsx:269 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:337 +msgid "Recipient action authentication" +msgstr "Autenticazione azione destinatario" + +#: packages/ui/components/document/document-email-checkboxes.tsx:126 +msgid "Recipient removed email" +msgstr "Email destinatario rimosso" + +#: packages/ui/components/document/document-email-checkboxes.tsx:50 +msgid "Recipient signed email" +msgstr "Email firmato dal destinatario" + +#: packages/ui/components/document/document-email-checkboxes.tsx:88 +msgid "Recipient signing request email" +msgstr "Email richiesta firma destinatario" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:118 +msgid "Recipient updated" +msgstr "Destinatario aggiornato" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/page.tsx:66 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:49 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recipients.tsx:30 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:140 +msgid "Recipients" +msgstr "Destinatari" + +#: apps/web/src/app/(dashboard)/admin/stats/page.tsx:102 +msgid "Recipients metrics" +msgstr "Metriche dei destinatari" + +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:165 +msgid "Recipients will still retain their copy of the document" +msgstr "I destinatari conserveranno comunque la loro copia del documento" + +#: apps/web/src/components/forms/2fa/recovery-code-list.tsx:26 +msgid "Recovery code copied" +msgstr "Codice di recupero copiato" + +#: apps/web/src/app/(dashboard)/settings/security/page.tsx:84 +msgid "Recovery codes" +msgstr "Codici di recupero" + +#: packages/ui/primitives/signature-pad/signature-pad.tsx:551 +msgid "Red" +msgstr "Rosso" + +#: packages/ui/primitives/document-flow/add-settings.tsx:383 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:507 +msgid "Redirect URL" +msgstr "URL di reindirizzamento" + +#: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:83 +#: apps/web/src/components/forms/signup.tsx:95 +#: apps/web/src/components/forms/v2/signup.tsx:139 +msgid "Registration Successful" +msgstr "Registrazione avvenuta con successo" + +#: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:109 +#: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:116 +#: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:162 +#: packages/email/template-components/template-document-invite.tsx:95 +msgid "Reject Document" +msgstr "Rifiuta Documento" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:141 +#: apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx:101 +msgid "Rejected" +msgstr "Rifiutato" + +#: packages/email/template-components/template-document-rejection-confirmed.tsx:22 +msgid "Rejection Confirmed" +msgstr "Rifiuto confermato" + +#: packages/email/template-components/template-document-rejection-confirmed.tsx:34 +msgid "Rejection reason: {reason}" +msgstr "Motivo del rifiuto: {reason}" + +#: apps/web/src/app/(unauthenticated)/forgot-password/page.tsx:34 +msgid "Remembered your password? <0>Sign In" +msgstr "Ricordi la tua password? <0>Accedi" + +#: packages/lib/server-only/document/resend-document.tsx:192 +msgid "Reminder: {0}" +msgstr "Promemoria: {0}" + +#: packages/lib/server-only/document/resend-document.tsx:132 +msgid "Reminder: {0} invited you to {recipientActionVerb} a document" +msgstr "Promemoria: {0} ti ha invitato a {recipientActionVerb} un documento" + +#: packages/lib/server-only/document/resend-document.tsx:121 +msgid "Reminder: Please {recipientActionVerb} this document" +msgstr "Promemoria: per favore {recipientActionVerb} questo documento" + +#: packages/lib/server-only/document/resend-document.tsx:127 +msgid "Reminder: Please {recipientActionVerb} your document" +msgstr "Promemoria: per favore {recipientActionVerb} il tuo documento" + +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:188 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:425 +#: apps/web/src/app/(signing)/sign/[token]/signing-field-container.tsx:156 +#: apps/web/src/app/(signing)/sign/[token]/signing-field-container.tsx:180 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:250 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx:89 +#: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:159 +#: apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx:54 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:163 +#: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:165 +#: apps/web/src/components/forms/avatar-image.tsx:166 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:217 +#: packages/ui/primitives/document-flow/add-fields.tsx:1128 +msgid "Remove" +msgstr "Rimuovi" + +#: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:108 +msgid "Remove team email" +msgstr "Rimuovere l'email del team" + +#: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:162 +msgid "Remove team member" +msgstr "Rimuovere il membro del team" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx:63 +msgid "Renews: {formattedDate}" +msgstr "Rinnova: {formattedDate}" + +#: apps/web/src/components/forms/password.tsx:144 +#: apps/web/src/components/forms/reset-password.tsx:131 +msgid "Repeat Password" +msgstr "Ripeti Password" + +#: apps/web/src/components/(teams)/dialogs/transfer-team-dialog.tsx:247 +msgid "Request transfer" +msgstr "Richiedi trasferimento" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:176 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:137 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:167 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:112 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:151 +msgid "Required field" +msgstr "Campo richiesto" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:61 +msgid "Reseal document" +msgstr "Risigilla documento" + +#: apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx:118 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:151 +#: packages/ui/primitives/document-flow/add-subject.tsx:84 +msgid "Resend" +msgstr "Reinvia" + +#: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:128 +msgid "Resend Confirmation Email" +msgstr "Reinvia email di conferma" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx:67 +msgid "Resend verification" +msgstr "Reinvia verifica" + +#: apps/web/src/components/(teams)/forms/update-team-form.tsx:163 +#: apps/web/src/components/forms/public-profile-form.tsx:267 +msgid "Reset" +msgstr "Ripristina" + +#: apps/web/src/components/forms/forgot-password.tsx:56 +msgid "Reset email sent" +msgstr "Email di reset inviato" + +#: apps/web/src/app/(unauthenticated)/reset-password/[token]/page.tsx:30 +#: apps/web/src/components/forms/forgot-password.tsx:93 +#: apps/web/src/components/forms/reset-password.tsx:143 +#: packages/email/template-components/template-forgot-password.tsx:33 +msgid "Reset Password" +msgstr "Reimposta password" + +#: apps/web/src/components/forms/reset-password.tsx:143 +msgid "Resetting Password..." +msgstr "Reimpostazione della password..." + +#: apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx:99 +msgid "Resolve" +msgstr "Risolvi" + +#: apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx:132 +msgid "Resolve payment" +msgstr "Risolvere il pagamento" + +#: packages/ui/components/document/document-share-button.tsx:147 +msgid "Rest assured, your document is strictly confidential and will never be shared. Only your signing experience will be highlighted. Share your personalized signing card to showcase your signature!" +msgstr "Stai tranquillo, il tuo documento è strettamente confidenziale e non sarà mai condiviso. Solo la tua esperienza di firma sarà evidenziata. Condividi la tua carta di firma personalizzata per mostrare la tua firma!" + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:126 +msgid "Retention of Documents" +msgstr "Conservazione dei documenti" + +#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:168 +msgid "Retry" +msgstr "Riprova" + +#: apps/web/src/app/(unauthenticated)/team/decline/[token]/page.tsx:48 +#: apps/web/src/app/(unauthenticated)/team/invite/[token]/page.tsx:50 +#: apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx:45 +#: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:48 +msgid "Return" +msgstr "Ritorna" + +#: apps/web/src/app/(unauthenticated)/team/decline/[token]/page.tsx:130 +msgid "Return to Dashboard" +msgstr "Torna al cruscotto" + +#: apps/web/src/app/(unauthenticated)/team/decline/[token]/page.tsx:136 +msgid "Return to Home" +msgstr "Torna alla home" + +#: apps/web/src/app/(unauthenticated)/check-email/page.tsx:32 +#: apps/web/src/app/(unauthenticated)/reset-password/page.tsx:32 +msgid "Return to sign in" +msgstr "Torna a accedere" + +#: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:118 +msgid "Revoke" +msgstr "Revoca" + +#: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:87 +msgid "Revoke access" +msgstr "Revoca l'accesso" + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:278 +#: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:318 +#: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:163 +#: apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx:80 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:120 +#: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:103 +msgid "Role" +msgstr "Ruolo" + +#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:133 +#: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:76 +msgid "Roles" +msgstr "Ruoli" + +#: packages/ui/primitives/data-table-pagination.tsx:55 +msgid "Rows per page" +msgstr "Righe per pagina" + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:440 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:350 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:361 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:312 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:305 +#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:322 +msgid "Save" +msgstr "Salva" + +#: packages/ui/primitives/template-flow/add-template-fields.tsx:974 +msgid "Save Template" +msgstr "Salva modello" + +#: apps/web/src/app/(dashboard)/documents/data-table-sender-filter.tsx:63 +#: apps/web/src/components/(dashboard)/layout/desktop-nav.tsx:81 +#: apps/web/src/components/(teams)/tables/teams-member-page-data-table.tsx:69 +#: apps/web/src/components/(teams)/tables/user-settings-teams-page-data-table.tsx:64 +msgid "Search" +msgstr "Cerca" + +#: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:140 +msgid "Search by document title" +msgstr "Cerca per titolo del documento" + +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:174 +#: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:144 +msgid "Search by name or email" +msgstr "Cerca per nome o email" + +#: apps/web/src/components/(dashboard)/document-search/document-search.tsx:42 +msgid "Search documents..." +msgstr "Cerca documenti..." + +#: packages/ui/components/common/language-switcher-dialog.tsx:34 +msgid "Search languages..." +msgstr "Cerca lingue..." + +#: apps/web/src/app/(dashboard)/settings/webhooks/[id]/page.tsx:189 +#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:217 +msgid "Secret" +msgstr "Segreto" + +#: apps/web/src/app/(dashboard)/settings/security/page.tsx:34 +#: apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx:77 +#: apps/web/src/components/(dashboard)/settings/layout/mobile-nav.tsx:80 +msgid "Security" +msgstr "Sicurezza" + +#: apps/web/src/app/(dashboard)/settings/security/activity/page.tsx:25 +msgid "Security activity" +msgstr "Attività di sicurezza" + +#: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:194 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:115 +#: packages/ui/primitives/document-flow/types.ts:59 +msgid "Select" +msgstr "Seleziona" + +#: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:87 +#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:98 +msgid "Select a team" +msgstr "Seleziona un team" + +#: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:81 +msgid "Select a team to move this document to. This action cannot be undone." +msgstr "Seleziona un team a cui spostare questo documento. Questa azione non può essere annullata." + +#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:92 +msgid "Select a team to move this template to. This action cannot be undone." +msgstr "Seleziona un team a cui spostare questo modello. Questa azione non può essere annullata." + +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:259 +msgid "Select a template you'd like to display on your public profile" +msgstr "Seleziona un modello che desideri mostrare nel tuo profilo pubblico" + +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:255 +msgid "Select a template you'd like to display on your team's public profile" +msgstr "Seleziona un modello che desideri mostrare nel profilo pubblico del tuo team" + +#: packages/ui/primitives/combobox.tsx:38 +msgid "Select an option" +msgstr "Seleziona un'opzione" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:139 +msgid "Select at least" +msgstr "Seleziona almeno" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:105 +msgid "Select default option" +msgstr "Seleziona opzione predefinita" + +#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:222 +msgid "Select passkey" +msgstr "Seleziona una chiave di accesso" + +#: packages/ui/primitives/document-flow/add-subject.tsx:82 +#: packages/ui/primitives/document-flow/add-subject.tsx:85 +#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:34 +#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:64 +msgid "Send" +msgstr "Invia" + +#: apps/web/src/components/forms/send-confirmation-email.tsx:94 +msgid "Send confirmation email" +msgstr "Invia email di conferma" + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:336 +msgid "Send document" +msgstr "Invia documento" + +#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:41 +msgid "Send Document" +msgstr "Invia documento" + +#: packages/ui/components/document/document-email-checkboxes.tsx:193 +msgid "Send document completed email" +msgstr "Invia email documento completato" + +#: packages/ui/components/document/document-email-checkboxes.tsx:269 +msgid "Send document completed email to the owner" +msgstr "Invia email documento completato al proprietario" + +#: packages/ui/components/document/document-email-checkboxes.tsx:231 +msgid "Send document deleted email" +msgstr "Invia email documento eliminato" + +#: packages/ui/components/document/document-email-checkboxes.tsx:154 +msgid "Send document pending email" +msgstr "Invia email documento in sospeso" + +#: packages/email/templates/confirm-team-email.tsx:101 +msgid "Send documents on behalf of the team using the email address" +msgstr "Invia documenti a nome del team utilizzando l'indirizzo email" + +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:253 +msgid "Send documents to recipients immediately" +msgstr "" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:200 +msgid "Send on Behalf of Team" +msgstr "Invia per conto del team" + +#: packages/ui/components/document/document-email-checkboxes.tsx:116 +msgid "Send recipient removed email" +msgstr "Invia email destinatario rimosso" + +#: packages/ui/components/document/document-email-checkboxes.tsx:40 +msgid "Send recipient signed email" +msgstr "Invia email firmato dal destinatario" + +#: packages/ui/components/document/document-email-checkboxes.tsx:78 +msgid "Send recipient signing request email" +msgstr "Invia email richiesta firma destinatario" + +#: apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx:190 +msgid "Send reminder" +msgstr "Invia promemoria" + +#: apps/web/src/app/(dashboard)/documents/data-table.tsx:59 +msgid "Sender" +msgstr "Mittente" + +#: apps/web/src/components/forms/forgot-password.tsx:93 +msgid "Sending Reset Email..." +msgstr "Invio dell'email di ripristino..." + +#: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:128 +msgid "Sending..." +msgstr "Invio..." + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:101 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:258 +msgid "Sent" +msgstr "Inviato" + +#: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:148 +msgid "Set a password" +msgstr "Imposta una password" + +#: apps/web/src/app/(dashboard)/settings/layout.tsx:20 +#: apps/web/src/components/(dashboard)/common/command-menu.tsx:65 +#: apps/web/src/components/(dashboard)/common/command-menu.tsx:211 +#: apps/web/src/components/(dashboard)/layout/mobile-navigation.tsx:47 +msgid "Settings" +msgstr "Impostazioni" + +#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:196 +msgid "Setup" +msgstr "Configurazione" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:154 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:187 +msgid "Share" +msgstr "Condividi" + +#: packages/ui/components/document/document-share-button.tsx:135 +msgid "Share Signature Card" +msgstr "Condividi carta firma" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:185 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:213 +msgid "Share Signing Card" +msgstr "Condividi scheda di firma" + +#: packages/lib/constants/template.ts:16 +msgid "Share the Link" +msgstr "Condividi il link" + +#: packages/ui/components/document/document-share-button.tsx:143 +msgid "Share your signing experience!" +msgstr "Condividi la tua esperienza di firma!" + +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:162 +msgid "Show" +msgstr "Mostra" + +#: apps/web/src/components/document/document-history-sheet.tsx:113 +msgid "Show additional information" +msgstr "Mostra informazioni aggiuntive" + +#: packages/ui/primitives/document-flow/add-signers.tsx:707 +#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:661 +msgid "Show advanced settings" +msgstr "Mostra impostazioni avanzate" + +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:45 +msgid "Show templates in your public profile for your audience to sign and get started quickly" +msgstr "Mostra modelli nel tuo profilo pubblico per il tuo pubblico da firmare e iniziare rapidamente" + +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:52 +msgid "Show templates in your team public profile for your audience to sign and get started quickly" +msgstr "Mostra modelli nel profilo pubblico della tua squadra per il tuo pubblico da firmare e iniziare rapidamente" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:89 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:115 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:133 +#: apps/web/src/app/(profile)/p/[url]/page.tsx:192 +#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:229 +#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:182 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:241 +#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:142 +#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:328 +#: apps/web/src/components/ui/user-profile-skeleton.tsx:75 +#: apps/web/src/components/ui/user-profile-timur.tsx:81 +#: packages/lib/constants/recipient-roles.ts:22 +msgid "Sign" +msgstr "Firma" + +#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:278 +msgid "Sign as {0} <0>({1})" +msgstr "Firma come {0} <0>({1})" + +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:200 +msgid "Sign as<0>{0} <1>({1})" +msgstr "Firma come<0>{0} <1>({1})" + +#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:360 +#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:240 +msgid "Sign document" +msgstr "Firma il documento" + +#: apps/web/src/app/(signing)/sign/[token]/form.tsx:141 +#: packages/email/template-components/template-document-invite.tsx:103 +msgid "Sign Document" +msgstr "Firma documento" + +#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-dialog.tsx:59 +msgid "Sign field" +msgstr "Campo di firma" + +#: apps/web/src/components/forms/signup.tsx:208 +#: apps/web/src/components/forms/v2/signup.tsx:366 +msgid "Sign Here" +msgstr "Firma qui" + +#: apps/web/src/app/not-found.tsx:29 +#: apps/web/src/components/forms/signin.tsx:384 +#: apps/web/src/components/forms/signin.tsx:511 +#: packages/email/template-components/template-reset-password.tsx:34 +msgid "Sign In" +msgstr "Accedi" + +#: apps/web/src/app/(unauthenticated)/signin/page.tsx:29 +msgid "Sign in to your account" +msgstr "Accedi al tuo account" + +#: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:297 +#: apps/web/src/components/(dashboard)/layout/mobile-navigation.tsx:84 +msgid "Sign Out" +msgstr "Disconnetti" + +#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:381 +#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:261 +msgid "Sign the document to complete the process." +msgstr "Firma il documento per completare il processo." + +#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:67 +msgid "Sign up" +msgstr "Registrati" + +#: apps/web/src/components/forms/signup.tsx:231 +msgid "Sign Up" +msgstr "Registrati" + +#: apps/web/src/components/forms/signup.tsx:253 +#: apps/web/src/components/forms/v2/signup.tsx:405 +msgid "Sign Up with Google" +msgstr "Iscriviti con Google" + +#: apps/web/src/components/forms/signup.tsx:277 +#: apps/web/src/components/forms/v2/signup.tsx:421 +msgid "Sign Up with OIDC" +msgstr "Iscriviti con OIDC" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:88 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:179 +#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:342 +#: apps/web/src/app/(signing)/sign/[token]/form.tsx:205 +#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:251 +#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:286 +#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:422 +#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:301 +#: apps/web/src/components/forms/profile.tsx:123 +#: packages/ui/primitives/document-flow/add-fields.tsx:841 +#: packages/ui/primitives/document-flow/field-icon.tsx:52 +#: packages/ui/primitives/document-flow/types.ts:49 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:706 +msgid "Signature" +msgstr "Firma" + +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:230 +msgid "Signature ID" +msgstr "ID Firma" + +#: apps/web/src/app/(signing)/sign/[token]/form.tsx:229 +#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:303 +#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:448 +#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:327 +msgid "Signature is too small. Please provide a more complete signature." +msgstr "La firma è troppo piccola. Si prega di fornire una firma più completa." + +#: apps/web/src/app/(dashboard)/admin/stats/page.tsx:123 +msgid "Signatures Collected" +msgstr "Firme raccolte" + +#: apps/web/src/app/(signing)/sign/[token]/complete/page.tsx:198 +msgid "Signatures will appear once the document has been completed" +msgstr "Le firme appariranno una volta completato il documento" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:114 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:280 +#: apps/web/src/components/document/document-read-only-fields.tsx:84 +#: packages/lib/constants/recipient-roles.ts:23 +msgid "Signed" +msgstr "Firmato" + +#: packages/lib/constants/recipient-roles.ts:25 +msgid "Signer" +msgstr "Firmatario" + +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:178 +msgid "Signer Events" +msgstr "Eventi del Firmatario" + +#: packages/lib/constants/recipient-roles.ts:26 +msgid "Signers" +msgstr "Firmatari" + +#: packages/ui/primitives/document-flow/add-signers.types.ts:36 +msgid "Signers must have unique emails" +msgstr "I firmatari devono avere email uniche" + +#: packages/lib/constants/recipient-roles.ts:24 +msgid "Signing" +msgstr "Firma" + +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:170 +msgid "Signing Certificate" +msgstr "Certificato di Firma" + +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:313 +msgid "Signing certificate provided by" +msgstr "Certificato di firma fornito da" + +#: packages/lib/server-only/document/send-completed-email.ts:119 +#: packages/lib/server-only/document/send-completed-email.ts:199 +msgid "Signing Complete!" +msgstr "Firma completata!" + +#: apps/web/src/components/forms/signin.tsx:384 +#: apps/web/src/components/forms/signin.tsx:511 +msgid "Signing in..." +msgstr "Accesso in corso..." + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:166 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:197 +msgid "Signing Links" +msgstr "Link di firma" + +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:315 +msgid "Signing links have been generated for this document." +msgstr "I link di firma sono stati generati per questo documento." + +#: apps/web/src/components/forms/signup.tsx:231 +msgid "Signing up..." +msgstr "Registrazione in corso..." + +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:90 +#: apps/web/src/app/(dashboard)/admin/leaderboard/page.tsx:46 +msgid "Signing Volume" +msgstr "Volume di firma" + +#: apps/web/src/components/forms/v2/signup.tsx:78 +msgid "Signups are disabled." +msgstr "Le iscrizioni sono disabilitate." + +#: apps/web/src/app/(profile)/p/[url]/page.tsx:109 +msgid "Since {0}" +msgstr "Dal {0}" + +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:93 +msgid "Site Banner" +msgstr "Banner del sito" + +#: apps/web/src/app/(dashboard)/admin/nav.tsx:107 +#: apps/web/src/app/(dashboard)/admin/site-settings/page.tsx:26 +msgid "Site Settings" +msgstr "Impostazioni del sito" + +#: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx:34 +msgid "Some signers have not been assigned a signature field. Please assign at least 1 signature field to each signer before proceeding." +msgstr "Alcuni firmatari non hanno un campo firma assegnato. Assegna almeno 1 campo di firma a ciascun firmatario prima di procedere." + +#: apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx:105 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:69 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:97 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:61 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-certificate-button.tsx:68 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:76 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:100 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:81 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:71 +#: apps/web/src/app/(dashboard)/settings/billing/billing-plans.tsx:62 +#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:51 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:123 +#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:73 +#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:93 +#: apps/web/src/app/(dashboard)/settings/teams/accept-team-invitation-button.tsx:32 +#: apps/web/src/app/(dashboard)/settings/teams/decline-team-invitation-button.tsx:32 +#: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:44 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:45 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:78 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:100 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:123 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:147 +#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:118 +#: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:27 +#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:38 +#: apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx:53 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:107 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx:39 +#: apps/web/src/app/(unauthenticated)/verify-email/[token]/page.tsx:61 +#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:262 +#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:144 +#: apps/web/src/components/(teams)/dialogs/create-team-checkout-dialog.tsx:50 +#: apps/web/src/components/(teams)/dialogs/create-team-checkout-dialog.tsx:99 +#: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:210 +#: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:64 +#: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:83 +#: apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx:33 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:65 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:82 +#: apps/web/src/components/(teams)/team-billing-portal-button.tsx:29 +#: packages/ui/components/document/document-share-button.tsx:51 +msgid "Something went wrong" +msgstr "Qualcosa è andato storto" + +#: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:98 +msgid "Something went wrong while attempting to transfer the ownership of team <0>{0} to your. Please try again later or contact support." +msgstr "Qualcosa è andato storto durante il tentativo di trasferimento della proprietà del team <0>{0} a te. Riprova più tardi o contatta il supporto." + +#: apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx:120 +msgid "Something went wrong while attempting to verify your email address for <0>{0}. Please try again later." +msgstr "Qualcosa è andato storto durante il tentativo di verifica del tuo indirizzo e-mail per <0>{0}. Riprova più tardi." + +#: packages/ui/primitives/pdf-viewer.tsx:220 +#: packages/ui/primitives/pdf-viewer.tsx:235 +msgid "Something went wrong while loading the document." +msgstr "Qualcosa è andato storto durante il caricamento del documento." + +#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:158 +msgid "Something went wrong while loading your passkeys." +msgstr "Qualcosa è andato storto durante il caricamento delle tue chiavi di accesso." + +#: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:55 +msgid "Something went wrong while sending the confirmation email." +msgstr "Qualcosa è andato storto durante l'invio dell'e-mail di conferma." + +#: apps/web/src/components/(teams)/dialogs/delete-team-dialog.tsx:96 +msgid "Something went wrong while updating the team billing subscription, please contact support." +msgstr "Qualcosa è andato storto durante l'aggiornamento dell'abbonamento di fatturazione del team, contatta il supporto." + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:108 +msgid "Something went wrong!" +msgstr "Qualcosa è andato storto!" + +#: packages/ui/primitives/data-table.tsx:136 +msgid "Something went wrong." +msgstr "Qualcosa è andato storto." + +#: apps/web/src/components/forms/token.tsx:143 +msgid "Something went wrong. Please try again later." +msgstr "Qualcosa è andato storto. Si prega di riprovare più tardi." + +#: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:240 +#: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:154 +msgid "Something went wrong. Please try again or contact support." +msgstr "Qualcosa è andato storto. Riprova o contatta il supporto." + +#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:63 +msgid "Sorry, we were unable to download the audit logs. Please try again later." +msgstr "Siamo spiacenti, non siamo riusciti a scaricare i log di verifica. Riprova più tardi." + +#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-certificate-button.tsx:70 +msgid "Sorry, we were unable to download the certificate. Please try again later." +msgstr "Siamo spiacenti, non siamo riusciti a scaricare il certificato. Riprova più tardi." + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:132 +msgid "Source" +msgstr "Fonte" + +#: apps/web/src/app/(dashboard)/admin/nav.tsx:37 +msgid "Stats" +msgstr "Statistiche" + +#: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:81 +#: apps/web/src/app/(dashboard)/admin/subscriptions/page.tsx:32 +#: apps/web/src/app/(dashboard)/documents/data-table.tsx:73 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:124 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:94 +#: apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx:73 +msgid "Status" +msgstr "Stato" + +#: packages/ui/primitives/document-flow/document-flow-root.tsx:107 +msgid "Step <0>{step} of {maxStep}" +msgstr "Passo <0>{step} di {maxStep}" + +#: packages/ui/primitives/document-flow/add-subject.tsx:143 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:364 +msgid "Subject <0>(Optional)" +msgstr "Oggetto <0>(Opzionale)" + +#: packages/ui/primitives/document-password-dialog.tsx:97 +msgid "Submit" +msgstr "Invia" + +#: apps/web/src/app/(dashboard)/settings/billing/billing-plans.tsx:129 +msgid "Subscribe" +msgstr "Iscriviti" + +#: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:81 +msgid "Subscription" +msgstr "Abbonamento" + +#: apps/web/src/app/(dashboard)/admin/nav.tsx:79 +msgid "Subscriptions" +msgstr "Abbonamenti" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:35 +#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:67 +#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:87 +#: apps/web/src/app/(dashboard)/settings/teams/accept-team-invitation-button.tsx:25 +#: apps/web/src/app/(dashboard)/settings/teams/decline-team-invitation-button.tsx:25 +#: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:37 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:114 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:137 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx:32 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:44 +#: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:44 +#: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:79 +#: apps/web/src/components/(teams)/dialogs/create-team-dialog.tsx:88 +#: apps/web/src/components/(teams)/dialogs/delete-team-dialog.tsx:72 +#: apps/web/src/components/(teams)/dialogs/delete-team-member-dialog.tsx:49 +#: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:150 +#: apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx:49 +#: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:57 +#: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:76 +#: apps/web/src/components/(teams)/dialogs/transfer-team-dialog.tsx:108 +#: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:79 +#: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:92 +#: apps/web/src/components/(teams)/forms/update-team-form.tsx:67 +#: apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx:27 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:59 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:76 +#: apps/web/src/components/forms/public-profile-form.tsx:80 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:132 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:168 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:95 +msgid "Success" +msgstr "Successo" + +#: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:87 +msgid "Successfully created passkey" +msgstr "Chiave di accesso creata con successo" + +#: packages/email/templates/bulk-send-complete.tsx:52 +msgid "Successfully created: {successCount}" +msgstr "" + +#: packages/email/templates/bulk-send-complete.tsx:44 +msgid "Summary:" +msgstr "" + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:57 +msgid "System Requirements" +msgstr "Requisiti di sistema" + +#: apps/web/src/components/(dashboard)/common/command-menu.tsx:266 +msgid "System Theme" +msgstr "Tema del sistema" + +#: apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx:63 +#: apps/web/src/components/(teams)/tables/pending-user-teams-data-table.tsx:62 +msgid "Team" +msgstr "Squadra" + +#: packages/lib/server-only/team/delete-team.ts:124 +msgid "Team \"{0}\" has been deleted on Documenso" +msgstr "Il team \"{0}\" è stato eliminato su Documenso" + +#: apps/web/src/components/(teams)/dialogs/create-team-checkout-dialog.tsx:85 +msgid "Team checkout" +msgstr "Acquisto squadra" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/page.tsx:61 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/page.tsx:140 +msgid "Team email" +msgstr "Email della squadra" + +#: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:58 +msgid "Team Email" +msgstr "Email del team" + +#: apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx:57 +msgid "Team email already verified!" +msgstr "Email del team già verificato!" + +#: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:58 +msgid "Team email has been removed" +msgstr "L'email del team è stato rimosso" + +#: packages/lib/server-only/team/delete-team-email.ts:104 +msgid "Team email has been revoked for {0}" +msgstr "L'email del team è stata revocata per {0}" + +#: packages/email/templates/team-email-removed.tsx:59 +msgid "Team email removed" +msgstr "Email del team rimosso" + +#: packages/email/templates/team-email-removed.tsx:29 +msgid "Team email removed for {teamName} on Documenso" +msgstr "Email del team rimosso per {teamName} su Documenso" + +#: apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx:116 +msgid "Team email verification" +msgstr "Verifica email del team" + +#: apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx:132 +msgid "Team email verified!" +msgstr "Email del team verificato!" + +#: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:80 +msgid "Team email was updated." +msgstr "L'email del team è stato aggiornato." + +#: apps/web/src/app/(unauthenticated)/team/decline/[token]/page.tsx:91 +#: apps/web/src/app/(unauthenticated)/team/invite/[token]/page.tsx:96 +msgid "Team invitation" +msgstr "Invito del team" + +#: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:151 +msgid "Team invitations have been sent." +msgstr "Gli inviti del team sono stati inviati." + +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:106 +#: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:84 +msgid "Team Member" +msgstr "Membro del team" + +#: apps/web/src/components/(teams)/dialogs/create-team-dialog.tsx:166 +#: apps/web/src/components/(teams)/forms/update-team-form.tsx:112 +msgid "Team Name" +msgstr "Nome del team" + +#: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:105 +msgid "Team Only" +msgstr "Solo team" + +#: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:110 +msgid "Team only templates are not linked anywhere and are visible only to your team." +msgstr "I modelli solo per il team non sono collegati da nessuna parte e sono visibili solo al tuo team." + +#: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:94 +msgid "Team ownership transfer" +msgstr "Trasferimento di proprietà del team" + +#: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:60 +msgid "Team ownership transfer already completed!" +msgstr "Trasferimento della proprietà del team già completato!" + +#: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:110 +msgid "Team ownership transferred!" +msgstr "Proprietà del team trasferita!" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/page.tsx:33 +msgid "Team Preferences" +msgstr "Preferenze del team" + +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:49 +msgid "Team Public Profile" +msgstr "Profilo pubblico del team" + +#: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:277 +msgid "Team settings" +msgstr "Impostazioni del team" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/layout.tsx:50 +msgid "Team Settings" +msgstr "Impostazioni del team" + +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:51 +msgid "Team templates" +msgstr "Modelli del team" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:79 +msgid "Team transfer in progress" +msgstr "Trasferimento del team in corso" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:77 +msgid "Team transfer request expired" +msgstr "Richiesta di trasferimento del team scaduta" + +#: apps/web/src/components/(teams)/dialogs/create-team-dialog.tsx:196 +#: apps/web/src/components/(teams)/forms/update-team-form.tsx:128 +msgid "Team URL" +msgstr "URL del team" + +#: apps/web/src/app/(dashboard)/settings/teams/page.tsx:25 +#: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:162 +#: apps/web/src/components/(dashboard)/layout/mobile-navigation.tsx:43 +#: apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx:64 +#: apps/web/src/components/(dashboard)/settings/layout/mobile-nav.tsx:67 +msgid "Teams" +msgstr "Team" + +#: apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx:83 +msgid "Teams restricted" +msgstr "Team limitati" + +#: apps/web/src/app/(dashboard)/templates/[id]/edit/template-edit-page-view.tsx:64 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:39 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:142 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:222 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:151 +#: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:408 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:269 +msgid "Template" +msgstr "Modello" + +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:36 +msgid "Template deleted" +msgstr "Modello eliminato" + +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:66 +msgid "Template document uploaded" +msgstr "Documento modello caricato" + +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:41 +msgid "Template duplicated" +msgstr "Modello duplicato" + +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:133 +msgid "Template has been removed from your public profile." +msgstr "Il modello è stato rimosso dal tuo profilo pubblico." + +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:169 +msgid "Template has been updated." +msgstr "Il modello è stato aggiornato." + +#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:50 +msgid "Template moved" +msgstr "Modello spostato" + +#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:62 +msgid "Template not found or already associated with a team." +msgstr "Modello non trovato o già associato a un team." + +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:216 +msgid "Template saved" +msgstr "Modello salvato" + +#: packages/ui/primitives/template-flow/add-template-settings.tsx:167 +msgid "Template title" +msgstr "Titolo del modello" + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:87 +#: apps/web/src/app/(dashboard)/templates/templates-page-view.tsx:55 +#: apps/web/src/components/(dashboard)/common/command-menu.tsx:208 +#: apps/web/src/components/(dashboard)/layout/desktop-nav.tsx:22 +#: apps/web/src/components/(dashboard)/layout/mobile-navigation.tsx:39 +msgid "Templates" +msgstr "Modelli" + +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:105 +msgid "Templates allow you to quickly generate documents with pre-filled recipients and fields." +msgstr "I modelli ti consentono di generare rapidamente documenti con destinatari e campi precompilati." + +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:258 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:287 +#: packages/ui/primitives/document-flow/add-fields.tsx:971 +#: packages/ui/primitives/document-flow/types.ts:52 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:836 +msgid "Text" +msgstr "Testo" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:79 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:61 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:56 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:61 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:140 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:124 +msgid "Text Align" +msgstr "" + +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:157 +msgid "Text Color" +msgstr "Colore del testo" + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:24 +msgid "Thank you for using Documenso to perform your electronic document signing. The purpose of this disclosure is to inform you about the process, legality, and your rights regarding the use of electronic signatures on our platform. By opting to use an electronic signature, you are agreeing to the terms and conditions outlined below." +msgstr "Grazie per aver utilizzato Documenso per eseguire la firma elettronica dei tuoi documenti. Lo scopo di questa divulgazione è informarti sul processo, la legalità e i tuoi diritti riguardanti l'uso delle firme elettroniche sulla nostra piattaforma. Optando per l'utilizzo di una firma elettronica, accetti i termini e le condizioni delineati di seguito." + +#: packages/email/template-components/template-forgot-password.tsx:25 +msgid "That's okay, it happens! Click the button below to reset your password." +msgstr "Va bene, succede! Fai clic sul pulsante qui sotto per reimpostare la tua password." + +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:52 +msgid "The account has been deleted successfully." +msgstr "L'account è stato eliminato con successo." + +#: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:48 +msgid "The account has been disabled successfully." +msgstr "L'account è stato disabilitato con successo." + +#: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:48 +msgid "The account has been enabled successfully." +msgstr "L'account è stato abilitato con successo." + +#: packages/ui/components/recipient/recipient-action-auth-select.tsx:44 +msgid "The authentication required for recipients to sign fields" +msgstr "Autenticazione richiesta per i destinatari per firmare i campi" + +#: packages/ui/components/document/document-global-auth-action-select.tsx:68 +msgid "The authentication required for recipients to sign the signature field." +msgstr "Autenticazione richiesta per i destinatari per firmare il campo della firma." + +#: packages/ui/components/document/document-global-auth-access-select.tsx:67 +msgid "The authentication required for recipients to view the document." +msgstr "Autenticazione richiesta per i destinatari per visualizzare il documento." + +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:188 +msgid "The content to show in the banner, HTML is allowed" +msgstr "Il contenuto da mostrare nel banner, HTML è consentito" + +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:73 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-badge.tsx:32 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:160 +msgid "The direct link has been copied to your clipboard" +msgstr "Il link diretto è stato copiato negli appunti" + +#: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:50 +msgid "The document has been successfully moved to the selected team." +msgstr "Il documento è stato spostato con successo al team selezionato." + +#: apps/web/src/app/embed/completed.tsx:30 +msgid "The document is now completed, please follow any instructions provided within the parent application." +msgstr "Il documento è ora completato, si prega di seguire eventuali istruzioni fornite nell'applicazione principale." + +#: packages/email/template-components/template-document-rejection-confirmed.tsx:39 +msgid "The document owner has been notified of this rejection. No further action is required from you at this time. The document owner may contact you with any questions regarding this rejection." +msgstr "Il proprietario del documento è stato informato di questo rifiuto. Non sono necessarie ulteriori azioni da parte tua in questo momento. Il proprietario del documento potrebbe contattarti per qualsiasi domanda riguardante questo rifiuto." + +#: apps/web/src/app/(signing)/sign/[token]/rejected/page.tsx:92 +msgid "The document owner has been notified of your decision. They may contact you with further instructions if necessary." +msgstr "Il proprietario del documento è stato informato della tua decisione. Potrebbe contattarti per ulteriori istruzioni, se necessario." + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:194 +msgid "The document was created but could not be sent to recipients." +msgstr "Il documento è stato creato ma non è stato possibile inviarlo ai destinatari." + +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:162 +msgid "The document will be hidden from your account" +msgstr "Il documento verrà nascosto dal tuo account" + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:344 +msgid "The document will be immediately sent to recipients if this is checked." +msgstr "Il documento sarà immediatamente inviato ai destinatari se selezionato." + +#: packages/ui/components/document/document-send-email-message-helper.tsx:31 +msgid "The document's name" +msgstr "Il nome del documento" + +#: apps/web/src/app/(dashboard)/settings/webhooks/[id]/page.tsx:175 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/[id]/page.tsx:179 +#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:203 +msgid "The events that will trigger a webhook to be sent to your URL." +msgstr "Gli eventi che scateneranno un webhook da inviare al tuo URL." + +#: packages/email/templates/bulk-send-complete.tsx:62 +msgid "The following errors occurred:" +msgstr "" + +#: packages/email/templates/team-delete.tsx:37 +msgid "The following team has been deleted by its owner. You will no longer be able to access this team and its documents" +msgstr "Il seguente team è stato eliminato dal suo proprietario. Non potrai più accedere a questo team e ai suoi documenti" + +#: packages/email/templates/team-delete.tsx:36 +msgid "The following team has been deleted by you" +msgstr "Il seguente team è stato eliminato da te" + +#: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:114 +msgid "The ownership of team <0>{0} has been successfully transferred to you." +msgstr "La proprietà del team <0>{0} è stata trasferita con successo a te." + +#: apps/web/src/components/partials/not-found.tsx:53 +msgid "The page you are looking for was moved, removed, renamed or might never have existed." +msgstr "La pagina che stai cercando è stata spostata, rimossa, rinominata o potrebbe non essere mai esistita." + +#: packages/ui/primitives/document-password-dialog.tsx:52 +msgid "The password you have entered is incorrect. Please try again." +msgstr "La password che hai inserito non è corretta. Per favore riprova." + +#: apps/web/src/components/forms/public-profile-form.tsx:118 +msgid "The profile link has been copied to your clipboard" +msgstr "Il link del profilo è stato copiato negli appunti" + +#: apps/web/src/app/(profile)/p/[url]/not-found.tsx:23 +msgid "The profile you are looking for could not be found." +msgstr "Il profilo che stai cercando non è stato trovato." + +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:378 +msgid "The public description that will be displayed with this template" +msgstr "La descrizione pubblica che verrà visualizzata con questo modello" + +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:356 +msgid "The public name for your template" +msgstr "Il nome pubblico per il tuo modello" + +#: packages/email/template-components/template-document-super-delete.tsx:38 +msgid "The reason provided for deletion is the following:" +msgstr "Il motivo fornito per l'eliminazione è il seguente:" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:119 +msgid "The recipient has been updated successfully" +msgstr "Il destinatario è stato aggiornato con successo" + +#: packages/ui/components/recipient/recipient-role-select.tsx:103 +msgid "The recipient is not required to take any action and receives a copy of the document after it is completed." +msgstr "Il destinatario non è tenuto a prendere alcuna azione e riceverà una copia del documento una volta completato." + +#: packages/ui/components/recipient/recipient-role-select.tsx:60 +msgid "The recipient is required to approve the document for it to be completed." +msgstr "Il destinatario è tenuto ad approvare il documento affinché sia completato." + +#: packages/ui/components/recipient/recipient-role-select.tsx:39 +msgid "The recipient is required to sign the document for it to be completed." +msgstr "Il destinatario è tenuto a firmare il documento affinché sia completato." + +#: packages/ui/components/recipient/recipient-role-select.tsx:81 +msgid "The recipient is required to view the document for it to be completed." +msgstr "Il destinatario è tenuto a visualizzare il documento affinché sia completato." + +#: apps/web/src/components/(teams)/dialogs/transfer-team-dialog.tsx:232 +msgid "The selected team member will receive an email which they must accept before the team is transferred" +msgstr "Il membro del team selezionato riceverà un'email che dovrà accettare prima che il team venga trasferito" + +#: packages/ui/components/document/document-share-button.tsx:52 +msgid "The sharing link could not be created at this time. Please try again." +msgstr "Il link di condivisione non può essere creato in questo momento. Per favore riprova." + +#: packages/ui/components/document/document-share-button.tsx:47 +msgid "The sharing link has been copied to your clipboard." +msgstr "Il link di condivisione è stato copiato negli appunti." + +#: packages/ui/components/document/document-send-email-message-helper.tsx:25 +msgid "The signer's email" +msgstr "L'email del firmatario" + +#: packages/ui/components/document/document-send-email-message-helper.tsx:19 +msgid "The signer's name" +msgstr "Il nome del firmatario" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:163 +#: apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx:41 +#: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:118 +#: packages/ui/primitives/document-flow/add-subject.tsx:243 +msgid "The signing link has been copied to your clipboard." +msgstr "Il link di firma è stato copiato negli appunti." + +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:96 +msgid "The site banner is a message that is shown at the top of the site. It can be used to display important information to your users." +msgstr "Il banner del sito è un messaggio che viene mostrato in cima al sito. Può essere utilizzato per visualizzare informazioni importanti ai tuoi utenti." + +#: packages/email/templates/team-email-removed.tsx:63 +msgid "The team email <0>{teamEmail} has been removed from the following team" +msgstr "L'email del team <0>{teamEmail} è stata rimossa dal seguente team" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:45 +msgid "The team transfer invitation has been successfully deleted." +msgstr "L'invito al trasferimento del team è stato eliminato con successo." + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:86 +msgid "The team transfer request to <0>{0} has expired." +msgstr "La richiesta di trasferimento del team a <0>{0} è scaduta." + +#: apps/web/src/app/(teams)/t/[teamUrl]/not-found.tsx:23 +msgid "The team you are looking for may have been removed, renamed or may have never existed." +msgstr "Il team che stai cercando potrebbe essere stato rimosso, rinominato o potrebbe non essere mai esistito." + +#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:51 +msgid "The template has been successfully moved to the selected team." +msgstr "Il modello è stato spostato con successo al team selezionato." + +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:441 +msgid "The template will be removed from your profile" +msgstr "Il modello sarà rimosso dal tuo profilo" + +#: apps/web/src/app/(recipient)/d/[token]/not-found.tsx:23 +msgid "The template you are looking for may have been disabled, deleted or may have never existed." +msgstr "Il modello che stai cercando potrebbe essere stato disabilitato, eliminato o potrebbe non essere mai esistito." + +#: apps/web/src/components/forms/token.tsx:107 +msgid "The token was copied to your clipboard." +msgstr "Il token è stato copiato negli appunti." + +#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:88 +msgid "The token was deleted successfully." +msgstr "Il token è stato eliminato con successo." + +#: apps/web/src/app/(unauthenticated)/reset-password/page.tsx:24 +msgid "The token you have used to reset your password is either expired or it never existed. If you have still forgotten your password, please request a new reset link." +msgstr "Il token che hai usato per reimpostare la tua password è scaduto o non è mai esistito. Se hai ancora dimenticato la tua password, richiedi un nuovo link per la reimpostazione." + +#: apps/web/src/app/(dashboard)/settings/webhooks/[id]/page.tsx:124 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/[id]/page.tsx:128 +#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:152 +msgid "The URL for Documenso to send webhook events to." +msgstr "L'URL per Documenso per inviare eventi webhook." + +#: apps/web/src/components/(dashboard)/settings/webhooks/delete-webhook-dialog.tsx:79 +msgid "The webhook has been successfully deleted." +msgstr "Il webhook è stato eliminato con successo." + +#: apps/web/src/app/(dashboard)/settings/webhooks/[id]/page.tsx:75 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/[id]/page.tsx:81 +msgid "The webhook has been updated successfully." +msgstr "Il webhook è stato aggiornato con successo." + +#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:93 +msgid "The webhook was successfully created." +msgstr "Il webhook è stato creato con successo." + +#: apps/web/src/app/(dashboard)/documents/empty-state.tsx:25 +msgid "There are no active drafts at the current moment. You can upload a document to start drafting." +msgstr "Non ci sono bozze attive al momento attuale. Puoi caricare un documento per iniziare a redigere." + +#: apps/web/src/app/(dashboard)/documents/empty-state.tsx:20 +msgid "There are no completed documents yet. Documents that you have created or received will appear here once completed." +msgstr "Non ci sono ancora documenti completati. I documenti che hai creato o ricevuto appariranno qui una volta completati." + +#: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:70 +msgid "They have permission on your behalf to:" +msgstr "Hanno il permesso per tuo conto di:" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:100 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:106 +#: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:98 +msgid "This action is not reversible. Please be certain." +msgstr "Questa azione non è reversibile. Si prega di essere certi." + +#: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:100 +msgid "This action is reversible, but please be careful as the account may be affected permanently (e.g. their settings and contents not being restored properly)." +msgstr "Questa azione è reversibile, ma fai attenzione poiché l'account potrebbe essere influenzato permanentemente (ad es. le impostazioni e i contenuti potrebbero non essere ripristinati correttamente)." + +#: packages/ui/components/document/document-global-auth-action-select.tsx:72 +msgid "This can be overriden by setting the authentication requirements directly on each recipient in the next step." +msgstr "Questo può essere sovrascritto impostando i requisiti di autenticazione direttamente su ciascun destinatario nel passaggio successivo." + +#: packages/email/template-components/template-document-super-delete.tsx:31 +msgid "This document can not be recovered, if you would like to dispute the reason for future documents please contact support." +msgstr "Questo documento non può essere recuperato, se vuoi contestare la ragione per i documenti futuri, contatta il supporto." + +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:82 +msgid "This document could not be deleted at this time. Please try again." +msgstr "Questo documento non può essere eliminato in questo momento. Riprova." + +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:72 +msgid "This document could not be duplicated at this time. Please try again." +msgstr "Questo documento non può essere duplicato in questo momento. Riprova." + +#: apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx:106 +msgid "This document could not be re-sent at this time. Please try again." +msgstr "Questo documento non può essere rinviato in questo momento. Riprova." + +#: packages/ui/primitives/document-flow/add-fields.tsx:776 +msgid "This document has already been sent to this recipient. You can no longer edit this recipient." +msgstr "Questo documento è già stato inviato a questo destinatario. Non puoi più modificare questo destinatario." + +#: apps/web/src/app/(signing)/sign/[token]/complete/page.tsx:178 +msgid "This document has been cancelled by the owner and is no longer available for others to sign." +msgstr "Questo documento è stato annullato dal proprietario e non è più disponibile per la firma di altri." + +#: apps/web/src/app/(signing)/sign/[token]/no-longer-available.tsx:52 +msgid "This document has been cancelled by the owner." +msgstr "Questo documento è stato annullato dal proprietario." + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:228 +msgid "This document has been signed by all recipients" +msgstr "Questo documento è stato firmato da tutti i destinatari" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:231 +msgid "This document is currently a draft and has not been sent" +msgstr "Questo documento è attualmente una bozza e non è stato inviato" + +#: packages/ui/primitives/document-password-dialog.tsx:66 +msgid "This document is password protected. Please enter the password to view the document." +msgstr "Questo documento è protetto da password. Inserisci la password per visualizzare il documento." + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:146 +msgid "This document was created by you or a team member using the template above." +msgstr "Questo documento è stato creato da te o un membro del team utilizzando il modello sopra." + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:158 +msgid "This document was created using a direct link." +msgstr "Questo documento è stato creato utilizzando un link diretto." + +#: packages/email/template-components/template-footer.tsx:17 +msgid "This document was sent using <0>Documenso." +msgstr "Questo documento è stato inviato utilizzando <0>Documenso." + +#: packages/email/template-components/template-document-rejection-confirmed.tsx:26 +msgid "This email confirms that you have rejected the document <0>\"{documentName}\" sent by {documentOwnerName}." +msgstr "Questa email conferma che hai rifiutato il documento <0>\"{documentName}\" inviato da {documentOwnerName}." + +#: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:93 +msgid "This email is already being used by another team." +msgstr "Questa email è già in uso da un altro team." + +#: packages/ui/components/document/document-email-checkboxes.tsx:55 +msgid "This email is sent to the document owner when a recipient has signed the document." +msgstr "Questa email viene inviata al proprietario del documento quando un destinatario ha firmato il documento." + +#: packages/ui/components/document/document-email-checkboxes.tsx:131 +msgid "This email is sent to the recipient if they are removed from a pending document." +msgstr "Questa email viene inviata al destinatario se viene rimosso da un documento in attesa." + +#: packages/ui/components/document/document-email-checkboxes.tsx:93 +msgid "This email is sent to the recipient requesting them to sign the document." +msgstr "Questa email viene inviata al destinatario chiedendo loro di firmare il documento." + +#: packages/ui/components/document/document-email-checkboxes.tsx:169 +msgid "This email will be sent to the recipient who has just signed the document, if there are still other recipients who have not signed yet." +msgstr "Questa email sarà inviata al destinatario che ha appena firmato il documento, se ci sono ancora altri destinatari che non hanno ancora firmato." + +#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:580 +msgid "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them." +msgstr "Questo campo non può essere modificato o eliminato. Quando condividi il link diretto di questo modello o lo aggiungi al tuo profilo pubblico, chiunque vi acceda può inserire il proprio nome e email, e compilare i campi assegnati." + +#: packages/ui/primitives/template-flow/add-template-settings.tsx:279 +msgid "This is how the document will reach the recipients once the document is ready for signing." +msgstr "È così che il documento raggiungerà i destinatari una volta pronto per essere firmato." + +#: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:40 +msgid "This link is invalid or has expired. Please contact your team to resend a transfer request." +msgstr "Questo link è invalido o è scaduto. Si prega di contattare il tuo team per inviare nuovamente una richiesta di trasferimento." + +#: apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx:37 +msgid "This link is invalid or has expired. Please contact your team to resend a verification." +msgstr "Questo link è invalido o è scaduto. Si prega di contattare il tuo team per inviare nuovamente una verifica." + +#: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:208 +msgid "This passkey has already been registered." +msgstr "Questa chiave d'accesso è già stata registrata." + +#: apps/web/src/components/forms/signin.tsx:201 +msgid "This passkey is not configured for this application. Please login and add one in the user settings." +msgstr "Questa chiave di accesso non è configurata per questa applicazione. Effettua il login e aggiungine una nelle impostazioni utente." + +#: apps/web/src/components/(teams)/dialogs/create-team-checkout-dialog.tsx:148 +msgid "This price includes minimum 5 seats." +msgstr "Questo prezzo include almeno 5 posti." + +#: packages/ui/primitives/document-flow/add-fields.tsx:1108 +msgid "This recipient can no longer be modified as they have signed a field, or completed the document." +msgstr "Questo destinatario non può più essere modificato poiché ha firmato un campo o completato il documento." + +#: apps/web/src/components/forms/signin.tsx:203 +msgid "This session has expired. Please try again." +msgstr "Questa sessione è scaduta. Per favore prova di nuovo." + +#: packages/ui/primitives/document-flow/add-signers.tsx:194 +msgid "This signer has already signed the document." +msgstr "Questo firmatario ha già firmato il documento." + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/page.tsx:195 +msgid "This team, and any associated data excluding billing invoices will be permanently deleted." +msgstr "Questo team e tutti i dati associati, escluse le fatture di fatturazione, verranno eliminati definitivamente." + +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:46 +msgid "This template could not be deleted at this time. Please try again." +msgstr "Questo modello non può essere eliminato in questo momento. Per favore prova di nuovo." + +#: apps/web/src/app/(unauthenticated)/team/decline/[token]/page.tsx:43 +msgid "This token is invalid or has expired. No action is needed." +msgstr "Questo token è invalido o è scaduto. Non è necessaria alcuna azione." + +#: apps/web/src/app/(unauthenticated)/team/invite/[token]/page.tsx:43 +msgid "This token is invalid or has expired. Please contact your team for a new invitation." +msgstr "Questo token è invalido o è scaduto. Si prega di contattare il vostro team per un nuovo invito." + +#: apps/web/src/components/(teams)/dialogs/create-team-dialog.tsx:98 +#: apps/web/src/components/(teams)/forms/update-team-form.tsx:86 +msgid "This URL is already in use." +msgstr "Questo URL è già in uso." + +#: apps/web/src/components/forms/v2/signup.tsx:81 +msgid "This username has already been taken" +msgstr "Questo nome utente è già stato preso" + +#: apps/web/src/components/forms/public-profile-claim-dialog.tsx:98 +msgid "This username is already taken" +msgstr "Questo nome utente è già stato preso" + +#: packages/ui/components/document/document-email-checkboxes.tsx:246 +msgid "This will be sent to all recipients if a pending document has been deleted." +msgstr "Questo sarà inviato a tutti i destinatari se un documento in attesa è stato eliminato." + +#: packages/ui/components/document/document-email-checkboxes.tsx:208 +msgid "This will be sent to all recipients once the document has been fully completed." +msgstr "Questo sarà inviato a tutti i destinatari una volta che il documento è stato completamente completato." + +#: packages/ui/components/document/document-email-checkboxes.tsx:284 +msgid "This will be sent to the document owner once the document has been fully completed." +msgstr "Questo sarà inviato al proprietario del documento una volta che il documento è stato completamente completato." + +#: packages/ui/components/recipient/recipient-action-auth-select.tsx:48 +msgid "This will override any global settings." +msgstr "Questo sovrascriverà qualsiasi impostazione globale." + +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:70 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:44 +msgid "Time" +msgstr "Ora" + +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-page-view.tsx:97 +msgid "Time zone" +msgstr "Fuso orario" + +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:132 +#: packages/ui/primitives/document-flow/add-settings.tsx:359 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:484 +msgid "Time Zone" +msgstr "Fuso orario" + +#: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:67 +#: apps/web/src/app/(dashboard)/documents/data-table.tsx:54 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:109 +#: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:61 +#: packages/ui/primitives/document-flow/add-settings.tsx:166 +msgid "Title" +msgstr "Titolo" + +#: apps/web/src/app/(unauthenticated)/team/invite/[token]/page.tsx:106 +msgid "To accept this invitation you must create an account." +msgstr "Per accettare questo invito devi creare un account." + +#: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:125 +msgid "To change the email you must remove and add a new email address." +msgstr "Per cambiare la email devi rimuovere e aggiungere un nuovo indirizzo email." + +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:113 +#: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:111 +#: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:101 +msgid "To confirm, please enter the accounts email address <0/>({0})." +msgstr "Per confermare, inserisci l'indirizzo email dell'account <0/>({0})." + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:107 +msgid "To confirm, please enter the reason" +msgstr "Per confermare, per favore inserisci il motivo" + +#: apps/web/src/app/(unauthenticated)/team/decline/[token]/page.tsx:101 +msgid "To decline this invitation you must create an account." +msgstr "Per rifiutare questo invito devi creare un account." + +#: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:197 +msgid "To enable two-factor authentication, scan the following QR code using your authenticator app." +msgstr "Per abilitare l'autenticazione a due fattori, scansiona il seguente codice QR utilizzando la tua app di autenticazione." + +#: apps/web/src/app/(unauthenticated)/unverified-account/page.tsx:23 +msgid "To gain access to your account, please confirm your email address by clicking on the confirmation link from your inbox." +msgstr "Per accedere al tuo account, conferma il tuo indirizzo email facendo clic sul link di conferma dalla tua casella di posta." + +#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:54 +msgid "To mark this document as viewed, you need to be logged in as <0>{0}" +msgstr "Per contrassegnare questo documento come visualizzato, è necessario essere connessi come <0>{0}" + +#: packages/ui/primitives/document-flow/add-fields.tsx:1091 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:954 +msgid "To proceed further, please set at least one value for the {0} field." +msgstr "Per procedere ulteriormente, si prega di impostare almeno un valore per il campo {0}." + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:60 +msgid "To use our electronic signature service, you must have access to:" +msgstr "Per utilizzare il nostro servizio di firma elettronica, devi avere accesso a:" + +#: apps/web/src/app/embed/authenticate.tsx:21 +msgid "To view this document you need to be signed into your account, please sign in to continue." +msgstr "Per visualizzare questo documento devi essere connesso al tuo account, per favore accedi per continuare." + +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:177 +msgid "Toggle the switch to hide your profile from the public." +msgstr "Attiva l'interruttore per nascondere il tuo profilo al pubblico." + +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:189 +msgid "Toggle the switch to show your profile to the public." +msgstr "Attiva l'interruttore per mostrare il tuo profilo al pubblico." + +#: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:236 +msgid "Token" +msgstr "Token" + +#: apps/web/src/components/forms/token.tsx:106 +msgid "Token copied to clipboard" +msgstr "Token copiato negli appunti" + +#: apps/web/src/components/forms/token.tsx:127 +msgid "Token created" +msgstr "Token creato" + +#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:87 +msgid "Token deleted" +msgstr "Token eliminato" + +#: apps/web/src/app/(dashboard)/settings/tokens/page.tsx:75 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:108 +msgid "Token doesn't have an expiration date" +msgstr "Il token non ha una data di scadenza" + +#: apps/web/src/components/forms/token.tsx:193 +msgid "Token expiration date" +msgstr "Data di scadenza del token" + +#: apps/web/src/components/forms/reset-password.tsx:83 +msgid "Token has expired. Please try again." +msgstr "Il token è scaduto. Per favore riprova." + +#: apps/web/src/components/forms/token.tsx:165 +msgid "Token name" +msgstr "Nome del token" + +#: apps/web/src/app/(dashboard)/admin/stats/page.tsx:65 +msgid "Total Documents" +msgstr "Totale documenti" + +#: apps/web/src/app/(dashboard)/admin/stats/page.tsx:108 +msgid "Total Recipients" +msgstr "Totale destinatari" + +#: packages/email/templates/bulk-send-complete.tsx:49 +msgid "Total rows processed: {totalProcessed}" +msgstr "" + +#: apps/web/src/app/(dashboard)/admin/stats/page.tsx:150 +msgid "Total Signers that Signed Up" +msgstr "Totale firmatari che si sono iscritti" + +#: apps/web/src/app/(dashboard)/admin/stats/page.tsx:64 +msgid "Total Users" +msgstr "Totale utenti" + +#: apps/web/src/components/(teams)/dialogs/transfer-team-dialog.tsx:76 +msgid "transfer {teamName}" +msgstr "trasferisci {teamName}" + +#: apps/web/src/components/(teams)/dialogs/transfer-team-dialog.tsx:160 +msgid "Transfer ownership of this team to a selected team member." +msgstr "Trasferisci la proprietà di questo team a un membro del team selezionato." + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/page.tsx:169 +#: apps/web/src/components/(teams)/dialogs/transfer-team-dialog.tsx:147 +#: apps/web/src/components/(teams)/dialogs/transfer-team-dialog.tsx:156 +msgid "Transfer team" +msgstr "Trasferisci il team" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/page.tsx:173 +msgid "Transfer the ownership of the team to another team member." +msgstr "Trasferisci la proprietà del team a un altro membro del team." + +#: apps/web/src/app/(dashboard)/settings/webhooks/[id]/page.tsx:163 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/[id]/page.tsx:167 +#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:191 +msgid "Triggers" +msgstr "Trigger" + +#: apps/web/src/app/(dashboard)/settings/security/page.tsx:52 +msgid "Two factor authentication" +msgstr "Autenticazione a due fattori" + +#: apps/web/src/app/(dashboard)/settings/security/page.tsx:88 +msgid "Two factor authentication recovery codes are used to access your account in the event that you lose access to your authenticator app." +msgstr "I codici di recupero dell'autenticazione a due fattori sono utilizzati per accedere al tuo account nel caso in cui perdi l'accesso alla tua app di autenticazione." + +#: apps/web/src/components/forms/signin.tsx:449 +msgid "Two-Factor Authentication" +msgstr "Autenticazione a due fattori" + +#: apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx:90 +msgid "Two-factor authentication disabled" +msgstr "Autenticazione a due fattori disattivata" + +#: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:94 +msgid "Two-factor authentication enabled" +msgstr "Autenticazione a due fattori attivata" + +#: apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx:92 +msgid "Two-factor authentication has been disabled for your account. You will no longer be required to enter a code from your authenticator app when signing in." +msgstr "L'autenticazione a due fattori è stata disattivata per il tuo account. Non sarà più necessario inserire un codice dalla tua app di autenticazione quando accedi." + +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:120 +msgid "Two-Factor Re-Authentication" +msgstr "Ri-autenticazione a due fattori" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:73 +#: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:67 +msgid "Type" +msgstr "Tipo" + +#: apps/web/src/components/(dashboard)/common/command-menu.tsx:186 +msgid "Type a command or search..." +msgstr "Digita un comando o cerca..." + +#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:134 +msgid "Typed signatures are not allowed. Please draw your signature." +msgstr "Le firme digitate non sono consentite. Si prega di disegnare la propria firma." + +#: apps/web/src/app/(unauthenticated)/verify-email/page.tsx:26 +msgid "Uh oh! Looks like you're missing a token" +msgstr "Oh no! Sembra che ti manchi un token" + +#: apps/web/src/components/(dashboard)/common/command-menu.tsx:303 +msgid "Unable to change the language at this time. Please try again later." +msgstr "Impossibile cambiare la lingua in questo momento. Per favore riprova più tardi." + +#: apps/web/src/components/forms/2fa/recovery-code-list.tsx:31 +msgid "Unable to copy recovery code" +msgstr "Impossibile copiare il codice di recupero" + +#: apps/web/src/components/forms/token.tsx:111 +msgid "Unable to copy token" +msgstr "Impossibile copiare il token" + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:101 +msgid "Unable to create direct template access. Please try again later." +msgstr "Impossibile creare l'accesso diretto al modello. Si prega di riprovare più tardi." + +#: apps/web/src/app/(dashboard)/settings/teams/decline-team-invitation-button.tsx:33 +msgid "Unable to decline this team invitation at this time." +msgstr "Impossibile rifiutare questo invito al team in questo momento." + +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:83 +msgid "Unable to delete invitation. Please try again." +msgstr "Impossibile eliminare l'invito. Si prega di riprovare." + +#: apps/web/src/components/(teams)/dialogs/delete-team-dialog.tsx:94 +msgid "Unable to delete team" +msgstr "Impossibile eliminare il team" + +#: apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx:103 +msgid "Unable to disable two-factor authentication" +msgstr "Impossibile disabilitare l'autenticazione a due fattori" + +#: apps/web/src/app/(dashboard)/settings/teams/accept-team-invitation-button.tsx:33 +msgid "Unable to join this team at this time." +msgstr "Impossibile unirsi a questo team in questo momento." + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recent-activity.tsx:70 +#: apps/web/src/components/document/document-history-sheet.tsx:127 +msgid "Unable to load document history" +msgstr "Impossibile caricare la cronologia del documento" + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:58 +msgid "Unable to load documents" +msgstr "Impossibile caricare i documenti" + +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:106 +msgid "Unable to load your public profile templates at this time" +msgstr "Impossibile caricare i modelli del profilo pubblico in questo momento" + +#: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:84 +msgid "Unable to remove email verification at this time. Please try again." +msgstr "Impossibile rimuovere la verifica e-mail in questo momento. Si prega di riprovare." + +#: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:65 +msgid "Unable to remove team email at this time. Please try again." +msgstr "Impossibile rimuovere l'e-mail del team in questo momento. Si prega di riprovare." + +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:66 +msgid "Unable to resend invitation. Please try again." +msgstr "Impossibile reinviare l'invito. Si prega di riprovare." + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx:40 +msgid "Unable to resend verification at this time. Please try again." +msgstr "Impossibile reinviare la verifica in questo momento. Si prega di riprovare." + +#: apps/web/src/app/(unauthenticated)/reset-password/page.tsx:20 +msgid "Unable to reset password" +msgstr "Impossibile reimpostare la password" + +#: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:68 +#: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:101 +msgid "Unable to setup two-factor authentication" +msgstr "Impossibile configurare l'autenticazione a due fattori" + +#: apps/web/src/components/forms/signin.tsx:248 +#: apps/web/src/components/forms/signin.tsx:256 +msgid "Unable to sign in" +msgstr "Impossibile accedere" + +#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:166 +#: apps/web/src/app/(teams)/t/[teamUrl]/error.tsx:27 +msgid "Unauthorized" +msgstr "Non autorizzato" + +#: apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx:155 +msgid "Uncompleted" +msgstr "Incompleto" + +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:239 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:264 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:275 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:286 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx:55 +msgid "Unknown" +msgstr "Sconosciuto" + +#: apps/web/src/app/(teams)/t/[teamUrl]/error.tsx:23 +msgid "Unknown error" +msgstr "Errore sconosciuto" + +#: apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx:79 +msgid "Unpaid" +msgstr "Non pagato" + +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:176 +#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:162 +#: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:166 +#: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:191 +#: apps/web/src/components/forms/public-profile-form.tsx:279 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:426 +#: packages/ui/primitives/document-flow/add-subject.tsx:86 +msgid "Update" +msgstr "Aggiorna" + +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:202 +msgid "Update Banner" +msgstr "Aggiorna banner" + +#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:118 +msgid "Update passkey" +msgstr "Aggiorna chiave d'accesso" + +#: apps/web/src/components/forms/password.tsx:157 +msgid "Update password" +msgstr "Aggiorna password" + +#: apps/web/src/components/forms/profile.tsx:142 +msgid "Update profile" +msgstr "Aggiorna profilo" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:180 +msgid "Update Recipient" +msgstr "Aggiorna destinatario" + +#: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:144 +msgid "Update role" +msgstr "Aggiorna ruolo" + +#: apps/web/src/components/(teams)/forms/update-team-form.tsx:175 +msgid "Update team" +msgstr "Aggiorna team" + +#: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:113 +#: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:121 +msgid "Update team email" +msgstr "Aggiorna email del team" + +#: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:136 +#: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:144 +msgid "Update team member" +msgstr "Aggiorna membro del team" + +#: packages/lib/constants/template.ts:13 +msgid "Update the role and add fields as required for the direct recipient. The individual who uses the direct link will sign the document as the direct recipient." +msgstr "Aggiorna il ruolo e aggiungi campi come richiesto per il destinatario diretto. L'individuo che utilizza il link diretto firmerà il documento come destinatario diretto." + +#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:149 +msgid "Update user" +msgstr "Aggiorna utente" + +#: apps/web/src/app/(dashboard)/settings/webhooks/[id]/page.tsx:208 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/[id]/page.tsx:210 +msgid "Update webhook" +msgstr "Aggiorna webhook" + +#: apps/web/src/components/forms/password.tsx:157 +msgid "Updating password..." +msgstr "Aggiornamento della password..." + +#: apps/web/src/components/forms/profile.tsx:142 +msgid "Updating profile..." +msgstr "Aggiornamento del profilo..." + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:115 +msgid "Updating Your Information" +msgstr "Aggiornamento delle tue informazioni" + +#: packages/ui/primitives/document-dropzone.tsx:168 +msgid "Upgrade" +msgstr "Aggiorna" + +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:132 +msgid "Upload a CSV file to create multiple documents from this template. Each row represents one document with its recipient details." +msgstr "" + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:426 +msgid "Upload a custom document to use instead of the template's default document" +msgstr "Carica un documento personalizzato da utilizzare al posto del documento predefinito del modello" + +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:267 +msgid "Upload and Process" +msgstr "" + +#: apps/web/src/components/forms/avatar-image.tsx:179 +msgid "Upload Avatar" +msgstr "Carica Avatar" + +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:198 +msgid "Upload CSV" +msgstr "" + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:419 +msgid "Upload custom document" +msgstr "Carica documento personalizzato" + +#: packages/ui/primitives/signature-pad/signature-pad.tsx:529 +msgid "Upload Signature" +msgstr "Carica Firma" + +#: packages/ui/primitives/document-dropzone.tsx:70 +msgid "Upload Template Document" +msgstr "Carica Documento Modello" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:256 +msgid "Upload your brand logo (max 5MB, JPG, PNG, or WebP)" +msgstr "Carica il tuo logo aziendale (max 5MB, JPG, PNG o WebP)" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:31 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:30 +msgid "Uploaded by" +msgstr "Caricato da" + +#: apps/web/src/components/forms/avatar-image.tsx:91 +msgid "Uploaded file is too large" +msgstr "Il file caricato è troppo grande" + +#: apps/web/src/components/forms/avatar-image.tsx:92 +msgid "Uploaded file is too small" +msgstr "Il file caricato è troppo piccolo" + +#: apps/web/src/components/forms/avatar-image.tsx:93 +msgid "Uploaded file not an allowed file type" +msgstr "Il file caricato non è di un tipo di file consentito" + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:175 +msgid "Use" +msgstr "Utilizza" + +#: apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx:187 +#: apps/web/src/components/forms/signin.tsx:506 +msgid "Use Authenticator" +msgstr "Usa Authenticator" + +#: apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx:185 +#: apps/web/src/components/forms/signin.tsx:504 +msgid "Use Backup Code" +msgstr "Usa il Codice di Backup" + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:219 +msgid "Use Template" +msgstr "Usa Modello" + +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:75 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:45 +msgid "User" +msgstr "Utente" + +#: apps/web/src/components/forms/password.tsx:80 +msgid "User has no password." +msgstr "L'utente non ha password." + +#: apps/web/src/app/(dashboard)/admin/subscriptions/page.tsx:41 +msgid "User ID" +msgstr "ID Utente" + +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:61 +#: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:55 +#: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:55 +msgid "User not found." +msgstr "Utente non trovato." + +#: apps/web/src/components/forms/v2/signup.tsx:238 +msgid "User profiles are here!" +msgstr "I profili utente sono qui!" + +#: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:269 +msgid "User settings" +msgstr "Impostazioni utente" + +#: apps/web/src/components/forms/v2/signup.tsx:79 +msgid "User with this email already exists. Please use a different email address." +msgstr "Un utente con questo email esiste già. Si prega di utilizzare un indirizzo email diverso." + +#: apps/web/src/components/forms/v2/signup.tsx:63 +msgid "Username can only container alphanumeric characters and dashes." +msgstr "Il nome utente può contenere solo caratteri alfanumerici e trattini." + +#: apps/web/src/app/(dashboard)/admin/nav.tsx:51 +msgid "Users" +msgstr "Utenti" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:132 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:188 +msgid "Validation" +msgstr "Validazione" + +#: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:83 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:91 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:96 +msgid "Value" +msgstr "Valore" + +#: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:100 +msgid "Verification Email Sent" +msgstr "Email di Verifica Inviata" + +#: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:45 +msgid "Verification email sent successfully." +msgstr "Email di verifica inviata con successo." + +#: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:102 +msgid "Verify Now" +msgstr "Verifica Ora" + +#: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:112 +msgid "Verify your email address" +msgstr "Verifica il tuo indirizzo email" + +#: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:88 +msgid "Verify your email address to unlock all features." +msgstr "Verifica il tuo indirizzo email per sbloccare tutte le funzionalità." + +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:60 +msgid "Verify your email to upload documents." +msgstr "Verifica il tuo email per caricare documenti." + +#: packages/email/templates/confirm-team-email.tsx:71 +msgid "Verify your team email address" +msgstr "Verifica il tuo indirizzo email del team" + +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:76 +msgid "Version History" +msgstr "Cronologia delle versioni" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:101 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:127 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:136 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:126 +#: apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx:100 +#: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:168 +#: packages/lib/constants/recipient-roles.ts:29 +msgid "View" +msgstr "Visualizza" + +#: apps/web/src/app/(dashboard)/settings/security/page.tsx:140 +msgid "View activity" +msgstr "Visualizza attività" + +#: packages/email/templates/confirm-team-email.tsx:95 +msgid "View all documents sent to and from this email address" +msgstr "Visualizza tutti i documenti inviati a o da questo indirizzo email" + +#: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:78 +msgid "View all documents sent to your account" +msgstr "Visualizza tutti i documenti inviati al tuo account" + +#: apps/web/src/app/(dashboard)/settings/security/page.tsx:134 +msgid "View all recent security activity related to your account." +msgstr "Visualizza tutte le attività di sicurezza recenti relative al tuo account." + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:153 +msgid "View all related documents" +msgstr "Visualizza tutti i documenti correlati" + +#: apps/web/src/app/(dashboard)/settings/security/activity/page.tsx:26 +msgid "View all security activity related to your account." +msgstr "Visualizza tutte le attività di sicurezza relative al tuo account." + +#: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:78 +msgid "View Codes" +msgstr "Visualizza Codici" + +#: packages/email/templates/document-created-from-direct-template.tsx:75 +msgid "View document" +msgstr "Visualizza documento" + +#: apps/web/src/app/(signing)/sign/[token]/form.tsx:140 +#: packages/email/template-components/template-document-invite.tsx:104 +#: packages/email/template-components/template-document-rejected.tsx:44 +#: packages/ui/primitives/document-flow/add-subject.tsx:90 +#: packages/ui/primitives/document-flow/add-subject.tsx:91 +msgid "View Document" +msgstr "Visualizza documento" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/page.tsx:150 +msgid "View documents associated with this email" +msgstr "Visualizza documenti associati a questa email" + +#: apps/web/src/app/(dashboard)/settings/teams/team-invitations.tsx:55 +msgid "View invites" +msgstr "Visualizza inviti" + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:91 +msgid "View more" +msgstr "Vedi di più" + +#: apps/web/src/app/(signing)/sign/[token]/complete/document-preview-button.tsx:34 +msgid "View Original Document" +msgstr "Visualizza Documento Originale" + +#: packages/email/template-components/template-document-self-signed.tsx:79 +msgid "View plans" +msgstr "Visualizza piani" + +#: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:87 +#: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:116 +msgid "View Recovery Codes" +msgstr "Visualizza Codici di Recupero" + +#: apps/web/src/app/(teams)/t/[teamUrl]/error.tsx:56 +msgid "View teams" +msgstr "Visualizza squadre" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:120 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:269 +#: packages/lib/constants/recipient-roles.ts:30 +msgid "Viewed" +msgstr "Visualizzato" + +#: packages/lib/constants/recipient-roles.ts:32 +msgid "Viewer" +msgstr "Visualizzatore" + +#: packages/lib/constants/recipient-roles.ts:33 +msgid "Viewers" +msgstr "Visualizzatori" + +#: packages/lib/constants/recipient-roles.ts:31 +msgid "Viewing" +msgstr "Visualizzazione" + +#: apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx:125 +msgid "Waiting" +msgstr "In attesa" + +#: packages/email/template-components/template-document-pending.tsx:31 +msgid "Waiting for others" +msgstr "In attesa di altri" + +#: packages/lib/server-only/document/send-pending-email.ts:96 +msgid "Waiting for others to complete signing." +msgstr "In attesa che altri completino la firma." + +#: apps/web/src/app/(signing)/sign/[token]/complete/page.tsx:148 +msgid "Waiting for others to sign" +msgstr "In attesa degli altri per firmare" + +#: apps/web/src/app/(signing)/sign/[token]/waiting/page.tsx:70 +msgid "Waiting for Your Turn" +msgstr "In attesa del tuo turno" + +#: apps/web/src/app/(signing)/sign/[token]/no-longer-available.tsx:61 +msgid "Want to send slick signing links like this one? <0>Check out Documenso." +msgstr "Vuoi inviare link di firma eleganti come questo? <0>Scopri Documenso." + +#: apps/web/src/app/(profile)/profile-header.tsx:68 +msgid "Want your own public profile?" +msgstr "Vuoi il tuo profilo pubblico?" + +#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:41 +#: apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx:55 +#: apps/web/src/components/(teams)/team-billing-portal-button.tsx:31 +msgid "We are unable to proceed to the billing portal at this time. Please try again, or contact support." +msgstr "Non siamo in grado di procedere al portale di fatturazione in questo momento. Per favore riprova, o contatta l'assistenza." + +#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:95 +msgid "We are unable to remove this passkey at the moment. Please try again later." +msgstr "Non siamo in grado di rimuovere questa chiave d'accesso al momento. Per favore riprova più tardi." + +#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:75 +msgid "We are unable to update this passkey at the moment. Please try again later." +msgstr "Non siamo in grado di aggiornare questa chiave d'accesso al momento. Per favore riprova più tardi." + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:149 +msgid "We encountered an error while removing the direct template link. Please try again later." +msgstr "Abbiamo riscontrato un errore durante la rimozione del link diretto al modello. Per favore riprova più tardi." + +#: apps/web/src/app/(dashboard)/settings/webhooks/[id]/page.tsx:84 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/[id]/page.tsx:90 +msgid "We encountered an error while updating the webhook. Please try again later." +msgstr "Abbiamo riscontrato un errore durante l'aggiornamento del webhook. Per favore riprova più tardi." + +#: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:102 +msgid "We encountered an unknown error while attempting to add this email. Please try again later." +msgstr "Abbiamo riscontrato un errore sconosciuto mentre tentavamo di aggiungere questa email. Per favore riprova più tardi." + +#: apps/web/src/components/(teams)/dialogs/create-team-dialog.tsx:107 +msgid "We encountered an unknown error while attempting to create a team. Please try again later." +msgstr "Abbiamo riscontrato un errore sconosciuto mentre tentavamo di creare un team. Per favore riprova più tardi." + +#: apps/web/src/components/(dashboard)/settings/webhooks/delete-webhook-dialog.tsx:90 +msgid "We encountered an unknown error while attempting to delete it. Please try again later." +msgstr "Abbiamo riscontrato un errore sconosciuto durante il tentativo di eliminarlo. Per favore riprova più tardi." + +#: apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx:35 +msgid "We encountered an unknown error while attempting to delete the pending team. Please try again later." +msgstr "Abbiamo riscontrato un errore sconosciuto mentre tentavamo di eliminare il team in sospeso. Per favore riprova più tardi." + +#: apps/web/src/components/(teams)/dialogs/delete-team-dialog.tsx:86 +msgid "We encountered an unknown error while attempting to delete this team. Please try again later." +msgstr "Abbiamo riscontrato un errore sconosciuto mentre tentavamo di eliminare questo team. Per favore riprova più tardi." + +#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:99 +msgid "We encountered an unknown error while attempting to delete this token. Please try again later." +msgstr "Abbiamo riscontrato un errore sconosciuto durante il tentativo di eliminare questo token. Si prega di riprovare più tardi." + +#: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:58 +msgid "We encountered an unknown error while attempting to delete your account. Please try again later." +msgstr "Abbiamo riscontrato un errore sconosciuto durante il tentativo di eliminare il tuo account. Si prega di riprovare più tardi." + +#: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:160 +msgid "We encountered an unknown error while attempting to invite team members. Please try again later." +msgstr "Abbiamo riscontrato un errore sconosciuto durante il tentativo di invitare membri del team. Si prega di riprovare più tardi." + +#: apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx:60 +msgid "We encountered an unknown error while attempting to leave this team. Please try again later." +msgstr "Abbiamo riscontrato un errore sconosciuto durante il tentativo di abbandonare questo team. Si prega di riprovare più tardi." + +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:142 +msgid "We encountered an unknown error while attempting to remove this template from your profile. Please try again later." +msgstr "Abbiamo riscontrato un errore sconosciuto durante il tentativo di rimuovere questo modello dal tuo profilo. Si prega di riprovare più tardi." + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:56 +msgid "We encountered an unknown error while attempting to remove this transfer. Please try again or contact support." +msgstr "Abbiamo riscontrato un errore sconosciuto durante il tentativo di rimuovere questo trasferimento. Si prega di riprovare o contattare il supporto." + +#: apps/web/src/components/(teams)/dialogs/delete-team-member-dialog.tsx:60 +msgid "We encountered an unknown error while attempting to remove this user. Please try again later." +msgstr "Abbiamo riscontrato un errore sconosciuto durante il tentativo di rimuovere questo utente. Si prega di riprovare più tardi." + +#: apps/web/src/components/(teams)/dialogs/transfer-team-dialog.tsx:118 +msgid "We encountered an unknown error while attempting to request a transfer of this team. Please try again later." +msgstr "Abbiamo riscontrato un errore sconosciuto durante il tentativo di richiedere un trasferimento di questo team. Si prega di riprovare più tardi." + +#: apps/web/src/components/forms/reset-password.tsx:91 +msgid "We encountered an unknown error while attempting to reset your password. Please try again later." +msgstr "Abbiamo riscontrato un errore sconosciuto durante il tentativo di reimpostare la tua password. Si prega di riprovare più tardi." + +#: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:46 +msgid "We encountered an unknown error while attempting to revoke access. Please try again or contact support." +msgstr "Abbiamo riscontrato un errore sconosciuto durante il tentativo di revocare l'accesso. Si prega di riprovare o contattare il supporto." + +#: apps/web/src/components/forms/public-profile-claim-dialog.tsx:115 +msgid "We encountered an unknown error while attempting to save your details. Please try again later." +msgstr "Abbiamo riscontrato un errore sconosciuto durante il tentativo di salvare i tuoi dettagli. Si prega di riprovare più tardi." + +#: apps/web/src/components/forms/signin.tsx:273 +#: apps/web/src/components/forms/signin.tsx:288 +#: apps/web/src/components/forms/signin.tsx:304 +msgid "We encountered an unknown error while attempting to sign you In. Please try again later." +msgstr "Abbiamo riscontrato un errore sconosciuto durante il tentativo di accedere. Si prega di riprovare più tardi." + +#: apps/web/src/components/forms/signup.tsx:126 +#: apps/web/src/components/forms/signup.tsx:140 +#: apps/web/src/components/forms/v2/signup.tsx:189 +#: apps/web/src/components/forms/v2/signup.tsx:203 +msgid "We encountered an unknown error while attempting to sign you Up. Please try again later." +msgstr "Abbiamo riscontrato un errore sconosciuto durante il tentativo di registrarti. Si prega di riprovare più tardi." + +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:84 +msgid "We encountered an unknown error while attempting to update the banner. Please try again later." +msgstr "Abbiamo riscontrato un errore sconosciuto durante il tentativo di aggiornare il banner. Si prega di riprovare più tardi." + +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:178 +msgid "We encountered an unknown error while attempting to update the template. Please try again later." +msgstr "Abbiamo riscontrato un errore sconosciuto durante il tentativo di aggiornare il modello. Si prega di riprovare più tardi." + +#: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:102 +msgid "We encountered an unknown error while attempting to update this team member. Please try again later." +msgstr "Abbiamo riscontrato un errore sconosciuto durante il tentativo di aggiornare questo membro del team. Si prega di riprovare più tardi." + +#: apps/web/src/components/forms/avatar-image.tsx:118 +#: apps/web/src/components/forms/password.tsx:88 +msgid "We encountered an unknown error while attempting to update your password. Please try again later." +msgstr "Abbiamo riscontrato un errore sconosciuto durante il tentativo di aggiornare la tua password. Si prega di riprovare più tardi." + +#: apps/web/src/components/forms/public-profile-form.tsx:106 +msgid "We encountered an unknown error while attempting to update your public profile. Please try again later." +msgstr "Abbiamo riscontrato un errore sconosciuto durante il tentativo di aggiornare il tuo profilo pubblico. Si prega di riprovare più tardi." + +#: apps/web/src/components/(teams)/forms/update-team-form.tsx:95 +msgid "We encountered an unknown error while attempting to update your team. Please try again later." +msgstr "Abbiamo riscontrato un errore sconosciuto durante il tentativo di aggiornare il tuo team. Si prega di riprovare più tardi." + +#: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:91 +msgid "We encountered an unknown error while attempting update the team email. Please try again later." +msgstr "Abbiamo riscontrato un errore sconosciuto durante il tentativo di aggiornare l'email del team. Si prega di riprovare più tardi." + +#: apps/web/src/components/forms/profile.tsx:81 +msgid "We encountered an unknown error while attempting update your profile. Please try again later." +msgstr "Abbiamo riscontrato un errore sconosciuto durante il tentativo di aggiornare il tuo profilo. Si prega di riprovare più tardi." + +#: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:80 +msgid "We have sent a confirmation email for verification." +msgstr "Abbiamo inviato un'email di conferma per la verifica." + +#: apps/web/src/components/forms/v2/signup.tsx:61 +msgid "We need a username to create your profile" +msgstr "Abbiamo bisogno di un nome utente per creare il tuo profilo" + +#: apps/web/src/components/forms/v2/signup.tsx:56 +msgid "We need your signature to sign documents" +msgstr "Abbiamo bisogno della tua firma per firmare i documenti" + +#: apps/web/src/components/forms/token.tsx:112 +msgid "We were unable to copy the token to your clipboard. Please try again." +msgstr "Non siamo riusciti a copiare il token negli appunti. Si prega di riprovare." + +#: apps/web/src/components/forms/2fa/recovery-code-list.tsx:33 +msgid "We were unable to copy your recovery code to your clipboard. Please try again." +msgstr "Non siamo riusciti a copiare il tuo codice di recupero negli appunti. Si prega di riprovare." + +#: apps/web/src/components/(teams)/dialogs/create-team-checkout-dialog.tsx:52 +msgid "We were unable to create a checkout session. Please try again, or contact support" +msgstr "Non siamo riusciti a creare una sessione di pagamento. Si prega di riprovare o contattare il supporto" + +#: apps/web/src/components/forms/v2/signup.tsx:80 +msgid "We were unable to create your account. Please review the information you provided and try again." +msgstr "Non siamo riusciti a creare il tuo account. Si prega di rivedere le informazioni fornite e riprovare." + +#: apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx:105 +msgid "We were unable to disable two-factor authentication for your account. Please ensure that you have entered your password and backup code correctly and try again." +msgstr "Non siamo riusciti a disabilitare l'autenticazione a due fattori per il tuo account. Assicurati di aver inserito correttamente la password e il codice di backup e riprova." + +#: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:28 +#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:39 +msgid "We were unable to log you out at this time." +msgstr "Non siamo riusciti a disconnetterti in questo momento." + +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:124 +msgid "We were unable to set your public profile to public. Please try again." +msgstr "Non siamo riusciti a impostare il tuo profilo pubblico come pubblico. Per favore riprova." + +#: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:70 +#: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:103 +msgid "We were unable to setup two-factor authentication for your account. Please ensure that you have entered your code correctly and try again." +msgstr "Non siamo riusciti a impostare l'autenticazione a due fattori per il tuo account. Assicurati di aver inserito correttamente il tuo codice e riprova." + +#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:120 +#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:264 +#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:146 +msgid "We were unable to submit this document at this time. Please try again later." +msgstr "Non siamo riusciti a inviare questo documento in questo momento. Per favore riprova più tardi." + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:109 +msgid "We were unable to update your branding preferences at this time, please try again later" +msgstr "Non siamo riusciti ad aggiornare le tue preferenze di branding al momento, riprova più tardi" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:110 +msgid "We were unable to update your document preferences at this time, please try again later" +msgstr "Non siamo riusciti ad aggiornare le tue preferenze sui documenti al momento, riprova più tardi" + +#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:169 +msgid "We were unable to verify your details. Please try again or contact support" +msgstr "Non siamo riusciti a verificare i tuoi dati. Per favore riprova o contatta il supporto" + +#: apps/web/src/app/(unauthenticated)/verify-email/[token]/page.tsx:65 +msgid "We were unable to verify your email. If your email is not verified already, please try again." +msgstr "Non siamo riusciti a verificare la tua email. Se la tua email non è già verificata, riprova." + +#: packages/ui/primitives/document-flow/add-subject.tsx:205 +msgid "We will generate signing links for with you, which you can send to the recipients through your method of choice." +msgstr "Genereremo link di firma con te, che potrai inviare ai destinatari tramite il tuo metodo preferito." + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:382 +msgid "We will generate signing links for you, which you can send to the recipients through your method of choice." +msgstr "Genereremo link di firma per te, che potrai inviare ai destinatari tramite il metodo di tua scelta." + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:378 +#: packages/ui/primitives/document-flow/add-subject.tsx:201 +msgid "We won't send anything to notify recipients." +msgstr "Non invieremo nulla per notificare i destinatari." + +#: apps/web/src/app/(dashboard)/documents/empty-state.tsx:29 +#: apps/web/src/app/(dashboard)/templates/empty-state.tsx:11 +msgid "We're all empty" +msgstr "Siamo tutti vuoti" + +#: packages/email/template-components/template-document-pending.tsx:41 +msgid "We're still waiting for other signers to sign this document.<0/>We'll notify you as soon as it's ready." +msgstr "Stiamo ancora aspettando che altri firmatari firmino questo documento.<0/>Ti avviseremo non appena sarà pronto." + +#: packages/email/templates/reset-password.tsx:65 +msgid "We've changed your password as you asked. You can now sign in with your new password." +msgstr "Abbiamo cambiato la tua password come richiesto. Ora puoi accedere con la tua nuova password." + +#: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:116 +msgid "We've sent a confirmation email to <0>{email}. Please check your inbox and click the link in the email to verify your account." +msgstr "Abbiamo inviato un'email di conferma a <0>{email}. Controlla la tua casella di posta e clicca sul link nell'email per verificare il tuo account." + +#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:92 +msgid "Webhook created" +msgstr "Webhook creato" + +#: apps/web/src/components/(dashboard)/settings/webhooks/delete-webhook-dialog.tsx:78 +msgid "Webhook deleted" +msgstr "Webhook eliminato" + +#: apps/web/src/app/(dashboard)/settings/webhooks/[id]/page.tsx:74 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/[id]/page.tsx:80 +msgid "Webhook updated" +msgstr "Webhook aggiornato" + +#: apps/web/src/app/(dashboard)/settings/webhooks/[id]/page.tsx:117 +#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:145 +msgid "Webhook URL" +msgstr "URL del webhook" + +#: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:28 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/page.tsx:33 +#: apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx:103 +#: apps/web/src/components/(dashboard)/settings/layout/mobile-nav.tsx:106 +#: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:109 +#: apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx:118 +msgid "Webhooks" +msgstr "Webhook" + +#: apps/web/src/app/(dashboard)/settings/billing/billing-plans.tsx:29 +msgid "Weekly" +msgstr "Settimanale" + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:21 +msgid "Welcome" +msgstr "Benvenuto" + +#: apps/web/src/app/(unauthenticated)/signin/page.tsx:33 +msgid "Welcome back, we are lucky to have you." +msgstr "Bentornato, siamo fortunati ad averti." + +#: packages/email/template-components/template-confirmation-email.tsx:21 +msgid "Welcome to Documenso!" +msgstr "Benvenuto su Documenso!" + +#: apps/web/src/app/(signing)/sign/[token]/waiting/page.tsx:88 +msgid "Were you trying to edit this document instead?" +msgstr "Stavi provando a modificare questo documento invece?" + +#: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:189 +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." + +#: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:183 +msgid "When you sign a document, we can automatically fill in and sign the following fields using information that has already been provided. You can also manually sign or remove any automatically signed fields afterwards if you desire." +msgstr "Quando firmi un documento, possiamo automaticamente compilare e firmare i seguenti campi utilizzando le informazioni già fornite. Puoi anche firmare manualmente o rimuovere eventuali campi firmati automaticamente in seguito, se lo desideri." + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:36 +msgid "When you use our platform to affix your electronic signature to documents, you are consenting to do so under the Electronic Signatures in Global and National Commerce Act (E-Sign Act) and other applicable laws. This action indicates your agreement to use electronic means to sign documents and receive notifications." +msgstr "Quando utilizzi la nostra piattaforma per apporre la tua firma elettronica sui documenti, acconsenti a farlo ai sensi della Legge sulle firme elettroniche nel commercio globale e nazionale (E-Sign Act) e altre leggi applicabili. Questa azione indica il tuo consenso a utilizzare mezzi elettronici per firmare documenti e ricevere notifiche." + +#: apps/web/src/app/(profile)/p/[url]/page.tsx:139 +msgid "While waiting for them to do so you can create your own Documenso account and get started with document signing right away." +msgstr "Mentre aspetti che lo facciano, puoi creare il tuo account Documenso e iniziare a firmare documenti subito." + +#: apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx:126 +msgid "Who do you want to remind?" +msgstr "Chi vuoi ricordare?" + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:101 +msgid "Withdrawing Consent" +msgstr "Ritiro del consenso" + +#: apps/web/src/components/forms/public-profile-form.tsx:223 +msgid "Write about the team" +msgstr "Scrivi della squadra" + +#: apps/web/src/components/forms/public-profile-form.tsx:223 +msgid "Write about yourself" +msgstr "Scrivi di te stesso" + +#: apps/web/src/app/(dashboard)/settings/billing/billing-plans.tsx:31 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx:53 +msgid "Yearly" +msgstr "Annuale" + +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:33 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:32 +#: packages/lib/utils/document-audit-logs.ts:274 +msgid "You" +msgstr "Tu" + +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:104 +msgid "You are about to delete <0>\"{documentTitle}\"" +msgstr "Stai per eliminare <0>\"{documentTitle}\"" + +#: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:120 +msgid "You are about to delete the following team email from <0>{teamName}." +msgstr "Stai per eliminare la seguente email del team da <0>{teamName}." + +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:108 +msgid "You are about to hide <0>\"{documentTitle}\"" +msgstr "Stai per nascondere <0>\"{documentTitle}\"" + +#: apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx:85 +msgid "You are about to leave the following team." +msgstr "Stai per abbandonare il seguente team." + +#: apps/web/src/components/(teams)/dialogs/delete-team-member-dialog.tsx:85 +msgid "You are about to remove the following user from <0>{teamName}." +msgstr "Stai per rimuovere il seguente utente da <0>{teamName}." + +#: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:98 +msgid "You are about to revoke access for team <0>{0} ({1}) to use your email." +msgstr "Stai per revocare l'accesso per il team <0>{0} ({1}) per utilizzare la tua email." + +#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:44 +msgid "You are about to send this document to the recipients. Are you sure you want to continue?" +msgstr "Stai per inviare questo documento ai destinatari. Sei sicuro di voler continuare?" + +#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:80 +msgid "You are currently on the <0>Free Plan." +msgstr "Attualmente sei sul <0>Piano Gratuito." + +#: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:148 +msgid "You are currently updating <0>{teamMemberName}." +msgstr "Stai attualmente aggiornando <0>{teamMemberName}." + +#: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:122 +msgid "You are currently updating the <0>{passkeyName} passkey." +msgstr "Stai attualmente aggiornando la chiave d'accesso <0>{passkeyName}." + +#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:64 +msgid "You are not a member of this team." +msgstr "Non sei un membro di questo team." + +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:62 +msgid "You are not authorized to delete this user." +msgstr "Non sei autorizzato a eliminare questo utente." + +#: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:56 +msgid "You are not authorized to disable this user." +msgstr "Non sei autorizzato a disabilitare questo utente." + +#: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:56 +msgid "You are not authorized to enable this user." +msgstr "Non sei autorizzato ad abilitare questo utente." + +#: apps/web/src/app/(teams)/t/[teamUrl]/error.tsx:28 +msgid "You are not authorized to view this page." +msgstr "Non sei autorizzato a visualizzare questa pagina." + +#: packages/email/template-components/template-confirmation-email.tsx:38 +msgid "You can also copy and paste this link into your browser: {confirmationLink} (link expires in 1 hour)" +msgstr "Puoi anche copiare e incollare questo link nel tuo browser: {confirmationLink} (il link scade tra 1 ora)" + +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:43 +msgid "You can choose to enable or disable your profile for public view." +msgstr "Puoi scegliere di abilitare o disabilitare il tuo profilo per la visualizzazione pubblica." + +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:50 +msgid "You can choose to enable or disable your team profile for public view." +msgstr "Puoi scegliere di abilitare o disabilitare il profilo del tuo team per la visualizzazione pubblica." + +#: apps/web/src/app/(dashboard)/documents/upcoming-profile-claim-teaser.tsx:30 +msgid "You can claim your profile later on by going to your profile settings!" +msgstr "Puoi rivendicare il tuo profilo più tardi andando alle impostazioni del tuo profilo!" + +#: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:87 +msgid "You can copy and share these links to recipients so they can action the document." +msgstr "Puoi copiare e condividere questi link con i destinatari affinché possano agire sul documento." + +#: packages/email/templates/confirm-team-email.tsx:106 +msgid "You can revoke access at any time in your team settings on Documenso <0>here." +msgstr "Puoi revocare l'accesso in qualsiasi momento nelle impostazioni del tuo team su Documenso <0>qui." + +#: apps/web/src/components/forms/public-profile-form.tsx:154 +msgid "You can update the profile URL by updating the team URL in the general settings page." +msgstr "Puoi aggiornare l'URL del profilo aggiornando l'URL del team nella pagina delle impostazioni generali." + +#: packages/ui/components/document/document-send-email-message-helper.tsx:11 +msgid "You can use the following variables in your message:" +msgstr "Puoi utilizzare le seguenti variabili nel tuo messaggio:" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/page.tsx:65 +msgid "You can view documents associated with this email and use this identity when sending documents." +msgstr "Puoi visualizzare i documenti associati a questa email e utilizzare questa identità quando invii documenti." + +#: packages/email/templates/bulk-send-complete.tsx:76 +msgid "You can view the created documents in your dashboard under the \"Documents created from template\" section." +msgstr "" + +#: packages/email/template-components/template-document-rejected.tsx:37 +msgid "You can view the document and its status by clicking the button below." +msgstr "Puoi visualizzare il documento e il suo stato cliccando sul pulsante qui sotto." + +#: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:213 +msgid "You cannot have more than {MAXIMUM_PASSKEYS} passkeys." +msgstr "Non puoi avere più di {MAXIMUM_PASSKEYS} passkey." + +#: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:120 +msgid "You cannot modify a team member who has a higher role than you." +msgstr "Non puoi modificare un membro del team che ha un ruolo superiore al tuo." + +#: packages/ui/primitives/document-dropzone.tsx:43 +msgid "You cannot upload documents at this time." +msgstr "Non puoi caricare documenti in questo momento." + +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:103 +msgid "You cannot upload encrypted PDFs" +msgstr "Non puoi caricare PDF crittografati" + +#: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:46 +msgid "You do not currently have a customer record, this should not happen. Please contact support for assistance." +msgstr "Attualmente non hai un record cliente, questo non dovrebbe succedere. Per favore contatta il supporto per assistenza." + +#: apps/web/src/components/forms/token.tsx:141 +msgid "You do not have permission to create a token for this team" +msgstr "Non hai il permesso di creare un token per questo team" + +#: packages/email/template-components/template-document-cancel.tsx:35 +msgid "You don't need to sign it anymore." +msgstr "Non hai più bisogno di firmarlo." + +#: apps/web/src/app/(unauthenticated)/team/invite/[token]/page.tsx:127 +msgid "You have accepted an invitation from <0>{0} to join their team." +msgstr "Hai accettato un invito da <0>{0} per unirti al loro team." + +#: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:64 +msgid "You have already completed the ownership transfer for <0>{0}." +msgstr "Hai già completato il trasferimento di proprietà per <0>{0}." + +#: apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx:61 +msgid "You have already verified your email address for <0>{0}." +msgstr "Hai già verificato il tuo indirizzo email per <0>{0}." + +#: apps/web/src/app/(unauthenticated)/team/decline/[token]/page.tsx:95 +#: apps/web/src/app/(unauthenticated)/team/invite/[token]/page.tsx:100 +msgid "You have been invited by <0>{0} to join their team." +msgstr "Sei stato invitato da <0>{0} a unirti al loro team." + +#: packages/lib/server-only/team/create-team-member-invites.ts:186 +msgid "You have been invited to join {0} on Documenso" +msgstr "Sei stato invitato a unirti a {0} su Documenso" + +#: packages/email/templates/team-invite.tsx:76 +msgid "You have been invited to join the following team" +msgstr "Sei stato invitato a unirti al seguente team" + +#: packages/lib/server-only/recipient/delete-document-recipient.ts:156 +#: packages/lib/server-only/recipient/set-document-recipients.ts:326 +msgid "You have been removed from a document" +msgstr "Sei stato rimosso da un documento" + +#: packages/lib/server-only/team/request-team-ownership-transfer.ts:114 +msgid "You have been requested to take ownership of team {0} on Documenso" +msgstr "Ti è stato richiesto di prendere possesso del team {0} su Documenso" + +#: apps/web/src/app/(unauthenticated)/team/decline/[token]/page.tsx:122 +msgid "You have declined the invitation from <0>{0} to join their team." +msgstr "Hai rifiutato l'invito da <0>{0} per unirti al loro team." + +#: packages/lib/jobs/definitions/emails/send-signing-email.handler.ts:103 +#: packages/lib/server-only/document/resend-document.tsx:125 +msgid "You have initiated the document {0} that requires you to {recipientActionVerb} it." +msgstr "Hai avviato il documento {0} che richiede che tu lo {recipientActionVerb}." + +#: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:44 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/page.tsx:49 +msgid "You have no webhooks yet. Your webhooks will be shown here once you create them." +msgstr "Non hai ancora webhook. I tuoi webhook verranno visualizzati qui una volta creati." + +#: apps/web/src/app/(dashboard)/templates/empty-state.tsx:15 +msgid "You have not yet created any templates. To create a template please upload one." +msgstr "Non hai ancora creato alcun modello. Per creare un modello, caricane uno." + +#: apps/web/src/app/(dashboard)/documents/empty-state.tsx:30 +msgid "You have not yet created or received any documents. To create a document please upload one." +msgstr "Non hai ancora creato o ricevuto documenti. Per creare un documento caricane uno." + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:229 +msgid "You have reached the maximum limit of {0} direct templates. <0>Upgrade your account to continue!" +msgstr "Hai raggiunto il limite massimo di {0} modelli diretti. <0>Aggiorna il tuo account per continuare!" + +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106 +msgid "You have reached your document limit for this month. Please upgrade your plan." +msgstr "Hai raggiunto il limite dei documenti per questo mese. Si prega di aggiornare il proprio piano." + +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:56 +#: packages/ui/primitives/document-dropzone.tsx:69 +msgid "You have reached your document limit." +msgstr "Hai raggiunto il tuo limite di documenti." + +#: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:183 +msgid "You have reached your document limit. <0>Upgrade your account to continue!" +msgstr "Hai raggiunto il tuo limite di documenti. <0>Aggiorna il tuo account per continuare!" + +#: packages/email/templates/document-rejection-confirmed.tsx:27 +msgid "You have rejected the document '{documentName}'" +msgstr "Hai rifiutato il documento '{documentName}'" + +#: apps/web/src/app/(signing)/sign/[token]/rejected/page.tsx:88 +msgid "You have rejected this document" +msgstr "Hai rifiutato questo documento" + +#: packages/email/template-components/template-document-self-signed.tsx:42 +msgid "You have signed “{documentName}”" +msgstr "Hai firmato “{documentName}”" + +#: apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx:50 +msgid "You have successfully left this team." +msgstr "Hai lasciato con successo questo team." + +#: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:85 +#: apps/web/src/components/forms/signup.tsx:97 +#: apps/web/src/components/forms/v2/signup.tsx:141 +msgid "You have successfully registered. Please verify your account by clicking on the link you received in the email." +msgstr "Ti sei registrato con successo. Verifica il tuo account cliccando sul link ricevuto via email." + +#: apps/web/src/components/(teams)/dialogs/delete-team-member-dialog.tsx:50 +msgid "You have successfully removed this user from the team." +msgstr "Hai rimosso con successo questo utente dal team." + +#: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:38 +msgid "You have successfully revoked access." +msgstr "Hai revocato con successo l'accesso." + +#: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:104 +msgid "You have the right to withdraw your consent to use electronic signatures at any time before completing the signing process. To withdraw your consent, please contact the sender of the document. In failing to contact the sender you may reach out to <0>{SUPPORT_EMAIL} for assistance. Be aware that withdrawing consent may delay or halt the completion of the related transaction or service." +msgstr "Hai il diritto di ritirare il tuo consenso all'uso delle firme elettroniche in qualsiasi momento prima di completare il processo di firma. Per ritirare il tuo consenso, contatta il mittente del documento. Nel caso in cui non riesci a contattare il mittente, puoi contattare <0>{SUPPORT_EMAIL} per assistenza. Sii consapevole che il ritiro del consenso potrebbe ritardare o fermare il completamento della transazione o del servizio correlato." + +#: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:93 +msgid "You have updated {teamMemberName}." +msgstr "Hai aggiornato {teamMemberName}." + +#: apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx:136 +msgid "You have verified your email address for <0>{0}." +msgstr "Hai verificato il tuo indirizzo email per <0>{0}." + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx:88 +msgid "You must be an admin of this team to manage billing." +msgstr "Devi essere un amministratore di questo team per gestire la fatturazione." + +#: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:60 +#: apps/web/src/components/(dashboard)/settings/webhooks/delete-webhook-dialog.tsx:58 +#: apps/web/src/components/(teams)/dialogs/delete-team-dialog.tsx:54 +msgid "You must enter '{deleteMessage}' to proceed" +msgstr "Devi inserire '{deleteMessage}' per procedere" + +#: apps/web/src/components/(teams)/dialogs/transfer-team-dialog.tsx:266 +msgid "You must have at least one other team member to transfer ownership." +msgstr "Devi avere almeno un altro membro del team per trasferire la proprietà." + +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:108 +msgid "You must set a profile URL before enabling your public profile." +msgstr "Devi impostare un'URL del profilo prima di abilitare il tuo profilo pubblico." + +#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:56 +msgid "You need to be logged in as <0>{email} to view this page." +msgstr "Devi essere loggato come <0>{email} per visualizzare questa pagina." + +#: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:45 +msgid "You need to be logged in to view this page." +msgstr "Devi essere loggato per visualizzare questa pagina." + +#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:105 +msgid "You need to setup 2FA to mark this document as viewed." +msgstr "Devi configurare l'autenticazione a due fattori per contrassegnare questo documento come visualizzato." + +#: apps/web/src/components/forms/v2/signup.tsx:287 +msgid "You will get notified & be able to set up your documenso public profile when we launch the feature." +msgstr "Riceverai una notifica e potrai configurare il tuo profilo pubblico su Documenso quando lanceremo la funzionalità." + +#: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:96 +msgid "You will now be required to enter a code from your authenticator app when signing in." +msgstr "Ora ti verrà richiesto di inserire un codice dalla tua app di autenticazione durante l'accesso." + +#: apps/web/src/app/(signing)/sign/[token]/complete/page.tsx:171 +msgid "You will receive an Email copy of the signed document once everyone has signed." +msgstr "Riceverai una copia del documento firmato via email una volta che tutti hanno firmato." + +#: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:48 +msgid "Your account has been deleted successfully." +msgstr "Il tuo account è stato eliminato con successo." + +#: apps/web/src/components/forms/avatar-image.tsx:108 +msgid "Your avatar has been updated successfully." +msgstr "Il tuo avatar è stato aggiornato correttamente." + +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:74 +msgid "Your banner has been updated successfully." +msgstr "Il tuo banner è stato aggiornato correttamente." + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:280 +msgid "Your brand website URL" +msgstr "URL del sito web del tuo marchio" + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:103 +msgid "Your branding preferences have been updated" +msgstr "Le tue preferenze di branding sono state aggiornate" + +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:97 +msgid "Your bulk send has been initiated. You will receive an email notification upon completion." +msgstr "" + +#: packages/email/templates/bulk-send-complete.tsx:40 +msgid "Your bulk send operation for template \"{templateName}\" has completed." +msgstr "" + +#: apps/web/src/app/(dashboard)/settings/billing/page.tsx:125 +msgid "Your current plan is past due. Please update your payment information." +msgstr "Il tuo piano attuale è scaduto. Aggiorna le informazioni di pagamento." + +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:249 +msgid "Your direct signing templates" +msgstr "I tuoi modelli di firma diretta" + +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:123 +msgid "Your document failed to upload." +msgstr "Il tuo documento non è stato caricato." + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:169 +msgid "Your document has been created from the template successfully." +msgstr "Il tuo documento è stato creato con successo dal modello." + +#: packages/email/template-components/template-document-super-delete.tsx:23 +msgid "Your document has been deleted by an admin!" +msgstr "Il tuo documento è stato eliminato da un amministratore!" + +#: apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx:98 +msgid "Your document has been re-sent successfully." +msgstr "Il tuo documento è stato reinviato correttamente." + +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:304 +msgid "Your document has been sent successfully." +msgstr "Il tuo documento è stato inviato correttamente." + +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:58 +msgid "Your document has been successfully duplicated." +msgstr "Il tuo documento è stato duplicato correttamente." + +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:86 +msgid "Your document has been uploaded successfully." +msgstr "Il tuo documento è stato caricato correttamente." + +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:68 +msgid "Your document has been uploaded successfully. You will be redirected to the template page." +msgstr "Il tuo documento è stato caricato correttamente. Sarai reindirizzato alla pagina del modello." + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:104 +msgid "Your document preferences have been updated" +msgstr "Le tue preferenze sui documenti sono state aggiornate" + +#: apps/web/src/components/(dashboard)/common/command-menu.tsx:223 +msgid "Your documents" +msgstr "I tuoi documenti" + +#: apps/web/src/app/(unauthenticated)/verify-email/[token]/client.tsx:40 +msgid "Your email has been successfully confirmed! You can now use all features of Documenso." +msgstr "La tua email è stata confermata con successo! Ora puoi utilizzare tutte le funzionalità di Documenso." + +#: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:62 +msgid "Your email is currently being used by team <0>{0} ({1})." +msgstr "La tua email è attualmente utilizzata dal team <0>{0} ({1})." + +#: apps/web/src/app/(dashboard)/settings/tokens/page.tsx:47 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:80 +msgid "Your existing tokens" +msgstr "I tuoi token esistenti" + +#: apps/web/src/components/forms/password.tsx:84 +#: apps/web/src/components/forms/reset-password.tsx:87 +msgid "Your new password cannot be the same as your old password." +msgstr "La tua nuova password non può essere la stessa della vecchia password." + +#: apps/web/src/components/forms/password.tsx:73 +#: apps/web/src/components/forms/reset-password.tsx:74 +msgid "Your password has been updated successfully." +msgstr "La tua password è stata aggiornata con successo." + +#: packages/email/template-components/template-reset-password.tsx:26 +msgid "Your password has been updated." +msgstr "La tua password è stata aggiornata." + +#: apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx:113 +msgid "Your payment for teams is overdue. Please settle the payment to avoid any service disruptions." +msgstr "Il pagamento per i team è in ritardo. Si prega di effettuare il pagamento per evitare interruzioni del servizio." + +#: apps/web/src/components/forms/profile.tsx:72 +msgid "Your profile has been updated successfully." +msgstr "Il tuo profilo è stato aggiornato correttamente." + +#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:75 +msgid "Your profile has been updated." +msgstr "Il tuo profilo è stato aggiornato." + +#: apps/web/src/components/forms/public-profile-form.tsx:81 +msgid "Your public profile has been updated." +msgstr "Il tuo profilo pubblico è stato aggiornato." + +#: apps/web/src/components/forms/2fa/recovery-code-list.tsx:27 +msgid "Your recovery code has been copied to your clipboard." +msgstr "Il tuo codice di recupero è stato copiato negli appunti." + +#: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:167 +#: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:91 +msgid "Your recovery codes are listed below. Please store them in a safe place." +msgstr "I tuoi codici di recupero sono elencati di seguito. Si prega di conservarli in un luogo sicuro." + +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx:72 +msgid "Your subscription is currently active." +msgstr "Il tuo abbonamento è attualmente attivo." + +#: apps/web/src/components/(teams)/dialogs/create-team-dialog.tsx:89 +msgid "Your team has been created." +msgstr "Il tuo team è stato creato." + +#: packages/email/templates/team-delete.tsx:28 +#: packages/email/templates/team-delete.tsx:32 +msgid "Your team has been deleted" +msgstr "Il tuo team è stato eliminato" + +#: apps/web/src/components/(teams)/dialogs/delete-team-dialog.tsx:73 +msgid "Your team has been successfully deleted." +msgstr "Il tuo team è stato eliminato correttamente." + +#: apps/web/src/components/(teams)/forms/update-team-form.tsx:68 +msgid "Your team has been successfully updated." +msgstr "Il tuo team è stato aggiornato correttamente." + +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:42 +msgid "Your template has been duplicated successfully." +msgstr "Il tuo modello è stato duplicato correttamente." + +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:37 +msgid "Your template has been successfully deleted." +msgstr "Il tuo modello è stato eliminato correttamente." + +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:66 +msgid "Your template will be duplicated." +msgstr "Il tuo modello sarà duplicato." + +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:217 +msgid "Your templates has been saved successfully." +msgstr "I tuoi modelli sono stati salvati con successo." + +#: apps/web/src/app/(unauthenticated)/verify-email/[token]/page.tsx:89 +msgid "Your token has expired!" +msgstr "Il tuo token è scaduto!" + +#: apps/web/src/components/forms/token.tsx:277 +msgid "Your token was created successfully! Make sure to copy it because you won't be able to see it again!" +msgstr "Il tuo token è stato creato con successo! Assicurati di copiarlo perché non potrai più vederlo!" + +#: apps/web/src/app/(dashboard)/settings/tokens/page.tsx:53 +#: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:86 +msgid "Your tokens will be shown here once you create them." +msgstr "I tuoi token verranno mostrati qui una volta creati." diff --git a/packages/lib/translations/pl/web.po b/packages/lib/translations/pl/web.po index fd1825aea..69982bb21 100644 --- a/packages/lib/translations/pl/web.po +++ b/packages/lib/translations/pl/web.po @@ -8,7 +8,7 @@ msgstr "" "Language: pl\n" "Project-Id-Version: documenso-app\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2024-12-31 08:04\n" +"PO-Revision-Date: 2025-01-24 12:04\n" "Last-Translator: \n" "Language-Team: Polish\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" @@ -22,7 +22,7 @@ msgstr "" msgid "\"{0}\" has invited you to sign \"example document\"." msgstr "Użytkownik \"{0}\" zaprosił Cię do podpisania \"przykładowego dokumentu\"." -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:69 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:74 msgid "\"{0}\" will appear on the document as it has a timezone of \"{timezone}\"." msgstr "\"{0}\" pojawi się w dokumencie, ponieważ ma strefę czasową \"{timezone}\"." @@ -38,7 +38,7 @@ msgstr "„{documentName}” został podpisany" msgid "“{documentName}” was signed by all signers" msgstr "„{documentName}” został podpisany przez wszystkich sygnatariuszy" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:62 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:61 msgid "\"{documentTitle}\" has been successfully deleted" msgstr "\"{documentTitle}\" został pomyślnie usunięty" @@ -46,12 +46,12 @@ msgstr "\"{documentTitle}\" został pomyślnie usunięty" msgid "\"{placeholderEmail}\" on behalf of \"{0}\" has invited you to sign \"example document\"." msgstr "\"{placeholderEmail}\" w imieniu \"{0}\" zaprosił Cię do podpisania \"przykładowego dokumentu\"." -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:313 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:330 msgid "{0, plural, one {(1 character over)} other {(# characters over)}}" msgstr "{0, plural, one {(1 znak przekroczony)} few {(# znaki przekroczone)} many {(# znaków przekroczonych)} other {(# znaków przekroczonych)}}" #: apps/web/src/components/forms/public-profile-form.tsx:237 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:395 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:393 msgid "{0, plural, one {# character over the limit} other {# characters over the limit}}" msgstr "{0, plural, one {# znak przekroczony} few {# znaki przekroczone} many {# znaków przekroczonych} other {# znaków przekroczonych}}" @@ -76,7 +76,7 @@ msgstr "{0, plural, one {1 pasujące pole} few {# pasujące pola} many {# pasuj msgid "{0, plural, one {1 Recipient} other {# Recipients}}" msgstr "{0, plural, one {1 odbiorca} few {# odbiorców} many {# odbiorców} other {# odbiorców}}" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:238 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:239 msgid "{0, plural, one {Waiting on 1 recipient} other {Waiting on # recipients}}" msgstr "{0, plural, one {Czekam na 1 odbiorcę} few {Czekam na # odbiorców} many {Czekam na # odbiorców} other {Czekam na # odbiorców}}" @@ -88,7 +88,7 @@ msgstr "{0, plural, zero {Wybierz wartości} one {# wybrana...} few {# wybrane.. msgid "{0}" msgstr "{0}" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:249 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:247 msgid "{0} direct signing templates" msgstr "{0} bezpośrednich szablonów podpisu" @@ -108,7 +108,7 @@ msgstr "{0} dołączył do zespołu {teamName} na Documenso" msgid "{0} left the team {teamName} on Documenso" msgstr "{0} opuścił zespół {teamName} na Documenso" -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:151 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:145 msgid "{0} of {1} documents remaining this month." msgstr "{0} z {1} dokumentów pozostałych w tym miesiącu." @@ -121,11 +121,11 @@ msgstr "{0} z {1} wybranych wierszy." msgid "{0} on behalf of \"{1}\" has invited you to {recipientActionVerb} the document \"{2}\"." msgstr "{0} w imieniu \"{1}\" zaprosił Cię do {recipientActionVerb} dokument „{2}”." -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:173 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:174 msgid "{0} Recipient(s)" msgstr "{0} Odbiorca(ów)" -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:294 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:311 msgid "{charactersRemaining, plural, one {1 character remaining} other {{charactersRemaining} characters remaining}}" msgstr "{charactersRemaining, plural, one {Pozostał # znak} few {Pozostały {charactersRemaining} znaki} many {Pozostało {charactersRemaining} znaków} other {Pozostało {charactersRemaining} znaków}}" @@ -141,7 +141,7 @@ msgstr "{inviterName} anulował dokument {documentName}, nie musisz go już podp msgid "{inviterName} has cancelled the document<0/>\"{documentName}\"" msgstr "{inviterName} anulował dokument<0/>\"{documentName}\"" -#: packages/email/template-components/template-document-invite.tsx:75 +#: packages/email/template-components/template-document-invite.tsx:74 msgid "{inviterName} has invited you to {0}<0/>\"{documentName}\"" msgstr "{inviterName} zaprosił Cię do {0}<0/>\"{documentName}\"" @@ -161,9 +161,9 @@ msgstr "{inviterName} usunął Cię z dokumentu {documentName}." msgid "{inviterName} has removed you from the document<0/>\"{documentName}\"" msgstr "{inviterName} usunął cię z dokumentu<0/>„{documentName}”" -#: packages/email/template-components/template-document-invite.tsx:63 -msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {0}" -msgstr "Użytkownik {inviterName} w imieniu zespołu \"{teamName}\" zaprosił Cię do {0}" +#: packages/email/template-components/template-document-invite.tsx:61 +msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {0}<0/>\"{documentName}\"" +msgstr "" #: packages/email/templates/document-invite.tsx:45 msgid "{inviterName} on behalf of \"{teamName}\" has invited you to {action} {documentName}" @@ -181,87 +181,87 @@ msgstr "{memberEmail} opuścił następujący zespół" msgid "{numberOfSeats, plural, one {# member} other {# members}}" msgstr "{numberOfSeats, plural, one {# członek} few {# członkowie} many {# członków} other {# członków}}" -#: packages/lib/utils/document-audit-logs.ts:263 +#: packages/lib/utils/document-audit-logs.ts:279 msgid "{prefix} added a field" msgstr "{prefix} dodał pole" -#: packages/lib/utils/document-audit-logs.ts:275 +#: packages/lib/utils/document-audit-logs.ts:291 msgid "{prefix} added a recipient" msgstr "{prefix} dodał odbiorcę" -#: packages/lib/utils/document-audit-logs.ts:287 +#: packages/lib/utils/document-audit-logs.ts:303 msgid "{prefix} created the document" msgstr "{prefix} utworzył dokument" -#: packages/lib/utils/document-audit-logs.ts:291 +#: packages/lib/utils/document-audit-logs.ts:307 msgid "{prefix} deleted the document" msgstr "{prefix} usunął dokument" -#: packages/lib/utils/document-audit-logs.ts:335 +#: packages/lib/utils/document-audit-logs.ts:351 msgid "{prefix} moved the document to team" msgstr "{prefix} przeniósł dokument do zespołu" -#: packages/lib/utils/document-audit-logs.ts:319 +#: packages/lib/utils/document-audit-logs.ts:335 msgid "{prefix} opened the document" msgstr "{prefix} otworzył dokument" -#: packages/lib/utils/document-audit-logs.ts:267 +#: packages/lib/utils/document-audit-logs.ts:283 msgid "{prefix} removed a field" msgstr "{prefix} usunął pole" -#: packages/lib/utils/document-audit-logs.ts:279 +#: packages/lib/utils/document-audit-logs.ts:295 msgid "{prefix} removed a recipient" msgstr "{prefix} usunął odbiorcę" -#: packages/lib/utils/document-audit-logs.ts:365 +#: packages/lib/utils/document-audit-logs.ts:381 msgid "{prefix} resent an email to {0}" msgstr "{prefix} ponownie wysłał e-mail do {0}" -#: packages/lib/utils/document-audit-logs.ts:366 +#: packages/lib/utils/document-audit-logs.ts:382 msgid "{prefix} sent an email to {0}" msgstr "{prefix} wysłał e-mail do {0}" -#: packages/lib/utils/document-audit-logs.ts:331 +#: packages/lib/utils/document-audit-logs.ts:347 msgid "{prefix} sent the document" msgstr "{prefix} wysłał dokument" -#: packages/lib/utils/document-audit-logs.ts:295 +#: packages/lib/utils/document-audit-logs.ts:311 msgid "{prefix} signed a field" msgstr "{prefix} podpisał pole" -#: packages/lib/utils/document-audit-logs.ts:299 +#: packages/lib/utils/document-audit-logs.ts:315 msgid "{prefix} unsigned a field" msgstr "{prefix} niepodpisane pole" -#: packages/lib/utils/document-audit-logs.ts:271 +#: packages/lib/utils/document-audit-logs.ts:287 msgid "{prefix} updated a field" msgstr "{prefix} zaktualizowane pole" -#: packages/lib/utils/document-audit-logs.ts:283 +#: packages/lib/utils/document-audit-logs.ts:299 msgid "{prefix} updated a recipient" msgstr "{prefix} zaktualizowany odbiorca" -#: packages/lib/utils/document-audit-logs.ts:315 +#: packages/lib/utils/document-audit-logs.ts:331 msgid "{prefix} updated the document" msgstr "{prefix} zaktualizowany dokument" -#: packages/lib/utils/document-audit-logs.ts:307 +#: packages/lib/utils/document-audit-logs.ts:323 msgid "{prefix} updated the document access auth requirements" msgstr "{prefix} zaktualizowane wymagania dotyczące autoryzacji dostępu do dokumentu" -#: packages/lib/utils/document-audit-logs.ts:327 +#: packages/lib/utils/document-audit-logs.ts:343 msgid "{prefix} updated the document external ID" msgstr "{prefix} zaktualizowane ID zewnętrzne dokumentu" -#: packages/lib/utils/document-audit-logs.ts:311 +#: packages/lib/utils/document-audit-logs.ts:327 msgid "{prefix} updated the document signing auth requirements" msgstr "{prefix} zaktualizowane wymagania dotyczące autoryzacji podpisu dokumentu" -#: packages/lib/utils/document-audit-logs.ts:323 +#: packages/lib/utils/document-audit-logs.ts:339 msgid "{prefix} updated the document title" msgstr "{prefix} zaktualizowany tytuł dokumentu" -#: packages/lib/utils/document-audit-logs.ts:303 +#: packages/lib/utils/document-audit-logs.ts:319 msgid "{prefix} updated the document visibility" msgstr "{prefix} zaktualizowana widoczność dokumentu" @@ -298,7 +298,7 @@ msgid "{recipientReference} has signed {documentName}" msgstr "{recipientReference} podpisał {documentName}" #: apps/web/src/components/forms/public-profile-form.tsx:231 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:389 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:387 msgid "{remaningLength, plural, one {# character remaining} other {# characters remaining}}" msgstr "{remaningLength, plural, one {Pozostał # znak} few {Pozostały # znaki} many {Pozostało # znaków} other {Pozostało # znaków}}" @@ -307,8 +307,8 @@ msgid "{signerName} has rejected the document \"{documentName}\"." msgstr "{signerName} odrzucił dokument \"{documentName}\"." #: packages/email/template-components/template-document-invite.tsx:68 -msgid "{teamName} has invited you to {0}" -msgstr "{teamName} zaprosił cię do {0}" +msgid "{teamName} has invited you to {0}<0/>\"{documentName}\"" +msgstr "" #: packages/email/templates/document-invite.tsx:46 msgid "{teamName} has invited you to {action} {documentName}" @@ -318,27 +318,27 @@ msgstr "{teamName} zaprosił cię do {action} {documentName}" msgid "{teamName} ownership transfer request" msgstr "Prośba o przeniesienie własności zespołu {teamName}" -#: packages/lib/utils/document-audit-logs.ts:343 +#: packages/lib/utils/document-audit-logs.ts:359 msgid "{userName} approved the document" msgstr "{userName} zatwierdził dokument" -#: packages/lib/utils/document-audit-logs.ts:344 +#: packages/lib/utils/document-audit-logs.ts:360 msgid "{userName} CC'd the document" msgstr "{userName} dodał CC do dokumentu" -#: packages/lib/utils/document-audit-logs.ts:345 +#: packages/lib/utils/document-audit-logs.ts:361 msgid "{userName} completed their task" msgstr "{userName} zakończył swoje zadanie" -#: packages/lib/utils/document-audit-logs.ts:355 +#: packages/lib/utils/document-audit-logs.ts:371 msgid "{userName} rejected the document" msgstr "{userName} odrzucił dokument" -#: packages/lib/utils/document-audit-logs.ts:341 +#: packages/lib/utils/document-audit-logs.ts:357 msgid "{userName} signed the document" msgstr "{userName} podpisał dokument" -#: packages/lib/utils/document-audit-logs.ts:342 +#: packages/lib/utils/document-audit-logs.ts:358 msgid "{userName} viewed the document" msgstr "{userName} wyświetlił dokument" @@ -358,7 +358,11 @@ msgstr "<0>{senderName} poprosił, abyś przejął własność następujące msgid "<0>{teamName} has requested to use your email address for their team on Documenso." msgstr "<0>{teamName} poprosił o używanie twojego adresu e-mail dla swojego zespołu w Documenso." -#: packages/ui/primitives/template-flow/add-template-settings.tsx:241 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:463 +msgid "<0>Click to upload or drag and drop" +msgstr "<0>Kliknij, aby przesłać lub przeciągnij i upuść" + +#: packages/ui/primitives/template-flow/add-template-settings.tsx:287 msgid "<0>Email - The recipient will be emailed the document to sign, approve, etc." msgstr "<0>E-mail - Odbiorca otrzyma e-mail z dokumentem do podpisania, zatwierdzenia itp." @@ -378,11 +382,11 @@ msgstr "<0>Brak ograniczeń - Dokument można bezpośrednio otworzyć za pom msgid "<0>None - No authentication required" msgstr "<0>Brak - Uwierzytelnianie nie jest wymagane" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:247 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:293 msgid "<0>None - We will generate links which you can send to the recipients manually." msgstr "<0>Brak - Wygenerujemy linki, które możesz wysłać do odbiorców ręcznie." -#: packages/ui/primitives/template-flow/add-template-settings.tsx:254 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:300 msgid "<0>Note - If you use Links in combination with direct templates, you will need to manually send the links to the remaining recipients." msgstr "<0>Uwaga - Jeśli używasz linków w połączeniu z bezpośrednimi szablonami, musisz ręcznie wysłać linki do pozostałych odbiorców." @@ -464,19 +468,19 @@ msgstr "Urządzenie zdolne do uzyskiwania dostępu, otwierania i czytania dokume msgid "A document was created by your direct template that requires you to {recipientActionVerb} it." msgstr "Dokument został utworzony przez Twój bezpośredni szablon, który wymaga, abyś go {recipientActionVerb}." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:218 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:230 msgid "A draft document will be created" msgstr "Zostanie utworzony szkic dokumentu" -#: packages/lib/utils/document-audit-logs.ts:262 +#: packages/lib/utils/document-audit-logs.ts:278 msgid "A field was added" msgstr "Dodano pole" -#: packages/lib/utils/document-audit-logs.ts:266 +#: packages/lib/utils/document-audit-logs.ts:282 msgid "A field was removed" msgstr "Usunięto pole" -#: packages/lib/utils/document-audit-logs.ts:270 +#: packages/lib/utils/document-audit-logs.ts:286 msgid "A field was updated" msgstr "Zaktualizowano pole" @@ -488,7 +492,7 @@ msgstr "Środek do drukowania lub pobierania dokumentów do swoich zapisów" msgid "A new member has joined your team" msgstr "Nowy członek dołączył do Twojego zespołu" -#: apps/web/src/components/forms/token.tsx:127 +#: apps/web/src/components/forms/token.tsx:128 msgid "A new token was created successfully." msgstr "Nowy token został utworzony." @@ -497,15 +501,15 @@ msgstr "Nowy token został utworzony." msgid "A password reset email has been sent, if you have an account you should see it in your inbox shortly." msgstr "E-mail z linkiem do resetowania hasła został wysłany. Jeśli masz konto, powinieneś go niedługo zobaczyć w skrzynce odbiorczej." -#: packages/lib/utils/document-audit-logs.ts:274 +#: packages/lib/utils/document-audit-logs.ts:290 msgid "A recipient was added" msgstr "Dodano odbiorcę" -#: packages/lib/utils/document-audit-logs.ts:278 +#: packages/lib/utils/document-audit-logs.ts:294 msgid "A recipient was removed" msgstr "Usunięto odbiorcę" -#: packages/lib/utils/document-audit-logs.ts:282 +#: packages/lib/utils/document-audit-logs.ts:298 msgid "A recipient was updated" msgstr "Zaktualizowano odbiorcę" @@ -591,7 +595,7 @@ msgstr "Akceptowane zaproszenie do zespołu" msgid "Account Authentication" msgstr "Uwierzytelnianie konta" -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:50 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:51 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:47 msgid "Account deleted" msgstr "Konto zostało usunięte" @@ -612,20 +616,20 @@ msgstr "Ponowna Autoryzacja Konta" msgid "Acknowledgment" msgstr "Potwierdzenie" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:108 -#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:98 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:123 -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:164 -#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:116 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:114 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:97 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:117 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:159 +#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:115 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:46 msgid "Action" msgstr "Akcja" #: apps/web/src/app/(dashboard)/documents/data-table.tsx:79 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:177 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:175 #: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:140 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:131 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:140 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:130 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:139 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:116 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:125 msgid "Actions" @@ -650,16 +654,16 @@ msgid "Add a document" msgstr "Dodaj dokument" #: packages/ui/primitives/document-flow/add-settings.tsx:390 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:468 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:514 msgid "Add a URL to redirect the user to once the document is signed" msgstr "Dodaj URL, aby przekierować użytkownika po podpisaniu dokumentu" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:177 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:88 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:153 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:87 msgid "Add all relevant fields for each recipient." msgstr "Dodaj wszystkie istotne pola dla każdego odbiorcy." -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:83 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:82 msgid "Add all relevant placeholders for each recipient." msgstr "Dodaj wszystkie odpowiednie symbole zastępcze dla każdego odbiorcy." @@ -675,7 +679,7 @@ msgstr "Dodaj autoryzator, aby służył jako dodatkowa metoda uwierzytelniania msgid "Add an external ID to the document. This can be used to identify the document in external systems." msgstr "Dodaj zewnętrzny ID do dokumentu. Może być używany do identyfikacji dokumentu w zewnętrznych systemach." -#: packages/ui/primitives/template-flow/add-template-settings.tsx:385 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:431 msgid "Add an external ID to the template. This can be used to identify in external systems." msgstr "Dodaj zewnętrzny ID do szablonu. Może być używany do identyfikacji w systemach zewnętrznych." @@ -692,8 +696,8 @@ msgstr "Dodaj kolejną wartość" msgid "Add email" msgstr "Dodaj adres e-mail" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:176 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:87 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:152 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:86 msgid "Add Fields" msgstr "Dodaj pola" @@ -718,7 +722,7 @@ msgstr "Dodaj klucz dostępu" msgid "Add Placeholder Recipient" msgstr "Dodaj odbiorcę zastępczego" -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:82 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:81 msgid "Add Placeholders" msgstr "Dodaj znaczniki" @@ -726,7 +730,7 @@ msgstr "Dodaj znaczniki" msgid "Add Signer" msgstr "Dodaj sygnatariusza" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:171 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:147 msgid "Add Signers" msgstr "Dodaj podpisujących" @@ -734,19 +738,19 @@ msgstr "Dodaj podpisujących" msgid "Add team email" msgstr "Dodaj e-mail zespołowy" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:73 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:80 msgid "Add text" msgstr "Dodaj tekst" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:78 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:85 msgid "Add text to the field" msgstr "Dodaj tekst do pola" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:172 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:148 msgid "Add the people who will sign the document." msgstr "Dodaj osoby, które podpiszą dokument." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:220 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:232 msgid "Add the recipients to create the document with" msgstr "Dodaj odbiorców, aby utworzyć dokument" @@ -771,12 +775,12 @@ msgid "Admin panel" msgstr "Panel administratora" #: packages/ui/primitives/document-flow/add-settings.tsx:284 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:367 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:413 msgid "Advanced Options" msgstr "Opcje zaawansowane" #: packages/ui/primitives/document-flow/add-fields.tsx:585 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:415 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:490 msgid "Advanced settings" msgstr "Ustawienia zaawansowane" @@ -804,11 +808,11 @@ msgstr "Wszystkie dokumenty zostały przetworzone. Nowe dokumenty, które zostan msgid "All documents related to the electronic signing process will be provided to you electronically through our platform or via email. It is your responsibility to ensure that your email address is current and that you can receive and open our emails." msgstr "Wszystkie dokumenty związane z procesem podpisywania elektronicznego będą dostarczane do Ciebie elektronicznie za pośrednictwem naszej platformy lub za pośrednictwem e-maila. To Twoja odpowiedzialność, aby upewnić się, że twój adres e-mail jest aktualny i że możesz odbierać i otwierać nasze e-maile." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:147 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:146 msgid "All inserted signatures will be voided" msgstr "Wszystkie wstawione podpisy zostaną unieważnione" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:150 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:149 msgid "All recipients will be notified" msgstr "Wszyscy odbiorcy zostaną powiadomieni" @@ -864,30 +868,26 @@ msgstr "E-mail zawierający zaproszenie zostanie wysłany do każdego członka." msgid "An email requesting the transfer of this team has been sent." msgstr "E-mail z prośbą o przeniesienie tego zespołu został wysłany." -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:60 -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:83 -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:59 #: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:100 #: apps/web/src/components/forms/avatar-image.tsx:122 #: apps/web/src/components/forms/password.tsx:92 -#: apps/web/src/components/forms/profile.tsx:81 #: apps/web/src/components/forms/reset-password.tsx:95 #: apps/web/src/components/forms/signup.tsx:112 -#: apps/web/src/components/forms/token.tsx:137 +#: apps/web/src/components/forms/token.tsx:146 #: apps/web/src/components/forms/v2/signup.tsx:166 msgid "An error occurred" msgstr "Wystąpił błąd" -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:257 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:227 msgid "An error occurred while adding fields." msgstr "Wystąpił błąd podczas dodawania pól." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:269 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:218 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:243 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:187 msgid "An error occurred while adding signers." msgstr "Wystąpił błąd podczas dodawania podpisujących." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:304 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:281 msgid "An error occurred while adding the fields." msgstr "Wystąpił błąd podczas dodawania pól." @@ -895,7 +895,7 @@ msgstr "Wystąpił błąd podczas dodawania pól." msgid "An error occurred while auto-signing the document, some fields may not be signed. Please review and manually sign any remaining fields." msgstr "Wystąpił błąd podczas automatycznego podpisywania dokumentu, niektóre pola mogą nie być podpisane. Proszę sprawdzić i ręcznie podpisać wszystkie pozostałe pola." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:176 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:188 msgid "An error occurred while creating document from template." msgstr "Wystąpił błąd podczas tworzenia dokumentu z szablonu." @@ -903,7 +903,11 @@ msgstr "Wystąpił błąd podczas tworzenia dokumentu z szablonu." msgid "An error occurred while creating the webhook. Please try again." msgstr "Wystąpił błąd podczas tworzenia webhooka. Proszę spróbować ponownie." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:124 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:63 +msgid "An error occurred while deleting the user." +msgstr "Wystąpił błąd podczas usuwania użytkownika." + +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:120 msgid "An error occurred while disabling direct link signing." msgstr "Wystąpił błąd podczas dezaktywacji podpisywania za pomocą linku bezpośredniego." @@ -911,18 +915,18 @@ msgstr "Wystąpił błąd podczas dezaktywacji podpisywania za pomocą linku bez msgid "An error occurred while disabling the user." msgstr "Wystąpił błąd podczas wyłączania użytkownika." -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:64 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:92 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:76 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:107 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:70 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:98 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:77 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:101 msgid "An error occurred while downloading your document." msgstr "Wystąpił błąd podczas pobierania dokumentu." -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:52 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51 msgid "An error occurred while duplicating template." msgstr "Wystąpił błąd podczas duplikowania szablonu." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:123 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:119 msgid "An error occurred while enabling direct link signing." msgstr "Wystąpił błąd podczas aktywacji podpisywania za pomocą linku bezpośredniego." @@ -951,21 +955,21 @@ msgid "An error occurred while removing the field." msgstr "Wystąpił błąd podczas usuwania pola." #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:154 -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:126 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:131 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:137 -#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:110 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:148 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:195 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:115 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:153 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:196 #: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:129 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:194 msgid "An error occurred while removing the signature." msgstr "Wystąpił błąd podczas usuwania podpisu." -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:196 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:197 msgid "An error occurred while removing the text." msgstr "Wystąpił błąd podczas usuwania tekstu." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:350 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:326 msgid "An error occurred while sending the document." msgstr "Wystąpił błąd podczas wysyłania dokumentu." @@ -974,15 +978,15 @@ msgid "An error occurred while sending your confirmation email" msgstr "Wystąpił błąd podczas wysyłania e-maila potwierdzającego" #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:125 -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:100 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:105 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:106 -#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:84 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:89 #: apps/web/src/app/(signing)/sign/[token]/initials-field.tsx:90 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:122 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:150 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:127 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:151 #: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:102 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:168 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:168 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:169 msgid "An error occurred while signing the document." msgstr "Wystąpił błąd podczas podpisywania dokumentu." @@ -990,8 +994,8 @@ msgstr "Wystąpił błąd podczas podpisywania dokumentu." msgid "An error occurred while trying to create a checkout session." msgstr "Wystąpił błąd podczas próby utworzenia sesji zamówienia." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:235 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:187 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:210 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:156 msgid "An error occurred while updating the document settings." msgstr "Wystąpił błąd podczas aktualizowania ustawień dokumentu." @@ -1003,13 +1007,12 @@ msgstr "Wystąpił błąd podczas aktualizowania podpisu." msgid "An error occurred while updating your profile." msgstr "Wystąpił błąd podczas aktualizowania profilu." -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:118 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:108 msgid "An error occurred while uploading your document." msgstr "Wystąpił błąd podczas przesyłania dokumentu." -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:66 -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:89 -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:65 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:58 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:81 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:55 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:54 #: apps/web/src/components/(dashboard)/common/command-menu.tsx:301 @@ -1026,7 +1029,7 @@ msgstr "Wystąpił błąd podczas przesyłania dokumentu." #: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:100 #: apps/web/src/components/(teams)/forms/update-team-form.tsx:93 #: apps/web/src/components/forms/avatar-image.tsx:94 -#: apps/web/src/components/forms/profile.tsx:87 +#: apps/web/src/components/forms/profile.tsx:79 #: apps/web/src/components/forms/public-profile-claim-dialog.tsx:113 #: apps/web/src/components/forms/public-profile-form.tsx:104 #: apps/web/src/components/forms/signin.tsx:249 @@ -1036,11 +1039,10 @@ msgstr "Wystąpił błąd podczas przesyłania dokumentu." #: apps/web/src/components/forms/signin.tsx:302 #: apps/web/src/components/forms/signup.tsx:124 #: apps/web/src/components/forms/signup.tsx:138 -#: apps/web/src/components/forms/token.tsx:143 #: apps/web/src/components/forms/v2/signup.tsx:187 #: apps/web/src/components/forms/v2/signup.tsx:201 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:141 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:178 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:140 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:176 msgid "An unknown error occurred" msgstr "Wystąpił nieznany błąd" @@ -1048,11 +1050,11 @@ msgstr "Wystąpił nieznany błąd" msgid "Any payment methods attached to this team will remain attached to this team. Please contact us if you need to update this information." msgstr "Jakiekolwiek metody płatności przypisane do tego zespołu pozostaną przypisane do tego zespołu. Proszę skontaktować się z nami, jeśli potrzebujesz zaktualizować te informacje." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:221 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:219 msgid "Any Source" msgstr "Jakiekolwiek źródło" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:201 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:199 msgid "Any Status" msgstr "Jakikolwiek status" @@ -1070,16 +1072,16 @@ msgstr "Tokeny API" msgid "App Version" msgstr "Wersja aplikacji" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:89 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:120 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:146 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:95 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:121 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:140 #: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:143 #: packages/lib/constants/recipient-roles.ts:8 msgid "Approve" msgstr "Zatwierdź" #: apps/web/src/app/(signing)/sign/[token]/form.tsx:142 -#: packages/email/template-components/template-document-invite.tsx:106 +#: packages/email/template-components/template-document-invite.tsx:105 msgid "Approve Document" msgstr "Zatwierdź dokument" @@ -1116,13 +1118,13 @@ msgstr "Czy na pewno chcesz usunąć klucz hasła <0>{passkeyName}." msgid "Are you sure you wish to delete this team?" msgstr "Czy na pewno chcesz usunąć ten zespół?" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:100 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:99 #: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:94 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:455 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:449 #: apps/web/src/components/(teams)/dialogs/delete-team-member-dialog.tsx:81 #: apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx:81 #: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:116 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:439 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:437 msgid "Are you sure?" msgstr "Czy na pewno?" @@ -1130,11 +1132,11 @@ msgstr "Czy na pewno?" 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." -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:130 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:136 msgid "Audit Log" msgstr "Dziennik logów" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:198 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:200 msgid "Authentication Level" msgstr "Poziom autoryzacji" @@ -1165,7 +1167,7 @@ msgstr "Powrót" msgid "Back to Documents" msgstr "Powrót do dokumentów" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:146 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:137 msgid "Background Color" msgstr "Kolor tła" @@ -1178,7 +1180,7 @@ msgstr "Kod zapasowy" msgid "Backup codes" msgstr "Kody zapasowe" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:74 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:73 msgid "Banner Updated" msgstr "Baner został zaktualizowany" @@ -1215,7 +1217,7 @@ msgstr "Preferencje dotyczące marki" msgid "Branding preferences updated" msgstr "Preferencje dotyczące marki zaktualizowane" -#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:97 +#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:96 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:48 msgid "Browser" msgstr "Przeglądarka" @@ -1228,6 +1230,23 @@ msgstr "Masowa kopia" msgid "Bulk Import" msgstr "Import zbiorczy" +#: packages/lib/jobs/definitions/internal/bulk-send-template.handler.ts:203 +msgid "Bulk Send Complete: {0}" +msgstr "" + +#: packages/email/templates/bulk-send-complete.tsx:30 +msgid "Bulk send operation complete for template \"{templateName}\"" +msgstr "" + +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:128 +msgid "Bulk Send Template via CSV" +msgstr "" + +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:97 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:120 +msgid "Bulk Send via CSV" +msgstr "" + #: packages/email/templates/team-invite.tsx:84 msgid "by <0>{senderName}" msgstr "przez <0>{senderName}" @@ -1240,7 +1259,7 @@ msgstr "Akceptując tę prośbę, przyznasz <0>{teamName} dostęp do:" msgid "By accepting this request, you will take responsibility for any billing items associated with this team." msgstr "Akceptując tę prośbę, przejmiesz odpowiedzialność za wszelkie pozycje dotyczące rozliczeń związane z tym zespołem." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:158 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:157 msgid "By deleting this document, the following will occur:" msgstr "Usunięcie tego dokumentu spowoduje następujące:" @@ -1261,17 +1280,17 @@ msgid "By using the electronic signature feature, you are consenting to conduct 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." #: apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx:185 -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:192 -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:108 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:191 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:107 #: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:120 #: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:248 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:157 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:198 #: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:109 -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:81 -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:78 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:76 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:77 #: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:131 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:472 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:466 #: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:220 #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:178 #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:71 @@ -1279,12 +1298,12 @@ msgstr "Korzystając z funkcji podpisu elektronicznego, wyrażasz zgodę na prze #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:189 #: apps/web/src/app/(signing)/sign/[token]/form.tsx:164 #: apps/web/src/app/(signing)/sign/[token]/form.tsx:246 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:215 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:328 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:232 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:341 #: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:153 #: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:131 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:320 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:335 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:352 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121 #: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:176 #: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:242 @@ -1302,8 +1321,9 @@ msgstr "Korzystając z funkcji podpisu elektronicznego, wyrażasz zgodę na prze #: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:187 #: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:257 #: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:163 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:450 -#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:357 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:448 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:263 +#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:323 #: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:58 msgid "Cancel" msgstr "Anuluj" @@ -1333,7 +1353,7 @@ msgstr "CC'd" msgid "Ccers" msgstr "Kserokopie" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:86 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:93 msgid "Character Limit" msgstr "Limit znaków" @@ -1353,15 +1373,15 @@ msgstr "Wartości checkboxa" msgid "Checkout" msgstr "Kasa" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:271 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:266 msgid "Choose an existing recipient from below to continue" msgstr "Wybierz istniejącego odbiorcę, aby kontynuować" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:267 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:262 msgid "Choose Direct Link Recipient" msgstr "Wybierz odbiorcę bezpośredniego linku" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:182 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:158 msgid "Choose how the document will reach recipients" msgstr "Wybierz, jak dokument dotrze do odbiorców" @@ -1385,6 +1405,10 @@ msgstr "Zgłoś swój profil później" msgid "Claim your username now" msgstr "Zgłoś swoją nazwę użytkownika teraz" +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:537 +msgid "Clear file" +msgstr "Wyczyść plik" + #: packages/ui/primitives/data-table.tsx:156 msgid "Clear filters" msgstr "Wyczyść filtry" @@ -1393,13 +1417,13 @@ msgstr "Wyczyść filtry" msgid "Clear Signature" msgstr "Wyczyść podpis" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:130 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:125 msgid "Click here to get started" msgstr "Kliknij, aby rozpocząć" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recent-activity.tsx:76 -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:118 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:66 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:113 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:64 #: apps/web/src/components/document/document-history-sheet.tsx:133 msgid "Click here to retry" msgstr "Kliknij tutaj, aby spróbować ponownie" @@ -1420,16 +1444,16 @@ msgstr "Kliknij, aby skopiować link podpisu do wysłania do odbiorcy" msgid "Click to insert field" msgstr "Kliknij, aby wstawić pole" -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:126 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:388 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:125 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:556 #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:125 #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:138 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121 #: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:140 #: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:180 #: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:102 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:319 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:423 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:317 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:421 #: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx:44 msgid "Close" msgstr "Zamknij" @@ -1453,7 +1477,7 @@ msgstr "Zakończ podpisywanie" msgid "Complete Viewing" msgstr "Zakończ wyświetlanie" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:204 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:202 #: apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx:77 #: apps/web/src/components/formatter/document-status.tsx:28 #: packages/email/template-components/template-document-completed.tsx:35 @@ -1480,25 +1504,25 @@ msgstr "Zakończone dokumenty" msgid "Configure Direct Recipient" msgstr "Skonfiguruj bezpośredniego odbiorcę" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:167 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:143 msgid "Configure general settings for the document." msgstr "Skonfiguruj ogólne ustawienia dokumentu." -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:78 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:77 msgid "Configure general settings for the template." msgstr "Skonfiguruj ogólne ustawienia szablonu." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:337 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:335 msgid "Configure template" msgstr "Skonfiguruj szablon" #: packages/ui/primitives/document-flow/add-fields.tsx:586 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:416 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:491 msgid "Configure the {0} field" msgstr "Skonfiguruj pole {0}" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:481 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:460 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:475 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:458 msgid "Confirm" msgstr "Potwierdź" @@ -1536,7 +1560,7 @@ msgstr "Zgoda na transakcje elektroniczne" msgid "Contact Information" msgstr "Informacje kontaktowe" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:189 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:180 msgid "Content" msgstr "Treść" @@ -1546,12 +1570,12 @@ msgstr "Treść" #: apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx:143 #: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:72 #: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:122 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:328 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:326 #: packages/ui/primitives/document-flow/document-flow-root.tsx:141 msgid "Continue" msgstr "Kontynuuj" -#: packages/email/template-components/template-document-invite.tsx:86 +#: packages/email/template-components/template-document-invite.tsx:85 msgid "Continue by approving the document." msgstr "Kontynuuj, zatwierdzając dokument." @@ -1559,11 +1583,11 @@ msgstr "Kontynuuj, zatwierdzając dokument." msgid "Continue by downloading the document." msgstr "Kontynuuj, pobierając dokument." -#: packages/email/template-components/template-document-invite.tsx:84 +#: packages/email/template-components/template-document-invite.tsx:83 msgid "Continue by signing the document." msgstr "Kontynuuj, podpisując dokument." -#: packages/email/template-components/template-document-invite.tsx:85 +#: packages/email/template-components/template-document-invite.tsx:84 msgid "Continue by viewing the document." msgstr "Kontynuuj, wyświetlając dokument." @@ -1597,9 +1621,9 @@ msgid "Copied" msgstr "Skopiowano" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:162 -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:77 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:72 #: apps/web/src/app/(dashboard)/templates/template-direct-link-badge.tsx:31 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:163 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:159 #: apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx:40 #: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:61 #: apps/web/src/components/document/document-recipient-link-copy-dialog.tsx:117 @@ -1618,11 +1642,11 @@ msgstr "Kopiuj" msgid "Copy Link" msgstr "Skopiuj link" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:169 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:164 msgid "Copy sharable link" msgstr "Kopiuj udostępnianą link" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:397 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:391 msgid "Copy Shareable Link" msgstr "Kopiuj udostępniany link" @@ -1657,15 +1681,15 @@ msgstr "Utwórz zespół, aby współpracować z członkami zespołu." msgid "Create account" msgstr "Utwórz konto" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:396 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:564 msgid "Create and send" msgstr "Utwórz i wyślij" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:394 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:562 msgid "Create as draft" msgstr "Utwórz jako szkic" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:354 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:365 msgid "Create as pending" msgstr "Utwórz jako oczekujące" @@ -1673,11 +1697,11 @@ msgstr "Utwórz jako oczekujące" msgid "Create Direct Link" msgstr "Utwórz bezpośredni link" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:202 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:197 msgid "Create Direct Signing Link" msgstr "Utwórz bezpośredni link do podpisu" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:214 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:226 msgid "Create document from template" msgstr "Utwórz dokument z szablonu" @@ -1685,11 +1709,11 @@ msgstr "Utwórz dokument z szablonu" msgid "Create now" msgstr "Utwórz teraz" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:352 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:346 msgid "Create one automatically" msgstr "Utwórz jeden automatycznie" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:398 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:566 msgid "Create signing links" msgstr "Utwórz linki do podpisania" @@ -1704,7 +1728,7 @@ msgstr "Utwórz zespół" msgid "Create Team" msgstr "Utwórz zespół" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:361 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:372 msgid "Create the document as pending and ready to sign." msgstr "Utwórz dokument jako oczekujący i gotowy do podpisania." @@ -1730,19 +1754,19 @@ msgid "Create your account and start using state-of-the-art document signing. Op msgstr "Utwórz swoje konto i zacznij korzystać z nowoczesnego podpisywania dokumentów. Otwarty i piękny podpis jest w zasięgu ręki." #: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:62 -#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:96 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:35 +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:112 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:36 #: apps/web/src/app/(dashboard)/documents/data-table.tsx:48 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table.tsx:63 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:105 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:34 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:103 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:35 #: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:56 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:274 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:272 msgid "Created" msgstr "Utworzono" #: apps/web/src/app/(dashboard)/admin/subscriptions/page.tsx:35 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:111 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:112 msgid "Created At" msgstr "Utworzono w" @@ -1762,6 +1786,10 @@ msgstr "Utworzone w" msgid "Created on {0}" msgstr "Utworzono {0}" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:143 +msgid "CSV Structure" +msgstr "" + #: apps/web/src/components/forms/password.tsx:112 msgid "Current Password" msgstr "Obecne hasło" @@ -1770,6 +1798,10 @@ msgstr "Obecne hasło" msgid "Current password is incorrect." msgstr "Aktualne hasło jest niepoprawne." +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:154 +msgid "Current recipients:" +msgstr "" + #: apps/web/src/app/(dashboard)/settings/billing/billing-plans.tsx:28 msgid "Daily" msgstr "Codziennie" @@ -1778,11 +1810,11 @@ msgstr "Codziennie" msgid "Dark Mode" msgstr "Tryb ciemny" -#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:68 -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:148 +#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:67 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:153 #: packages/ui/primitives/document-flow/add-fields.tsx:945 #: packages/ui/primitives/document-flow/types.ts:53 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:732 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:810 msgid "Date" msgstr "Data" @@ -1791,7 +1823,7 @@ msgid "Date created" msgstr "Data utworzenia" #: packages/ui/primitives/document-flow/add-settings.tsx:325 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:408 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:454 msgid "Date Format" msgstr "Format daty" @@ -1812,19 +1844,19 @@ msgstr "Domyślny język dokumentu" msgid "Default Document Visibility" msgstr "Domyślna widoczność dokumentu" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:50 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:49 msgid "delete" msgstr "usuń" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:144 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:189 -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:202 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:150 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:183 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:201 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:177 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:211 #: apps/web/src/app/(dashboard)/settings/tokens/page.tsx:83 #: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:100 -#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:94 -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:90 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:107 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:85 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:116 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/page.tsx:105 #: apps/web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx:121 @@ -1843,25 +1875,25 @@ msgstr "usuń {0}" msgid "delete {teamName}" msgstr "usuń {teamName}" -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:136 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:133 msgid "Delete account" msgstr "Usuń konto" -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:97 -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:104 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:94 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:101 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:72 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:86 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:93 msgid "Delete Account" msgstr "Usuń konto" -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:135 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:125 msgid "Delete document" msgstr "Usuń dokument" -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:85 -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:98 -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:105 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:75 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:88 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:95 msgid "Delete Document" msgstr "Usuń dokument" @@ -1878,11 +1910,11 @@ msgstr "Usuń zespół" msgid "Delete team member" msgstr "Usuń członka zespołu" -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:88 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:78 msgid "Delete the document. This action is irreversible so proceed with caution." msgstr "Usuń dokument. Działanie to jest nieodwracalne, więc działaj ostrożnie." -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:86 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:83 msgid "Delete the users account and all its contents. This action is irreversible and will cancel their subscription, so proceed with caution." msgstr "Usuń konto użytkownika i wszystkie jego treści. Działanie to jest nieodwracalne i anuluję subskrypcję, więc działaj ostrożnie." @@ -1895,7 +1927,7 @@ msgid "Delete your account and all its contents, including completed documents. msgstr "Usuń swoje konto i wszystkie jego treści, w tym zakończone dokumenty. Działanie to jest nieodwracalne i anuluję twoją subskrypcję, więc działaj ostrożnie." #: apps/web/src/app/(dashboard)/admin/documents/[id]/page.tsx:41 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:97 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:98 msgid "Deleted" msgstr "Usunięto" @@ -1903,12 +1935,12 @@ msgstr "Usunięto" msgid "Deleting account..." msgstr "Usuwanie konta..." -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:178 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:180 msgid "Details" msgstr "Szczegóły" -#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:73 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:242 +#: apps/web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx:72 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:244 msgid "Device" msgstr "Urządzenie" @@ -1922,12 +1954,12 @@ msgid "direct link" msgstr "link bezpośredni" #: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:40 -#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:79 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:81 msgid "Direct link" msgstr "Link bezpośredni" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:156 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:227 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:154 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:225 msgid "Direct Link" msgstr "Bezpośredni link" @@ -1939,15 +1971,15 @@ msgstr "link bezpośredni wyłączony" msgid "Direct link receiver" msgstr "Odbiorca linku bezpośredniego" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:363 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:357 msgid "Direct Link Signing" msgstr "Podpisywanie bezpośrednim linkiem" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:115 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:111 msgid "Direct link signing has been disabled" msgstr "Podpisywanie bezpośrednim linkiem zostało wyłączone" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:114 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:110 msgid "Direct link signing has been enabled" msgstr "Podpisywanie za pomocą linku bezpośredniego zostało włączone" @@ -1955,15 +1987,15 @@ msgstr "Podpisywanie za pomocą linku bezpośredniego zostało włączone" msgid "Direct link templates contain one dynamic recipient placeholder. Anyone with access to this link can sign the document, and it will then appear on your documents page." msgstr "Szablony linków bezpośrednich zawierają jedno dynamiczne miejsce odbiorcy. Każdy, kto ma dostęp do tego linku, może podpisać dokument, a następnie pojawi się on na stronie twoich dokumentów." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:142 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:138 msgid "Direct template link deleted" msgstr "Link szablonu bezpośredniego usunięty" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:228 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:223 msgid "Direct template link usage exceeded ({0}/{1})" msgstr "Przekroczono użycie linku szablonu bezpośredniego ({0}/{1})" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:417 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:415 msgid "Disable" msgstr "Wyłącz" @@ -1991,7 +2023,7 @@ msgstr "Wyłącz dwuskładnikowe uwierzytelnianie przed usunięciem konta." msgid "Disabled" msgstr "Wyłączone" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:380 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:374 msgid "Disabling direct link signing will prevent anyone from accessing the link." msgstr "Wyłączenie podpisywania za pomocą linku bezpośredniego uniemożliwi dostęp do linku." @@ -2003,15 +2035,15 @@ msgstr "Wyłączenie użytkownika uniemożliwia korzystanie z konta oraz dezakty msgid "Display your name and email in documents" msgstr "Wyświetl swoją nazwę i adres e-mail w dokumentach" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:181 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:157 msgid "Distribute Document" msgstr "Rozprowadź dokument" -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:63 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:58 msgid "Do you want to delete this template?" msgstr "Czy chcesz usunąć ten szablon?" -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:63 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:62 msgid "Do you want to duplicate this template?" msgstr "Czy chcesz zduplikować ten szablon?" @@ -2034,11 +2066,11 @@ msgstr "Dokument \"{0}\" - Odrzucenie potwierdzone" #: packages/ui/components/document/document-global-auth-access-select.tsx:62 #: packages/ui/primitives/document-flow/add-settings.tsx:227 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:202 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:224 msgid "Document access" msgstr "Dostęp do dokumentu" -#: packages/lib/utils/document-audit-logs.ts:306 +#: packages/lib/utils/document-audit-logs.ts:322 msgid "Document access auth updated" msgstr "Zaktualizowano autoryzację dostępu do dokumentu" @@ -2051,14 +2083,14 @@ msgid "Document Approved" msgstr "Dokument zatwierdzony" #: apps/web/src/app/(signing)/sign/[token]/no-longer-available.tsx:40 -#: packages/lib/server-only/document/delete-document.ts:246 -#: packages/lib/server-only/document/super-delete-document.ts:98 +#: packages/lib/server-only/document/delete-document.ts:263 +#: packages/lib/server-only/document/super-delete-document.ts:101 msgid "Document Cancelled" msgstr "Dokument anulowany" #: apps/web/src/components/formatter/document-status.tsx:29 -#: packages/lib/utils/document-audit-logs.ts:369 -#: packages/lib/utils/document-audit-logs.ts:370 +#: packages/lib/utils/document-audit-logs.ts:385 +#: packages/lib/utils/document-audit-logs.ts:386 msgid "Document completed" msgstr "Dokument ukończony" @@ -2071,21 +2103,21 @@ msgstr "E-mail ukończonego dokumentu" msgid "Document Completed!" msgstr "Dokument Zakończony!" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:156 -#: packages/lib/utils/document-audit-logs.ts:286 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:168 +#: packages/lib/utils/document-audit-logs.ts:302 msgid "Document created" msgstr "Dokument utworzony" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:127 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:125 msgid "Document created by <0>{0}" msgstr "Dokument utworzony przez <0>{0}" #: packages/email/templates/document-created-from-direct-template.tsx:32 -#: packages/lib/server-only/template/create-document-from-direct-template.ts:585 +#: packages/lib/server-only/template/create-document-from-direct-template.ts:588 msgid "Document created from direct template" msgstr "Dokument utworzony z bezpośredniego szablonu" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:132 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:130 msgid "Document created using a <0>direct link" msgstr "Dokument utworzony za pomocą <0>bezpośredniego linku" @@ -2093,10 +2125,10 @@ msgstr "Dokument utworzony za pomocą <0>bezpośredniego linku" msgid "Document Creation" msgstr "Tworzenie dokumentu" -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:51 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:181 -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:61 -#: packages/lib/utils/document-audit-logs.ts:290 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:50 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:182 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:60 +#: packages/lib/utils/document-audit-logs.ts:306 msgid "Document deleted" msgstr "Dokument usunięty" @@ -2104,12 +2136,12 @@ msgstr "Dokument usunięty" msgid "Document deleted email" msgstr "E-mail usuniętego dokumentu" -#: packages/lib/server-only/document/send-delete-email.ts:82 +#: packages/lib/server-only/document/send-delete-email.ts:85 msgid "Document Deleted!" msgstr "Dokument usunięty!" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:219 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:228 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:265 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:274 msgid "Document Distribution Method" msgstr "Metoda dystrybucji dokumentu" @@ -2117,21 +2149,21 @@ msgstr "Metoda dystrybucji dokumentu" msgid "Document draft" msgstr "Szkic dokumentu" -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:58 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:57 msgid "Document Duplicated" msgstr "Dokument zduplikowany" -#: packages/lib/utils/document-audit-logs.ts:326 +#: packages/lib/utils/document-audit-logs.ts:342 msgid "Document external ID updated" msgstr "Zaktualizowane ID zewnętrzne dokumentu" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:192 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:193 #: apps/web/src/components/document/document-history-sheet.tsx:104 msgid "Document history" msgstr "Historia dokumentu" #: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-page-view.tsx:71 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:81 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:82 msgid "Document ID" msgstr "Identyfikator dokumentu" @@ -2151,7 +2183,7 @@ msgstr "Metryki dokumentów" msgid "Document moved" msgstr "Dokument przeniesiony" -#: packages/lib/utils/document-audit-logs.ts:334 +#: packages/lib/utils/document-audit-logs.ts:350 msgid "Document moved to team" msgstr "Dokument przeniesiony do zespołu" @@ -2159,7 +2191,7 @@ msgstr "Dokument przeniesiony do zespołu" msgid "Document no longer available to sign" msgstr "Dokument nie jest już dostępny do podpisania" -#: packages/lib/utils/document-audit-logs.ts:318 +#: packages/lib/utils/document-audit-logs.ts:334 msgid "Document opened" msgstr "Dokument otwarty" @@ -2188,8 +2220,8 @@ msgstr "Dokument odrzucone" msgid "Document resealed" msgstr "Dokument ponownie zaplombowany" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:327 -#: packages/lib/utils/document-audit-logs.ts:330 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:303 +#: packages/lib/utils/document-audit-logs.ts:346 msgid "Document sent" msgstr "Dokument wysłany" @@ -2197,11 +2229,11 @@ msgstr "Dokument wysłany" msgid "Document Signed" msgstr "Dokument podpisany" -#: packages/lib/utils/document-audit-logs.ts:310 +#: packages/lib/utils/document-audit-logs.ts:326 msgid "Document signing auth updated" msgstr "Zaktualizowano autoryzację podpisu dokumentu" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:144 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:143 msgid "Document signing process will be cancelled" msgstr "Proces podpisywania dokumentu zostanie anulowany" @@ -2213,11 +2245,11 @@ msgstr "Status dokumentu" msgid "Document title" msgstr "Tytuł dokumentu" -#: packages/lib/utils/document-audit-logs.ts:322 +#: packages/lib/utils/document-audit-logs.ts:338 msgid "Document title updated" msgstr "Zaktualizowano tytuł dokumentu" -#: packages/lib/utils/document-audit-logs.ts:314 +#: packages/lib/utils/document-audit-logs.ts:330 msgid "Document updated" msgstr "Zaktualizowano dokument" @@ -2225,7 +2257,7 @@ msgstr "Zaktualizowano dokument" msgid "Document upload disabled due to unpaid invoices" msgstr "Przesyłanie dokumentu wyłączone z powodu nieopłaconych faktur" -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:86 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:85 msgid "Document uploaded" msgstr "Przesłano dokument" @@ -2233,17 +2265,17 @@ msgstr "Przesłano dokument" msgid "Document Viewed" msgstr "Dokument został wyświetlony" -#: packages/lib/utils/document-audit-logs.ts:302 +#: packages/lib/utils/document-audit-logs.ts:318 msgid "Document visibility updated" msgstr "Zaktualizowano widoczność dokumentu" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:141 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:140 msgid "Document will be permanently deleted" msgstr "Dokument zostanie trwale usunięty" #: apps/web/src/app/(dashboard)/admin/nav.tsx:65 #: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:92 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:144 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:145 #: apps/web/src/app/(dashboard)/documents/[id]/edit/document-edit-page-view.tsx:109 #: apps/web/src/app/(dashboard)/documents/[id]/loading.tsx:16 #: apps/web/src/app/(dashboard)/documents/[id]/sent/page.tsx:15 @@ -2257,7 +2289,7 @@ msgstr "Dokument zostanie trwale usunięty" msgid "Documents" msgstr "Dokumenty" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:197 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:200 msgid "Documents created from template" msgstr "Dokumenty utworzone z szablonu" @@ -2274,10 +2306,10 @@ msgstr "Wyświetlone dokumenty" msgid "Don't have an account? <0>Sign up" msgstr "Nie masz konta? <0>Zarejestruj się" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:111 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:123 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:141 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:162 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:117 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:129 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:142 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:156 #: apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx:110 #: apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx:185 #: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:107 @@ -2286,7 +2318,7 @@ msgstr "Nie masz konta? <0>Zarejestruj się" msgid "Download" msgstr "Pobierz" -#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:81 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:77 msgid "Download Audit Logs" msgstr "Pobierz dziennik logów" @@ -2294,7 +2326,11 @@ msgstr "Pobierz dziennik logów" msgid "Download Certificate" msgstr "Pobierz certyfikat" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:210 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:168 +msgid "Download Template CSV" +msgstr "" + +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:208 #: apps/web/src/components/formatter/document-status.tsx:34 #: packages/lib/constants/document.ts:13 msgid "Draft" @@ -2313,7 +2349,7 @@ msgid "Drag & drop your PDF here." msgstr "Przeciągnij i upuść swój PDF tutaj." #: packages/ui/primitives/document-flow/add-fields.tsx:1076 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:863 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:941 msgid "Dropdown" msgstr "Lista rozwijana" @@ -2325,28 +2361,28 @@ msgstr "Opcje rozwijane" msgid "Due to an unpaid invoice, your team has been restricted. Please settle the payment to restore full access to your team." msgstr "Z powodu nieopłaconej faktury Twój zespół został ograniczony. Proszę uregulować płatność, aby przywrócić pełny dostęp do zespołu." -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:136 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:167 -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:85 -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:118 -#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:74 -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:91 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:142 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:161 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:84 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:117 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:76 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:89 msgid "Duplicate" msgstr "Zduplikuj" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:104 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:115 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:102 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:156 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:110 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:121 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:103 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:150 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:111 #: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:95 -#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:65 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:67 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx:77 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/page.tsx:100 msgid "Edit" msgstr "Edytuj" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:117 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:120 msgid "Edit Template" msgstr "Edytuj szablon" @@ -2366,18 +2402,18 @@ msgstr "Ujawnienie podpisu elektronicznego" #: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:166 #: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:116 #: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:71 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:265 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:272 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:277 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:284 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:122 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:129 -#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:118 -#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:126 +#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:119 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:131 #: apps/web/src/app/embed/direct/[[...url]]/client.tsx:407 #: apps/web/src/app/embed/sign/[[...url]]/client.tsx:287 #: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:169 #: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:153 #: apps/web/src/components/forms/forgot-password.tsx:81 -#: apps/web/src/components/forms/profile.tsx:122 +#: apps/web/src/components/forms/profile.tsx:113 #: apps/web/src/components/forms/signin.tsx:339 #: apps/web/src/components/forms/signup.tsx:176 #: packages/lib/constants/document.ts:28 @@ -2385,7 +2421,7 @@ msgstr "Ujawnienie podpisu elektronicznego" #: packages/ui/primitives/document-flow/add-signers.tsx:511 #: packages/ui/primitives/document-flow/add-signers.tsx:518 #: packages/ui/primitives/document-flow/types.ts:54 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:680 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:758 #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:470 #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:477 msgid "Email" @@ -2401,7 +2437,7 @@ msgstr "Adres e-mail" msgid "Email Address" msgstr "Adres e-mail" -#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:80 +#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:81 msgid "Email cannot already exist in the template" msgstr "E-mail nie może już istnieć w szablonie" @@ -2409,15 +2445,15 @@ msgstr "E-mail nie może już istnieć w szablonie" msgid "Email Confirmed!" msgstr "E-mail potwierdzony!" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:307 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:353 msgid "Email Options" msgstr "Opcje e-mail" -#: packages/lib/utils/document-audit-logs.ts:363 +#: packages/lib/utils/document-audit-logs.ts:379 msgid "Email resent" msgstr "E-mail wysłany ponownie" -#: packages/lib/utils/document-audit-logs.ts:363 +#: packages/lib/utils/document-audit-logs.ts:379 msgid "Email sent" msgstr "E-mail wysłany" @@ -2459,11 +2495,11 @@ msgstr "Włącz aplikację uwierzytelniającą" msgid "Enable custom branding for all documents in this team." msgstr "Włącz niestandardowe brandowanie dla wszystkich dokumentów w tym zespole." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:251 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:246 msgid "Enable direct link signing" msgstr "Włącz podpisywanie za pomocą bezpośredniego linku" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:374 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:368 #: packages/lib/constants/template.ts:8 msgid "Enable Direct Link Signing" msgstr "Włącz podpisywanie linku bezpośredniego" @@ -2478,11 +2514,11 @@ msgid "Enable Typed Signature" msgstr "Włącz podpis pisany" #: packages/ui/primitives/document-flow/add-fields.tsx:813 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:600 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:678 msgid "Enable Typed Signatures" msgstr "Włącz podpisy typu pisanego" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:123 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:114 #: apps/web/src/app/(dashboard)/settings/webhooks/[id]/page.tsx:138 #: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:74 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/[id]/page.tsx:142 @@ -2495,7 +2531,7 @@ msgstr "Włączone" msgid "Enabling the account results in the user being able to use the account again, and all the related features such as webhooks, teams, and API keys for example." msgstr "Włączenie konta pozwala użytkownikowi na ponowne korzystanie z niego oraz przywraca wszystkie powiązane funkcje, takie jak webhooki, zespoły i klucze API." -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:87 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:88 msgid "Enclosed Document" msgstr "Załączony dokument" @@ -2515,7 +2551,7 @@ msgstr "Wprowadź szczegóły swojej marki" msgid "Enter your email" msgstr "Wprowadź swój adres e-mail" -#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:135 +#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:136 msgid "Enter your email address to receive the completed document." msgstr "Wprowadź swój adres e-mail, aby otrzymać ukończony dokument." @@ -2523,53 +2559,53 @@ msgstr "Wprowadź swój adres e-mail, aby otrzymać ukończony dokument." msgid "Enter your name" msgstr "Wprowadź swoje imię" -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:280 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:293 msgid "Enter your text here" msgstr "Wprowadź swój tekst tutaj" #: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:41 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:66 #: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:60 #: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:60 #: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:80 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:234 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:268 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:303 -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:349 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:209 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:242 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:280 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:325 #: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:57 #: apps/web/src/app/(dashboard)/documents/upload-document.tsx:111 -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:117 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:155 #: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:186 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:217 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:256 -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:226 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:50 #: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:68 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:175 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:187 #: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:152 #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:124 #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:153 #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:214 -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:99 -#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:125 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:104 +#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:130 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:105 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:136 -#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:83 -#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:109 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:88 +#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:114 #: apps/web/src/app/(signing)/sign/[token]/initials-field.tsx:89 #: apps/web/src/app/(signing)/sign/[token]/initials-field.tsx:115 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:121 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:147 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:149 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:194 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:126 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:152 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:150 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:195 #: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:101 #: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:128 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:133 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:167 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:193 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:167 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:195 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:168 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:196 #: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:54 #: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:101 -#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:258 +#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:224 #: packages/ui/primitives/pdf-viewer.tsx:166 msgid "Error" msgstr "Błąd" @@ -2600,7 +2636,7 @@ msgid "Expires on {0}" msgstr "Wygasa {0}" #: packages/ui/primitives/document-flow/add-settings.tsx:295 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:378 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:424 msgid "External ID" msgstr "Zewnętrzny ID" @@ -2608,7 +2644,7 @@ msgstr "Zewnętrzny ID" msgid "Failed to reseal document" msgstr "Nie udało się ponownie zaplombować dokumentu" -#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:259 +#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:225 msgid "Failed to save settings." msgstr "Nie udało się zapisać ustawień." @@ -2621,16 +2657,20 @@ msgstr "Nie udało się zaktualizować odbiorcy" msgid "Failed to update webhook" msgstr "Nie udało się zaktualizować webhooku" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:93 +#: packages/email/templates/bulk-send-complete.tsx:55 +msgid "Failed: {failedCount}" +msgstr "" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:100 msgid "Field character limit" msgstr "Limit znaków pola" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:62 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:44 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:44 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:44 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:69 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:51 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:46 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:51 #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:130 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:107 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:114 msgid "Field font size" msgstr "Rozmiar czcionki pola" @@ -2638,19 +2678,19 @@ msgstr "Rozmiar czcionki pola" msgid "Field format" msgstr "Format pola" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:53 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:60 msgid "Field label" msgstr "Etykieta pola" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:65 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:72 msgid "Field placeholder" msgstr "Zastępczy tekst pola" -#: packages/lib/utils/document-audit-logs.ts:294 +#: packages/lib/utils/document-audit-logs.ts:310 msgid "Field signed" msgstr "Pole podpisane" -#: packages/lib/utils/document-audit-logs.ts:298 +#: packages/lib/utils/document-audit-logs.ts:314 msgid "Field unsigned" msgstr "Pole niepodpisane" @@ -2658,16 +2698,20 @@ msgstr "Pole niepodpisane" msgid "Fields" msgstr "Pola" -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:130 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:124 msgid "File cannot be larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB" msgstr "Plik nie może mieć większej wielkości niż {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:56 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:38 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:38 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:38 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:513 +msgid "File size exceeds the limit of {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB" +msgstr "Rozmiar pliku przekracza limit {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB" + +#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:63 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:45 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:40 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:45 #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:124 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:101 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:108 msgid "Font Size" msgstr "Rozmiar czcionki" @@ -2675,6 +2719,10 @@ msgstr "Rozmiar czcionki" msgid "For any questions regarding this disclosure, electronic signatures, or any related process, please contact us at: <0>{SUPPORT_EMAIL}" msgstr "W przypadku jakichkolwiek pytań dotyczących tego ujawnienia, podpisów elektronicznych lub jakiegokolwiek powiązanego procesu, prosimy o kontakt z nami pod adresem: <0>{SUPPORT_EMAIL}" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:147 +msgid "For each recipient, provide their email (required) and name (optional) in separate columns. Download the template CSV below for the correct format." +msgstr "" + #: packages/lib/server-only/auth/send-forgot-password.ts:61 msgid "Forgot Password?" msgstr "Zapomniałeś hasła?" @@ -2691,16 +2739,16 @@ msgstr "Podpis wolny" #: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:330 #: apps/web/src/app/(signing)/sign/[token]/form.tsx:191 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:193 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:210 #: apps/web/src/app/embed/direct/[[...url]]/client.tsx:392 #: apps/web/src/app/embed/sign/[[...url]]/client.tsx:272 -#: apps/web/src/components/forms/profile.tsx:110 +#: apps/web/src/components/forms/profile.tsx:101 #: apps/web/src/components/forms/v2/signup.tsx:316 msgid "Full Name" msgstr "Imię i nazwisko" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:166 -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:77 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:142 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:76 #: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:62 #: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:44 #: apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx:52 @@ -2776,7 +2824,7 @@ msgstr "Tutaj możesz ustawić preferencje i domyślne ustawienia dla brandowani msgid "Here you can set preferences and defaults for your team." msgstr "Tutaj możesz ustawić preferencje i domyślne ustawienia dla swojego zespołu." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:206 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:201 msgid "Here's how it works:" msgstr "Oto jak to działa:" @@ -2784,13 +2832,17 @@ msgstr "Oto jak to działa:" msgid "Hey I’m Timur" msgstr "Cześć, jestem Timur" +#: packages/email/templates/bulk-send-complete.tsx:36 +msgid "Hi {userName}," +msgstr "" + #: packages/email/templates/reset-password.tsx:56 msgid "Hi, {userName} <0>({userEmail})" msgstr "Cześć, {userName} <0>({userEmail})" -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:189 -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:202 -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:155 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:183 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:201 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:154 msgid "Hide" msgstr "Ukryj" @@ -2851,8 +2903,8 @@ msgstr "Skrzynka odbiorcza dokumentów" msgid "Include the Signing Certificate in the Document" msgstr "Dołącz certyfikat podpisu do dokumentu" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:53 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:50 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:54 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:51 msgid "Information" msgstr "Informacje" @@ -2882,10 +2934,6 @@ msgstr "Nieprawidłowy kod. Proszę spróbuj ponownie." msgid "Invalid email" msgstr "Nieprawidłowy email" -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:105 -msgid "Invalid file" -msgstr "Plik jest nieprawidłowy" - #: apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx:33 #: apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx:36 msgid "Invalid link" @@ -2908,11 +2956,11 @@ msgstr "Zaproszenie zaakceptowane!" msgid "Invitation declined" msgstr "Zaproszenie odrzucone" -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:78 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:77 msgid "Invitation has been deleted" msgstr "Zaproszenie zostało usunięte" -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:61 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:60 msgid "Invitation has been resent" msgstr "Zaproszenie zostało ponownie wysłane" @@ -2932,7 +2980,7 @@ msgstr "Zaproś członków" msgid "Invite team members" msgstr "Zaproś członków zespołu" -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:126 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:125 msgid "Invited At" msgstr "Zaproś o" @@ -2941,7 +2989,7 @@ msgid "Invoice" msgstr "Faktura" #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:47 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:235 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:237 msgid "IP Address" msgstr "Adres IP" @@ -2975,13 +3023,13 @@ msgstr "Dołącz do {teamName} na Documenso" #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:67 #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:72 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:48 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:55 msgid "Label" msgstr "Etykieta" #: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:286 #: packages/ui/primitives/document-flow/add-settings.tsx:187 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:162 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:184 msgid "Language" msgstr "Język" @@ -2997,8 +3045,8 @@ msgstr "Ostatnie 30 dni" msgid "Last 7 days" msgstr "Ostatnie 7 dni" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:41 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:38 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:42 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:39 msgid "Last modified" msgstr "Ostatnia modyfikacja" @@ -3006,7 +3054,7 @@ msgstr "Ostatnia modyfikacja" msgid "Last updated" msgstr "Zaktualizowano" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:121 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:122 msgid "Last Updated" msgstr "Zaktualizowano" @@ -3048,11 +3096,11 @@ msgstr "Czy chcesz mieć własny publiczny profil z umowami?" msgid "Link expires in 1 hour." msgstr "Link wygasa za 1 godzinę." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:216 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:215 msgid "Link template" msgstr "Szablon linku" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:338 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:314 msgid "Links Generated" msgstr "Wygenerowane linki" @@ -3073,7 +3121,7 @@ msgstr "Ładowanie dokumentu..." #: apps/web/src/app/(dashboard)/documents/[id]/loading.tsx:20 #: apps/web/src/app/(dashboard)/documents/[id]/sent/page.tsx:19 -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:91 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:90 msgid "Loading Document..." msgstr "Ładowanie dokumentu..." @@ -3104,7 +3152,7 @@ msgstr "Zarządzaj profilem {0}" msgid "Manage all teams you are currently associated with." msgstr "Zarządzaj wszystkimi zespołami, z którymi jesteś obecnie związany." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:161 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:164 msgid "Manage and view template" msgstr "Zarządzaj i przeglądaj szablon" @@ -3112,7 +3160,7 @@ msgstr "Zarządzaj i przeglądaj szablon" msgid "Manage billing" msgstr "Zarządzaj fakturowaniem" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:341 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:339 msgid "Manage details for this public template" msgstr "Zarządzaj szczegółami tego publicznego szablonu" @@ -3148,7 +3196,7 @@ msgstr "Zarządzaj subskrypcją zespołu." msgid "Manage teams" msgstr "Zarządzaj zespołami" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:367 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:361 msgid "Manage the direct link signing for this template" msgstr "Zarządzaj podpisywaniem bezpośredniego linku dla tego szablonu" @@ -3184,10 +3232,14 @@ msgstr "MAU (utworzony dokument)" msgid "MAU (had document completed)" msgstr "MAU (zakończony dokument)" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:188 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:209 msgid "Max" msgstr "Max" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:227 +msgid "Maximum file size: 4MB. Maximum 100 rows per upload. Blank values will use template defaults." +msgstr "" + #: packages/lib/constants/teams.ts:12 msgid "Member" msgstr "Członek" @@ -3204,11 +3256,11 @@ msgid "Members" msgstr "Członkowie" #: packages/ui/primitives/document-flow/add-subject.tsx:160 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:338 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:384 msgid "Message <0>(Optional)" msgstr "Wiadomość <0>(Opcjonalnie)" -#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:176 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:197 msgid "Min" msgstr "Min" @@ -3243,8 +3295,8 @@ msgstr "Przenieś dokument do zespołu" msgid "Move Template to Team" msgstr "Przenieś szablon do zespołu" -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:174 -#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:85 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:168 +#: apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx:87 msgid "Move to Team" msgstr "Przenieś do zespołu" @@ -3263,10 +3315,10 @@ msgstr "Moje szablony" #: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:66 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:144 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table.tsx:59 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:287 -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:294 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:299 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:306 #: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:118 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:170 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:175 #: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:153 #: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:141 #: apps/web/src/components/forms/signup.tsx:160 @@ -3274,7 +3326,7 @@ msgstr "Moje szablony" #: packages/ui/primitives/document-flow/add-signers.tsx:549 #: packages/ui/primitives/document-flow/add-signers.tsx:555 #: packages/ui/primitives/document-flow/types.ts:55 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:706 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:784 #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:505 #: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:511 msgid "Name" @@ -3308,8 +3360,8 @@ msgstr "Nigdy nie wygasa" msgid "New team owner" msgstr "Nowy właściciel zespołu" -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:96 -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:103 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:95 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:102 msgid "New Template" msgstr "Nowy szablon" @@ -3335,7 +3387,7 @@ msgstr "Nie są wymagane żadne dalsze działania z Twojej strony w tym momencie msgid "No payment required" msgstr "Brak wymaganej płatności" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:125 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:120 msgid "No public profile templates found" msgstr "Nie znaleziono szablonów profilu publicznego" @@ -3343,12 +3395,12 @@ msgstr "Nie znaleziono szablonów profilu publicznego" msgid "No recent activity" msgstr "Brak ostatnich aktywności" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:101 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:99 msgid "No recent documents" msgstr "Brak ostatnich dokumentów" #: packages/ui/primitives/document-flow/add-fields.tsx:705 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:520 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:598 msgid "No recipient matching this description was found." msgstr "Nie znaleziono odbiorcy pasującego do tego opisu." @@ -3360,7 +3412,7 @@ msgid "No recipients" msgstr "Brak odbiorców" #: packages/ui/primitives/document-flow/add-fields.tsx:720 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:535 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:613 msgid "No recipients with this role" msgstr "Brak odbiorców z tą rolą" @@ -3387,11 +3439,11 @@ msgstr "Nie znaleziono pola podpisu" msgid "No token provided" msgstr "Nie podano tokena" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:284 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:282 msgid "No valid direct templates found" msgstr "Nie znaleziono ważnych szablonów bezpośrednich" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:293 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:288 msgid "No valid recipients found" msgstr "Nie znaleziono ważnych odbiorców" @@ -3419,10 +3471,10 @@ msgstr "Nieobsługiwane" msgid "Nothing to do" msgstr "Nic do zrobienia" -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:271 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:284 #: packages/ui/primitives/document-flow/add-fields.tsx:997 #: packages/ui/primitives/document-flow/types.ts:56 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:784 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:862 msgid "Number" msgstr "Numer" @@ -3464,7 +3516,7 @@ msgstr "Na tej stronie możesz utworzyć nowe webhooki i zarządzać istniejący msgid "On this page, you can edit the webhook and its settings." msgstr "Na tej stronie możesz edytować webhook i jego ustawienia." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:136 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:135 msgid "Once confirmed, the following will occur:" msgstr "Po potwierdzeniu, nastąpi:" @@ -3504,7 +3556,7 @@ msgstr "Ups! Coś poszło nie tak." msgid "Opened" msgstr "Otwarto" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:337 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:332 #: apps/web/src/components/forms/signup.tsx:239 #: apps/web/src/components/forms/signup.tsx:263 #: apps/web/src/components/forms/v2/signup.tsx:387 @@ -3515,12 +3567,12 @@ msgstr "Lub" msgid "Or continue with" msgstr "Lub kontynuuj z" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:340 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:351 msgid "Otherwise, the document will be created as a draft." msgstr "W przeciwnym razie dokument zostanie utworzony jako wersja robocza." #: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:86 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:103 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:104 #: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:81 #: apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx:84 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:107 @@ -3629,7 +3681,7 @@ msgid "Payment overdue" msgstr "Płatność zaległa" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:131 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:207 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:205 #: apps/web/src/components/(teams)/tables/teams-member-page-data-table.tsx:82 #: apps/web/src/components/(teams)/tables/user-settings-teams-page-data-table.tsx:77 #: apps/web/src/components/document/document-read-only-fields.tsx:89 @@ -3680,11 +3732,11 @@ msgstr "Wybierz dowolną z poniższych umów i zacznij podpisywanie, aby rozpocz #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:79 #: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:84 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:60 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:67 msgid "Placeholder" msgstr "Zastępczy tekst" -#: packages/email/template-components/template-document-invite.tsx:56 +#: packages/email/template-components/template-document-invite.tsx:55 msgid "Please {0} your document<0/>\"{documentName}\"" msgstr "Proszę {0} Twój dokument<0/>\"{documentName}\"" @@ -3724,7 +3776,7 @@ msgstr "Proszę potwierdzić swój email" msgid "Please confirm your email address" msgstr "Proszę potwierdzić swój adres email" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:176 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:175 msgid "Please contact support if you would like to revert this action." msgstr "Proszę skontaktować się z pomocą techniczną, jeśli chcesz cofnąć tę akcję." @@ -3741,19 +3793,19 @@ msgstr "Proszę wpisać poprawną nazwę." msgid "Please mark as viewed to complete" msgstr "Proszę zaznaczyć jako obejrzane, aby zakończyć" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:459 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:453 msgid "Please note that proceeding will remove direct linking recipient and turn it into a placeholder." msgstr "Proszę zauważyć, że kontynuowanie usunie bezpośrednio łączącego odbiorcę i zamieni go w symbol zastępczy." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:130 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:129 msgid "Please note that this action is <0>irreversible." msgstr "Proszę zauważyć, że ta czynność jest <0>nieodwracalna." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:121 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:120 msgid "Please note that this action is <0>irreversible. Once confirmed, this document will be permanently deleted." msgstr "Proszę pamiętać, że ta czynność jest <0>nieodwracalna. Po potwierdzeniu, ten dokument zostanie trwale usunięty." -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:67 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:62 msgid "Please note that this action is irreversible. Once confirmed, your template will be permanently deleted." msgstr "Proszę pamiętać, że ta czynność jest nieodwracalna. Po potwierdzeniu, Twój szablon zostanie trwale usunięty." @@ -3785,6 +3837,10 @@ msgstr "Proszę podać token z Twojego uwierzytelniacza lub kod zapasowy." msgid "Please review the document before signing." msgstr "Proszę przejrzeć dokument przed podpisaniem." +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:503 +msgid "Please select a PDF file" +msgstr "Proszę wybrać plik PDF" + #: apps/web/src/components/forms/send-confirmation-email.tsx:64 msgid "Please try again and make sure you enter the correct email address." msgstr "Spróbuj ponownie i upewnij się, że wprowadzasz poprawny adres email." @@ -3793,7 +3849,7 @@ msgstr "Spróbuj ponownie i upewnij się, że wprowadzasz poprawny adres email." msgid "Please try again later or login using your normal details" msgstr "Spróbuj ponownie później lub zaloguj się, używając swoich normalnych danych" -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:80 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:79 msgid "Please try again later." msgstr "Proszę spróbować ponownie później." @@ -3802,7 +3858,7 @@ msgstr "Proszę spróbować ponownie później." msgid "Please try again or contact our support." msgstr "Spróbuj ponownie lub skontaktuj się z naszym wsparciem." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:186 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:185 msgid "Please type {0} to confirm" msgstr "Wpisz {0}, aby potwierdzić" @@ -3810,6 +3866,10 @@ msgstr "Wpisz {0}, aby potwierdzić" msgid "Please type <0>{0} to confirm." msgstr "Wpisz <0>{0}, aby potwierdzić." +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:172 +msgid "Pre-formatted CSV template with example data." +msgstr "" + #: apps/web/src/components/(dashboard)/common/command-menu.tsx:214 #: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:58 #: apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx:67 @@ -3840,16 +3900,16 @@ msgstr "Prywatne szablony mogą być modyfikowane i przeglądane tylko przez Cie msgid "Profile" msgstr "Profil" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:184 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:183 msgid "Profile is currently <0>hidden." msgstr "Profil jest obecnie <0>ukryty." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:172 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:171 msgid "Profile is currently <0>visible." msgstr "Profil jest obecnie <0>widoczny." #: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:74 -#: apps/web/src/components/forms/profile.tsx:72 +#: apps/web/src/components/forms/profile.tsx:71 msgid "Profile updated" msgstr "Profil zaktualizowano" @@ -3888,9 +3948,9 @@ msgstr "Wartości radiowe" #: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:186 #: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:147 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:156 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:177 #: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:122 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:133 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:161 msgid "Read only" msgstr "Tylko do odczytu" @@ -3906,7 +3966,7 @@ msgstr "Przeczytaj pełne <0>ujawnienie podpisu." msgid "Ready" msgstr "Gotowy" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:289 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:291 msgid "Reason" msgstr "Powód" @@ -3935,21 +3995,21 @@ msgstr "Otrzymuje kopię" msgid "Recent activity" msgstr "Ostatnia aktywność" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:45 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:43 msgid "Recent documents" msgstr "Ostatnie dokumenty" #: apps/web/src/app/(dashboard)/documents/data-table.tsx:63 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:116 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:280 -#: packages/lib/utils/document-audit-logs.ts:338 -#: packages/lib/utils/document-audit-logs.ts:353 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:114 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:275 +#: packages/lib/utils/document-audit-logs.ts:354 +#: packages/lib/utils/document-audit-logs.ts:369 msgid "Recipient" msgstr "Odbiorca" #: packages/ui/components/recipient/recipient-action-auth-select.tsx:39 #: packages/ui/primitives/document-flow/add-settings.tsx:269 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:291 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:337 msgid "Recipient action authentication" msgstr "Uwierzytelnianie akcji odbiorcy" @@ -3972,7 +4032,7 @@ msgstr "Odbiorca zaktualizowany" #: apps/web/src/app/(dashboard)/admin/documents/[id]/page.tsx:66 #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:49 #: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recipients.tsx:30 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:139 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:140 msgid "Recipients" msgstr "Odbiorcy" @@ -3980,7 +4040,7 @@ msgstr "Odbiorcy" msgid "Recipients metrics" msgstr "Metryki odbiorców" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:166 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:165 msgid "Recipients will still retain their copy of the document" msgstr "Odbiorcy nadal zachowają swoją kopię dokumentu" @@ -3997,7 +4057,7 @@ msgid "Red" msgstr "Czerwony" #: packages/ui/primitives/document-flow/add-settings.tsx:383 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:461 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:507 msgid "Redirect URL" msgstr "Adres URL przekierowania" @@ -4010,7 +4070,7 @@ msgstr "Rejestracja zakończona sukcesem" #: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:109 #: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:116 #: apps/web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx:162 -#: packages/email/template-components/template-document-invite.tsx:96 +#: packages/email/template-components/template-document-invite.tsx:95 msgid "Reject Document" msgstr "Odrzuć dokument" @@ -4047,17 +4107,18 @@ msgstr "Przypomnienie: Proszę {recipientActionVerb} ten dokument" msgid "Reminder: Please {recipientActionVerb} your document" msgstr "Przypomnienie: Proszę {recipientActionVerb} Twój dokument" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:193 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:431 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:188 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:425 #: apps/web/src/app/(signing)/sign/[token]/signing-field-container.tsx:156 #: apps/web/src/app/(signing)/sign/[token]/signing-field-container.tsx:180 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:250 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx:89 #: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:159 #: apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx:54 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:164 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:163 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:165 #: apps/web/src/components/forms/avatar-image.tsx:166 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:217 #: packages/ui/primitives/document-flow/add-fields.tsx:1128 msgid "Remove" msgstr "Usuń" @@ -4085,9 +4146,9 @@ msgstr "Zleć przeniesienie" #: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:176 #: packages/ui/primitives/document-flow/field-items-advanced-settings/dropdown-field.tsx:137 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:146 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:167 #: packages/ui/primitives/document-flow/field-items-advanced-settings/radio-field.tsx:112 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:123 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:151 msgid "Required field" msgstr "Wymagane pole" @@ -4096,7 +4157,7 @@ msgid "Reseal document" msgstr "Zapieczętuj ponownie dokument" #: apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx:118 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:152 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:151 #: packages/ui/primitives/document-flow/add-subject.tsx:84 msgid "Resend" msgstr "Wyślij ponownie" @@ -4177,11 +4238,11 @@ msgstr "Cofnij" msgid "Revoke access" msgstr "Cofnij dostęp" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:283 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:278 #: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:318 #: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:163 #: apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx:80 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:121 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:120 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:103 msgid "Role" msgstr "Rola" @@ -4195,16 +4256,16 @@ msgstr "Role" msgid "Rows per page" msgstr "Wiersze na stronę" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:446 -#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:337 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:344 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:440 +#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:350 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:361 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx:312 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:305 -#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:356 +#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:322 msgid "Save" msgstr "Zapisz" -#: packages/ui/primitives/template-flow/add-template-fields.tsx:896 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:974 msgid "Save Template" msgstr "Zapisz szablon" @@ -4219,7 +4280,7 @@ msgstr "Szukaj" msgid "Search by document title" msgstr "Szukaj tytułu dokumentu" -#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:147 +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:174 #: apps/web/src/app/(dashboard)/admin/users/data-table-users.tsx:144 msgid "Search by name or email" msgstr "Szukaj nazwy lub adresu e-mail" @@ -4266,11 +4327,11 @@ msgstr "Wybierz drużynę, do której chcesz przenieść ten dokument. Ta akcja msgid "Select a team to move this template to. This action cannot be undone." msgstr "Wybierz drużynę, do której chcesz przenieść ten szablon. Ta akcja nie może być cofnięta." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:261 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:259 msgid "Select a template you'd like to display on your public profile" msgstr "Wybierz szablon, który chcesz wyświetlić w profilu publicznym" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:257 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:255 msgid "Select a template you'd like to display on your team's public profile" msgstr "Wybierz szablon, który chcesz wyświetlić w profilu publicznym zespołu" @@ -4301,7 +4362,7 @@ msgstr "Wyślij" msgid "Send confirmation email" msgstr "Wyślij e-mail potwierdzający" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:325 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:336 msgid "Send document" msgstr "Wyślij dokument" @@ -4329,6 +4390,10 @@ msgstr "Wyślij e-mail oczekującego dokumentu" msgid "Send documents on behalf of the team using the email address" msgstr "Wyślij dokumenty w imieniu zespołu, używając adresu e-mail" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:253 +msgid "Send documents to recipients immediately" +msgstr "" + #: apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx:200 msgid "Send on Behalf of Team" msgstr "Wyślij w imieniu zespołu" @@ -4362,7 +4427,7 @@ msgid "Sending..." msgstr "Wysyłanie..." #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:101 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:256 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:258 msgid "Sent" msgstr "Wysłano" @@ -4381,8 +4446,8 @@ msgstr "Ustawienia" msgid "Setup" msgstr "Konfiguracja" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:148 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:193 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:154 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:187 msgid "Share" msgstr "Udostępnij" @@ -4390,8 +4455,8 @@ msgstr "Udostępnij" msgid "Share Signature Card" msgstr "Udostępnij kartę podpisu" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:179 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:219 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:185 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:213 msgid "Share Signing Card" msgstr "Udostępnij kartę podpisu" @@ -4403,7 +4468,7 @@ msgstr "Udostępnij link" msgid "Share your signing experience!" msgstr "Podziel się swoim doświadczeniem podpisywania!" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:163 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:162 msgid "Show" msgstr "Pokaż" @@ -4424,13 +4489,13 @@ msgstr "Pokaż szablony w profilu publicznym, aby szybko podpisać dokument" msgid "Show templates in your team public profile for your audience to sign and get started quickly" msgstr "Pokaż szablony w profilu publicznym zespołu, aby szybko podpisać dokument" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:83 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:114 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:139 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:89 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:115 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:133 #: apps/web/src/app/(profile)/p/[url]/page.tsx:192 #: apps/web/src/app/(signing)/sign/[token]/auto-sign.tsx:229 #: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:182 -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:224 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:241 #: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:142 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:328 #: apps/web/src/components/ui/user-profile-skeleton.tsx:75 @@ -4443,7 +4508,7 @@ msgstr "Podpisz" msgid "Sign as {0} <0>({1})" msgstr "Podpisz jako {0} <0>({1})" -#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:183 +#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:200 msgid "Sign as<0>{0} <1>({1})" msgstr "Podpisz jako<0>{0} <1>({1})" @@ -4453,7 +4518,7 @@ msgid "Sign document" msgstr "Podpisz dokument" #: apps/web/src/app/(signing)/sign/[token]/form.tsx:141 -#: packages/email/template-components/template-document-invite.tsx:104 +#: packages/email/template-components/template-document-invite.tsx:103 msgid "Sign Document" msgstr "Podpisz dokument" @@ -4506,22 +4571,22 @@ msgid "Sign Up with OIDC" msgstr "Zarejestruj się za pomocą OIDC" #: apps/web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx:88 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:177 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:179 #: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:342 #: apps/web/src/app/(signing)/sign/[token]/form.tsx:205 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:251 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:286 #: apps/web/src/app/embed/direct/[[...url]]/client.tsx:422 #: apps/web/src/app/embed/sign/[[...url]]/client.tsx:301 -#: apps/web/src/components/forms/profile.tsx:132 +#: apps/web/src/components/forms/profile.tsx:123 #: packages/ui/primitives/document-flow/add-fields.tsx:841 #: packages/ui/primitives/document-flow/field-icon.tsx:52 #: packages/ui/primitives/document-flow/types.ts:49 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:628 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:706 msgid "Signature" msgstr "Podpis" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:228 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:230 msgid "Signature ID" msgstr "Identyfikator podpisu" @@ -4541,7 +4606,7 @@ msgid "Signatures will appear once the document has been completed" msgstr "Podpisy pojawią się po ukończeniu dokumentu" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:114 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:278 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:280 #: apps/web/src/components/document/document-read-only-fields.tsx:84 #: packages/lib/constants/recipient-roles.ts:23 msgid "Signed" @@ -4551,7 +4616,7 @@ msgstr "Podpisano" msgid "Signer" msgstr "Sygnatariusz" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:176 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:178 msgid "Signer Events" msgstr "Wydarzenia sygnatariusza" @@ -4567,11 +4632,11 @@ msgstr "Podpisujący muszą mieć unikalne emaile" msgid "Signing" msgstr "Podpisywanie" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:168 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:170 msgid "Signing Certificate" msgstr "Certyfikat podpisu" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:311 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:313 msgid "Signing certificate provided by" msgstr "Certyfikat podpisu dostarczony przez" @@ -4585,12 +4650,12 @@ msgstr "Podpisywanie zakończone!" msgid "Signing in..." msgstr "Logowanie..." -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:160 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:203 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:166 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:197 msgid "Signing Links" msgstr "Linki do podpisania" -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:339 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:315 msgid "Signing links have been generated for this document." msgstr "Linki do podpisania zostały wygenerowane dla tego dokumentu." @@ -4598,7 +4663,7 @@ msgstr "Linki do podpisania zostały wygenerowane dla tego dokumentu." msgid "Signing up..." msgstr "Rejestracja..." -#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:82 +#: apps/web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx:90 #: apps/web/src/app/(dashboard)/admin/leaderboard/page.tsx:46 msgid "Signing Volume" msgstr "Liczba podpisów" @@ -4611,7 +4676,7 @@ msgstr "Rejestracje są wyłączone." msgid "Since {0}" msgstr "Od {0}" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:102 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:93 msgid "Site Banner" msgstr "Baner strony" @@ -4625,27 +4690,27 @@ msgid "Some signers have not been assigned a signature field. Please assign at l msgstr "Niektórzy sygnatariusze nie zostali przypisani do pola podpisu. Przypisz co najmniej 1 pole podpisu do każdego sygnatariusza przed kontynuowaniem." #: apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx:105 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:63 -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:91 -#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:65 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:69 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-dropdown.tsx:97 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:61 #: apps/web/src/app/(dashboard)/documents/[id]/logs/download-certificate-button.tsx:68 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:75 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:106 -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:82 -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:72 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:76 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:100 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:81 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:71 #: apps/web/src/app/(dashboard)/settings/billing/billing-plans.tsx:62 #: apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx:51 -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:124 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:123 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:73 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:93 #: apps/web/src/app/(dashboard)/settings/teams/accept-team-invitation-button.tsx:32 #: apps/web/src/app/(dashboard)/settings/teams/decline-team-invitation-button.tsx:32 #: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:44 -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:50 -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:79 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:104 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:127 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:151 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:45 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:78 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:100 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:123 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:147 #: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:118 #: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:27 #: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:38 @@ -4661,8 +4726,8 @@ msgstr "Niektórzy sygnatariusze nie zostali przypisani do pola podpisu. Przypis #: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:64 #: apps/web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx:83 #: apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx:33 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:66 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:83 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:65 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:82 #: apps/web/src/components/(teams)/team-billing-portal-button.tsx:29 #: packages/ui/components/document/document-share-button.tsx:51 msgid "Something went wrong" @@ -4701,12 +4766,16 @@ msgstr "Coś poszło nie tak!" msgid "Something went wrong." msgstr "Coś poszło nie tak." +#: apps/web/src/components/forms/token.tsx:143 +msgid "Something went wrong. Please try again later." +msgstr "Coś poszło nie tak. Proszę spróbować ponownie później." + #: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:240 #: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:154 msgid "Something went wrong. Please try again or contact support." msgstr "Coś poszło nie tak. Proszę spróbować ponownie lub skontaktować się z pomocą techniczną." -#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:67 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx:63 msgid "Sorry, we were unable to download the audit logs. Please try again later." msgstr "Nie mogliśmy pobrać dzienniku logów. Spróbuj ponownie później." @@ -4714,7 +4783,7 @@ msgstr "Nie mogliśmy pobrać dzienniku logów. Spróbuj ponownie później." msgid "Sorry, we were unable to download the certificate. Please try again later." msgstr "Przepraszamy, nie mogliśmy pobrać certyfikatu. Proszę spróbować ponownie później." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:134 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:132 msgid "Source" msgstr "Źródło" @@ -4725,8 +4794,8 @@ msgstr "Statystyki" #: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:81 #: apps/web/src/app/(dashboard)/admin/subscriptions/page.tsx:32 #: apps/web/src/app/(dashboard)/documents/data-table.tsx:73 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:126 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:93 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:124 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:94 #: apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx:73 msgid "Status" msgstr "Stan" @@ -4736,7 +4805,7 @@ msgid "Step <0>{step} of {maxStep}" msgstr "Krok <0>{step} z {maxStep}" #: packages/ui/primitives/document-flow/add-subject.tsx:143 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:318 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:364 msgid "Subject <0>(Optional)" msgstr "Temat <0>(Opcjonalnie)" @@ -4762,8 +4831,8 @@ msgstr "Subskrypcje" #: apps/web/src/app/(dashboard)/settings/teams/accept-team-invitation-button.tsx:25 #: apps/web/src/app/(dashboard)/settings/teams/decline-team-invitation-button.tsx:25 #: apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx:37 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:118 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:141 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:114 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:137 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx:32 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:44 #: apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx:44 @@ -4780,11 +4849,12 @@ msgstr "Subskrypcje" #: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:92 #: apps/web/src/components/(teams)/forms/update-team-form.tsx:67 #: apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx:27 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:60 -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:77 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:59 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:76 #: apps/web/src/components/forms/public-profile-form.tsx:80 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:133 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:170 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:132 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:168 +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:95 msgid "Success" msgstr "Sukces" @@ -4792,6 +4862,14 @@ msgstr "Sukces" msgid "Successfully created passkey" msgstr "Pomyślnie utworzono klucz uwierzytelniający" +#: packages/email/templates/bulk-send-complete.tsx:52 +msgid "Successfully created: {successCount}" +msgstr "" + +#: packages/email/templates/bulk-send-complete.tsx:44 +msgid "Summary:" +msgstr "" + #: apps/web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx:57 msgid "System Requirements" msgstr "Wymagania systemowe" @@ -4863,7 +4941,7 @@ msgstr "Zaproszenie do zespołu" msgid "Team invitations have been sent." msgstr "Zaproszenia do zespołu zostały wysłane." -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:107 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:106 #: apps/web/src/components/(teams)/tables/team-members-data-table.tsx:84 msgid "Team Member" msgstr "Użytkownik zespołu" @@ -4940,31 +5018,31 @@ msgstr "Zespoły ograniczone" #: apps/web/src/app/(dashboard)/templates/[id]/edit/template-edit-page-view.tsx:64 #: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:39 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:144 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:224 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:148 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:142 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:222 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:151 #: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:408 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:271 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:269 msgid "Template" msgstr "Szablon" -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:41 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:36 msgid "Template deleted" msgstr "Szablon usunięty" -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:67 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:66 msgid "Template document uploaded" msgstr "Dokument szablonu przesłany" -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:42 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:41 msgid "Template duplicated" msgstr "Szablon skopiowany" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:134 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:133 msgid "Template has been removed from your public profile." msgstr "Szablon został usunięty z profilu publicznego." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:171 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:169 msgid "Template has been updated." msgstr "Szablon został zaktualizowany." @@ -4976,15 +5054,15 @@ msgstr "Szablon przeniesiony" msgid "Template not found or already associated with a team." msgstr "Szablon nie znaleziony lub już powiązany z zespołem." -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:246 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:216 msgid "Template saved" msgstr "Szablon zapisany" -#: packages/ui/primitives/template-flow/add-template-settings.tsx:145 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:167 msgid "Template title" msgstr "Tytuł szablonu" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:86 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:87 #: apps/web/src/app/(dashboard)/templates/templates-page-view.tsx:55 #: apps/web/src/components/(dashboard)/common/command-menu.tsx:208 #: apps/web/src/components/(dashboard)/layout/desktop-nav.tsx:22 @@ -4992,19 +5070,28 @@ msgstr "Tytuł szablonu" msgid "Templates" msgstr "Szablony" -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:106 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:105 msgid "Templates allow you to quickly generate documents with pre-filled recipients and fields." msgstr "Szablony pozwalają na szybkie generowanie dokumentów z wypełnionymi odbiorcami i polami." -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:257 -#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:274 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:258 +#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:287 #: packages/ui/primitives/document-flow/add-fields.tsx:971 #: packages/ui/primitives/document-flow/types.ts:52 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:758 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:836 msgid "Text" msgstr "Tekst" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:166 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx:79 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx:61 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx:56 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx:61 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:140 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/text-field.tsx:124 +msgid "Text Align" +msgstr "" + +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:157 msgid "Text Color" msgstr "Kolor tekstu" @@ -5016,7 +5103,7 @@ msgstr "Dziękujemy za korzystanie z Documenso do wykonywania podpisu elektronic msgid "That's okay, it happens! Click the button below to reset your password." msgstr "To w porządku, zdarza się! Kliknij przycisk poniżej, aby zresetować hasło." -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:51 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:52 msgid "The account has been deleted successfully." msgstr "Konto zostało pomyślnie usunięte." @@ -5040,13 +5127,13 @@ msgstr "Uwierzytelnianie wymagane dla odbiorców do podpisania pola podpisu." msgid "The authentication required for recipients to view the document." msgstr "Uwierzytelnianie wymagane dla odbiorców do wyświetlenia dokumentu." -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:197 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:188 msgid "The content to show in the banner, HTML is allowed" msgstr "Treść do wyświetlenia w banerze, dozwolone HTML" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:78 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:73 #: apps/web/src/app/(dashboard)/templates/template-direct-link-badge.tsx:32 -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:164 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:160 msgid "The direct link has been copied to your clipboard" msgstr "Bezpośredni link został skopiowany do schowka" @@ -5066,15 +5153,15 @@ msgstr "Właściciel dokumentu został poinformowany o tym odrzuceniu. W tej chw msgid "The document owner has been notified of your decision. They may contact you with further instructions if necessary." msgstr "Właściciel dokumentu został poinformowany o Twojej decyzji. Mogą się z Tobą skontaktować w celu podania dalszych instrukcji, jeśli to konieczne." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:182 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:194 msgid "The document was created but could not be sent to recipients." msgstr "Dokument został utworzony, ale nie mógł zostać wysłany do odbiorców." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:163 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:162 msgid "The document will be hidden from your account" msgstr "Dokument zostanie ukryty w Twoim koncie" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:333 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:344 msgid "The document will be immediately sent to recipients if this is checked." msgstr "Dokument zostanie natychmiast wysłany do odbiorców, jeśli to zostanie zaznaczone." @@ -5088,6 +5175,10 @@ msgstr "Nazwa dokumentu" msgid "The events that will trigger a webhook to be sent to your URL." msgstr "Wydarzenia, które wyzwolą webhook do wysłania do Twojego URL." +#: packages/email/templates/bulk-send-complete.tsx:62 +msgid "The following errors occurred:" +msgstr "" + #: packages/email/templates/team-delete.tsx:37 msgid "The following team has been deleted by its owner. You will no longer be able to access this team and its documents" msgstr "Następujący zespół został usunięty przez jego właściciela. Nie będziesz mógł już uzyskać dostępu do tego zespołu i jego dokumentów" @@ -5116,11 +5207,11 @@ msgstr "Link do profilu został skopiowany do schowka" msgid "The profile you are looking for could not be found." msgstr "Profil, którego szukasz, nie mógł zostać znaleziony." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:380 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:378 msgid "The public description that will be displayed with this template" msgstr "Publiczny opis, który zostanie wyświetlony z tym szablonem" -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:358 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:356 msgid "The public name for your template" msgstr "Publiczna nazwa Twojego szablonu" @@ -5162,11 +5253,11 @@ msgstr "Link do udostępniania został skopiowany do schowka." #: packages/ui/components/document/document-send-email-message-helper.tsx:25 msgid "The signer's email" -msgstr "Email sygnatariusza" +msgstr "Adres e-mail podpisującego" #: packages/ui/components/document/document-send-email-message-helper.tsx:19 msgid "The signer's name" -msgstr "Imię sygnatariusza" +msgstr "Nazwa podpisującego" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:163 #: apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx:41 @@ -5175,7 +5266,7 @@ msgstr "Imię sygnatariusza" msgid "The signing link has been copied to your clipboard." msgstr "Link do podpisu został skopiowany do schowka." -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:105 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:96 msgid "The site banner is a message that is shown at the top of the site. It can be used to display important information to your users." msgstr "Baner strony to wiadomość, która jest wyświetlana u góry strony. Może być używany do wyświetlania ważnych informacji użytkownikom." @@ -5199,7 +5290,7 @@ msgstr "Zespół, którego szukasz, mógł zostać usunięty, zmieniony lub mog msgid "The template has been successfully moved to the selected team." msgstr "Szablon został pomyślnie przeniesiony do wybranego zespołu." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:443 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:441 msgid "The template will be removed from your profile" msgstr "Szablon zostanie usunięty z Twojego profilu" @@ -5207,7 +5298,7 @@ msgstr "Szablon zostanie usunięty z Twojego profilu" msgid "The template you are looking for may have been disabled, deleted or may have never existed." msgstr "Szablon, którego szukasz, mógł zostać wyłączony, usunięty lub mógł nigdy nie istnieć." -#: apps/web/src/components/forms/token.tsx:106 +#: apps/web/src/components/forms/token.tsx:107 msgid "The token was copied to your clipboard." msgstr "Token został skopiowany do schowka." @@ -5250,8 +5341,8 @@ msgstr "Brak zakończonych dokumentów. Utworzone lub odebrane dokumentu pojawi msgid "They have permission on your behalf to:" msgstr "Mają pozwolenie w Twoim imieniu na:" -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:110 -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:109 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:100 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:106 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:98 msgid "This action is not reversible. Please be certain." msgstr "Ta akcja nie jest odwracalna. Proszę być pewnym." @@ -5268,11 +5359,11 @@ msgstr "To można nadpisać, ustawiając wymagania dotyczące uwierzytelniania b msgid "This document can not be recovered, if you would like to dispute the reason for future documents please contact support." msgstr "Dokument ten nie może być odzyskany. Jeśli chcesz zakwestionować przyczynę przyszłych dokumentów, skontaktuj się z administracją." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:83 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:82 msgid "This document could not be deleted at this time. Please try again." msgstr "Nie można usunąć tego dokumentu w tej chwili. Proszę spróbować ponownie." -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:73 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:72 msgid "This document could not be duplicated at this time. Please try again." msgstr "Nie można skopiować tego dokumentu w tej chwili. Proszę spróbować ponownie." @@ -5292,11 +5383,11 @@ 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/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:227 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:228 msgid "This document has been signed by all recipients" msgstr "Ten dokument został podpisany przez wszystkich odbiorców" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:230 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:231 msgid "This document is currently a draft and has not been sent" msgstr "Ten dokument jest obecnie szkicowany i nie został wysłany" @@ -5304,11 +5395,11 @@ msgstr "Ten dokument jest obecnie szkicowany i nie został wysłany" msgid "This document is password protected. Please enter the password to view the document." msgstr "Ten dokument jest zabezpieczony hasłem. Proszę wprowadzić hasło, aby wyświetlić dokument." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:148 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:146 msgid "This document was created by you or a team member using the template above." msgstr "Ten dokument został stworzony przez Ciebie lub członka zespołu przy użyciu powyższego szablonu." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:160 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:158 msgid "This document was created using a direct link." msgstr "Ten dokument został stworzony przy użyciu bezpośredniego linku." @@ -5344,7 +5435,7 @@ msgstr "Ten e-mail zostanie wysłany do odbiorcy, który właśnie podpisał dok msgid "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them." msgstr "To pole nie może być modyfikowane ani usuwane. Po udostępnieniu bezpośredniego linku do tego szablonu lub dodaniu go do swojego publicznego profilu, każdy, kto się w nim dostanie, może wpisać swoje imię i email oraz wypełnić przypisane mu pola." -#: packages/ui/primitives/template-flow/add-template-settings.tsx:233 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:279 msgid "This is how the document will reach the recipients once the document is ready for signing." msgstr "W ten sposób dokument dotrze do odbiorców, gdy tylko dokument będzie gotowy do podpisania." @@ -5384,7 +5475,7 @@ msgstr "Ten sygnatariusz już podpisał dokument." msgid "This team, and any associated data excluding billing invoices will be permanently deleted." msgstr "Ten zespół oraz wszelkie powiązane dane, z wyjątkiem faktur, zostaną trwale usunięte." -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:51 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:46 msgid "This template could not be deleted at this time. Please try again." msgstr "Ten szablon nie mógł zostać usunięty w tej chwili. Proszę spróbować ponownie." @@ -5425,7 +5516,7 @@ msgstr "To zostanie wysłane do właściciela dokumentu, gdy dokument zostanie w msgid "This will override any global settings." msgstr "To zastąpi wszystkie globalne ustawienia." -#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:71 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:70 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:44 msgid "Time" msgstr "Czas" @@ -5434,15 +5525,15 @@ msgstr "Czas" msgid "Time zone" msgstr "Strefa czasowa" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:131 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:132 #: packages/ui/primitives/document-flow/add-settings.tsx:359 -#: packages/ui/primitives/template-flow/add-template-settings.tsx:438 +#: packages/ui/primitives/template-flow/add-template-settings.tsx:484 msgid "Time Zone" msgstr "Strefa czasowa" #: apps/web/src/app/(dashboard)/admin/documents/document-results.tsx:67 #: apps/web/src/app/(dashboard)/documents/data-table.tsx:54 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:111 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-documents-table.tsx:109 #: apps/web/src/app/(dashboard)/templates/data-table-templates.tsx:61 #: packages/ui/primitives/document-flow/add-settings.tsx:166 msgid "Title" @@ -5456,13 +5547,13 @@ msgstr "Aby zaakceptować to zaproszenie, musisz założyć konto." msgid "To change the email you must remove and add a new email address." msgstr "Aby zmienić e-mail, musisz usunąć i dodać nowy adres e-mail." -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:116 +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:113 #: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:111 #: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:101 msgid "To confirm, please enter the accounts email address <0/>({0})." msgstr "Aby potwierdzić, proszę wpisać adres e-mail konta <0/>({0})." -#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:117 +#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:107 msgid "To confirm, please enter the reason" msgstr "Aby potwierdzić, proszę wpisać powód" @@ -5483,7 +5574,7 @@ msgid "To mark this document as viewed, you need to be logged in as <0>{0}" msgstr "Aby oznaczyć ten dokument jako wyświetlony, musisz być zalogowany jako <0>{0}" #: packages/ui/primitives/document-flow/add-fields.tsx:1091 -#: packages/ui/primitives/template-flow/add-template-fields.tsx:876 +#: packages/ui/primitives/template-flow/add-template-fields.tsx:954 msgid "To proceed further, please set at least one value for the {0} field." msgstr "Aby kontynuować, ustaw przynajmniej jedną wartość dla pola {0}." @@ -5495,11 +5586,11 @@ msgstr "Aby skorzystać z naszej usługi podpisu elektronicznego, musisz mieć d msgid "To view this document you need to be signed into your account, please sign in to continue." msgstr "Aby zobaczyć ten dokument, musisz być zalogowany na swoje konto, proszę zaloguj się, aby kontynuować." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:178 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:177 msgid "Toggle the switch to hide your profile from the public." msgstr "Przełącz przełącznik, aby ukryć swój profil przed publicznością." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:190 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:189 msgid "Toggle the switch to show your profile to the public." msgstr "Przełącz przełącznik, aby pokazać swój profil publicznie." @@ -5507,11 +5598,11 @@ msgstr "Przełącz przełącznik, aby pokazać swój profil publicznie." msgid "Token" msgstr "Token" -#: apps/web/src/components/forms/token.tsx:105 +#: apps/web/src/components/forms/token.tsx:106 msgid "Token copied to clipboard" msgstr "Token został skopiowany do schowka" -#: apps/web/src/components/forms/token.tsx:126 +#: apps/web/src/components/forms/token.tsx:127 msgid "Token created" msgstr "Token został utworzony" @@ -5544,6 +5635,10 @@ msgstr "Łączna liczba dokumentów" msgid "Total Recipients" msgstr "Łączna liczba odbiorców" +#: packages/email/templates/bulk-send-complete.tsx:49 +msgid "Total rows processed: {totalProcessed}" +msgstr "" + #: apps/web/src/app/(dashboard)/admin/stats/page.tsx:150 msgid "Total Signers that Signed Up" msgstr "Łączna liczba podpisujących, którzy się zarejestrowali" @@ -5629,11 +5724,11 @@ msgstr "Nie można zmienić języka w tej chwili. Spróbuj ponownie później." msgid "Unable to copy recovery code" msgstr "Nie można skopiować kodu odzyskiwania" -#: apps/web/src/components/forms/token.tsx:110 +#: apps/web/src/components/forms/token.tsx:111 msgid "Unable to copy token" msgstr "Nie można skopiować tokena" -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:105 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:101 msgid "Unable to create direct template access. Please try again later." msgstr "Nie można utworzyć bezpośredniego dostępu do szablonu. Proszę spróbować ponownie później." @@ -5641,7 +5736,7 @@ msgstr "Nie można utworzyć bezpośredniego dostępu do szablonu. Proszę spró msgid "Unable to decline this team invitation at this time." msgstr "Nie można w tej chwili odrzucić zaproszenia do zespołu." -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:84 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:83 msgid "Unable to delete invitation. Please try again." msgstr "Nie można usunąć zaproszenia. Proszę spróbować ponownie." @@ -5662,11 +5757,11 @@ msgstr "Nie można dołączyć do tego zespołu w tej chwili." msgid "Unable to load document history" msgstr "Nie można załadować historii dokumentu" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:60 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:58 msgid "Unable to load documents" msgstr "Nie można załadować dokumentów" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:111 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:106 msgid "Unable to load your public profile templates at this time" msgstr "Nie można załadować szablonów publicznego profilu w tej chwili" @@ -5678,7 +5773,7 @@ msgstr "Nie można usunąć weryfikacji e-maila w tej chwili. Proszę spróbowa msgid "Unable to remove team email at this time. Please try again." msgstr "Nie można usunąć e-maila zespołu w tej chwili. Proszę spróbować ponownie." -#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:67 +#: apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx:66 msgid "Unable to resend invitation. Please try again." msgstr "Nie można ponownie wysłać zaproszenia. Proszę spróbować ponownie." @@ -5709,10 +5804,10 @@ msgstr "Nieautoryzowany" msgid "Uncompleted" msgstr "Niezakończony" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:237 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:262 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:273 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:284 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:239 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:264 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:275 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:286 #: apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx:55 msgid "Unknown" msgstr "Nieznany" @@ -5725,17 +5820,17 @@ msgstr "Nieznany błąd" msgid "Unpaid" msgstr "Nieopłacone" -#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:181 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx:176 #: apps/web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx:162 #: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:166 #: apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx:191 #: apps/web/src/components/forms/public-profile-form.tsx:279 -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:428 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:426 #: packages/ui/primitives/document-flow/add-subject.tsx:86 msgid "Update" msgstr "Zaktualizuj" -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:211 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:202 msgid "Update Banner" msgstr "Zaktualizuj baner" @@ -5747,7 +5842,7 @@ msgstr "Zaktualizuj klucz dostępu" msgid "Update password" msgstr "Zaktualizuj hasło" -#: apps/web/src/components/forms/profile.tsx:151 +#: apps/web/src/components/forms/profile.tsx:142 msgid "Update profile" msgstr "Zaktualizuj profil" @@ -5790,7 +5885,7 @@ msgstr "Zaktualizuj webhook" msgid "Updating password..." msgstr "Aktualizowanie hasła..." -#: apps/web/src/components/forms/profile.tsx:151 +#: apps/web/src/components/forms/profile.tsx:142 msgid "Updating profile..." msgstr "Aktualizacja profilu..." @@ -5802,10 +5897,30 @@ msgstr "Aktualizacja Twoich informacji" msgid "Upgrade" msgstr "Ulepsz" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:132 +msgid "Upload a CSV file to create multiple documents from this template. Each row represents one document with its recipient details." +msgstr "" + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:426 +msgid "Upload a custom document to use instead of the template's default document" +msgstr "Prześlij niestandardowy dokument do użycia zamiast domyślnego dokumentu szablonu" + +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:267 +msgid "Upload and Process" +msgstr "" + #: apps/web/src/components/forms/avatar-image.tsx:179 msgid "Upload Avatar" msgstr "Prześlij awatar" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:198 +msgid "Upload CSV" +msgstr "" + +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:419 +msgid "Upload custom document" +msgstr "Prześlij niestandardowy dokument" + #: packages/ui/primitives/signature-pad/signature-pad.tsx:529 msgid "Upload Signature" msgstr "Prześlij podpis" @@ -5835,7 +5950,7 @@ msgstr "Przesłany plik jest zbyt mały" msgid "Uploaded file not an allowed file type" msgstr "Przesłany plik nie jest dozwolonym typem pliku" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:172 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx:175 msgid "Use" msgstr "Użyj" @@ -5849,11 +5964,11 @@ msgstr "Użyj Authenticatora" msgid "Use Backup Code" msgstr "Użyj kodu zapasowego" -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:207 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:219 msgid "Use Template" msgstr "Użyj szablonu" -#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:76 +#: apps/web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx:75 #: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx:45 msgid "User" msgstr "Użytkownik" @@ -5866,6 +5981,7 @@ msgstr "Użytkownik nie ma hasła." msgid "User ID" msgstr "ID użytkownika" +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:61 #: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:55 #: apps/web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx:55 msgid "User not found." @@ -5892,7 +6008,7 @@ msgid "Users" msgstr "Użytkownicy" #: packages/ui/primitives/document-flow/field-items-advanced-settings/checkbox-field.tsx:132 -#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:167 +#: packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx:188 msgid "Validation" msgstr "Walidacja" @@ -5930,14 +6046,14 @@ msgstr "Zweryfikuj adres e-mail, aby przesłać dokumenty." msgid "Verify your team email address" msgstr "Zweryfikuj swój adres e-mail zespołu" -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:75 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx:76 msgid "Version History" msgstr "Historia wersji" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:95 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:126 -#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:135 -#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:132 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:101 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:127 +#: apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx:136 +#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:126 #: apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx:100 #: apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx:168 #: packages/lib/constants/recipient-roles.ts:29 @@ -5960,7 +6076,7 @@ msgstr "Wyświetl wszystkie dokumenty wysłane na twoje konto" msgid "View all recent security activity related to your account." msgstr "Wyświetl wszystkie ostatnie aktywności związane z bezpieczeństwem twojego konta." -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:155 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:153 msgid "View all related documents" msgstr "Zobacz wszystkie powiązane dokumenty" @@ -5977,7 +6093,7 @@ msgid "View document" msgstr "Zobacz dokument" #: apps/web/src/app/(signing)/sign/[token]/form.tsx:140 -#: packages/email/template-components/template-document-invite.tsx:105 +#: packages/email/template-components/template-document-invite.tsx:104 #: packages/email/template-components/template-document-rejected.tsx:44 #: packages/ui/primitives/document-flow/add-subject.tsx:90 #: packages/ui/primitives/document-flow/add-subject.tsx:91 @@ -5992,7 +6108,7 @@ msgstr "Wyświetl dokumenty powiązane z tym e-mailem" msgid "View invites" msgstr "Wyświetl zaproszenia" -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:93 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-recent-activity.tsx:91 msgid "View more" msgstr "Zobacz więcej" @@ -6014,7 +6130,7 @@ msgid "View teams" msgstr "Wyświetl zespoły" #: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-recipients.tsx:120 -#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:267 +#: apps/web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx:269 #: packages/lib/constants/recipient-roles.ts:30 msgid "Viewed" msgstr "Wyświetlono" @@ -6073,7 +6189,7 @@ msgstr "Nie możemy usunąć tego klucza zabezpieczeń w tej chwili. Proszę spr msgid "We are unable to update this passkey at the moment. Please try again later." msgstr "Nie możemy zaktualizować tego klucza zabezpieczeń w tej chwili. Proszę spróbuj ponownie później." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:153 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:149 msgid "We encountered an error while removing the direct template link. Please try again later." msgstr "Wystąpił błąd podczas usuwania bezpośredniego linku do szablonu. Proszę spróbować ponownie później." @@ -6082,10 +6198,6 @@ msgstr "Wystąpił błąd podczas usuwania bezpośredniego linku do szablonu. Pr msgid "We encountered an error while updating the webhook. Please try again later." msgstr "Natknęliśmy się na błąd podczas aktualizacji webhooka. Proszę spróbuj ponownie później." -#: apps/web/src/components/forms/token.tsx:145 -msgid "We encountered an unknown error while attempting create the new token. Please try again later." -msgstr "Natknęliśmy się na nieznany błąd podczas próby utworzenia nowego tokena. Proszę spróbuj ponownie później." - #: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:102 msgid "We encountered an unknown error while attempting to add this email. Please try again later." msgstr "Natknęliśmy się na nieznany błąd podczas próby dodania tego e-maila. Proszę spróbuj ponownie później." @@ -6110,7 +6222,6 @@ msgstr "Natknęliśmy się na nieznany błąd podczas próby usunięcia tego zes msgid "We encountered an unknown error while attempting to delete this token. Please try again later." msgstr "Natknęliśmy się na nieznany błąd podczas próby usunięcia tego tokena. Proszę spróbuj ponownie później." -#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:70 #: apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx:58 msgid "We encountered an unknown error while attempting to delete your account. Please try again later." msgstr "Natknęliśmy się na nieznany błąd podczas próby usunięcia twojego konta. Proszę spróbuj ponownie później." @@ -6123,7 +6234,7 @@ msgstr "Natknęliśmy się na nieznany błąd podczas próby zaproszenia członk msgid "We encountered an unknown error while attempting to leave this team. Please try again later." msgstr "Natknęliśmy się na nieznany błąd podczas próby opuszczenia tego zespołu. Proszę spróbuj ponownie później." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:143 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:142 msgid "We encountered an unknown error while attempting to remove this template from your profile. Please try again later." msgstr "Natknęliśmy się na nieznany błąd podczas próby usunięcia tego szablonu z twojego profilu. Proszę spróbuj ponownie później." @@ -6151,7 +6262,6 @@ msgstr "Natknęliśmy się na nieznany błąd podczas próby odwołania dostępu msgid "We encountered an unknown error while attempting to save your details. Please try again later." msgstr "Natknęliśmy się na nieznany błąd podczas próby zapisania twoich danych. Proszę spróbuj ponownie później." -#: apps/web/src/components/forms/profile.tsx:89 #: apps/web/src/components/forms/signin.tsx:273 #: apps/web/src/components/forms/signin.tsx:288 #: apps/web/src/components/forms/signin.tsx:304 @@ -6165,11 +6275,11 @@ msgstr "Natknęliśmy się na nieznany błąd podczas próby zalogowania się. P msgid "We encountered an unknown error while attempting to sign you Up. Please try again later." msgstr "Natknęliśmy się na nieznany błąd podczas próby rejestracji. Proszę spróbuj ponownie później." -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:92 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:84 msgid "We encountered an unknown error while attempting to update the banner. Please try again later." msgstr "Natknęliśmy się na nieznany błąd podczas próby zaktualizowania banera. Proszę spróbuj ponownie później." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:180 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:178 msgid "We encountered an unknown error while attempting to update the template. Please try again later." msgstr "Natknęliśmy się na nieznany błąd podczas próby zaktualizowania szablonu. Proszę spróbuj ponownie później." @@ -6194,6 +6304,10 @@ msgstr "Natknęliśmy się na nieznany błąd podczas próby zaktualizowania two msgid "We encountered an unknown error while attempting update the team email. Please try again later." msgstr "Natknęliśmy się na nieznany błąd podczas próby zaktualizowania e-maila zespołu. Proszę spróbuj ponownie później." +#: apps/web/src/components/forms/profile.tsx:81 +msgid "We encountered an unknown error while attempting update your profile. Please try again later." +msgstr "Napotkaliśmy nieznany błąd podczas próby aktualizacji Twojego profilu. Proszę spróbować ponownie później." + #: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:80 msgid "We have sent a confirmation email for verification." msgstr "Wysłaliśmy wiadomość e-mail z potwierdzeniem dla weryfikacji." @@ -6206,7 +6320,7 @@ msgstr "Potrzebujemy nazwy użytkownika, aby utworzyć Twój profil" msgid "We need your signature to sign documents" msgstr "Potrzebujemy Twojego podpisu, aby podpisać dokumenty" -#: apps/web/src/components/forms/token.tsx:111 +#: apps/web/src/components/forms/token.tsx:112 msgid "We were unable to copy the token to your clipboard. Please try again." msgstr "Nie udało nam się skopiować tokena do schowka. Spróbuj ponownie." @@ -6231,7 +6345,7 @@ msgstr "Nie udało nam się wyłączyć uwierzytelniania dwuskładnikowego dla t msgid "We were unable to log you out at this time." msgstr "Nie udało nam się wylogować w tej chwili." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:125 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:124 msgid "We were unable to set your public profile to public. Please try again." msgstr "Nie udało nam się ustawić twojego profilu publicznego na publiczny. Proszę spróbuj ponownie." @@ -6266,11 +6380,11 @@ msgstr "Nie udało się zweryfikować twojego e-maila. Jeśli twój e-mail nie j msgid "We will generate signing links for with you, which you can send to the recipients through your method of choice." msgstr "Wygenerujemy linki do podpisu dla Ciebie, które możesz wysłać do odbiorców w wybrany przez siebie sposób." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:369 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:382 msgid "We will generate signing links for you, which you can send to the recipients through your method of choice." msgstr "Wygenerujemy dla Ciebie linki do podpisania, które możesz wysłać do odbiorców za pomocą wybranej metody." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:365 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:378 #: packages/ui/primitives/document-flow/add-subject.tsx:201 msgid "We won't send anything to notify recipients." msgstr "Nie wyślemy nic, aby powiadomić odbiorców." @@ -6376,13 +6490,13 @@ msgstr "Napisz o sobie" msgid "Yearly" msgstr "Rocznie" -#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:32 -#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:31 -#: packages/lib/utils/document-audit-logs.ts:258 +#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-information.tsx:33 +#: apps/web/src/app/(dashboard)/templates/[id]/template-page-view-information.tsx:32 +#: packages/lib/utils/document-audit-logs.ts:274 msgid "You" msgstr "Ty" -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:105 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:104 msgid "You are about to delete <0>\"{documentTitle}\"" msgstr "Zaraz usuniesz <0>\"{documentTitle}\"" @@ -6390,7 +6504,7 @@ msgstr "Zaraz usuniesz <0>\"{documentTitle}\"" msgid "You are about to delete the following team email from <0>{teamName}." msgstr "Zaraz usuniesz następujący e-mail zespołowy z <0>{teamName}." -#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:109 +#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:108 msgid "You are about to hide <0>\"{documentTitle}\"" msgstr "Zaraz ukryjesz <0>\"{documentTitle}\"" @@ -6426,6 +6540,10 @@ msgstr "Obecnie aktualizujesz klucz zabezpieczeń <0>{passkeyName}." msgid "You are not a member of this team." msgstr "Nie jesteś członkiem tego zespołu." +#: apps/web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx:62 +msgid "You are not authorized to delete this user." +msgstr "Nie masz uprawnień do usunięcia tego użytkownika." + #: apps/web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx:56 msgid "You are not authorized to disable this user." msgstr "Nie masz uprawnień, aby wyłączyć tego użytkownika." @@ -6474,6 +6592,10 @@ msgstr "Możesz użyć następujących zmiennych w swojej wiadomości:" msgid "You can view documents associated with this email and use this identity when sending documents." msgstr "Możesz wyświetlać dokumenty powiązane z tym e-mailem i używać tej tożsamości podczas wysyłania dokumentów." +#: packages/email/templates/bulk-send-complete.tsx:76 +msgid "You can view the created documents in your dashboard under the \"Documents created from template\" section." +msgstr "" + #: packages/email/template-components/template-document-rejected.tsx:37 msgid "You can view the document and its status by clicking the button below." msgstr "Możesz zobaczyć dokument i jego status, klikając przycisk poniżej." @@ -6490,7 +6612,7 @@ msgstr "Nie możesz modyfikować członka zespołu, który ma wyższą rolę ni msgid "You cannot upload documents at this time." msgstr "Nie możesz przesyłać dokumentów w tej chwili." -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:103 msgid "You cannot upload encrypted PDFs" msgstr "Nie możesz przesyłać zaszyfrowanych plików PDF" @@ -6498,6 +6620,10 @@ msgstr "Nie możesz przesyłać zaszyfrowanych plików PDF" msgid "You do not currently have a customer record, this should not happen. Please contact support for assistance." msgstr "Obecnie nie masz rekordu klienta, nie powinno tak się dziać. Proszę skontaktuj się z pomocą techniczną." +#: apps/web/src/components/forms/token.tsx:141 +msgid "You do not have permission to create a token for this team" +msgstr "Nie masz uprawnień do utworzenia tokenu dla tego zespołu" + #: packages/email/template-components/template-document-cancel.tsx:35 msgid "You don't need to sign it anymore." msgstr "Nie musisz go już podpisywać." @@ -6527,7 +6653,8 @@ msgstr "Zostałeś zaproszony do dołączenia do {0} na Documenso" msgid "You have been invited to join the following team" msgstr "Zostałeś zaproszony do dołączenia do następującego zespołu" -#: packages/lib/server-only/recipient/set-recipients-for-document.ts:337 +#: packages/lib/server-only/recipient/delete-document-recipient.ts:156 +#: packages/lib/server-only/recipient/set-document-recipients.ts:326 msgid "You have been removed from a document" msgstr "Zostałeś usunięty z dokumentu" @@ -6557,10 +6684,14 @@ msgstr "Brak utworzonych szablonów. Prześlij, aby utworzyć." msgid "You have not yet created or received any documents. To create a document please upload one." msgstr "Brak utworzonych lub odebranych dokumentów. Prześlij, aby utworzyć." -#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:234 +#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:229 msgid "You have reached the maximum limit of {0} direct templates. <0>Upgrade your account to continue!" msgstr "Osiągnąłeś maksymalny limit {0} bezpośrednich szablonów. <0>Ulepsz swoje konto, aby kontynuować!" +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106 +msgid "You have reached your document limit for this month. Please upgrade your plan." +msgstr "Osiągnąłeś limit dokumentów na ten miesiąc. Proszę zaktualizować swój plan." + #: apps/web/src/app/(dashboard)/documents/upload-document.tsx:56 #: packages/ui/primitives/document-dropzone.tsx:69 msgid "You have reached your document limit." @@ -6626,7 +6757,7 @@ msgstr "Musisz wpisać '{deleteMessage}' aby kontynuować" msgid "You must have at least one other team member to transfer ownership." msgstr "Musisz mieć przynajmniej jednego innego członka zespołu, aby przenieść własność." -#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:109 +#: apps/web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx:108 msgid "You must set a profile URL before enabling your public profile." msgstr "Musisz ustawić URL profilu przed włączeniem swojego publicznego profilu." @@ -6662,7 +6793,7 @@ msgstr "Konto zostało usunięte." msgid "Your avatar has been updated successfully." msgstr "Awatar został zaktualizowany." -#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:75 +#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:74 msgid "Your banner has been updated successfully." msgstr "Twój banner został pomyślnie zaktualizowany." @@ -6674,43 +6805,51 @@ msgstr "Adres URL witryny Twojej marki" msgid "Your branding preferences have been updated" msgstr "Preferencje dotyczące marki zostały zaktualizowane" +#: apps/web/src/components/templates/template-bulk-send-dialog.tsx:97 +msgid "Your bulk send has been initiated. You will receive an email notification upon completion." +msgstr "" + +#: packages/email/templates/bulk-send-complete.tsx:40 +msgid "Your bulk send operation for template \"{templateName}\" has completed." +msgstr "" + #: apps/web/src/app/(dashboard)/settings/billing/page.tsx:125 msgid "Your current plan is past due. Please update your payment information." msgstr "Twój obecny plan jest przeterminowany. Zaktualizuj swoje informacje płatnicze." -#: apps/web/src/components/templates/manage-public-template-dialog.tsx:251 +#: apps/web/src/components/templates/manage-public-template-dialog.tsx:249 msgid "Your direct signing templates" msgstr "Twoje bezpośrednie szablony podpisu" -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:129 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:123 msgid "Your document failed to upload." msgstr "Twój dokument nie udało się załadować." -#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:157 +#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:169 msgid "Your document has been created from the template successfully." msgstr "Twój dokument został pomyślnie utworzony na podstawie szablonu." #: packages/email/template-components/template-document-super-delete.tsx:23 msgid "Your document has been deleted by an admin!" -msgstr "Twój dokument został usunięty przez administratora!" +msgstr "Dokument został usunięty przez administratora!" #: apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx:98 msgid "Your document has been re-sent successfully." msgstr "Twój dokument został pomyślnie ponownie wysłany." -#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:328 +#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:304 msgid "Your document has been sent successfully." msgstr "Twój dokument został pomyślnie wysłany." -#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:59 +#: apps/web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx:58 msgid "Your document has been successfully duplicated." msgstr "Twój dokument został pomyślnie zduplikowany." -#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:87 +#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:86 msgid "Your document has been uploaded successfully." msgstr "Twój dokument został pomyślnie załadowany." -#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:69 +#: apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx:68 msgid "Your document has been uploaded successfully. You will be redirected to the template page." msgstr "Twój dokument został pomyślnie załadowany. Zostaniesz przekierowany na stronę szablonu." @@ -6747,13 +6886,13 @@ msgstr "Hasło zostało zaktualizowane." #: packages/email/template-components/template-reset-password.tsx:26 msgid "Your password has been updated." -msgstr "Twoje hasło zostało zaktualizowane." +msgstr "Hasło zostało zaktualizowane." #: apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx:113 msgid "Your payment for teams is overdue. Please settle the payment to avoid any service disruptions." msgstr "Twoja płatność za zespoły jest przeterminowana. Proszę uregulować płatność, aby uniknąć zakłóceń w świadczeniu usług." -#: apps/web/src/components/forms/profile.tsx:73 +#: apps/web/src/components/forms/profile.tsx:72 msgid "Your profile has been updated successfully." msgstr "Twój profil został pomyślnie zaktualizowany." @@ -6795,19 +6934,19 @@ msgstr "Twój zespół został pomyślnie usunięty." msgid "Your team has been successfully updated." msgstr "Twój zespół został pomyślnie zaktualizowany." -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:43 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:42 msgid "Your template has been duplicated successfully." msgstr "Twój szablon został pomyślnie zduplikowany." -#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:42 +#: apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx:37 msgid "Your template has been successfully deleted." msgstr "Twój szablon został pomyślnie usunięty." -#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:67 +#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:66 msgid "Your template will be duplicated." msgstr "Twój szablon zostanie zduplikowany." -#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:247 +#: apps/web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx:217 msgid "Your templates has been saved successfully." msgstr "Twoje szablony zostały pomyślnie zapisane." @@ -6823,4 +6962,3 @@ msgstr "Twój token został pomyślnie utworzony! Upewnij się, że go skopiujes #: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:86 msgid "Your tokens will be shown here once you create them." msgstr "Twoje tokeny będą tutaj wyświetlane po ich utworzeniu." - diff --git a/packages/lib/types/document-audit-logs.ts b/packages/lib/types/document-audit-logs.ts index 689ca4a78..73073f7a8 100644 --- a/packages/lib/types/document-audit-logs.ts +++ b/packages/lib/types/document-audit-logs.ts @@ -8,7 +8,7 @@ import { z } from 'zod'; import { DocumentSource, FieldType } from '@documenso/prisma/client'; -import { ZRecipientActionAuthTypesSchema } from './document-auth'; +import { ZRecipientAccessAuthTypesSchema, ZRecipientActionAuthTypesSchema } from './document-auth'; export const ZDocumentAuditLogTypeSchema = z.enum([ // Document actions. @@ -127,11 +127,11 @@ export const ZGenericFromToSchema = z.object({ }); export const ZRecipientDiffActionAuthSchema = ZGenericFromToSchema.extend({ - type: z.literal(RECIPIENT_DIFF_TYPE.ACCESS_AUTH), + type: z.literal(RECIPIENT_DIFF_TYPE.ACTION_AUTH), }); export const ZRecipientDiffAccessAuthSchema = ZGenericFromToSchema.extend({ - type: z.literal(RECIPIENT_DIFF_TYPE.ACTION_AUTH), + type: z.literal(RECIPIENT_DIFF_TYPE.ACCESS_AUTH), }); export const ZRecipientDiffNameSchema = ZGenericFromToSchema.extend({ @@ -438,6 +438,7 @@ export const ZDocumentAuditLogEventFieldUpdatedSchema = z.object({ export const ZDocumentAuditLogEventRecipientAddedSchema = z.object({ type: z.literal(DOCUMENT_AUDIT_LOG_TYPE.RECIPIENT_CREATED), data: ZBaseRecipientDataSchema.extend({ + accessAuth: ZRecipientAccessAuthTypesSchema.optional(), actionAuth: ZRecipientActionAuthTypesSchema.optional(), }), }); diff --git a/packages/lib/types/document-auth.ts b/packages/lib/types/document-auth.ts index eccd119eb..f0979754d 100644 --- a/packages/lib/types/document-auth.ts +++ b/packages/lib/types/document-auth.ts @@ -48,7 +48,9 @@ export const ZDocumentAuthMethodsSchema = z.discriminatedUnion('type', [ * Must keep these two in sync. */ export const ZDocumentAccessAuthSchema = z.discriminatedUnion('type', [ZDocumentAuthAccountSchema]); -export const ZDocumentAccessAuthTypesSchema = z.enum([DocumentAuth.ACCOUNT]); +export const ZDocumentAccessAuthTypesSchema = z + .enum([DocumentAuth.ACCOUNT]) + .describe('The type of authentication required for the recipient to access the document.'); /** * The global document action auth methods. @@ -60,11 +62,11 @@ export const ZDocumentActionAuthSchema = z.discriminatedUnion('type', [ ZDocumentAuthPasskeySchema, ZDocumentAuth2FASchema, ]); -export const ZDocumentActionAuthTypesSchema = z.enum([ - DocumentAuth.ACCOUNT, - DocumentAuth.PASSKEY, - DocumentAuth.TWO_FACTOR_AUTH, -]); +export const ZDocumentActionAuthTypesSchema = z + .enum([DocumentAuth.ACCOUNT, DocumentAuth.PASSKEY, DocumentAuth.TWO_FACTOR_AUTH]) + .describe( + 'The type of authentication required for the recipient to sign the document. This field is restricted to Enterprise plan users only.', + ); /** * The recipient access auth methods. @@ -74,7 +76,9 @@ export const ZDocumentActionAuthTypesSchema = z.enum([ export const ZRecipientAccessAuthSchema = z.discriminatedUnion('type', [ ZDocumentAuthAccountSchema, ]); -export const ZRecipientAccessAuthTypesSchema = z.enum([DocumentAuth.ACCOUNT]); +export const ZRecipientAccessAuthTypesSchema = z + .enum([DocumentAuth.ACCOUNT]) + .describe('The type of authentication required for the recipient to access the document.'); /** * The recipient action auth methods. @@ -87,12 +91,14 @@ export const ZRecipientActionAuthSchema = z.discriminatedUnion('type', [ ZDocumentAuth2FASchema, ZDocumentAuthExplicitNoneSchema, ]); -export const ZRecipientActionAuthTypesSchema = z.enum([ - DocumentAuth.ACCOUNT, - DocumentAuth.PASSKEY, - DocumentAuth.TWO_FACTOR_AUTH, - DocumentAuth.EXPLICIT_NONE, -]); +export const ZRecipientActionAuthTypesSchema = z + .enum([ + DocumentAuth.ACCOUNT, + DocumentAuth.PASSKEY, + DocumentAuth.TWO_FACTOR_AUTH, + DocumentAuth.EXPLICIT_NONE, + ]) + .describe('The type of authentication required for the recipient to sign the document.'); export const DocumentAccessAuth = ZDocumentAccessAuthTypesSchema.Enum; export const DocumentActionAuth = ZDocumentActionAuthTypesSchema.Enum; diff --git a/packages/lib/types/document-email.ts b/packages/lib/types/document-email.ts index 7a0e07305..ccf23d38e 100644 --- a/packages/lib/types/document-email.ts +++ b/packages/lib/types/document-email.ts @@ -15,13 +15,44 @@ export enum DocumentEmailEvents { export const ZDocumentEmailSettingsSchema = z .object({ - recipientSigningRequest: z.boolean().default(true), - recipientRemoved: z.boolean().default(true), - recipientSigned: z.boolean().default(true), - documentPending: z.boolean().default(true), - documentCompleted: z.boolean().default(true), - documentDeleted: z.boolean().default(true), - ownerDocumentCompleted: z.boolean().default(true), + recipientSigningRequest: z + .boolean() + .describe( + 'Whether to send an email to all recipients that the document is ready for them to sign.', + ) + .default(true), + recipientRemoved: z + .boolean() + .describe( + 'Whether to send an email to the recipient who was removed from a pending document.', + ) + .default(true), + recipientSigned: z + .boolean() + .describe( + 'Whether to send an email to the document owner when a recipient has signed the document.', + ) + .default(true), + documentPending: z + .boolean() + .describe( + 'Whether to send an email to the recipient who has just signed the document indicating that there are still other recipients who need to sign the document. This will only be sent if the document is still pending after the recipient has signed.', + ) + .default(true), + documentCompleted: z + .boolean() + .describe('Whether to send an email to all recipients when the document is complete.') + .default(true), + documentDeleted: z + .boolean() + .describe( + 'Whether to send an email to all recipients if a pending document has been deleted.', + ) + .default(true), + ownerDocumentCompleted: z + .boolean() + .describe('Whether to send an email to the document owner when the document is complete.') + .default(true), }) .strip() .catch(() => ({ diff --git a/packages/lib/types/document-form-values.ts b/packages/lib/types/document-form-values.ts new file mode 100644 index 000000000..90dc19e36 --- /dev/null +++ b/packages/lib/types/document-form-values.ts @@ -0,0 +1,8 @@ +import { z } from 'zod'; + +export const ZDocumentFormValuesSchema = z.record( + z.string(), + z.union([z.string(), z.boolean(), z.number()]), +); + +export type TDocumentFormValues = z.infer; diff --git a/packages/lib/types/document.ts b/packages/lib/types/document.ts new file mode 100644 index 000000000..830842e83 --- /dev/null +++ b/packages/lib/types/document.ts @@ -0,0 +1,118 @@ +import type { z } from 'zod'; + +import { + DocumentDataSchema, + DocumentMetaSchema, + DocumentSchema, + TeamSchema, + UserSchema, +} from '@documenso/prisma/generated/zod'; + +import { ZFieldSchema } from './field'; +import { ZRecipientLiteSchema } from './recipient'; + +/** + * The full document response schema. + * + * Mainly used for returning a single document from the API. + */ +export const ZDocumentSchema = DocumentSchema.pick({ + visibility: true, + status: true, + source: true, + id: true, + externalId: true, + userId: true, + authOptions: true, + formValues: true, + title: true, + documentDataId: true, + createdAt: true, + updatedAt: true, + completedAt: true, + deletedAt: true, + teamId: true, + templateId: true, +}).extend({ + // Todo: Maybe we want to alter this a bit since this returns a lot of data. + documentData: DocumentDataSchema.pick({ + type: true, + id: true, + data: true, + initialData: true, + }), + documentMeta: DocumentMetaSchema.pick({ + signingOrder: true, + distributionMethod: true, + id: true, + subject: true, + message: true, + timezone: true, + password: true, + dateFormat: true, + documentId: true, + redirectUrl: true, + typedSignatureEnabled: true, + language: true, + emailSettings: true, + }).nullable(), + recipients: ZRecipientLiteSchema.array(), + fields: ZFieldSchema.array(), +}); + +export type TDocument = z.infer; + +/** + * A lite version of the document response schema without relations. + */ +export const ZDocumentLiteSchema = DocumentSchema.pick({ + visibility: true, + status: true, + source: true, + id: true, + externalId: true, + userId: true, + authOptions: true, + formValues: true, + title: true, + documentDataId: true, + createdAt: true, + updatedAt: true, + completedAt: true, + deletedAt: true, + teamId: true, + templateId: true, +}); + +/** + * A version of the document response schema when returning multiple documents at once from a single API endpoint. + */ +export const ZDocumentManySchema = DocumentSchema.pick({ + visibility: true, + status: true, + source: true, + id: true, + externalId: true, + userId: true, + authOptions: true, + formValues: true, + title: true, + documentDataId: true, + createdAt: true, + updatedAt: true, + completedAt: true, + deletedAt: true, + teamId: true, + templateId: true, +}).extend({ + user: UserSchema.pick({ + id: true, + name: true, + email: true, + }), + recipients: ZRecipientLiteSchema.array(), + team: TeamSchema.pick({ + id: true, + url: true, + }).nullable(), +}); diff --git a/packages/lib/types/field-meta.ts b/packages/lib/types/field-meta.ts index c7171529a..674cccb4b 100644 --- a/packages/lib/types/field-meta.ts +++ b/packages/lib/types/field-meta.ts @@ -1,5 +1,7 @@ import { z } from 'zod'; +import { FieldType } from '@documenso/prisma/client'; + export const ZBaseFieldMeta = z.object({ label: z.string().optional(), placeholder: z.string().optional(), @@ -9,56 +11,66 @@ export const ZBaseFieldMeta = z.object({ export type TBaseFieldMeta = z.infer; -export const ZInitialsFieldMeta = z.object({ - type: z.literal('initials').default('initials'), +export const ZFieldTextAlignSchema = z.enum(['left', 'center', 'right']); + +export type TFieldTextAlignSchema = z.infer; + +export const ZInitialsFieldMeta = ZBaseFieldMeta.extend({ + type: z.literal('initials'), fontSize: z.number().min(8).max(96).optional(), + textAlign: ZFieldTextAlignSchema.optional(), }); export type TInitialsFieldMeta = z.infer; -export const ZNameFieldMeta = z.object({ - type: z.literal('name').default('name'), +export const ZNameFieldMeta = ZBaseFieldMeta.extend({ + type: z.literal('name'), fontSize: z.number().min(8).max(96).optional(), + textAlign: ZFieldTextAlignSchema.optional(), }); export type TNameFieldMeta = z.infer; -export const ZEmailFieldMeta = z.object({ - type: z.literal('email').default('email'), +export const ZEmailFieldMeta = ZBaseFieldMeta.extend({ + type: z.literal('email'), fontSize: z.number().min(8).max(96).optional(), + textAlign: ZFieldTextAlignSchema.optional(), }); export type TEmailFieldMeta = z.infer; -export const ZDateFieldMeta = z.object({ - type: z.literal('date').default('date'), +export const ZDateFieldMeta = ZBaseFieldMeta.extend({ + type: z.literal('date'), fontSize: z.number().min(8).max(96).optional(), + textAlign: ZFieldTextAlignSchema.optional(), }); export type TDateFieldMeta = z.infer; export const ZTextFieldMeta = ZBaseFieldMeta.extend({ - type: z.literal('text').default('text'), + type: z.literal('text'), text: z.string().optional(), characterLimit: z.number().optional(), fontSize: z.number().min(8).max(96).optional(), + textAlign: ZFieldTextAlignSchema.optional(), }); export type TTextFieldMeta = z.infer; export const ZNumberFieldMeta = ZBaseFieldMeta.extend({ - type: z.literal('number').default('number'), + type: z.literal('number'), numberFormat: z.string().optional(), value: z.string().optional(), minValue: z.number().optional(), maxValue: z.number().optional(), fontSize: z.number().min(8).max(96).optional(), + textAlign: ZFieldTextAlignSchema.optional(), }); export type TNumberFieldMeta = z.infer; export const ZRadioFieldMeta = ZBaseFieldMeta.extend({ - type: z.literal('radio').default('radio'), + type: z.literal('radio'), values: z .array( z.object({ @@ -73,7 +85,7 @@ export const ZRadioFieldMeta = ZBaseFieldMeta.extend({ export type TRadioFieldMeta = z.infer; export const ZCheckboxFieldMeta = ZBaseFieldMeta.extend({ - type: z.literal('checkbox').default('checkbox'), + type: z.literal('checkbox'), values: z .array( z.object({ @@ -90,25 +102,85 @@ export const ZCheckboxFieldMeta = ZBaseFieldMeta.extend({ export type TCheckboxFieldMeta = z.infer; export const ZDropdownFieldMeta = ZBaseFieldMeta.extend({ - type: z.literal('dropdown').default('dropdown'), + type: z.literal('dropdown'), values: z.array(z.object({ value: z.string() })).optional(), defaultValue: z.string().optional(), }); export type TDropdownFieldMeta = z.infer; +export const ZFieldMetaNotOptionalSchema = z.discriminatedUnion('type', [ + ZInitialsFieldMeta, + ZNameFieldMeta, + ZEmailFieldMeta, + ZDateFieldMeta, + ZTextFieldMeta, + ZNumberFieldMeta, + ZRadioFieldMeta, + ZCheckboxFieldMeta, + ZDropdownFieldMeta, +]); + +export type TFieldMetaNotOptionalSchema = z.infer; + export const ZFieldMetaSchema = z .union([ - ZBaseFieldMeta.extend(ZInitialsFieldMeta.shape), - ZBaseFieldMeta.extend(ZNameFieldMeta.shape), - ZBaseFieldMeta.extend(ZEmailFieldMeta.shape), - ZBaseFieldMeta.extend(ZDateFieldMeta.shape), - ZTextFieldMeta, - ZNumberFieldMeta, - ZRadioFieldMeta, - ZCheckboxFieldMeta, - ZDropdownFieldMeta, + // Handles an empty object being provided as fieldMeta. + z + .object({}) + .strict() + .transform(() => undefined), + ZFieldMetaNotOptionalSchema, ]) .optional(); export type TFieldMetaSchema = z.infer; + +export const ZFieldAndMetaSchema = z.discriminatedUnion('type', [ + z.object({ + type: z.literal(FieldType.SIGNATURE), + fieldMeta: z.undefined(), + }), + z.object({ + type: z.literal(FieldType.FREE_SIGNATURE), + fieldMeta: z.undefined(), + }), + z.object({ + type: z.literal(FieldType.INITIALS), + fieldMeta: ZInitialsFieldMeta.optional(), + }), + z.object({ + type: z.literal(FieldType.NAME), + fieldMeta: ZNameFieldMeta.optional(), + }), + z.object({ + type: z.literal(FieldType.EMAIL), + fieldMeta: ZEmailFieldMeta.optional(), + }), + z.object({ + type: z.literal(FieldType.DATE), + fieldMeta: ZDateFieldMeta.optional(), + }), + z.object({ + type: z.literal(FieldType.TEXT), + fieldMeta: ZTextFieldMeta.optional(), + }), + z.object({ + type: z.literal(FieldType.NUMBER), + fieldMeta: ZNumberFieldMeta.optional(), + }), + z.object({ + type: z.literal(FieldType.RADIO), + fieldMeta: ZRadioFieldMeta.optional(), + }), + z.object({ + type: z.literal(FieldType.CHECKBOX), + fieldMeta: ZCheckboxFieldMeta.optional(), + }), + z.object({ + type: z.literal(FieldType.DROPDOWN), + fieldMeta: ZDropdownFieldMeta.optional(), + }), +]); + +export type TFieldAndMeta = z.infer; diff --git a/packages/lib/types/field.ts b/packages/lib/types/field.ts new file mode 100644 index 000000000..da9ffc797 --- /dev/null +++ b/packages/lib/types/field.ts @@ -0,0 +1,51 @@ +import { z } from 'zod'; + +import { FieldSchema } from '@documenso/prisma/generated/zod'; + +/** + * The full field response schema. + * + * If you need to return something different, adjust this file to utilise the: + * - ZFieldSchema + * - ZFieldLiteSchema + * - ZFieldManySchema + * + * Setup similar to: + * - ./documents.ts + * - ./templates.ts + */ +export const ZFieldSchema = FieldSchema.pick({ + type: true, + id: true, + secondaryId: true, + documentId: true, + templateId: true, + recipientId: true, + page: true, + positionX: true, + positionY: true, + width: true, + height: true, + customText: true, + inserted: true, + fieldMeta: true, +}); + +export const ZFieldPageNumberSchema = z + .number() + .min(1) + .describe('The page number the field will be on.'); + +export const ZFieldPageXSchema = z + .number() + .min(0) + .describe('The X coordinate of where the field will be placed.'); + +export const ZFieldPageYSchema = z + .number() + .min(0) + .describe('The Y coordinate of where the field will be placed.'); + +export const ZFieldWidthSchema = z.number().min(1).describe('The width of the field.'); + +export const ZFieldHeightSchema = z.number().min(1).describe('The height of the field.'); diff --git a/packages/lib/types/recipient.ts b/packages/lib/types/recipient.ts new file mode 100644 index 000000000..3c0fa944f --- /dev/null +++ b/packages/lib/types/recipient.ts @@ -0,0 +1,85 @@ +import { TeamSchema, UserSchema } from '@documenso/prisma/generated/zod'; +import RecipientSchema from '@documenso/prisma/generated/zod/modelSchema/RecipientSchema'; + +import { ZFieldSchema } from './field'; + +/** + * The full recipient response schema. + * + * Mainly used for returning a single recipient from the API. + */ +export const ZRecipientSchema = RecipientSchema.pick({ + role: true, + readStatus: true, + signingStatus: true, + sendStatus: true, + id: true, + documentId: true, + templateId: true, + email: true, + name: true, + token: true, + documentDeletedAt: true, + expired: true, + signedAt: true, + authOptions: true, + signingOrder: true, + rejectionReason: true, +}).extend({ + fields: ZFieldSchema.array(), +}); + +/** + * A lite version of the recipient response schema without relations. + */ +export const ZRecipientLiteSchema = RecipientSchema.pick({ + role: true, + readStatus: true, + signingStatus: true, + sendStatus: true, + id: true, + documentId: true, + templateId: true, + email: true, + name: true, + token: true, + documentDeletedAt: true, + expired: true, + signedAt: true, + authOptions: true, + signingOrder: true, + rejectionReason: true, +}); + +/** + * A version of the recipient response schema when returning multiple recipients at once from a single API endpoint. + */ +export const ZRecipientManySchema = RecipientSchema.pick({ + role: true, + readStatus: true, + signingStatus: true, + sendStatus: true, + id: true, + documentId: true, + templateId: true, + email: true, + name: true, + token: true, + documentDeletedAt: true, + expired: true, + signedAt: true, + authOptions: true, + signingOrder: true, + rejectionReason: true, +}).extend({ + user: UserSchema.pick({ + id: true, + name: true, + email: true, + }), + recipients: RecipientSchema.array(), + team: TeamSchema.pick({ + id: true, + url: true, + }).nullable(), +}); diff --git a/packages/lib/types/search-params.ts b/packages/lib/types/search-params.ts index 9501c96ed..35a166b95 100644 --- a/packages/lib/types/search-params.ts +++ b/packages/lib/types/search-params.ts @@ -8,9 +8,9 @@ import { z } from 'zod'; * Keep this and `ZUrlSearchParamsSchema` in sync. */ export const ZFindSearchParamsSchema = z.object({ - query: z.string().optional(), - page: z.coerce.number().min(1).optional(), - perPage: z.coerce.number().min(1).optional(), + query: z.string().describe('The search query.').optional(), + page: z.coerce.number().min(1).describe('The pagination page number, starts at 1.').optional(), + perPage: z.coerce.number().min(1).describe('The number of items per page.').max(100).optional(), }); /** @@ -31,16 +31,17 @@ export const ZUrlSearchParamsSchema = z.object({ perPage: z.coerce .number() .min(1) + .max(100) .optional() .catch(() => undefined), }); export const ZFindResultResponse = z.object({ - data: z.union([z.array(z.unknown()), z.unknown()]), - count: z.number(), - currentPage: z.number(), - perPage: z.number(), - totalPages: z.number(), + data: z.union([z.array(z.unknown()), z.unknown()]).describe('The results from the search.'), + count: z.number().describe('The total number of items.'), + currentPage: z.number().describe('The current page number, starts at 1.'), + perPage: z.number().describe('The number of items per page.'), + totalPages: z.number().describe('The total number of pages.'), }); // Can't infer generics from Zod. diff --git a/packages/lib/types/template.ts b/packages/lib/types/template.ts new file mode 100644 index 000000000..da3df474b --- /dev/null +++ b/packages/lib/types/template.ts @@ -0,0 +1,119 @@ +import type { z } from 'zod'; + +import { + DocumentDataSchema, + TeamSchema, + TemplateDirectLinkSchema, + TemplateMetaSchema, + TemplateSchema, + UserSchema, +} from '@documenso/prisma/generated/zod'; + +import { ZFieldSchema } from './field'; +import { ZRecipientLiteSchema } from './recipient'; + +/** + * The full template response schema. + * + * Mainly used for returning a single template from the API. + */ +export const ZTemplateSchema = TemplateSchema.pick({ + type: true, + visibility: true, + id: true, + externalId: true, + title: true, + userId: true, + teamId: true, + authOptions: true, + templateDocumentDataId: true, + createdAt: true, + updatedAt: true, + publicTitle: true, + publicDescription: true, +}).extend({ + // Todo: Maybe we want to alter this a bit since this returns a lot of data. + templateDocumentData: DocumentDataSchema.pick({ + type: true, + id: true, + data: true, + initialData: true, + }), + templateMeta: TemplateMetaSchema.pick({ + id: true, + subject: true, + message: true, + timezone: true, + dateFormat: true, + signingOrder: true, + typedSignatureEnabled: true, + distributionMethod: true, + templateId: true, + redirectUrl: true, + language: true, + emailSettings: true, + }).nullable(), + directLink: TemplateDirectLinkSchema.nullable(), + user: UserSchema.pick({ + id: true, + name: true, + email: true, + }), + recipients: ZRecipientLiteSchema.array(), + fields: ZFieldSchema.array(), +}); + +export type TTemplate = z.infer; + +/** + * A lite version of the template response schema without relations. + */ +export const ZTemplateLiteSchema = TemplateSchema.pick({ + type: true, + visibility: true, + id: true, + externalId: true, + title: true, + userId: true, + teamId: true, + authOptions: true, + templateDocumentDataId: true, + createdAt: true, + updatedAt: true, + publicTitle: true, + publicDescription: true, +}); + +/** + * A version of the template response schema when returning multiple template at once from a single API endpoint. + */ +export const ZTemplateManySchema = TemplateSchema.pick({ + type: true, + visibility: true, + id: true, + externalId: true, + title: true, + userId: true, + teamId: true, + authOptions: true, + templateDocumentDataId: true, + createdAt: true, + updatedAt: true, + publicTitle: true, + publicDescription: true, +}).extend({ + team: TeamSchema.pick({ + id: true, + url: true, + }).nullable(), + fields: ZFieldSchema.array(), + recipients: ZRecipientLiteSchema.array(), + templateMeta: TemplateMetaSchema.pick({ + signingOrder: true, + distributionMethod: true, + }).nullable(), + directLink: TemplateDirectLinkSchema.pick({ + token: true, + enabled: true, + }).nullable(), +}); diff --git a/packages/lib/types/webhook-payload.ts b/packages/lib/types/webhook-payload.ts index e0626c563..fedb8f7ff 100644 --- a/packages/lib/types/webhook-payload.ts +++ b/packages/lib/types/webhook-payload.ts @@ -1,5 +1,6 @@ import { z } from 'zod'; +import type { Document, DocumentMeta, Recipient } from '@documenso/prisma/client'; import { DocumentDistributionMethod, DocumentSigningOrder, @@ -73,8 +74,36 @@ export const ZWebhookDocumentSchema = z.object({ templateId: z.number().nullable(), source: z.nativeEnum(DocumentSource), documentMeta: ZWebhookDocumentMetaSchema.nullable(), + recipients: z.array(ZWebhookRecipientSchema), + + /** + * Legacy field for backwards compatibility. + */ Recipient: z.array(ZWebhookRecipientSchema), }); export type TWebhookRecipient = z.infer; export type TWebhookDocument = z.infer; + +export const mapDocumentToWebhookDocumentPayload = ( + document: Document & { + recipients: Recipient[]; + documentMeta: DocumentMeta | null; + }, +): TWebhookDocument => { + const { recipients, documentMeta, ...trimmedDocument } = document; + + return { + ...trimmedDocument, + documentMeta: documentMeta + ? { + ...documentMeta, + // Not sure why is optional in the prisma schema. + timezone: 'Etc/UTC', + dateFormat: 'yyyy-MM-dd hh:mm a', + } + : null, + Recipient: recipients, + recipients, + }; +}; diff --git a/packages/lib/universal/extract-request-metadata.ts b/packages/lib/universal/extract-request-metadata.ts index 3129a060b..d66322eee 100644 --- a/packages/lib/universal/extract-request-metadata.ts +++ b/packages/lib/universal/extract-request-metadata.ts @@ -12,6 +12,36 @@ export const ZRequestMetadataSchema = z.object({ export type RequestMetadata = z.infer; +export type ApiRequestMetadata = { + /** + * The general metadata of the request. + */ + requestMetadata: RequestMetadata; + + /** + * The source of the request. + */ + source: 'apiV1' | 'apiV2' | 'app'; + + /** + * The method of authentication used to access the API. + * + * If the request is not authenticated, the value will be `null`. + */ + auth: 'api' | 'session' | null; + + /** + * The user that is performing the action. + * + * If a team API key is used, the user will classified as the team. + */ + auditUser?: { + id: number | null; + email: string | null; + name: string | null; + }; +}; + export const extractNextApiRequestMetadata = (req: NextApiRequest): RequestMetadata => { const parsedIp = ZIpSchema.safeParse(req.headers['x-forwarded-for'] || req.socket.remoteAddress); diff --git a/packages/lib/utils/document-audit-logs.ts b/packages/lib/utils/document-audit-logs.ts index bb4f9bc8e..339bf453b 100644 --- a/packages/lib/utils/document-audit-logs.ts +++ b/packages/lib/utils/document-audit-logs.ts @@ -19,14 +19,15 @@ import { ZDocumentAuditLogSchema, } from '../types/document-audit-logs'; import { ZRecipientAuthOptionsSchema } from '../types/document-auth'; -import type { RequestMetadata } from '../universal/extract-request-metadata'; +import type { ApiRequestMetadata, RequestMetadata } from '../universal/extract-request-metadata'; type CreateDocumentAuditLogDataOptions = { documentId: number; type: T; data: Extract['data']; - user: { email?: string; id?: number | null; name?: string | null } | null; + user?: { email?: string | null; id?: number | null; name?: string | null } | null; requestMetadata?: RequestMetadata; + metadata?: ApiRequestMetadata; }; export type CreateDocumentAuditLogDataResponse = Pick< @@ -42,16 +43,31 @@ export const createDocumentAuditLogData = ( data, user, requestMetadata, + metadata, }: CreateDocumentAuditLogDataOptions): CreateDocumentAuditLogDataResponse => { + let userId: number | null = metadata?.auditUser?.id || null; + let email: string | null = metadata?.auditUser?.email || null; + let name: string | null = metadata?.auditUser?.name || null; + + // Prioritize explicit user parameter over metadata audit user. + if (user) { + userId = user.id || null; + email = user.email || null; + name = user.name || null; + } + + const ipAddress = metadata?.requestMetadata.ipAddress ?? requestMetadata?.ipAddress ?? null; + const userAgent = metadata?.requestMetadata.userAgent ?? requestMetadata?.userAgent ?? null; + return { type, data, documentId, - userId: user?.id ?? null, - email: user?.email ?? null, - name: user?.name ?? null, - userAgent: requestMetadata?.userAgent ?? null, - ipAddress: requestMetadata?.ipAddress ?? null, + userId, + email, + name, + userAgent, + ipAddress, }; }; diff --git a/packages/lib/utils/document-visibility.ts b/packages/lib/utils/document-visibility.ts new file mode 100644 index 000000000..737bfd0dd --- /dev/null +++ b/packages/lib/utils/document-visibility.ts @@ -0,0 +1,20 @@ +import { DocumentVisibility, TeamMemberRole } from '@documenso/prisma/client'; + +export const determineDocumentVisibility = ( + globalVisibility: DocumentVisibility | null | undefined, + userRole: TeamMemberRole, +): DocumentVisibility => { + if (globalVisibility) { + return globalVisibility; + } + + if (userRole === TeamMemberRole.ADMIN) { + return DocumentVisibility.ADMIN; + } + + if (userRole === TeamMemberRole.MANAGER) { + return DocumentVisibility.MANAGER_AND_ABOVE; + } + + return DocumentVisibility.EVERYONE; +}; diff --git a/packages/lib/utils/mask-recipient-tokens-for-document.ts b/packages/lib/utils/mask-recipient-tokens-for-document.ts index ed6e2b13e..52ddab367 100644 --- a/packages/lib/utils/mask-recipient-tokens-for-document.ts +++ b/packages/lib/utils/mask-recipient-tokens-for-document.ts @@ -12,7 +12,7 @@ export const maskRecipientTokensForDocument = user, token, }: MaskRecipientTokensForDocumentOptions) => { - const maskedRecipients = document.Recipient.map((recipient) => { + const maskedRecipients = document.recipients.map((recipient) => { if (document.userId === user?.id) { return recipient; } diff --git a/packages/lib/utils/recipients.ts b/packages/lib/utils/recipients.ts index eab5f963c..845a9e36a 100644 --- a/packages/lib/utils/recipients.ts +++ b/packages/lib/utils/recipients.ts @@ -8,8 +8,17 @@ export const formatSigningLink = (token: string) => `${NEXT_PUBLIC_WEBAPP_URL()} * Whether a recipient can be modified by the document owner. */ export const canRecipientBeModified = (recipient: Recipient, fields: Field[]) => { + if (!recipient) { + return false; + } + + // CCers can always be modified (unless document is completed). + if (recipient.role === RecipientRole.CC) { + return true; + } + // Deny if the recipient has already signed the document. - if (!recipient || recipient.signingStatus === SigningStatus.SIGNED) { + if (recipient.signingStatus === SigningStatus.SIGNED) { return false; } diff --git a/packages/prisma/index.ts b/packages/prisma/index.ts index 6851111d3..b9c1600b7 100644 --- a/packages/prisma/index.ts +++ b/packages/prisma/index.ts @@ -1,3 +1,4 @@ +/// import { PrismaClient } from '@prisma/client'; import { Kysely, PostgresAdapter, PostgresIntrospector, PostgresQueryCompiler } from 'kysely'; import kyselyExtension from 'prisma-extension-kysely'; diff --git a/packages/prisma/migrations/20250124135853_add_cancelled_event_webhooks/migration.sql b/packages/prisma/migrations/20250124135853_add_cancelled_event_webhooks/migration.sql new file mode 100644 index 000000000..51b9aaa08 --- /dev/null +++ b/packages/prisma/migrations/20250124135853_add_cancelled_event_webhooks/migration.sql @@ -0,0 +1,2 @@ +-- AlterEnum +ALTER TYPE "WebhookTriggerEvents" ADD VALUE 'DOCUMENT_CANCELLED'; diff --git a/packages/prisma/package.json b/packages/prisma/package.json index 5a5ff6d1d..5cc8497a6 100644 --- a/packages/prisma/package.json +++ b/packages/prisma/package.json @@ -30,9 +30,10 @@ "devDependencies": { "dotenv": "^16.3.1", "dotenv-cli": "^7.3.0", + "prisma-json-types-generator": "^3.2.2", "prisma-kysely": "^1.8.0", "tsx": "^4.11.0", - "typescript": "5.2.2", - "zod-prisma-types": "^3.1.8" + "typescript": "5.6.2", + "zod-prisma-types": "3.1.9" } -} +} \ No newline at end of file diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index 9a4217b7d..2f081e0f6 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -6,8 +6,15 @@ generator client { provider = "prisma-client-js" } +generator json { + provider = "prisma-json-types-generator" +} + generator zod { - provider = "zod-prisma-types" + provider = "zod-prisma-types" + createInputTypes = false + writeBarrelFiles = true + useMultipleFiles = true } datasource db { @@ -46,9 +53,9 @@ model User { accounts Account[] sessions Session[] - Document Document[] - Subscription Subscription[] - PasswordResetToken PasswordResetToken[] + documents Document[] + subscriptions Subscription[] + passwordResetTokens PasswordResetToken[] ownedTeams Team[] ownedPendingTeams TeamPending[] teamMembers TeamMember[] @@ -57,15 +64,15 @@ model User { twoFactorBackupCodes String? url String? @unique - profile UserProfile? - VerificationToken VerificationToken[] - ApiToken ApiToken[] - Template Template[] - securityAuditLogs UserSecurityAuditLog[] - Webhooks Webhook[] - siteSettings SiteSettings[] - passkeys Passkey[] - avatarImage AvatarImage? @relation(fields: [avatarImageId], references: [id], onDelete: SetNull) + profile UserProfile? + verificationTokens VerificationToken[] + apiTokens ApiToken[] + templates Template[] + securityAuditLogs UserSecurityAuditLog[] + webhooks Webhook[] + siteSettings SiteSettings[] + passkeys Passkey[] + avatarImage AvatarImage? @relation(fields: [avatarImageId], references: [id], onDelete: SetNull) @@index([email]) } @@ -113,7 +120,7 @@ model UserSecurityAuditLog { userAgent String? ipAddress String? - User User @relation(fields: [userId], references: [id], onDelete: Cascade) + user User @relation(fields: [userId], references: [id], onDelete: Cascade) } model PasswordResetToken { @@ -122,7 +129,7 @@ model PasswordResetToken { createdAt DateTime @default(now()) expiry DateTime userId Int - User User @relation(fields: [userId], references: [id], onDelete: Cascade) + user User @relation(fields: [userId], references: [id], onDelete: Cascade) } model Passkey { @@ -139,7 +146,7 @@ model Passkey { credentialBackedUp Boolean transports String[] - User User @relation(fields: [userId], references: [id], onDelete: Cascade) + user User @relation(fields: [userId], references: [id], onDelete: Cascade) } model AnonymousVerificationToken { @@ -168,6 +175,7 @@ enum WebhookTriggerEvents { DOCUMENT_SIGNED DOCUMENT_COMPLETED DOCUMENT_REJECTED + DOCUMENT_CANCELLED } model Webhook { @@ -179,10 +187,10 @@ model Webhook { createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt userId Int - User User @relation(fields: [userId], references: [id], onDelete: Cascade) + user User @relation(fields: [userId], references: [id], onDelete: Cascade) teamId Int? team Team? @relation(fields: [teamId], references: [id], onDelete: Cascade) - WebhookCall WebhookCall[] + webhookCalls WebhookCall[] } enum WebhookCallStatus { @@ -240,7 +248,7 @@ model Subscription { cancelAtPeriodEnd Boolean @default(false) team Team? @relation(fields: [teamId], references: [id], onDelete: Cascade) - User User? @relation(fields: [userId], references: [id], onDelete: Cascade) + user User? @relation(fields: [userId], references: [id], onDelete: Cascade) @@index([userId]) } @@ -294,19 +302,20 @@ enum DocumentVisibility { ADMIN } +/// @zod.import(["import { ZDocumentAuthOptionsSchema } from '@documenso/lib/types/document-auth';", "import { ZDocumentFormValuesSchema } from '@documenso/lib/types/document-form-values';"]) model Document { id Int @id @default(autoincrement()) - externalId String? - userId Int - User User @relation(fields: [userId], references: [id], onDelete: Cascade) - authOptions Json? - formValues Json? + externalId String? /// @zod.string.describe("A custom external ID you can use to identify the document.") + userId Int /// @zod.number.describe("The ID of the user that created this document.") + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + authOptions Json? /// [DocumentAuthOptions] @zod.custom.use(ZDocumentAuthOptionsSchema) + formValues Json? /// [DocumentFormValues] @zod.custom.use(ZDocumentFormValuesSchema) visibility DocumentVisibility @default(EVERYONE) title String status DocumentStatus @default(DRAFT) - Recipient Recipient[] - Field Field[] - ShareLink DocumentShareLink[] + recipients Recipient[] + fields Field[] + shareLinks DocumentShareLink[] documentDataId String documentData DocumentData @relation(fields: [documentDataId], references: [id], onDelete: Cascade) documentMeta DocumentMeta? @@ -361,8 +370,8 @@ model DocumentData { type DocumentDataType data String initialData String - Document Document? - Template Template? + document Document? + template Template? } enum DocumentDistributionMethod { @@ -370,6 +379,7 @@ enum DocumentDistributionMethod { NONE } +/// @zod.import(["import { ZDocumentEmailSettingsSchema } from '@documenso/lib/types/document-email';"]) model DocumentMeta { id String @id @default(cuid()) subject String? @@ -384,7 +394,7 @@ model DocumentMeta { typedSignatureEnabled Boolean @default(true) language String @default("en") distributionMethod DocumentDistributionMethod @default(EMAIL) - emailSettings Json? + emailSettings Json? /// [DocumentEmailSettings] @zod.custom.use(ZDocumentEmailSettingsSchema) } model DocumentAccessToken { @@ -427,6 +437,7 @@ enum RecipientRole { APPROVER } +/// @zod.import(["import { ZRecipientAuthOptionsSchema } from '@documenso/lib/types/document-auth';"]) model Recipient { id Int @id @default(autoincrement()) documentId Int? @@ -437,17 +448,17 @@ model Recipient { documentDeletedAt DateTime? expired DateTime? signedAt DateTime? - authOptions Json? - signingOrder Int? + authOptions Json? /// [RecipientAuthOptions] @zod.custom.use(ZRecipientAuthOptionsSchema) + signingOrder Int? /// @zod.number.describe("The order in which the recipient should sign the document. Only works if the document is set to sequential signing.") rejectionReason String? role RecipientRole @default(SIGNER) readStatus ReadStatus @default(NOT_OPENED) signingStatus SigningStatus @default(NOT_SIGNED) sendStatus SendStatus @default(NOT_SENT) - Document Document? @relation(fields: [documentId], references: [id], onDelete: Cascade) - Template Template? @relation(fields: [templateId], references: [id], onDelete: Cascade) - Field Field[] - Signature Signature[] + document Document? @relation(fields: [documentId], references: [id], onDelete: Cascade) + template Template? @relation(fields: [templateId], references: [id], onDelete: Cascade) + fields Field[] + signatures Signature[] @@unique([documentId, email]) @@unique([templateId, email]) @@ -470,6 +481,7 @@ enum FieldType { DROPDOWN } +/// @zod.import(["import { ZFieldMetaNotOptionalSchema } from '@documenso/lib/types/field-meta';"]) model Field { id Int @id @default(autoincrement()) secondaryId String @unique @default(cuid()) @@ -477,18 +489,18 @@ model Field { templateId Int? recipientId Int type FieldType - page Int + page Int /// @zod.number.describe("The page number of the field on the document. Starts from 1.") positionX Decimal @default(0) positionY Decimal @default(0) width Decimal @default(-1) height Decimal @default(-1) customText String inserted Boolean - Document Document? @relation(fields: [documentId], references: [id], onDelete: Cascade) - Template Template? @relation(fields: [templateId], references: [id], onDelete: Cascade) - Recipient Recipient @relation(fields: [recipientId], references: [id], onDelete: Cascade) - Signature Signature? - fieldMeta Json? + document Document? @relation(fields: [documentId], references: [id], onDelete: Cascade) + template Template? @relation(fields: [templateId], references: [id], onDelete: Cascade) + recipient Recipient @relation(fields: [recipientId], references: [id], onDelete: Cascade) + signature Signature? + fieldMeta Json? /// [FieldMeta] @zod.custom.use(ZFieldMetaNotOptionalSchema) @@index([documentId]) @@index([templateId]) @@ -503,8 +515,8 @@ model Signature { signatureImageAsBase64 String? typedSignature String? - Recipient Recipient @relation(fields: [recipientId], references: [id], onDelete: Cascade) - Field Field @relation(fields: [fieldId], references: [id], onDelete: Cascade) + recipient Recipient @relation(fields: [recipientId], references: [id], onDelete: Cascade) + field Field @relation(fields: [fieldId], references: [id], onDelete: Cascade) @@index([recipientId]) } @@ -572,10 +584,10 @@ model Team { owner User @relation(fields: [ownerUserId], references: [id], onDelete: Cascade) subscription Subscription? - document Document[] + documents Document[] templates Template[] - ApiToken ApiToken[] - Webhook Webhook[] + apiTokens ApiToken[] + webhooks Webhook[] } model TeamPending { @@ -653,6 +665,7 @@ enum TemplateType { PRIVATE } +/// @zod.import(["import { ZDocumentEmailSettingsSchema } from '@documenso/lib/types/document-email';"]) model TemplateMeta { id String @id @default(cuid()) subject String? @@ -668,9 +681,10 @@ model TemplateMeta { template Template @relation(fields: [templateId], references: [id], onDelete: Cascade) redirectUrl String? language String @default("en") - emailSettings Json? + emailSettings Json? /// [DocumentEmailSettings] @zod.custom.use(ZDocumentEmailSettingsSchema) } +/// @zod.import(["import { ZDocumentAuthOptionsSchema } from '@documenso/lib/types/document-auth';"]) model Template { id Int @id @default(autoincrement()) externalId String? @@ -679,7 +693,7 @@ model Template { userId Int teamId Int? visibility DocumentVisibility @default(EVERYONE) - authOptions Json? + authOptions Json? /// [DocumentAuthOptions] @zod.custom.use(ZDocumentAuthOptionsSchema) templateMeta TemplateMeta? templateDocumentDataId String createdAt DateTime @default(now()) @@ -689,9 +703,9 @@ model Template { team Team? @relation(fields: [teamId], references: [id], onDelete: Cascade) templateDocumentData DocumentData @relation(fields: [templateDocumentDataId], references: [id], onDelete: Cascade) - User User @relation(fields: [userId], references: [id], onDelete: Cascade) - Recipient Recipient[] - Field Field[] + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + recipients Recipient[] + fields Field[] directLink TemplateDirectLink? documents Document[] diff --git a/packages/prisma/seed/documents.ts b/packages/prisma/seed/documents.ts index f8a363599..93ca14a53 100644 --- a/packages/prisma/seed/documents.ts +++ b/packages/prisma/seed/documents.ts @@ -115,7 +115,7 @@ export const seedDraftDocument = async ( for (const recipient of recipients) { const email = typeof recipient === 'string' ? recipient : recipient.email; - const name = typeof recipient === 'string' ? recipient : recipient.name ?? ''; + const name = typeof recipient === 'string' ? recipient : (recipient.name ?? ''); await prisma.recipient.create({ data: { @@ -126,12 +126,12 @@ export const seedDraftDocument = async ( sendStatus: SendStatus.NOT_SENT, signingStatus: SigningStatus.NOT_SIGNED, signedAt: new Date(), - Document: { + document: { connect: { id: document.id, }, }, - Field: { + fields: { create: { page: 1, type: FieldType.NAME, @@ -184,7 +184,7 @@ export const seedPendingDocument = async ( for (const recipient of recipients) { const email = typeof recipient === 'string' ? recipient : recipient.email; - const name = typeof recipient === 'string' ? recipient : recipient.name ?? ''; + const name = typeof recipient === 'string' ? recipient : (recipient.name ?? ''); await prisma.recipient.create({ data: { @@ -195,12 +195,12 @@ export const seedPendingDocument = async ( sendStatus: SendStatus.SENT, signingStatus: SigningStatus.NOT_SIGNED, signedAt: new Date(), - Document: { + document: { connect: { id: document.id, }, }, - Field: { + fields: { create: { page: 1, type: FieldType.NAME, @@ -222,7 +222,7 @@ export const seedPendingDocument = async ( id: document.id, }, include: { - Recipient: true, + recipients: true, }, }); }; @@ -240,7 +240,7 @@ export const seedPendingDocumentNoFields = async ({ for (const recipient of recipients) { const email = typeof recipient === 'string' ? recipient : recipient.email; - const name = typeof recipient === 'string' ? recipient : recipient.name ?? ''; + const name = typeof recipient === 'string' ? recipient : (recipient.name ?? ''); await prisma.recipient.create({ data: { @@ -251,7 +251,7 @@ export const seedPendingDocumentNoFields = async ({ sendStatus: SendStatus.SENT, signingStatus: SigningStatus.NOT_SIGNED, signedAt: new Date(), - Document: { + document: { connect: { id: document.id, }, @@ -265,7 +265,7 @@ export const seedPendingDocumentNoFields = async ({ documentId: document.id, }, include: { - Field: true, + fields: true, }, }); @@ -301,7 +301,7 @@ export const seedPendingDocumentWithFullFields = async ({ for (const [recipientIndex, recipient] of recipients.entries()) { const email = typeof recipient === 'string' ? recipient : recipient.email; - const name = typeof recipient === 'string' ? recipient : recipient.name ?? ''; + const name = typeof recipient === 'string' ? recipient : (recipient.name ?? ''); await prisma.recipient.create({ data: { @@ -312,12 +312,12 @@ export const seedPendingDocumentWithFullFields = async ({ sendStatus: SendStatus.SENT, signingStatus: SigningStatus.NOT_SIGNED, signedAt: new Date(), - Document: { + document: { connect: { id: document.id, }, }, - Field: { + fields: { createMany: { data: fields.map((fieldType, fieldIndex) => ({ page: 1, @@ -342,7 +342,7 @@ export const seedPendingDocumentWithFullFields = async ({ documentId: document.id, }, include: { - Field: true, + fields: true, }, }); @@ -393,7 +393,7 @@ export const seedCompletedDocument = async ( for (const recipient of recipients) { const email = typeof recipient === 'string' ? recipient : recipient.email; - const name = typeof recipient === 'string' ? recipient : recipient.name ?? ''; + const name = typeof recipient === 'string' ? recipient : (recipient.name ?? ''); await prisma.recipient.create({ data: { @@ -404,12 +404,12 @@ export const seedCompletedDocument = async ( sendStatus: SendStatus.SENT, signingStatus: SigningStatus.SIGNED, signedAt: new Date(), - Document: { + document: { connect: { id: document.id, }, }, - Field: { + fields: { create: { page: 1, type: FieldType.NAME, diff --git a/packages/prisma/seed/initial-seed.ts b/packages/prisma/seed/initial-seed.ts index 38b340a79..d270b31fa 100644 --- a/packages/prisma/seed/initial-seed.ts +++ b/packages/prisma/seed/initial-seed.ts @@ -58,7 +58,7 @@ export const seedDatabase = async () => { title: 'Example Document', documentDataId: examplePdfData.id, userId: exampleUser.id, - Recipient: { + recipients: { create: { name: String(adminUser.name), email: adminUser.email, diff --git a/packages/prisma/seed/templates.ts b/packages/prisma/seed/templates.ts index c3c08e6f4..33d61442c 100644 --- a/packages/prisma/seed/templates.ts +++ b/packages/prisma/seed/templates.ts @@ -66,12 +66,12 @@ export const seedTemplate = async (options: SeedTemplateOptions) => { id: documentData.id, }, }, - User: { + user: { connect: { id: userId, }, }, - Recipient: { + recipients: { create: { email: 'recipient.1@documenso.com', name: 'Recipient 1', @@ -114,12 +114,12 @@ export const seedDirectTemplate = async (options: SeedTemplateOptions) => { id: documentData.id, }, }, - User: { + user: { connect: { id: userId, }, }, - Recipient: { + recipients: { create: { email: DIRECT_TEMPLATE_RECIPIENT_EMAIL, name: DIRECT_TEMPLATE_RECIPIENT_NAME, @@ -138,12 +138,12 @@ export const seedDirectTemplate = async (options: SeedTemplateOptions) => { ...options.createTemplateOptions, }, include: { - Recipient: true, - User: true, + recipients: true, + user: true, }, }); - const directTemplateRecpient = template.Recipient.find( + const directTemplateRecpient = template.recipients.find( (recipient) => recipient.email === DIRECT_TEMPLATE_RECIPIENT_EMAIL, ); @@ -166,8 +166,8 @@ export const seedDirectTemplate = async (options: SeedTemplateOptions) => { }, include: { directLink: true, - Field: true, - Recipient: true, + fields: true, + recipients: true, team: true, }, }); diff --git a/packages/prisma/types/document-with-data.ts b/packages/prisma/types/document-with-data.ts deleted file mode 100644 index 461d13e6c..000000000 --- a/packages/prisma/types/document-with-data.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { Document, DocumentData, DocumentMeta } from '@documenso/prisma/client'; - -export type DocumentWithData = Document & { - documentData?: DocumentData | null; - documentMeta?: DocumentMeta | null; -}; diff --git a/packages/prisma/types/document-with-recipient.ts b/packages/prisma/types/document-with-recipient.ts index 32ecd29cb..f7d966f16 100644 --- a/packages/prisma/types/document-with-recipient.ts +++ b/packages/prisma/types/document-with-recipient.ts @@ -1,10 +1,10 @@ import type { Document, DocumentData, Recipient } from '@documenso/prisma/client'; export type DocumentWithRecipients = Document & { - Recipient: Recipient[]; + recipients: Recipient[]; }; export type DocumentWithRecipient = Document & { - Recipient: Recipient[]; + recipients: Recipient[]; documentData: DocumentData; }; diff --git a/packages/prisma/types/document.ts b/packages/prisma/types/document.ts deleted file mode 100644 index 5bbc53b55..000000000 --- a/packages/prisma/types/document.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { - Document, - DocumentData, - DocumentMeta, - Field, - Recipient, -} from '@documenso/prisma/client'; - -export type DocumentWithRecipientAndSender = Omit & { - recipient: Recipient; - sender: { - id: number; - name: string | null; - email: string; - }; - subject: string; - description: string; -}; - -export type DocumentWithDetails = Document & { - documentData: DocumentData; - documentMeta: DocumentMeta | null; - Recipient: Recipient[]; - Field: Field[]; -}; diff --git a/packages/prisma/types/field-with-signature-and-fieldmeta.ts b/packages/prisma/types/field-with-signature-and-fieldmeta.ts index 7bce5d9fe..f9a086e3f 100644 --- a/packages/prisma/types/field-with-signature-and-fieldmeta.ts +++ b/packages/prisma/types/field-with-signature-and-fieldmeta.ts @@ -2,6 +2,6 @@ import { type TFieldMetaSchema as FieldMeta } from '@documenso/lib/types/field-m import type { Field, Signature } from '@documenso/prisma/client'; export type FieldWithSignatureAndFieldMeta = Field & { - Signature?: Signature | null; + signature?: Signature | null; fieldMeta: FieldMeta | null; }; diff --git a/packages/prisma/types/field-with-signature.ts b/packages/prisma/types/field-with-signature.ts index c215a3fb0..d005a464c 100644 --- a/packages/prisma/types/field-with-signature.ts +++ b/packages/prisma/types/field-with-signature.ts @@ -1,5 +1,5 @@ import type { Field, Signature } from '@documenso/prisma/client'; export type FieldWithSignature = Field & { - Signature?: Signature | null; + signature?: Signature | null; }; diff --git a/packages/prisma/types/template.ts b/packages/prisma/types/template.ts deleted file mode 100644 index e0073bc09..000000000 --- a/packages/prisma/types/template.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { TGetTemplateByIdResponse } from '@documenso/lib/server-only/template/get-template-by-id'; -import type { DocumentData, Template, TemplateMeta } from '@documenso/prisma/client'; - -export type TemplateWithData = Template & { - templateDocumentData?: DocumentData | null; - templateMeta?: TemplateMeta | null; -}; - -export type TemplateWithDetails = TGetTemplateByIdResponse; diff --git a/packages/prisma/types/types.d.ts b/packages/prisma/types/types.d.ts new file mode 100644 index 000000000..4cdd6278b --- /dev/null +++ b/packages/prisma/types/types.d.ts @@ -0,0 +1,25 @@ +/* eslint-disable @typescript-eslint/no-namespace */ +import type { + TDocumentAuthOptions, + TRecipientAuthOptions, +} from '@documenso/lib/types/document-auth'; +import type { TDocumentEmailSettings } from '@documenso/lib/types/document-email'; +import type { TDocumentFormValues } from '@documenso/lib/types/document-form-values'; +import type { TFieldMetaNotOptionalSchema } from '@documenso/lib/types/field-meta'; + +/** + * Global types for Prisma.Json instances. + */ +declare global { + namespace PrismaJson { + type DocumentFormValues = TDocumentFormValues; + type DocumentAuthOptions = TDocumentAuthOptions; + type DocumentEmailSettings = TDocumentEmailSettings; + + type RecipientAuthOptions = TRecipientAuthOptions; + + type FieldMeta = TFieldMetaNotOptionalSchema; + } +} + +export {}; diff --git a/packages/signing/helpers/update-signing-placeholder.ts b/packages/signing/helpers/update-signing-placeholder.ts index c0c95f859..18875737d 100644 --- a/packages/signing/helpers/update-signing-placeholder.ts +++ b/packages/signing/helpers/update-signing-placeholder.ts @@ -26,9 +26,9 @@ export const updateSigningPlaceholder = ({ pdf }: UpdateSigningPlaceholderOption const newByteRange = `[${byteRange.join(' ')}]`.padEnd(byteRangeSlice.length, ' '); const updatedPdf = Buffer.concat([ - pdf.subarray(0, byteRangeStart), - Buffer.from(newByteRange), - pdf.subarray(byteRangeEnd + 1), + new Uint8Array(pdf.subarray(0, byteRangeStart)), + new Uint8Array(Buffer.from(newByteRange)), + new Uint8Array(pdf.subarray(byteRangeEnd + 1)), ]); if (updatedPdf.length !== length) { diff --git a/packages/signing/transports/google-cloud-hsm.ts b/packages/signing/transports/google-cloud-hsm.ts index b327c7901..000ee80c5 100644 --- a/packages/signing/transports/google-cloud-hsm.ts +++ b/packages/signing/transports/google-cloud-hsm.ts @@ -23,13 +23,14 @@ export const signWithGoogleCloudHSM = async ({ pdf }: SignWithGoogleCloudHSMOpti process.env.NEXT_PRIVATE_SIGNING_GCLOUD_APPLICATION_CREDENTIALS_CONTENTS ) { if (!fs.existsSync(process.env.GOOGLE_APPLICATION_CREDENTIALS)) { - fs.writeFileSync( - process.env.GOOGLE_APPLICATION_CREDENTIALS, + const contents = new Uint8Array( Buffer.from( process.env.NEXT_PRIVATE_SIGNING_GCLOUD_APPLICATION_CREDENTIALS_CONTENTS, 'base64', ), ); + + fs.writeFileSync(process.env.GOOGLE_APPLICATION_CREDENTIALS, contents); } } @@ -38,8 +39,8 @@ export const signWithGoogleCloudHSM = async ({ pdf }: SignWithGoogleCloudHSMOpti }); const pdfWithoutSignature = Buffer.concat([ - pdfWithPlaceholder.subarray(0, byteRange[1]), - pdfWithPlaceholder.subarray(byteRange[2]), + new Uint8Array(pdfWithPlaceholder.subarray(0, byteRange[1])), + new Uint8Array(pdfWithPlaceholder.subarray(byteRange[2])), ]); const signatureLength = byteRange[2] - byteRange[1]; @@ -70,9 +71,9 @@ export const signWithGoogleCloudHSM = async ({ pdf }: SignWithGoogleCloudHSMOpti const signatureAsHex = signature.toString('hex'); const signedPdf = Buffer.concat([ - pdfWithPlaceholder.subarray(0, byteRange[1]), - Buffer.from(`<${signatureAsHex.padEnd(signatureLength - 2, '0')}>`), - pdfWithPlaceholder.subarray(byteRange[2]), + new Uint8Array(pdfWithPlaceholder.subarray(0, byteRange[1])), + new Uint8Array(Buffer.from(`<${signatureAsHex.padEnd(signatureLength - 2, '0')}>`)), + new Uint8Array(pdfWithPlaceholder.subarray(byteRange[2])), ]); return signedPdf; diff --git a/packages/signing/transports/local-cert.ts b/packages/signing/transports/local-cert.ts index 7ed2f5f8b..6b88288b6 100644 --- a/packages/signing/transports/local-cert.ts +++ b/packages/signing/transports/local-cert.ts @@ -15,8 +15,8 @@ export const signWithLocalCert = async ({ pdf }: SignWithLocalCertOptions) => { }); const pdfWithoutSignature = Buffer.concat([ - pdfWithPlaceholder.subarray(0, byteRange[1]), - pdfWithPlaceholder.subarray(byteRange[2]), + new Uint8Array(pdfWithPlaceholder.subarray(0, byteRange[1])), + new Uint8Array(pdfWithPlaceholder.subarray(byteRange[2])), ]); const signatureLength = byteRange[2] - byteRange[1]; @@ -51,9 +51,9 @@ export const signWithLocalCert = async ({ pdf }: SignWithLocalCertOptions) => { const signatureAsHex = signature.toString('hex'); const signedPdf = Buffer.concat([ - pdfWithPlaceholder.subarray(0, byteRange[1]), - Buffer.from(`<${signatureAsHex.padEnd(signatureLength - 2, '0')}>`), - pdfWithPlaceholder.subarray(byteRange[2]), + new Uint8Array(pdfWithPlaceholder.subarray(0, byteRange[1])), + new Uint8Array(Buffer.from(`<${signatureAsHex.padEnd(signatureLength - 2, '0')}>`)), + new Uint8Array(pdfWithPlaceholder.subarray(byteRange[2])), ]); return signedPdf; diff --git a/packages/trpc/client/guards.ts b/packages/trpc/client/guards.ts deleted file mode 100644 index 5a37eec30..000000000 --- a/packages/trpc/client/guards.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { TRPCClientError } from '@trpc/client'; - -import { AppRouter } from '../server/router'; - -export const isTRPCBadRequestError = (err: unknown): err is TRPCClientError => { - return err instanceof TRPCClientError && err.shape?.code === 'BAD_REQUEST'; -}; diff --git a/packages/trpc/client/index.ts b/packages/trpc/client/index.ts index a91021f97..5f0e37ab6 100644 --- a/packages/trpc/client/index.ts +++ b/packages/trpc/client/index.ts @@ -1,24 +1,44 @@ -import { createTRPCProxyClient, httpBatchLink, httpLink, splitLink } from '@trpc/client'; +import { createTRPCClient, httpBatchLink, httpLink, splitLink } from '@trpc/client'; import SuperJSON from 'superjson'; import { getBaseUrl } from '@documenso/lib/universal/get-base-url'; import type { AppRouter } from '../server/router'; -export const trpc = createTRPCProxyClient({ - transformer: SuperJSON, - +export const trpc = createTRPCClient({ links: [ splitLink({ condition: (op) => op.context.skipBatch === true, true: httpLink({ url: `${getBaseUrl()}/api/trpc`, + transformer: SuperJSON, + headers: (opts) => { + if (typeof opts.op.context.teamId === 'string') { + return { + 'x-team-id': opts.op.context.teamId, + }; + } + + return {}; + }, }), false: httpBatchLink({ url: `${getBaseUrl()}/api/trpc`, + transformer: SuperJSON, + headers: (opts) => { + const operationWithTeamId = opts.opList.find( + (op) => op.context.teamId && typeof op.context.teamId === 'string', + ); + + if (operationWithTeamId && typeof operationWithTeamId.context.teamId === 'string') { + return { + 'x-team-id': operationWithTeamId.context.teamId, + }; + } + + return {}; + }, }), }), ], }); - -export { TRPCClientError } from '@trpc/client'; diff --git a/packages/trpc/package.json b/packages/trpc/package.json index 8a5518c42..5a858fbe6 100644 --- a/packages/trpc/package.json +++ b/packages/trpc/package.json @@ -12,15 +12,16 @@ "dependencies": { "@documenso/lib": "*", "@documenso/prisma": "*", - "@tanstack/react-query": "^4.32.0", - "@trpc/client": "^10.36.0", - "@trpc/next": "^10.36.0", - "@trpc/react-query": "^10.36.0", - "@trpc/server": "^10.36.0", + "@tanstack/react-query": "5.59.15", + "@trpc/client": "11.0.0-rc.648", + "@trpc/next": "11.0.0-rc.648", + "@trpc/react-query": "11.0.0-rc.648", + "@trpc/server": "11.0.0-rc.648", "@ts-rest/core": "^3.30.5", "@ts-rest/next": "^3.30.5", "luxon": "^3.4.0", "superjson": "^1.13.1", + "trpc-to-openapi": "2.0.4", "ts-pattern": "^5.0.5", "zod": "3.24.1" } diff --git a/packages/trpc/react/index.tsx b/packages/trpc/react/index.tsx index 0a6028b08..f31ff0d6f 100644 --- a/packages/trpc/react/index.tsx +++ b/packages/trpc/react/index.tsx @@ -35,9 +35,10 @@ export const trpc = createTRPCReact({ export interface TrpcProviderProps { children: React.ReactNode; + headers?: Record; } -export function TrpcProvider({ children }: TrpcProviderProps) { +export function TrpcProvider({ children, headers }: TrpcProviderProps) { let queryClientConfig: QueryClientConfig | undefined; const isDevelopingOffline = @@ -62,16 +63,18 @@ export function TrpcProvider({ children }: TrpcProviderProps) { const [trpcClient] = useState(() => trpc.createClient({ - transformer: SuperJSON, - links: [ splitLink({ condition: (op) => op.context.skipBatch === true, true: httpLink({ url: `${getBaseUrl()}/api/trpc`, + headers, + transformer: SuperJSON, }), false: httpBatchLink({ url: `${getBaseUrl()}/api/trpc`, + headers, + transformer: SuperJSON, }), }), ], diff --git a/packages/trpc/server/admin-router/router.ts b/packages/trpc/server/admin-router/router.ts index 32e14cbc1..e8a999629 100644 --- a/packages/trpc/server/admin-router/router.ts +++ b/packages/trpc/server/admin-router/router.ts @@ -106,14 +106,6 @@ export const adminRouter = router({ deleteUser: adminProcedure.input(ZAdminDeleteUserMutationSchema).mutation(async ({ input }) => { const { id } = input; - const user = await getUserById({ id }).catch(() => null); - - if (!user) { - throw new AppError(AppErrorCode.NOT_FOUND, { - message: 'User not found', - }); - } - return await deleteUser({ id }); }), diff --git a/packages/trpc/server/auth-router/router.ts b/packages/trpc/server/auth-router/router.ts index 2ee4b7d8b..72971da45 100644 --- a/packages/trpc/server/auth-router/router.ts +++ b/packages/trpc/server/auth-router/router.ts @@ -17,7 +17,6 @@ import { findPasskeys } from '@documenso/lib/server-only/auth/find-passkeys'; import { compareSync } from '@documenso/lib/server-only/auth/hash'; import { updatePasskey } from '@documenso/lib/server-only/auth/update-passkey'; import { createUser } from '@documenso/lib/server-only/user/create-user'; -import { extractNextApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; import { authenticatedProcedure, procedure, router } from '../trpc'; import { @@ -89,7 +88,7 @@ export const authRouter = router({ userId: ctx.user.id, verificationResponse, passkeyName: input.passkeyName, - requestMetadata: extractNextApiRequestMetadata(ctx.req), + requestMetadata: ctx.metadata.requestMetadata, }); }), @@ -132,7 +131,7 @@ export const authRouter = router({ await deletePasskey({ userId: ctx.user.id, passkeyId, - requestMetadata: extractNextApiRequestMetadata(ctx.req), + requestMetadata: ctx.metadata.requestMetadata, }); }), @@ -158,7 +157,7 @@ export const authRouter = router({ userId: ctx.user.id, passkeyId, name, - requestMetadata: extractNextApiRequestMetadata(ctx.req), + requestMetadata: ctx.metadata.requestMetadata, }); }), }); diff --git a/packages/trpc/server/context.ts b/packages/trpc/server/context.ts index 7136afd70..4ed5be40f 100644 --- a/packages/trpc/server/context.ts +++ b/packages/trpc/server/context.ts @@ -1,15 +1,41 @@ -import type { CreateNextContextOptions } from '@trpc/server/adapters/next'; +import { z } from 'zod'; import { getServerSession } from '@documenso/lib/next-auth/get-server-session'; +import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import { extractNextApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; -export const createTrpcContext = async ({ req, res }: CreateNextContextOptions) => { +import type { CreateNextContextOptions } from './adapters/next'; + +type CreateTrpcContext = CreateNextContextOptions & { + requestSource: 'apiV1' | 'apiV2' | 'app'; +}; + +export const createTrpcContext = async ({ + req, + res, + requestSource, +}: Omit) => { const { session, user } = await getServerSession({ req, res }); + const metadata: ApiRequestMetadata = { + requestMetadata: extractNextApiRequestMetadata(req), + source: requestSource, + auth: null, + }; + + const teamId = z.coerce + .number() + .optional() + .catch(() => undefined) + .parse(req.headers['x-team-id']); + if (!session) { return { session: null, user: null, + teamId, req, + metadata, }; } @@ -17,14 +43,18 @@ export const createTrpcContext = async ({ req, res }: CreateNextContextOptions) return { session: null, user: null, + teamId, req, + metadata, }; } return { session, user, + teamId, req, + metadata, }; }; diff --git a/packages/trpc/server/document-router/router.ts b/packages/trpc/server/document-router/router.ts index b47a66e4e..2a151b7c1 100644 --- a/packages/trpc/server/document-router/router.ts +++ b/packages/trpc/server/document-router/router.ts @@ -1,73 +1,60 @@ import { TRPCError } from '@trpc/server'; import { DateTime } from 'luxon'; -import { z } from 'zod'; import { getServerLimits } from '@documenso/ee/server-only/limits/server'; import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app'; import { DOCUMENSO_ENCRYPTION_KEY } from '@documenso/lib/constants/crypto'; -import { AppError } from '@documenso/lib/errors/app-error'; +import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; import { encryptSecondaryData } from '@documenso/lib/server-only/crypto/encrypt'; +import { createDocumentData } from '@documenso/lib/server-only/document-data/create-document-data'; import { upsertDocumentMeta } from '@documenso/lib/server-only/document-meta/upsert-document-meta'; -import { - ZCreateDocumentResponseSchema, - createDocument, -} from '@documenso/lib/server-only/document/create-document'; +import { createDocument } from '@documenso/lib/server-only/document/create-document'; +import { createDocumentV2 } from '@documenso/lib/server-only/document/create-document-v2'; import { deleteDocument } from '@documenso/lib/server-only/document/delete-document'; -import { - ZDuplicateDocumentResponseSchema, - duplicateDocument, -} from '@documenso/lib/server-only/document/duplicate-document-by-id'; +import { duplicateDocument } from '@documenso/lib/server-only/document/duplicate-document-by-id'; import { findDocumentAuditLogs } from '@documenso/lib/server-only/document/find-document-audit-logs'; -import { - ZFindDocumentsResponseSchema, - findDocuments, -} from '@documenso/lib/server-only/document/find-documents'; +import { findDocuments } from '@documenso/lib/server-only/document/find-documents'; import { getDocumentById } from '@documenso/lib/server-only/document/get-document-by-id'; import { getDocumentAndSenderByToken } from '@documenso/lib/server-only/document/get-document-by-token'; -import { - ZGetDocumentWithDetailsByIdResponseSchema, - getDocumentWithDetailsById, -} from '@documenso/lib/server-only/document/get-document-with-details-by-id'; -import { - ZMoveDocumentToTeamResponseSchema, - moveDocumentToTeam, -} from '@documenso/lib/server-only/document/move-document-to-team'; +import { getDocumentWithDetailsById } from '@documenso/lib/server-only/document/get-document-with-details-by-id'; +import { moveDocumentToTeam } from '@documenso/lib/server-only/document/move-document-to-team'; import { resendDocument } from '@documenso/lib/server-only/document/resend-document'; import { searchDocumentsWithKeyword } from '@documenso/lib/server-only/document/search-documents-with-keyword'; -import { - ZSendDocumentResponseSchema, - sendDocument, -} from '@documenso/lib/server-only/document/send-document'; -import { - ZUpdateDocumentSettingsResponseSchema, - updateDocumentSettings, -} from '@documenso/lib/server-only/document/update-document-settings'; -import { updateTitle } from '@documenso/lib/server-only/document/update-title'; +import { sendDocument } from '@documenso/lib/server-only/document/send-document'; +import { updateDocument } from '@documenso/lib/server-only/document/update-document'; import { symmetricEncrypt } from '@documenso/lib/universal/crypto'; -import { extractNextApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; -import { DocumentStatus } from '@documenso/prisma/client'; +import { getPresignPostUrl } from '@documenso/lib/universal/upload/server-actions'; +import { DocumentDataType, DocumentStatus } from '@documenso/prisma/client'; import { authenticatedProcedure, procedure, router } from '../trpc'; import { - ZCreateDocumentMutationSchema, + ZCreateDocumentRequestSchema, + ZCreateDocumentV2RequestSchema, + ZCreateDocumentV2ResponseSchema, ZDeleteDocumentMutationSchema, + ZDistributeDocumentRequestSchema, + ZDistributeDocumentResponseSchema, ZDownloadAuditLogsMutationSchema, ZDownloadCertificateMutationSchema, - ZDuplicateDocumentMutationSchema, + ZDuplicateDocumentRequestSchema, + ZDuplicateDocumentResponseSchema, ZFindDocumentAuditLogsQuerySchema, - ZFindDocumentsQuerySchema, + ZFindDocumentsRequestSchema, + ZFindDocumentsResponseSchema, + ZGenericSuccessResponse, ZGetDocumentByIdQuerySchema, ZGetDocumentByTokenQuerySchema, - ZGetDocumentWithDetailsByIdQuerySchema, + ZGetDocumentWithDetailsByIdRequestSchema, + ZGetDocumentWithDetailsByIdResponseSchema, + ZMoveDocumentToTeamResponseSchema, ZMoveDocumentToTeamSchema, ZResendDocumentMutationSchema, ZSearchDocumentsMutationSchema, - ZSendDocumentMutationSchema, ZSetPasswordForDocumentMutationSchema, - ZSetSettingsForDocumentMutationSchema, ZSetSigningOrderForDocumentMutationSchema, - ZSetTitleForDocumentMutationSchema, - ZUpdateTypedSignatureSettingsMutationSchema, + ZSuccessResponseSchema, + ZUpdateDocumentRequestSchema, + ZUpdateDocumentResponseSchema, } from './schema'; export const documentRouter = router({ @@ -77,9 +64,13 @@ export const documentRouter = router({ getDocumentById: authenticatedProcedure .input(ZGetDocumentByIdQuerySchema) .query(async ({ input, ctx }) => { + const { teamId } = ctx; + const { documentId } = input; + return await getDocumentById({ - ...input, userId: ctx.user.id, + teamId, + documentId, }); }), @@ -104,28 +95,19 @@ export const documentRouter = router({ .meta({ openapi: { method: 'GET', - path: '/document/find', + path: '/document', summary: 'Find documents', description: 'Find documents based on a search criteria', - tags: ['Documents'], + tags: ['Document'], }, }) - .input(ZFindDocumentsQuerySchema) + .input(ZFindDocumentsRequestSchema) .output(ZFindDocumentsResponseSchema) .query(async ({ input, ctx }) => { - const { user } = ctx; + const { user, teamId } = ctx; - const { - query, - teamId, - templateId, - page, - perPage, - orderByDirection, - orderByColumn, - source, - status, - } = input; + const { query, templateId, page, perPage, orderByDirection, orderByColumn, source, status } = + input; const documents = await findDocuments({ userId: user.id, @@ -154,41 +136,120 @@ export const documentRouter = router({ path: '/document/{documentId}', summary: 'Get document', description: 'Returns a document given an ID', - tags: ['Documents'], + tags: ['Document'], }, }) - .input(ZGetDocumentWithDetailsByIdQuerySchema) + .input(ZGetDocumentWithDetailsByIdRequestSchema) .output(ZGetDocumentWithDetailsByIdResponseSchema) .query(async ({ input, ctx }) => { + const { teamId, user } = ctx; + const { documentId } = input; + return await getDocumentWithDetailsById({ - ...input, - userId: ctx.user.id, + userId: user.id, + teamId, + documentId, }); }), /** + * Temporariy endpoint for V2 Beta until we allow passthrough documents on create. + * * @public + * @deprecated */ - createDocument: authenticatedProcedure + createDocumentTemporary: authenticatedProcedure .meta({ openapi: { method: 'POST', - path: '/document/create', + path: '/document/create/beta', summary: 'Create document', - tags: ['Documents'], + description: + 'You will need to upload the PDF to the provided URL returned. Note: Once V2 API is released, this will be removed since we will allow direct uploads, instead of using an upload URL.', + tags: ['Document'], }, }) - .input(ZCreateDocumentMutationSchema) - .output(ZCreateDocumentResponseSchema) + .input(ZCreateDocumentV2RequestSchema) + .output(ZCreateDocumentV2ResponseSchema) .mutation(async ({ input, ctx }) => { - const { title, documentDataId, teamId, timezone } = input; + const { teamId } = ctx; + + const { + title, + externalId, + visibility, + globalAccessAuth, + globalActionAuth, + recipients, + meta, + } = input; const { remaining } = await getServerLimits({ email: ctx.user.email, teamId }); if (remaining.documents <= 0) { - throw new TRPCError({ - code: 'BAD_REQUEST', + throw new AppError(AppErrorCode.LIMIT_EXCEEDED, { message: 'You have reached your document limit for this month. Please upgrade your plan.', + statusCode: 400, + }); + } + + const fileName = title.endsWith('.pdf') ? title : `${title}.pdf`; + + const { url, key } = await getPresignPostUrl(fileName, 'application/pdf'); + + const documentData = await createDocumentData({ + data: key, + type: DocumentDataType.S3_PATH, + }); + + const createdDocument = await createDocumentV2({ + userId: ctx.user.id, + teamId, + documentDataId: documentData.id, + normalizePdf: false, // Not normalizing because of presigned URL. + data: { + title, + externalId, + visibility, + globalAccessAuth, + globalActionAuth, + recipients, + }, + meta, + requestMetadata: ctx.metadata, + }); + + return { + document: createdDocument, + uploadUrl: url, + }; + }), + + /** + * Wait until RR7 so we can passthrough documents. + * + * @private + */ + createDocument: authenticatedProcedure + // .meta({ + // openapi: { + // method: 'POST', + // path: '/document/create', + // summary: 'Create document', + // tags: ['Document'], + // }, + // }) + .input(ZCreateDocumentRequestSchema) + .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; + const { title, documentDataId, timezone } = input; + + const { remaining } = await getServerLimits({ email: ctx.user.email, teamId }); + + if (remaining.documents <= 0) { + throw new AppError(AppErrorCode.LIMIT_EXCEEDED, { + message: 'You have reached your document limit for this month. Please upgrade your plan.', + statusCode: 400, }); } @@ -199,7 +260,7 @@ export const documentRouter = router({ documentDataId, normalizePdf: true, timezone, - requestMetadata: extractNextApiRequestMetadata(ctx.req), + requestMetadata: ctx.metadata, }); }), @@ -212,38 +273,44 @@ export const documentRouter = router({ .meta({ openapi: { method: 'POST', - path: '/document/{documentId}', + path: '/document/update', summary: 'Update document', - tags: ['Documents'], + tags: ['Document'], }, }) - .input(ZSetSettingsForDocumentMutationSchema) - .output(ZUpdateDocumentSettingsResponseSchema) + .input(ZUpdateDocumentRequestSchema) + .output(ZUpdateDocumentResponseSchema) .mutation(async ({ input, ctx }) => { - const { documentId, teamId, data, meta } = input; + const { teamId } = ctx; + const { documentId, data, meta = {} } = input; const userId = ctx.user.id; - const requestMetadata = extractNextApiRequestMetadata(ctx.req); - - if (meta.timezone || meta.dateFormat || meta.redirectUrl) { + if (Object.values(meta).length > 0) { await upsertDocumentMeta({ - documentId, - dateFormat: meta.dateFormat, - timezone: meta.timezone, - redirectUrl: meta.redirectUrl, - language: meta.language, userId: ctx.user.id, - requestMetadata, + teamId, + documentId, + subject: meta.subject, + message: meta.message, + timezone: meta.timezone, + dateFormat: meta.dateFormat, + language: meta.language, + typedSignatureEnabled: meta.typedSignatureEnabled, + redirectUrl: meta.redirectUrl, + distributionMethod: meta.distributionMethod, + signingOrder: meta.signingOrder, + emailSettings: meta.emailSettings, + requestMetadata: ctx.metadata, }); } - return await updateDocumentSettings({ + return await updateDocument({ userId, teamId, documentId, data, - requestMetadata, + requestMetadata: ctx.metadata, }); }), @@ -254,15 +321,16 @@ export const documentRouter = router({ .meta({ openapi: { method: 'POST', - path: '/document/{documentId}/delete', + path: '/document/delete', summary: 'Delete document', - tags: ['Documents'], + tags: ['Document'], }, }) .input(ZDeleteDocumentMutationSchema) - .output(z.void()) + .output(ZSuccessResponseSchema) .mutation(async ({ input, ctx }) => { - const { documentId, teamId } = input; + const { teamId } = ctx; + const { documentId } = input; const userId = ctx.user.id; @@ -270,8 +338,10 @@ export const documentRouter = router({ id: documentId, userId, teamId, - requestMetadata: extractNextApiRequestMetadata(ctx.req), + requestMetadata: ctx.metadata, }); + + return ZGenericSuccessResponse; }), /** @@ -281,10 +351,10 @@ export const documentRouter = router({ .meta({ openapi: { method: 'POST', - path: '/document/{documentId}/move', + path: '/document/move', summary: 'Move document', - description: 'Move a document to a team', - tags: ['Documents'], + description: 'Move a document from your personal account to a team', + tags: ['Document'], }, }) .input(ZMoveDocumentToTeamSchema) @@ -297,27 +367,7 @@ export const documentRouter = router({ documentId, teamId, userId, - requestMetadata: extractNextApiRequestMetadata(ctx.req), - }); - }), - - /** - * @private - */ - // Should probably use `updateDocument` - setTitleForDocument: authenticatedProcedure - .input(ZSetTitleForDocumentMutationSchema) - .mutation(async ({ input, ctx }) => { - const { documentId, teamId, title } = input; - - const userId = ctx.user.id; - - return await updateTitle({ - title, - userId, - teamId, - documentId, - requestMetadata: extractNextApiRequestMetadata(ctx.req), + requestMetadata: ctx.metadata, }); }), @@ -327,6 +377,7 @@ export const documentRouter = router({ setPasswordForDocument: authenticatedProcedure .input(ZSetPasswordForDocumentMutationSchema) .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; const { documentId, password } = input; const key = DOCUMENSO_ENCRYPTION_KEY; @@ -341,55 +392,31 @@ export const documentRouter = router({ }); await upsertDocumentMeta({ + userId: ctx.user.id, + teamId, documentId, password: securePassword, - userId: ctx.user.id, - requestMetadata: extractNextApiRequestMetadata(ctx.req), + requestMetadata: ctx.metadata, }); }), /** * @private + * + * Todo: Remove and use `updateDocument` endpoint instead. */ setSigningOrderForDocument: authenticatedProcedure .input(ZSetSigningOrderForDocumentMutationSchema) .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; const { documentId, signingOrder } = input; return await upsertDocumentMeta({ + userId: ctx.user.id, + teamId, documentId, signingOrder, - userId: ctx.user.id, - requestMetadata: extractNextApiRequestMetadata(ctx.req), - }); - }), - - /** - * @private - */ - updateTypedSignatureSettings: authenticatedProcedure - .input(ZUpdateTypedSignatureSettingsMutationSchema) - .mutation(async ({ input, ctx }) => { - const { documentId, teamId, typedSignatureEnabled } = input; - - const document = await getDocumentById({ - documentId, - teamId, - userId: ctx.user.id, - }).catch(() => null); - - if (!document) { - throw new TRPCError({ - code: 'NOT_FOUND', - message: 'Document not found', - }); - } - - return await upsertDocumentMeta({ - documentId, - typedSignatureEnabled, - userId: ctx.user.id, - requestMetadata: extractNextApiRequestMetadata(ctx.req), + requestMetadata: ctx.metadata, }); }), @@ -403,27 +430,22 @@ export const documentRouter = router({ .meta({ openapi: { method: 'POST', - path: '/document/{documentId}/distribute', + path: '/document/distribute', summary: 'Distribute document', description: 'Send the document out to recipients based on your distribution method', - tags: ['Documents'], + tags: ['Document'], }, }) - .input(ZSendDocumentMutationSchema) - .output(ZSendDocumentResponseSchema) + .input(ZDistributeDocumentRequestSchema) + .output(ZDistributeDocumentResponseSchema) .mutation(async ({ input, ctx }) => { - const { documentId, teamId, meta } = input; + const { teamId } = ctx; + const { documentId, meta = {} } = input; - if ( - meta.message || - meta.subject || - meta.timezone || - meta.dateFormat || - meta.redirectUrl || - meta.distributionMethod || - meta.emailSettings - ) { + if (Object.values(meta).length > 0) { await upsertDocumentMeta({ + userId: ctx.user.id, + teamId, documentId, subject: meta.subject, message: meta.message, @@ -431,9 +453,9 @@ export const documentRouter = router({ timezone: meta.timezone, redirectUrl: meta.redirectUrl, distributionMethod: meta.distributionMethod, - userId: ctx.user.id, emailSettings: meta.emailSettings, - requestMetadata: extractNextApiRequestMetadata(ctx.req), + language: meta.language, + requestMetadata: ctx.metadata, }); } @@ -441,32 +463,41 @@ export const documentRouter = router({ userId: ctx.user.id, documentId, teamId, - requestMetadata: extractNextApiRequestMetadata(ctx.req), + requestMetadata: ctx.metadata, }); }), /** * @public + * + * Todo: Refactor to redistributeDocument. */ resendDocument: authenticatedProcedure .meta({ openapi: { method: 'POST', - path: '/document/{documentId}/resend', - summary: 'Resend document', + path: '/document/redistribute', + summary: 'Redistribute document', description: - 'Resend the document to recipients who have not signed. Will use the distribution method set in the document.', - tags: ['Documents'], + 'Redistribute the document to the provided recipients who have not actioned the document. Will use the distribution method set in the document', + tags: ['Document'], }, }) .input(ZResendDocumentMutationSchema) - .output(z.void()) + .output(ZSuccessResponseSchema) .mutation(async ({ input, ctx }) => { - return await resendDocument({ + const { teamId } = ctx; + const { documentId, recipients } = input; + + await resendDocument({ userId: ctx.user.id, - ...input, - requestMetadata: extractNextApiRequestMetadata(ctx.req), + teamId, + documentId, + recipients, + requestMetadata: ctx.metadata, }); + + return ZGenericSuccessResponse; }), /** @@ -476,17 +507,21 @@ export const documentRouter = router({ .meta({ openapi: { method: 'POST', - path: '/document/{documentId}/duplicate', + path: '/document/duplicate', summary: 'Duplicate document', - tags: ['Documents'], + tags: ['Document'], }, }) - .input(ZDuplicateDocumentMutationSchema) + .input(ZDuplicateDocumentRequestSchema) .output(ZDuplicateDocumentResponseSchema) .mutation(async ({ input, ctx }) => { + const { teamId, user } = ctx; + const { documentId } = input; + return await duplicateDocument({ - userId: ctx.user.id, - ...input, + userId: user.id, + teamId, + documentId, }); }), @@ -512,6 +547,8 @@ export const documentRouter = router({ findDocumentAuditLogs: authenticatedProcedure .input(ZFindDocumentAuditLogsQuerySchema) .query(async ({ input, ctx }) => { + const { teamId } = ctx; + const { page, perPage, @@ -523,13 +560,14 @@ export const documentRouter = router({ } = input; return await findDocumentAuditLogs({ + userId: ctx.user.id, + teamId, page, perPage, documentId, cursor, filterForRecentActivity, orderBy: orderByColumn ? { column: orderByColumn, direction: orderByDirection } : undefined, - userId: ctx.user.id, }); }), @@ -539,7 +577,8 @@ export const documentRouter = router({ downloadAuditLogs: authenticatedProcedure .input(ZDownloadAuditLogsMutationSchema) .mutation(async ({ input, ctx }) => { - const { documentId, teamId } = input; + const { teamId } = ctx; + const { documentId } = input; const document = await getDocumentById({ documentId, @@ -570,7 +609,8 @@ export const documentRouter = router({ downloadCertificate: authenticatedProcedure .input(ZDownloadCertificateMutationSchema) .mutation(async ({ input, ctx }) => { - const { documentId, teamId } = input; + const { teamId } = ctx; + const { documentId } = input; const document = await getDocumentById({ documentId, diff --git a/packages/trpc/server/document-router/schema.ts b/packages/trpc/server/document-router/schema.ts index f51488b3c..887bc48e2 100644 --- a/packages/trpc/server/document-router/schema.ts +++ b/packages/trpc/server/document-router/schema.ts @@ -1,12 +1,27 @@ import { z } from 'zod'; +import { VALID_DATE_FORMAT_VALUES } from '@documenso/lib/constants/date-formats'; import { SUPPORTED_LANGUAGE_CODES } from '@documenso/lib/constants/i18n'; +import { + ZDocumentLiteSchema, + ZDocumentManySchema, + ZDocumentSchema, +} from '@documenso/lib/types/document'; import { ZDocumentAccessAuthTypesSchema, ZDocumentActionAuthTypesSchema, } from '@documenso/lib/types/document-auth'; import { ZDocumentEmailSettingsSchema } from '@documenso/lib/types/document-email'; -import { ZFindSearchParamsSchema } from '@documenso/lib/types/search-params'; +import { ZDocumentFormValuesSchema } from '@documenso/lib/types/document-form-values'; +import { + ZFieldHeightSchema, + ZFieldPageNumberSchema, + ZFieldPageXSchema, + ZFieldPageYSchema, + ZFieldWidthSchema, +} from '@documenso/lib/types/field'; +import { ZFieldAndMetaSchema } from '@documenso/lib/types/field-meta'; +import { ZFindResultResponse, ZFindSearchParamsSchema } from '@documenso/lib/types/search-params'; import { isValidRedirectUrl } from '@documenso/lib/utils/is-valid-redirect-url'; import { DocumentDistributionMethod, @@ -15,18 +30,107 @@ import { DocumentStatus, DocumentVisibility, FieldType, - RecipientRole, } from '@documenso/prisma/client'; -export const ZFindDocumentsQuerySchema = ZFindSearchParamsSchema.extend({ - teamId: z.number().min(1).optional(), - templateId: z.number().min(1).optional(), - source: z.nativeEnum(DocumentSource).optional(), - status: z.nativeEnum(DocumentStatus).optional(), - orderByColumn: z.enum(['createdAt']).optional(), - orderByDirection: z.enum(['asc', 'desc']).default('desc'), +import { ZCreateRecipientSchema } from '../recipient-router/schema'; + +/** + * Required for empty responses since we currently can't 201 requests for our openapi setup. + * + * Without this it will throw an error in Speakeasy SDK when it tries to parse an empty response. + */ +export const ZSuccessResponseSchema = z.object({ + success: z.literal(true), }); +export const ZGenericSuccessResponse = { + success: true, +} satisfies z.infer; + +export const ZDocumentTitleSchema = z + .string() + .trim() + .min(1) + .max(255) + .describe('The title of the document.'); + +export const ZDocumentExternalIdSchema = z + .string() + .trim() + .describe('The external ID of the document.'); + +export const ZDocumentVisibilitySchema = z + .nativeEnum(DocumentVisibility) + .describe('The visibility of the document.'); + +export const ZDocumentMetaTimezoneSchema = z + .string() + .describe( + 'The timezone to use for date fields and signing the document. Example Etc/UTC, Australia/Melbourne', + ); +// Cooked. +// .refine((value) => TIME_ZONES.includes(value), { +// message: 'Invalid timezone. Please provide a valid timezone', +// }); + +export type TDocumentMetaTimezone = z.infer; + +export const ZDocumentMetaDateFormatSchema = z + .enum(VALID_DATE_FORMAT_VALUES) + .describe('The date format to use for date fields and signing the document.'); + +export type TDocumentMetaDateFormat = z.infer; + +export const ZDocumentMetaRedirectUrlSchema = z + .string() + .describe('The URL to which the recipient should be redirected after signing the document.') + .refine((value) => value === undefined || value === '' || isValidRedirectUrl(value), { + message: 'Please enter a valid URL, make sure you include http:// or https:// part of the url.', + }); + +export const ZDocumentMetaLanguageSchema = z + .enum(SUPPORTED_LANGUAGE_CODES) + .describe('The language to use for email communications with recipients.'); + +export const ZDocumentMetaSubjectSchema = z + .string() + .describe('The subject of the email that will be sent to the recipients.'); + +export const ZDocumentMetaMessageSchema = z + .string() + .describe('The message of the email that will be sent to the recipients.'); + +export const ZDocumentMetaDistributionMethodSchema = z + .nativeEnum(DocumentDistributionMethod) + .describe('The distribution method to use when sending the document to the recipients.'); + +export const ZDocumentMetaTypedSignatureEnabledSchema = z + .boolean() + .describe('Whether to allow recipients to sign using a typed signature.'); + +export const ZFindDocumentsRequestSchema = ZFindSearchParamsSchema.extend({ + templateId: z + .number() + .describe('Filter documents by the template ID used to create it.') + .optional(), + source: z + .nativeEnum(DocumentSource) + .describe('Filter documents by how it was created.') + .optional(), + status: z + .nativeEnum(DocumentStatus) + .describe('Filter documents by the current status') + .optional(), + orderByColumn: z.enum(['createdAt']).optional(), + orderByDirection: z.enum(['asc', 'desc']).describe('').default('desc'), +}); + +export const ZFindDocumentsResponseSchema = ZFindResultResponse.extend({ + data: ZDocumentManySchema.array(), +}); + +export type TFindDocumentsResponse = z.infer; + export const ZFindDocumentAuditLogsQuerySchema = ZFindSearchParamsSchema.extend({ documentId: z.number().min(1), cursor: z.string().optional(), @@ -36,16 +140,16 @@ export const ZFindDocumentAuditLogsQuerySchema = ZFindSearchParamsSchema.extend( }); export const ZGetDocumentByIdQuerySchema = z.object({ - documentId: z.number().min(1), - teamId: z.number().min(1).optional(), + documentId: z.number(), }); -export const ZDuplicateDocumentMutationSchema = z.object({ - documentId: z.number().min(1), - teamId: z.number().min(1).optional(), +export const ZDuplicateDocumentRequestSchema = z.object({ + documentId: z.number(), }); -export type TGetDocumentByIdQuerySchema = z.infer; +export const ZDuplicateDocumentResponseSchema = z.object({ + documentId: z.number(), +}); export const ZGetDocumentByTokenQuerySchema = z.object({ token: z.string().min(1), @@ -53,76 +157,105 @@ export const ZGetDocumentByTokenQuerySchema = z.object({ export type TGetDocumentByTokenQuerySchema = z.infer; -export const ZGetDocumentWithDetailsByIdQuerySchema = z.object({ - documentId: z.number().min(1), - teamId: z.number().min(1).optional(), +export const ZGetDocumentWithDetailsByIdRequestSchema = z.object({ + documentId: z.number(), }); -export type TGetDocumentWithDetailsByIdQuerySchema = z.infer< - typeof ZGetDocumentWithDetailsByIdQuerySchema ->; +export const ZGetDocumentWithDetailsByIdResponseSchema = ZDocumentSchema; -export const ZCreateDocumentMutationSchema = z.object({ - title: z.string().min(1), +export const ZCreateDocumentRequestSchema = z.object({ + title: ZDocumentTitleSchema, documentDataId: z.string().min(1), - teamId: z.number().optional(), - timezone: z.string().optional(), + timezone: ZDocumentMetaTimezoneSchema.optional(), }); -export type TCreateDocumentMutationSchema = z.infer; - -export const ZSetSettingsForDocumentMutationSchema = z.object({ - documentId: z.number(), - teamId: z.number().min(1).optional(), - data: z.object({ - title: z.string().min(1).optional(), - externalId: z.string().nullish(), - visibility: z.nativeEnum(DocumentVisibility).optional(), - globalAccessAuth: ZDocumentAccessAuthTypesSchema.nullable().optional(), - globalActionAuth: ZDocumentActionAuthTypesSchema.nullable().optional(), - }), - meta: z.object({ - timezone: z.string(), - dateFormat: z.string(), - redirectUrl: z - .string() - .optional() - .refine((value) => value === undefined || value === '' || isValidRedirectUrl(value), { - message: - 'Please enter a valid URL, make sure you include http:// or https:// part of the url.', +export const ZCreateDocumentV2RequestSchema = z.object({ + title: ZDocumentTitleSchema, + externalId: ZDocumentExternalIdSchema.optional(), + visibility: ZDocumentVisibilitySchema.optional(), + globalAccessAuth: ZDocumentAccessAuthTypesSchema.optional(), + globalActionAuth: ZDocumentActionAuthTypesSchema.optional(), + formValues: ZDocumentFormValuesSchema.optional(), + recipients: z + .array( + ZCreateRecipientSchema.extend({ + fields: ZFieldAndMetaSchema.and( + z.object({ + pageNumber: ZFieldPageNumberSchema, + pageX: ZFieldPageXSchema, + pageY: ZFieldPageYSchema, + width: ZFieldWidthSchema, + height: ZFieldHeightSchema, + }), + ) + .array() + .optional(), }), - language: z.enum(SUPPORTED_LANGUAGE_CODES).optional(), - }), + ) + .refine( + (recipients) => { + const emails = recipients.map((recipient) => recipient.email); + + return new Set(emails).size === emails.length; + }, + { message: 'Recipients must have unique emails' }, + ) + .optional(), + meta: z + .object({ + subject: ZDocumentMetaSubjectSchema.optional(), + message: ZDocumentMetaMessageSchema.optional(), + timezone: ZDocumentMetaTimezoneSchema.optional(), + dateFormat: ZDocumentMetaDateFormatSchema.optional(), + distributionMethod: ZDocumentMetaDistributionMethodSchema.optional(), + signingOrder: z.nativeEnum(DocumentSigningOrder).optional(), + redirectUrl: ZDocumentMetaRedirectUrlSchema.optional(), + language: ZDocumentMetaLanguageSchema.optional(), + typedSignatureEnabled: ZDocumentMetaTypedSignatureEnabledSchema.optional(), + emailSettings: ZDocumentEmailSettingsSchema.optional(), + }) + .optional(), }); -export type TSetGeneralSettingsForDocumentMutationSchema = z.infer< - typeof ZSetSettingsForDocumentMutationSchema ->; +export type TCreateDocumentV2Request = z.infer; -export const ZSetTitleForDocumentMutationSchema = z.object({ +export const ZCreateDocumentV2ResponseSchema = z.object({ + document: ZDocumentSchema, + uploadUrl: z + .string() + .describe( + 'The URL to upload the document PDF to. Use a PUT request with the file via form-data', + ), +}); + +export const ZUpdateDocumentRequestSchema = z.object({ documentId: z.number(), - teamId: z.number().min(1).optional(), - title: z.string().min(1), + 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(), + redirectUrl: ZDocumentMetaRedirectUrlSchema.optional(), + language: ZDocumentMetaLanguageSchema.optional(), + typedSignatureEnabled: ZDocumentMetaTypedSignatureEnabledSchema.optional(), + emailSettings: ZDocumentEmailSettingsSchema.optional(), + }) + .optional(), }); -export type TSetTitleForDocumentMutationSchema = z.infer; - -export const ZSetRecipientsForDocumentMutationSchema = z.object({ - documentId: z.number(), - teamId: z.number().min(1).optional(), - recipients: z.array( - z.object({ - id: z.number().nullish(), - email: z.string().min(1).email(), - name: z.string(), - role: z.nativeEnum(RecipientRole), - }), - ), -}); - -export type TSetRecipientsForDocumentMutationSchema = z.infer< - typeof ZSetRecipientsForDocumentMutationSchema ->; +export const ZUpdateDocumentResponseSchema = ZDocumentLiteSchema; export const ZSetFieldsForDocumentMutationSchema = z.object({ documentId: z.number(), @@ -144,26 +277,24 @@ export type TSetFieldsForDocumentMutationSchema = z.infer< typeof ZSetFieldsForDocumentMutationSchema >; -export const ZSendDocumentMutationSchema = z.object({ - documentId: z.number(), - teamId: z.number().optional(), - meta: z.object({ - subject: z.string(), - message: z.string(), - timezone: z.string().optional(), - dateFormat: z.string().optional(), - distributionMethod: z.nativeEnum(DocumentDistributionMethod).optional(), - redirectUrl: z - .string() - .optional() - .refine((value) => value === undefined || value === '' || isValidRedirectUrl(value), { - message: - 'Please enter a valid URL, make sure you include http:// or https:// part of the url.', - }), - emailSettings: ZDocumentEmailSettingsSchema.optional(), - }), +export const ZDistributeDocumentRequestSchema = z.object({ + documentId: z.number().describe('The ID of the document to send.'), + meta: z + .object({ + subject: ZDocumentMetaSubjectSchema.optional(), + message: ZDocumentMetaMessageSchema.optional(), + timezone: ZDocumentMetaTimezoneSchema.optional(), + dateFormat: ZDocumentMetaDateFormatSchema.optional(), + distributionMethod: ZDocumentMetaDistributionMethodSchema.optional(), + redirectUrl: ZDocumentMetaRedirectUrlSchema.optional(), + language: ZDocumentMetaLanguageSchema.optional(), + emailSettings: ZDocumentEmailSettingsSchema.optional(), + }) + .optional(), }); +export const ZDistributeDocumentResponseSchema = ZDocumentLiteSchema; + export const ZSetPasswordForDocumentMutationSchema = z.object({ documentId: z.number(), password: z.string(), @@ -182,27 +313,16 @@ export type TSetSigningOrderForDocumentMutationSchema = z.infer< typeof ZSetSigningOrderForDocumentMutationSchema >; -export const ZUpdateTypedSignatureSettingsMutationSchema = z.object({ - documentId: z.number(), - teamId: z.number().optional(), - typedSignatureEnabled: z.boolean(), -}); - -export type TUpdateTypedSignatureSettingsMutationSchema = z.infer< - typeof ZUpdateTypedSignatureSettingsMutationSchema ->; - export const ZResendDocumentMutationSchema = z.object({ documentId: z.number(), - recipients: z.array(z.number()).min(1), - teamId: z.number().min(1).optional(), + recipients: z + .array(z.number()) + .min(1) + .describe('The IDs of the recipients to redistribute the document to.'), }); -export type TSendDocumentMutationSchema = z.infer; - export const ZDeleteDocumentMutationSchema = z.object({ - documentId: z.number().min(1), - teamId: z.number().min(1).optional(), + documentId: z.number(), }); export type TDeleteDocumentMutationSchema = z.infer; @@ -213,15 +333,15 @@ export const ZSearchDocumentsMutationSchema = z.object({ export const ZDownloadAuditLogsMutationSchema = z.object({ documentId: z.number(), - teamId: z.number().optional(), }); export const ZDownloadCertificateMutationSchema = z.object({ documentId: z.number(), - teamId: z.number().optional(), }); export const ZMoveDocumentToTeamSchema = z.object({ - documentId: z.number(), - teamId: z.number(), + documentId: z.number().describe('The ID of the document to move to a team.'), + teamId: z.number().describe('The ID of the team to move the document to.'), }); + +export const ZMoveDocumentToTeamResponseSchema = ZDocumentLiteSchema; diff --git a/packages/trpc/server/field-router/router.ts b/packages/trpc/server/field-router/router.ts index b42bb3a6b..df17aef88 100644 --- a/packages/trpc/server/field-router/router.ts +++ b/packages/trpc/server/field-router/router.ts @@ -1,47 +1,67 @@ -import { - ZGetFieldByIdResponseSchema, - getFieldById, -} from '@documenso/lib/server-only/field/get-field-by-id'; +import { createDocumentFields } from '@documenso/lib/server-only/field/create-document-fields'; +import { createTemplateFields } from '@documenso/lib/server-only/field/create-template-fields'; +import { deleteDocumentField } from '@documenso/lib/server-only/field/delete-document-field'; +import { deleteTemplateField } from '@documenso/lib/server-only/field/delete-template-field'; +import { getFieldById } from '@documenso/lib/server-only/field/get-field-by-id'; import { removeSignedFieldWithToken } from '@documenso/lib/server-only/field/remove-signed-field-with-token'; -import { - ZSetFieldsForDocumentResponseSchema, - setFieldsForDocument, -} from '@documenso/lib/server-only/field/set-fields-for-document'; -import { - ZSetFieldsForTemplateResponseSchema, - setFieldsForTemplate, -} from '@documenso/lib/server-only/field/set-fields-for-template'; +import { setFieldsForDocument } from '@documenso/lib/server-only/field/set-fields-for-document'; +import { setFieldsForTemplate } from '@documenso/lib/server-only/field/set-fields-for-template'; import { signFieldWithToken } from '@documenso/lib/server-only/field/sign-field-with-token'; +import { updateDocumentFields } from '@documenso/lib/server-only/field/update-document-fields'; +import { updateTemplateFields } from '@documenso/lib/server-only/field/update-template-fields'; import { extractNextApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import { ZGenericSuccessResponse, ZSuccessResponseSchema } from '../document-router/schema'; import { authenticatedProcedure, procedure, router } from '../trpc'; import { - ZAddFieldsMutationSchema, - ZAddTemplateFieldsMutationSchema, - ZGetFieldQuerySchema, + ZCreateDocumentFieldRequestSchema, + ZCreateDocumentFieldResponseSchema, + ZCreateDocumentFieldsRequestSchema, + ZCreateDocumentFieldsResponseSchema, + ZCreateTemplateFieldRequestSchema, + ZCreateTemplateFieldResponseSchema, + ZCreateTemplateFieldsRequestSchema, + ZCreateTemplateFieldsResponseSchema, + ZDeleteDocumentFieldRequestSchema, + ZDeleteTemplateFieldRequestSchema, + ZGetFieldRequestSchema, + ZGetFieldResponseSchema, ZRemovedSignedFieldWithTokenMutationSchema, + ZSetDocumentFieldsRequestSchema, + ZSetDocumentFieldsResponseSchema, + ZSetFieldsForTemplateRequestSchema, + ZSetFieldsForTemplateResponseSchema, ZSignFieldWithTokenMutationSchema, + ZUpdateDocumentFieldRequestSchema, + ZUpdateDocumentFieldResponseSchema, + ZUpdateDocumentFieldsRequestSchema, + ZUpdateDocumentFieldsResponseSchema, + ZUpdateTemplateFieldRequestSchema, + ZUpdateTemplateFieldResponseSchema, + ZUpdateTemplateFieldsRequestSchema, + ZUpdateTemplateFieldsResponseSchema, } from './schema'; export const fieldRouter = router({ /** * @public */ - getField: authenticatedProcedure + getDocumentField: authenticatedProcedure .meta({ openapi: { method: 'GET', - path: '/field/{fieldId}', - summary: 'Get field', + path: '/document/field/{fieldId}', + summary: 'Get document field', description: - 'Returns a single field. If you want to retrieve all the fields for a document or template, use the "Get Document" or "Get Template" request.', - tags: ['Fields'], + 'Returns a single field. If you want to retrieve all the fields for a document, use the "Get Document" endpoint.', + tags: ['Document Fields'], }, }) - .input(ZGetFieldQuerySchema) - .output(ZGetFieldByIdResponseSchema) + .input(ZGetFieldRequestSchema) + .output(ZGetFieldResponseSchema) .query(async ({ input, ctx }) => { - const { fieldId, teamId } = input; + const { teamId } = ctx; + const { fieldId } = input; return await getFieldById({ userId: ctx.user.id, @@ -53,23 +73,163 @@ export const fieldRouter = router({ /** * @public */ - addFields: authenticatedProcedure + createDocumentField: authenticatedProcedure .meta({ openapi: { method: 'POST', - path: '/document/{documentId}/field', - summary: 'Set document fields', - tags: ['Fields'], + path: '/document/field/create', + summary: 'Create document field', + description: 'Create a single field for a document.', + tags: ['Document Fields'], }, }) - .input(ZAddFieldsMutationSchema) - .output(ZSetFieldsForDocumentResponseSchema) + .input(ZCreateDocumentFieldRequestSchema) + .output(ZCreateDocumentFieldResponseSchema) .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; + const { documentId, field } = input; + + const createdFields = await createDocumentFields({ + userId: ctx.user.id, + teamId, + documentId, + fields: [field], + requestMetadata: ctx.metadata, + }); + + return createdFields.fields[0]; + }), + + /** + * @public + */ + createDocumentFields: authenticatedProcedure + .meta({ + openapi: { + method: 'POST', + path: '/document/field/create-many', + summary: 'Create document fields', + description: 'Create multiple fields for a document.', + tags: ['Document Fields'], + }, + }) + .input(ZCreateDocumentFieldsRequestSchema) + .output(ZCreateDocumentFieldsResponseSchema) + .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; + const { documentId, fields } = input; + + return await createDocumentFields({ + userId: ctx.user.id, + teamId, + documentId, + fields, + requestMetadata: ctx.metadata, + }); + }), + + /** + * @public + */ + updateDocumentField: authenticatedProcedure + .meta({ + openapi: { + method: 'POST', + path: '/document/field/update', + summary: 'Update document field', + description: 'Update a single field for a document.', + tags: ['Document Fields'], + }, + }) + .input(ZUpdateDocumentFieldRequestSchema) + .output(ZUpdateDocumentFieldResponseSchema) + .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; + const { documentId, field } = input; + + const updatedFields = await updateDocumentFields({ + userId: ctx.user.id, + teamId, + documentId, + fields: [field], + requestMetadata: ctx.metadata, + }); + + return updatedFields.fields[0]; + }), + + /** + * @public + */ + updateDocumentFields: authenticatedProcedure + .meta({ + openapi: { + method: 'POST', + path: '/document/field/update-many', + summary: 'Update document fields', + description: 'Update multiple fields for a document.', + tags: ['Document Fields'], + }, + }) + .input(ZUpdateDocumentFieldsRequestSchema) + .output(ZUpdateDocumentFieldsResponseSchema) + .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; + const { documentId, fields } = input; + + return await updateDocumentFields({ + userId: ctx.user.id, + teamId, + documentId, + fields, + requestMetadata: ctx.metadata, + }); + }), + + /** + * @public + */ + deleteDocumentField: authenticatedProcedure + .meta({ + openapi: { + method: 'POST', + path: '/document/field/delete', + summary: 'Delete document field', + tags: ['Document Fields'], + }, + }) + .input(ZDeleteDocumentFieldRequestSchema) + .output(ZSuccessResponseSchema) + .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; + const { fieldId } = input; + + await deleteDocumentField({ + userId: ctx.user.id, + teamId, + fieldId, + requestMetadata: ctx.metadata, + }); + + return ZGenericSuccessResponse; + }), + + /** + * @private + * + * Todo: Refactor to setFieldsForDocument function. + */ + addFields: authenticatedProcedure + .input(ZSetDocumentFieldsRequestSchema) + .output(ZSetDocumentFieldsResponseSchema) + .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; const { documentId, fields } = input; return await setFieldsForDocument({ documentId, userId: ctx.user.id, + teamId, fields: fields.map((field) => ({ id: field.nativeId, signerEmail: field.signerEmail, @@ -81,30 +241,192 @@ export const fieldRouter = router({ pageHeight: field.pageHeight, fieldMeta: field.fieldMeta, })), - requestMetadata: extractNextApiRequestMetadata(ctx.req), + requestMetadata: ctx.metadata, }); }), /** * @public */ - addTemplateFields: authenticatedProcedure + createTemplateField: authenticatedProcedure .meta({ openapi: { method: 'POST', - path: '/template/{templateId}/field', - summary: 'Set template fields', - tags: ['Fields'], + path: '/template/field/create', + summary: 'Create template field', + description: 'Create a single field for a template.', + tags: ['Template Fields'], }, }) - .input(ZAddTemplateFieldsMutationSchema) + .input(ZCreateTemplateFieldRequestSchema) + .output(ZCreateTemplateFieldResponseSchema) + .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; + const { templateId, field } = input; + + const createdFields = await createTemplateFields({ + userId: ctx.user.id, + teamId, + templateId, + fields: [field], + }); + + return createdFields.fields[0]; + }), + + /** + * @public + */ + getTemplateField: authenticatedProcedure + .meta({ + openapi: { + method: 'GET', + path: '/template/field/{fieldId}', + summary: 'Get template field', + description: + 'Returns a single field. If you want to retrieve all the fields for a template, use the "Get Template" endpoint.', + tags: ['Template Fields'], + }, + }) + .input(ZGetFieldRequestSchema) + .output(ZGetFieldResponseSchema) + .query(async ({ input, ctx }) => { + const { teamId } = ctx; + const { fieldId } = input; + + return await getFieldById({ + userId: ctx.user.id, + teamId, + fieldId, + }); + }), + + /** + * @public + */ + createTemplateFields: authenticatedProcedure + .meta({ + openapi: { + method: 'POST', + path: '/template/field/create-many', + summary: 'Create template fields', + description: 'Create multiple fields for a template.', + tags: ['Template Fields'], + }, + }) + .input(ZCreateTemplateFieldsRequestSchema) + .output(ZCreateTemplateFieldsResponseSchema) + .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; + const { templateId, fields } = input; + + return await createTemplateFields({ + userId: ctx.user.id, + teamId, + templateId, + fields, + }); + }), + + /** + * @public + */ + updateTemplateField: authenticatedProcedure + .meta({ + openapi: { + method: 'POST', + path: '/template/field/update', + summary: 'Update template field', + description: 'Update a single field for a template.', + tags: ['Template Fields'], + }, + }) + .input(ZUpdateTemplateFieldRequestSchema) + .output(ZUpdateTemplateFieldResponseSchema) + .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; + const { templateId, field } = input; + + const updatedFields = await updateTemplateFields({ + userId: ctx.user.id, + teamId, + templateId, + fields: [field], + }); + + return updatedFields.fields[0]; + }), + + /** + * @public + */ + updateTemplateFields: authenticatedProcedure + .meta({ + openapi: { + method: 'POST', + path: '/template/field/update-many', + summary: 'Update template fields', + description: 'Update multiple fields for a template.', + tags: ['Template Fields'], + }, + }) + .input(ZUpdateTemplateFieldsRequestSchema) + .output(ZUpdateTemplateFieldsResponseSchema) + .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; + const { templateId, fields } = input; + + return await updateTemplateFields({ + userId: ctx.user.id, + teamId, + templateId, + fields, + }); + }), + + /** + * @public + */ + deleteTemplateField: authenticatedProcedure + .meta({ + openapi: { + method: 'POST', + path: '/template/field/delete', + summary: 'Delete template field', + tags: ['Template Fields'], + }, + }) + .input(ZDeleteTemplateFieldRequestSchema) + .output(ZSuccessResponseSchema) + .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; + const { fieldId } = input; + + await deleteTemplateField({ + userId: ctx.user.id, + teamId, + fieldId, + }); + + return ZGenericSuccessResponse; + }), + + /** + * @private + * + * Todo: Refactor to setFieldsForTemplate. + */ + addTemplateFields: authenticatedProcedure + .input(ZSetFieldsForTemplateRequestSchema) .output(ZSetFieldsForTemplateResponseSchema) .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; const { templateId, fields } = input; return await setFieldsForTemplate({ - userId: ctx.user.id, templateId, + userId: ctx.user.id, + teamId, fields: fields.map((field) => ({ id: field.nativeId, signerEmail: field.signerEmail, diff --git a/packages/trpc/server/field-router/schema.ts b/packages/trpc/server/field-router/schema.ts index 4f408fc2c..373d4a693 100644 --- a/packages/trpc/server/field-router/schema.ts +++ b/packages/trpc/server/field-router/schema.ts @@ -1,10 +1,112 @@ import { z } from 'zod'; import { ZRecipientActionAuthSchema } from '@documenso/lib/types/document-auth'; -import { ZFieldMetaSchema } from '@documenso/lib/types/field-meta'; +import { + ZFieldHeightSchema, + ZFieldPageNumberSchema, + ZFieldPageXSchema, + ZFieldPageYSchema, + ZFieldSchema, + ZFieldWidthSchema, +} from '@documenso/lib/types/field'; +import { ZFieldAndMetaSchema, ZFieldMetaSchema } from '@documenso/lib/types/field-meta'; import { FieldType } from '@documenso/prisma/client'; -export const ZAddFieldsMutationSchema = z.object({ +const ZCreateFieldSchema = ZFieldAndMetaSchema.and( + z.object({ + recipientId: z.number().describe('The ID of the recipient to create the field for.'), + pageNumber: ZFieldPageNumberSchema, + pageX: ZFieldPageXSchema, + pageY: ZFieldPageYSchema, + width: ZFieldWidthSchema, + height: ZFieldHeightSchema, + }), +); + +const ZUpdateFieldSchema = ZFieldAndMetaSchema.and( + z.object({ + id: z.number().describe('The ID of the field to update.'), + pageNumber: ZFieldPageNumberSchema.optional(), + pageX: ZFieldPageXSchema.optional(), + pageY: ZFieldPageYSchema.optional(), + width: ZFieldWidthSchema.optional(), + height: ZFieldHeightSchema.optional(), + }), +); + +export const ZCreateDocumentFieldRequestSchema = z.object({ + documentId: z.number(), + field: ZCreateFieldSchema, +}); + +export const ZCreateDocumentFieldResponseSchema = ZFieldSchema; + +export const ZCreateDocumentFieldsRequestSchema = z.object({ + documentId: z.number(), + fields: ZCreateFieldSchema.array(), +}); + +export const ZCreateDocumentFieldsResponseSchema = z.object({ + fields: z.array(ZFieldSchema), +}); + +export const ZUpdateDocumentFieldRequestSchema = z.object({ + documentId: z.number(), + field: ZUpdateFieldSchema, +}); + +export const ZUpdateDocumentFieldResponseSchema = ZFieldSchema; + +export const ZUpdateDocumentFieldsRequestSchema = z.object({ + documentId: z.number(), + fields: ZUpdateFieldSchema.array(), +}); + +export const ZUpdateDocumentFieldsResponseSchema = z.object({ + fields: z.array(ZFieldSchema), +}); + +export const ZDeleteDocumentFieldRequestSchema = z.object({ + fieldId: z.number(), +}); + +export const ZCreateTemplateFieldRequestSchema = z.object({ + templateId: z.number(), + field: ZCreateFieldSchema, +}); + +export const ZCreateTemplateFieldResponseSchema = ZFieldSchema; + +export const ZCreateTemplateFieldsRequestSchema = z.object({ + templateId: z.number(), + fields: ZCreateFieldSchema.array(), +}); + +export const ZCreateTemplateFieldsResponseSchema = z.object({ + fields: z.array(ZFieldSchema), +}); + +export const ZUpdateTemplateFieldRequestSchema = z.object({ + templateId: z.number(), + field: ZUpdateFieldSchema, +}); + +export const ZUpdateTemplateFieldsRequestSchema = z.object({ + templateId: z.number(), + fields: ZUpdateFieldSchema.array(), +}); + +export const ZUpdateTemplateFieldsResponseSchema = z.object({ + fields: z.array(ZFieldSchema), +}); + +export const ZUpdateTemplateFieldResponseSchema = ZFieldSchema; + +export const ZDeleteTemplateFieldRequestSchema = z.object({ + fieldId: z.number(), +}); + +export const ZSetDocumentFieldsRequestSchema = z.object({ documentId: z.number(), fields: z.array( z.object({ @@ -22,9 +124,11 @@ export const ZAddFieldsMutationSchema = z.object({ ), }); -export type TAddFieldsMutationSchema = z.infer; +export const ZSetDocumentFieldsResponseSchema = z.object({ + fields: z.array(ZFieldSchema), +}); -export const ZAddTemplateFieldsMutationSchema = z.object({ +export const ZSetFieldsForTemplateRequestSchema = z.object({ templateId: z.number(), fields: z.array( z.object({ @@ -42,7 +146,9 @@ export const ZAddTemplateFieldsMutationSchema = z.object({ ), }); -export type TAddTemplateFieldsMutationSchema = z.infer; +export const ZSetFieldsForTemplateResponseSchema = z.object({ + fields: z.array(ZFieldSchema), +}); export const ZSignFieldWithTokenMutationSchema = z.object({ token: z.string(), @@ -63,16 +169,8 @@ export type TRemovedSignedFieldWithTokenMutationSchema = z.infer< typeof ZRemovedSignedFieldWithTokenMutationSchema >; -export const ZGetFieldQuerySchema = z.object({ +export const ZGetFieldRequestSchema = z.object({ fieldId: z.number(), - teamId: z.number().optional(), }); -export type TGetFieldQuerySchema = z.infer; - -export const ZUpdateFieldMutationSchema = z.object({ - fieldId: z.number(), - documentId: z.number(), - fieldMeta: ZFieldMetaSchema, - teamId: z.number().optional(), -}); +export const ZGetFieldResponseSchema = ZFieldSchema; diff --git a/packages/trpc/server/open-api.ts b/packages/trpc/server/open-api.ts index 05414cf7b..c55042f93 100644 --- a/packages/trpc/server/open-api.ts +++ b/packages/trpc/server/open-api.ts @@ -1,12 +1,30 @@ -import { generateOpenApiDocument } from 'trpc-openapi'; +import { generateOpenApiDocument } from 'trpc-to-openapi'; import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app'; import { appRouter } from './router'; -export const openApiDocument = generateOpenApiDocument(appRouter, { - title: 'Do not use.', - version: '0.0.0', - baseUrl: `${NEXT_PUBLIC_WEBAPP_URL()}/api/beta`, - // docsUrl: '', // Todo -}); +export const openApiDocument = { + ...generateOpenApiDocument(appRouter, { + title: 'Documenso v2 beta API', + description: 'Subject to breaking changes until v2 is fully released.', + version: '0.0.0', + baseUrl: `${NEXT_PUBLIC_WEBAPP_URL()}/api/v2-beta`, + securitySchemes: { + apiKey: { + type: 'apiKey', + in: 'header', + name: 'Authorization', + }, + }, + }), + + /** + * Dirty way to pass through the security field. + */ + security: [ + { + apiKey: [], + }, + ], +}; diff --git a/packages/trpc/server/profile-router/router.ts b/packages/trpc/server/profile-router/router.ts index 2ee779e65..e87a726c8 100644 --- a/packages/trpc/server/profile-router/router.ts +++ b/packages/trpc/server/profile-router/router.ts @@ -52,7 +52,7 @@ export const profileRouter = router({ userId: ctx.user.id, name, signature, - requestMetadata: extractNextApiRequestMetadata(ctx.req), + requestMetadata: ctx.metadata.requestMetadata, }); }), @@ -96,7 +96,7 @@ export const profileRouter = router({ userId: ctx.user.id, password, currentPassword, - requestMetadata: extractNextApiRequestMetadata(ctx.req), + requestMetadata: ctx.metadata.requestMetadata, }); }), @@ -146,7 +146,7 @@ export const profileRouter = router({ userId: ctx.user.id, teamId, bytes, - requestMetadata: extractNextApiRequestMetadata(ctx.req), + requestMetadata: ctx.metadata, }); }), }); diff --git a/packages/trpc/server/recipient-router/router.ts b/packages/trpc/server/recipient-router/router.ts index 3fa0d63c3..b323ba5f0 100644 --- a/packages/trpc/server/recipient-router/router.ts +++ b/packages/trpc/server/recipient-router/router.ts @@ -1,47 +1,67 @@ import { completeDocumentWithToken } from '@documenso/lib/server-only/document/complete-document-with-token'; import { rejectDocumentWithToken } from '@documenso/lib/server-only/document/reject-document-with-token'; -import { - ZGetRecipientByIdResponseSchema, - getRecipientById, -} from '@documenso/lib/server-only/recipient/get-recipient-by-id'; -import { - ZSetRecipientsForDocumentResponseSchema, - setRecipientsForDocument, -} from '@documenso/lib/server-only/recipient/set-recipients-for-document'; -import { - ZSetRecipientsForTemplateResponseSchema, - setRecipientsForTemplate, -} from '@documenso/lib/server-only/recipient/set-recipients-for-template'; +import { createDocumentRecipients } from '@documenso/lib/server-only/recipient/create-document-recipients'; +import { createTemplateRecipients } from '@documenso/lib/server-only/recipient/create-template-recipients'; +import { deleteDocumentRecipient } from '@documenso/lib/server-only/recipient/delete-document-recipient'; +import { deleteTemplateRecipient } from '@documenso/lib/server-only/recipient/delete-template-recipient'; +import { getRecipientById } from '@documenso/lib/server-only/recipient/get-recipient-by-id'; +import { setDocumentRecipients } from '@documenso/lib/server-only/recipient/set-document-recipients'; +import { setTemplateRecipients } from '@documenso/lib/server-only/recipient/set-template-recipients'; +import { updateDocumentRecipients } from '@documenso/lib/server-only/recipient/update-document-recipients'; +import { updateTemplateRecipients } from '@documenso/lib/server-only/recipient/update-template-recipients'; import { extractNextApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import { ZGenericSuccessResponse, ZSuccessResponseSchema } from '../document-router/schema'; import { authenticatedProcedure, procedure, router } from '../trpc'; import { - ZAddSignersMutationSchema, - ZAddTemplateSignersMutationSchema, ZCompleteDocumentWithTokenMutationSchema, - ZGetRecipientQuerySchema, + ZCreateDocumentRecipientRequestSchema, + ZCreateDocumentRecipientResponseSchema, + ZCreateDocumentRecipientsRequestSchema, + ZCreateDocumentRecipientsResponseSchema, + ZCreateTemplateRecipientRequestSchema, + ZCreateTemplateRecipientResponseSchema, + ZCreateTemplateRecipientsRequestSchema, + ZCreateTemplateRecipientsResponseSchema, + ZDeleteDocumentRecipientRequestSchema, + ZDeleteTemplateRecipientRequestSchema, + ZGetRecipientRequestSchema, + ZGetRecipientResponseSchema, ZRejectDocumentWithTokenMutationSchema, + ZSetDocumentRecipientsRequestSchema, + ZSetDocumentRecipientsResponseSchema, + ZSetTemplateRecipientsRequestSchema, + ZSetTemplateRecipientsResponseSchema, + ZUpdateDocumentRecipientRequestSchema, + ZUpdateDocumentRecipientResponseSchema, + ZUpdateDocumentRecipientsRequestSchema, + ZUpdateDocumentRecipientsResponseSchema, + ZUpdateTemplateRecipientRequestSchema, + ZUpdateTemplateRecipientResponseSchema, + ZUpdateTemplateRecipientsRequestSchema, + ZUpdateTemplateRecipientsResponseSchema, } from './schema'; export const recipientRouter = router({ /** * @public */ - getRecipient: authenticatedProcedure + getDocumentRecipient: authenticatedProcedure .meta({ openapi: { method: 'GET', - path: '/recipient/{recipientId}', - summary: 'Get recipient', + path: '/document/recipient/{recipientId}', + summary: 'Get document recipient', description: - 'Returns a single recipient. If you want to retrieve all the recipients for a document or template, use the "Get Document" or "Get Template" request.', - tags: ['Recipients'], + 'Returns a single recipient. If you want to retrieve all the recipients for a document, use the "Get Document" endpoint.', + tags: ['Document Recipients'], }, }) - .input(ZGetRecipientQuerySchema) - .output(ZGetRecipientByIdResponseSchema) + .input(ZGetRecipientRequestSchema) + .output(ZGetRecipientResponseSchema) .query(async ({ input, ctx }) => { - const { recipientId, teamId } = input; + const { teamId } = ctx; + const { recipientId } = input; return await getRecipientById({ userId: ctx.user.id, @@ -53,64 +73,360 @@ export const recipientRouter = router({ /** * @public */ - addSigners: authenticatedProcedure + createDocumentRecipient: authenticatedProcedure .meta({ openapi: { method: 'POST', - path: '/document/{documentId}/recipient/set', - summary: 'Set document recipients', - tags: ['Recipients'], + path: '/document/recipient/create', + summary: 'Create document recipient', + description: 'Create a single recipient for a document.', + tags: ['Document Recipients'], }, }) - .input(ZAddSignersMutationSchema) - .output(ZSetRecipientsForDocumentResponseSchema) + .input(ZCreateDocumentRecipientRequestSchema) + .output(ZCreateDocumentRecipientResponseSchema) .mutation(async ({ input, ctx }) => { - const { documentId, teamId, signers } = input; + const { teamId } = ctx; + const { documentId, recipient } = input; - return await setRecipientsForDocument({ + const createdRecipients = await createDocumentRecipients({ userId: ctx.user.id, - documentId, teamId, - recipients: signers.map((signer) => ({ - id: signer.nativeId, - email: signer.email, - name: signer.name, - role: signer.role, - signingOrder: signer.signingOrder, - actionAuth: signer.actionAuth, - })), - requestMetadata: extractNextApiRequestMetadata(ctx.req), + documentId, + recipients: [recipient], + requestMetadata: ctx.metadata, + }); + + return createdRecipients.recipients[0]; + }), + + /** + * @public + */ + createDocumentRecipients: authenticatedProcedure + .meta({ + openapi: { + method: 'POST', + path: '/document/recipient/create-many', + summary: 'Create document recipients', + description: 'Create multiple recipients for a document.', + tags: ['Document Recipients'], + }, + }) + .input(ZCreateDocumentRecipientsRequestSchema) + .output(ZCreateDocumentRecipientsResponseSchema) + .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; + const { documentId, recipients } = input; + + return await createDocumentRecipients({ + userId: ctx.user.id, + teamId, + documentId, + recipients, + requestMetadata: ctx.metadata, }); }), /** * @public */ - addTemplateSigners: authenticatedProcedure + updateDocumentRecipient: authenticatedProcedure .meta({ openapi: { method: 'POST', - path: '/template/{templateId}/recipient/set', - summary: 'Set template recipients', - tags: ['Recipients'], + path: '/document/recipient/update', + summary: 'Update document recipient', + description: 'Update a single recipient for a document.', + tags: ['Document Recipients'], }, }) - .input(ZAddTemplateSignersMutationSchema) - .output(ZSetRecipientsForTemplateResponseSchema) + .input(ZUpdateDocumentRecipientRequestSchema) + .output(ZUpdateDocumentRecipientResponseSchema) .mutation(async ({ input, ctx }) => { - const { templateId, signers, teamId } = input; + const { teamId } = ctx; + const { documentId, recipient } = input; - return await setRecipientsForTemplate({ + const updatedRecipients = await updateDocumentRecipients({ + userId: ctx.user.id, + teamId, + documentId, + recipients: [recipient], + requestMetadata: ctx.metadata, + }); + + return updatedRecipients.recipients[0]; + }), + + /** + * @public + */ + updateDocumentRecipients: authenticatedProcedure + .meta({ + openapi: { + method: 'POST', + path: '/document/recipient/update-many', + summary: 'Update document recipients', + description: 'Update multiple recipients for a document.', + tags: ['Document Recipients'], + }, + }) + .input(ZUpdateDocumentRecipientsRequestSchema) + .output(ZUpdateDocumentRecipientsResponseSchema) + .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; + const { documentId, recipients } = input; + + return await updateDocumentRecipients({ + userId: ctx.user.id, + teamId, + documentId, + recipients, + requestMetadata: ctx.metadata, + }); + }), + + /** + * @public + */ + deleteDocumentRecipient: authenticatedProcedure + .meta({ + openapi: { + method: 'POST', + path: '/document/recipient/delete', + summary: 'Delete document recipient', + tags: ['Document Recipients'], + }, + }) + .input(ZDeleteDocumentRecipientRequestSchema) + .output(ZSuccessResponseSchema) + .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; + const { recipientId } = input; + + await deleteDocumentRecipient({ + userId: ctx.user.id, + teamId, + recipientId, + requestMetadata: ctx.metadata, + }); + + return ZGenericSuccessResponse; + }), + + /** + * @private + */ + setDocumentRecipients: authenticatedProcedure + .input(ZSetDocumentRecipientsRequestSchema) + .output(ZSetDocumentRecipientsResponseSchema) + .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; + const { documentId, recipients } = input; + + return await setDocumentRecipients({ + userId: ctx.user.id, + teamId, + documentId, + recipients: recipients.map((recipient) => ({ + id: recipient.nativeId, + email: recipient.email, + name: recipient.name, + role: recipient.role, + signingOrder: recipient.signingOrder, + actionAuth: recipient.actionAuth, + })), + requestMetadata: ctx.metadata, + }); + }), + + /** + * @public + */ + getTemplateRecipient: authenticatedProcedure + .meta({ + openapi: { + method: 'GET', + path: '/template/recipient/{recipientId}', + summary: 'Get template recipient', + description: + 'Returns a single recipient. If you want to retrieve all the recipients for a template, use the "Get Template" endpoint.', + tags: ['Template Recipients'], + }, + }) + .input(ZGetRecipientRequestSchema) + .output(ZGetRecipientResponseSchema) + .query(async ({ input, ctx }) => { + const { teamId } = ctx; + const { recipientId } = input; + + return await getRecipientById({ + userId: ctx.user.id, + teamId, + recipientId, + }); + }), + + /** + * @public + */ + createTemplateRecipient: authenticatedProcedure + .meta({ + openapi: { + method: 'POST', + path: '/template/recipient/create', + summary: 'Create template recipient', + description: 'Create a single recipient for a template.', + tags: ['Template Recipients'], + }, + }) + .input(ZCreateTemplateRecipientRequestSchema) + .output(ZCreateTemplateRecipientResponseSchema) + .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; + const { templateId, recipient } = input; + + const createdRecipients = await createTemplateRecipients({ userId: ctx.user.id, teamId, templateId, - recipients: signers.map((signer) => ({ - id: signer.nativeId, - email: signer.email, - name: signer.name, - role: signer.role, - signingOrder: signer.signingOrder, - actionAuth: signer.actionAuth, + recipients: [recipient], + }); + + return createdRecipients.recipients[0]; + }), + + /** + * @public + */ + createTemplateRecipients: authenticatedProcedure + .meta({ + openapi: { + method: 'POST', + path: '/template/recipient/create-many', + summary: 'Create template recipients', + description: 'Create multiple recipients for a template.', + tags: ['Template Recipients'], + }, + }) + .input(ZCreateTemplateRecipientsRequestSchema) + .output(ZCreateTemplateRecipientsResponseSchema) + .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; + const { templateId, recipients } = input; + + return await createTemplateRecipients({ + userId: ctx.user.id, + teamId, + templateId, + recipients, + }); + }), + + /** + * @public + */ + updateTemplateRecipient: authenticatedProcedure + .meta({ + openapi: { + method: 'POST', + path: '/template/recipient/update', + summary: 'Update template recipient', + description: 'Update a single recipient for a template.', + tags: ['Template Recipients'], + }, + }) + .input(ZUpdateTemplateRecipientRequestSchema) + .output(ZUpdateTemplateRecipientResponseSchema) + .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; + const { templateId, recipient } = input; + + const updatedRecipients = await updateTemplateRecipients({ + userId: ctx.user.id, + teamId, + templateId, + recipients: [recipient], + }); + + return updatedRecipients.recipients[0]; + }), + + /** + * @public + */ + updateTemplateRecipients: authenticatedProcedure + .meta({ + openapi: { + method: 'POST', + path: '/template/recipient/update-many', + summary: 'Update template recipients', + description: 'Update multiple recipients for a template.', + tags: ['Template Recipients'], + }, + }) + .input(ZUpdateTemplateRecipientsRequestSchema) + .output(ZUpdateTemplateRecipientsResponseSchema) + .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; + const { templateId, recipients } = input; + + return await updateTemplateRecipients({ + userId: ctx.user.id, + teamId, + templateId, + recipients, + }); + }), + + /** + * @public + */ + deleteTemplateRecipient: authenticatedProcedure + .meta({ + openapi: { + method: 'POST', + path: '/template/recipient/delete', + summary: 'Delete template recipient', + tags: ['Template Recipients'], + }, + }) + .input(ZDeleteTemplateRecipientRequestSchema) + .output(ZSuccessResponseSchema) + .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; + const { recipientId } = input; + + await deleteTemplateRecipient({ + recipientId, + userId: ctx.user.id, + teamId, + }); + + return ZGenericSuccessResponse; + }), + + /** + * @private + */ + setTemplateRecipients: authenticatedProcedure + .input(ZSetTemplateRecipientsRequestSchema) + .output(ZSetTemplateRecipientsResponseSchema) + .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; + const { templateId, recipients } = input; + + return await setTemplateRecipients({ + userId: ctx.user.id, + teamId, + templateId, + recipients: recipients.map((recipient) => ({ + id: recipient.nativeId, + email: recipient.email, + name: recipient.name, + role: recipient.role, + signingOrder: recipient.signingOrder, + actionAuth: recipient.actionAuth, })), }); }), diff --git a/packages/trpc/server/recipient-router/schema.ts b/packages/trpc/server/recipient-router/schema.ts index 9dea0b42c..7e05eb002 100644 --- a/packages/trpc/server/recipient-router/schema.ts +++ b/packages/trpc/server/recipient-router/schema.ts @@ -1,24 +1,108 @@ import { z } from 'zod'; import { + ZRecipientAccessAuthTypesSchema, ZRecipientActionAuthSchema, ZRecipientActionAuthTypesSchema, } from '@documenso/lib/types/document-auth'; +import { ZRecipientLiteSchema, ZRecipientSchema } from '@documenso/lib/types/recipient'; import { RecipientRole } from '@documenso/prisma/client'; -export const ZGetRecipientQuerySchema = z.object({ +export const ZGetRecipientRequestSchema = z.object({ recipientId: z.number(), - teamId: z.number().optional(), }); -export const ZAddSignersMutationSchema = z +export const ZGetRecipientResponseSchema = ZRecipientSchema; + +/** + * When changing this, ensure everything that uses this schema is updated correctly + * since this will change the Openapi schema. + * + * Example `createDocument` uses this, so you will need to update that function to + * pass along required details. + */ +export const ZCreateRecipientSchema = z.object({ + email: z.string().toLowerCase().email().min(1), + name: z.string(), + role: z.nativeEnum(RecipientRole), + signingOrder: z.number().optional(), + accessAuth: ZRecipientAccessAuthTypesSchema.optional().nullable(), + actionAuth: ZRecipientActionAuthTypesSchema.optional().nullable(), +}); + +const ZUpdateRecipientSchema = z.object({ + id: z.number().describe('The ID of the recipient to update.'), + email: z.string().toLowerCase().email().min(1).optional(), + name: z.string().optional(), + role: z.nativeEnum(RecipientRole).optional(), + signingOrder: z.number().optional(), + accessAuth: ZRecipientAccessAuthTypesSchema.optional().nullable(), + actionAuth: ZRecipientActionAuthTypesSchema.optional().nullable(), +}); + +export const ZCreateDocumentRecipientRequestSchema = z.object({ + documentId: z.number(), + recipient: ZCreateRecipientSchema, +}); + +export const ZCreateDocumentRecipientResponseSchema = ZRecipientLiteSchema; + +export const ZCreateDocumentRecipientsRequestSchema = z.object({ + documentId: z.number(), + recipients: z.array(ZCreateRecipientSchema).refine( + (recipients) => { + const emails = recipients.map((recipient) => recipient.email.toLowerCase()); + + return new Set(emails).size === emails.length; + }, + { + message: 'Recipients must have unique emails', + }, + ), +}); + +export const ZCreateDocumentRecipientsResponseSchema = z.object({ + recipients: ZRecipientLiteSchema.array(), +}); + +export const ZUpdateDocumentRecipientRequestSchema = z.object({ + documentId: z.number(), + recipient: ZUpdateRecipientSchema, +}); + +export const ZUpdateDocumentRecipientResponseSchema = ZRecipientSchema; + +export const ZUpdateDocumentRecipientsRequestSchema = z.object({ + documentId: z.number(), + recipients: z.array(ZUpdateRecipientSchema).refine( + (recipients) => { + const emails = recipients + .filter((recipient) => recipient.email !== undefined) + .map((recipient) => recipient.email?.toLowerCase()); + + return new Set(emails).size === emails.length; + }, + { + message: 'Recipients must have unique emails', + }, + ), +}); + +export const ZUpdateDocumentRecipientsResponseSchema = z.object({ + recipients: z.array(ZRecipientSchema), +}); + +export const ZDeleteDocumentRecipientRequestSchema = z.object({ + recipientId: z.number(), +}); + +export const ZSetDocumentRecipientsRequestSchema = z .object({ documentId: z.number(), - teamId: z.number().optional(), - signers: z.array( + recipients: z.array( z.object({ nativeId: z.number().optional(), - email: z.string().email().min(1), + email: z.string().toLowerCase().email().min(1), name: z.string(), role: z.nativeEnum(RecipientRole), signingOrder: z.number().optional(), @@ -28,24 +112,81 @@ export const ZAddSignersMutationSchema = z }) .refine( (schema) => { - const emails = schema.signers.map((signer) => signer.email.toLowerCase()); + const emails = schema.recipients.map((recipient) => recipient.email.toLowerCase()); return new Set(emails).size === emails.length; }, // Dirty hack to handle errors when .root is populated for an array type - { message: 'Signers must have unique emails', path: ['signers__root'] }, + { message: 'Recipients must have unique emails', path: ['recipients__root'] }, ); -export type TAddSignersMutationSchema = z.infer; +export const ZSetDocumentRecipientsResponseSchema = z.object({ + recipients: ZRecipientLiteSchema.array(), +}); -export const ZAddTemplateSignersMutationSchema = z +export const ZCreateTemplateRecipientRequestSchema = z.object({ + templateId: z.number(), + recipient: ZCreateRecipientSchema, +}); + +export const ZCreateTemplateRecipientResponseSchema = ZRecipientLiteSchema; + +export const ZCreateTemplateRecipientsRequestSchema = z.object({ + templateId: z.number(), + recipients: z.array(ZCreateRecipientSchema).refine( + (recipients) => { + const emails = recipients.map((recipient) => recipient.email); + + return new Set(emails).size === emails.length; + }, + { + message: 'Recipients must have unique emails', + }, + ), +}); + +export const ZCreateTemplateRecipientsResponseSchema = z.object({ + recipients: ZRecipientLiteSchema.array(), +}); + +export const ZUpdateTemplateRecipientRequestSchema = z.object({ + templateId: z.number(), + recipient: ZUpdateRecipientSchema, +}); + +export const ZUpdateTemplateRecipientResponseSchema = ZRecipientSchema; + +export const ZUpdateTemplateRecipientsRequestSchema = z.object({ + templateId: z.number(), + recipients: z.array(ZUpdateRecipientSchema).refine( + (recipients) => { + const emails = recipients + .filter((recipient) => recipient.email !== undefined) + .map((recipient) => recipient.email); + + return new Set(emails).size === emails.length; + }, + { + message: 'Recipients must have unique emails', + }, + ), +}); + +export const ZUpdateTemplateRecipientsResponseSchema = z.object({ + recipients: z.array(ZRecipientSchema), +}); + +export const ZDeleteTemplateRecipientRequestSchema = z.object({ + recipientId: z.number(), +}); + +export const ZSetTemplateRecipientsRequestSchema = z .object({ - teamId: z.number().optional(), templateId: z.number(), - signers: z.array( + recipients: z.array( z.object({ nativeId: z.number().optional(), - email: z.string().email().min(1), + email: z.string().toLowerCase().email().min(1), name: z.string(), role: z.nativeEnum(RecipientRole), signingOrder: z.number().optional(), @@ -55,15 +196,17 @@ export const ZAddTemplateSignersMutationSchema = z }) .refine( (schema) => { - const emails = schema.signers.map((signer) => signer.email.toLowerCase()); + const emails = schema.recipients.map((recipient) => recipient.email); return new Set(emails).size === emails.length; }, // Dirty hack to handle errors when .root is populated for an array type - { message: 'Signers must have unique emails', path: ['signers__root'] }, + { message: 'Recipients must have unique emails', path: ['recipients__root'] }, ); -export type TAddTemplateSignersMutationSchema = z.infer; +export const ZSetTemplateRecipientsResponseSchema = z.object({ + recipients: ZRecipientLiteSchema.array(), +}); export const ZCompleteDocumentWithTokenMutationSchema = z.object({ token: z.string(), diff --git a/packages/trpc/server/team-router/router.ts b/packages/trpc/server/team-router/router.ts index 67eda92de..292dc85db 100644 --- a/packages/trpc/server/team-router/router.ts +++ b/packages/trpc/server/team-router/router.ts @@ -91,7 +91,6 @@ export const teamRouter = router({ // }, // }) .input(ZFindTeamsQuerySchema) - .output(z.unknown()) .query(async ({ input, ctx }) => { return await findTeams({ userId: ctx.user.id, @@ -110,7 +109,6 @@ export const teamRouter = router({ // }, // }) .input(ZGetTeamQuerySchema) - .output(z.unknown()) .query(async ({ input, ctx }) => { return await getTeamById({ teamId: input.teamId, userId: ctx.user.id }); }), @@ -126,7 +124,6 @@ export const teamRouter = router({ // }, // }) .input(ZCreateTeamMutationSchema) - .output(z.unknown()) .mutation(async ({ input, ctx }) => { return await createTeam({ userId: ctx.user.id, @@ -145,7 +142,6 @@ export const teamRouter = router({ // }, // }) .input(ZUpdateTeamMutationSchema) - .output(z.unknown()) .mutation(async ({ input, ctx }) => { return await updateTeam({ userId: ctx.user.id, @@ -164,7 +160,6 @@ export const teamRouter = router({ // }, // }) .input(ZDeleteTeamMutationSchema) - .output(z.unknown()) .mutation(async ({ input, ctx }) => { return await deleteTeam({ userId: ctx.user.id, @@ -184,7 +179,6 @@ export const teamRouter = router({ // }, // }) .input(ZLeaveTeamMutationSchema) - .output(z.unknown()) .mutation(async ({ input, ctx }) => { return await leaveTeam({ userId: ctx.user.id, @@ -204,7 +198,6 @@ export const teamRouter = router({ // }, // }) .input(ZFindTeamMemberInvitesQuerySchema) - .output(z.unknown()) .query(async ({ input, ctx }) => { return await findTeamMemberInvites({ userId: ctx.user.id, @@ -224,7 +217,6 @@ export const teamRouter = router({ // }, // }) .input(ZCreateTeamMemberInvitesMutationSchema) - .output(z.unknown()) .mutation(async ({ input, ctx }) => { return await createTeamMemberInvites({ userId: ctx.user.id, @@ -245,7 +237,6 @@ export const teamRouter = router({ // }, // }) .input(ZResendTeamMemberInvitationMutationSchema) - .output(z.unknown()) .mutation(async ({ input, ctx }) => { await resendTeamMemberInvitation({ userId: ctx.user.id, @@ -266,7 +257,6 @@ export const teamRouter = router({ // }, // }) .input(ZDeleteTeamMemberInvitationsMutationSchema) - .output(z.unknown()) .mutation(async ({ input, ctx }) => { return await deleteTeamMemberInvitations({ userId: ctx.user.id, @@ -285,7 +275,6 @@ export const teamRouter = router({ // }, // }) .input(ZGetTeamMembersQuerySchema) - .output(z.unknown()) .query(async ({ input, ctx }) => { return await getTeamMembers({ teamId: input.teamId, userId: ctx.user.id }); }), @@ -302,7 +291,6 @@ export const teamRouter = router({ // }, // }) .input(ZFindTeamMembersQuerySchema) - .output(z.unknown()) .query(async ({ input, ctx }) => { return await findTeamMembers({ userId: ctx.user.id, @@ -321,7 +309,6 @@ export const teamRouter = router({ // }, // }) .input(ZUpdateTeamMemberMutationSchema) - .output(z.unknown()) .mutation(async ({ input, ctx }) => { return await updateTeamMember({ userId: ctx.user.id, @@ -341,7 +328,6 @@ export const teamRouter = router({ // }, // }) .input(ZDeleteTeamMembersMutationSchema) - .output(z.unknown()) .mutation(async ({ input, ctx }) => { return await deleteTeamMembers({ userId: ctx.user.id, @@ -400,7 +386,6 @@ export const teamRouter = router({ // }, // }) .input(ZUpdateTeamPublicProfileMutationSchema) - .output(z.unknown()) .mutation(async ({ input, ctx }) => { try { const { teamId, bio, enabled } = input; diff --git a/packages/trpc/server/template-router/router.ts b/packages/trpc/server/template-router/router.ts index 7ea651364..56f319634 100644 --- a/packages/trpc/server/template-router/router.ts +++ b/packages/trpc/server/template-router/router.ts @@ -1,13 +1,9 @@ import { TRPCError } from '@trpc/server'; -import { z } from 'zod'; import { getServerLimits } from '@documenso/ee/server-only/limits/server'; -import { isValidLanguageCode } from '@documenso/lib/constants/i18n'; import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; -import { - ZGetDocumentWithDetailsByIdResponseSchema, - getDocumentWithDetailsById, -} from '@documenso/lib/server-only/document/get-document-with-details-by-id'; +import { jobs } from '@documenso/lib/jobs/client'; +import { getDocumentWithDetailsById } from '@documenso/lib/server-only/document/get-document-with-details-by-id'; import { sendDocument } from '@documenso/lib/server-only/document/send-document'; import { ZCreateDocumentFromDirectTemplateResponseSchema, @@ -18,55 +14,41 @@ import { ZCreateTemplateResponseSchema, createTemplate, } from '@documenso/lib/server-only/template/create-template'; -import { - ZCreateTemplateDirectLinkResponseSchema, - createTemplateDirectLink, -} from '@documenso/lib/server-only/template/create-template-direct-link'; +import { createTemplateDirectLink } from '@documenso/lib/server-only/template/create-template-direct-link'; import { deleteTemplate } from '@documenso/lib/server-only/template/delete-template'; import { deleteTemplateDirectLink } from '@documenso/lib/server-only/template/delete-template-direct-link'; -import { - ZDuplicateTemplateResponseSchema, - duplicateTemplate, -} from '@documenso/lib/server-only/template/duplicate-template'; -import { - ZFindTemplatesResponseSchema, - findTemplates, -} from '@documenso/lib/server-only/template/find-templates'; -import { - ZGetTemplateByIdResponseSchema, - getTemplateById, -} from '@documenso/lib/server-only/template/get-template-by-id'; -import { - ZMoveTemplateToTeamResponseSchema, - moveTemplateToTeam, -} from '@documenso/lib/server-only/template/move-template-to-team'; -import { - ZToggleTemplateDirectLinkResponseSchema, - toggleTemplateDirectLink, -} from '@documenso/lib/server-only/template/toggle-template-direct-link'; -import { - ZUpdateTemplateSettingsResponseSchema, - updateTemplateSettings, -} from '@documenso/lib/server-only/template/update-template-settings'; -import { extractNextApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import { duplicateTemplate } from '@documenso/lib/server-only/template/duplicate-template'; +import { findTemplates } from '@documenso/lib/server-only/template/find-templates'; +import { getTemplateById } from '@documenso/lib/server-only/template/get-template-by-id'; +import { moveTemplateToTeam } from '@documenso/lib/server-only/template/move-template-to-team'; +import { toggleTemplateDirectLink } from '@documenso/lib/server-only/template/toggle-template-direct-link'; +import { updateTemplate } from '@documenso/lib/server-only/template/update-template'; import type { Document } from '@documenso/prisma/client'; +import { ZGenericSuccessResponse, ZSuccessResponseSchema } from '../document-router/schema'; import { authenticatedProcedure, maybeAuthenticatedProcedure, router } from '../trpc'; import { - ZCreateDocumentFromDirectTemplateMutationSchema, - ZCreateDocumentFromTemplateMutationSchema, - ZCreateTemplateDirectLinkMutationSchema, + ZBulkSendTemplateMutationSchema, + ZCreateDocumentFromDirectTemplateRequestSchema, + ZCreateDocumentFromTemplateRequestSchema, + ZCreateDocumentFromTemplateResponseSchema, + ZCreateTemplateDirectLinkRequestSchema, + ZCreateTemplateDirectLinkResponseSchema, ZCreateTemplateMutationSchema, - ZDeleteTemplateDirectLinkMutationSchema, + ZDeleteTemplateDirectLinkRequestSchema, ZDeleteTemplateMutationSchema, ZDuplicateTemplateMutationSchema, - ZFindTemplatesQuerySchema, - ZGetTemplateByIdQuerySchema, - ZMoveTemplatesToTeamSchema, - ZSetSigningOrderForTemplateMutationSchema, - ZToggleTemplateDirectLinkMutationSchema, - ZUpdateTemplateSettingsMutationSchema, - ZUpdateTemplateTypedSignatureSettingsMutationSchema, + ZDuplicateTemplateResponseSchema, + ZFindTemplatesRequestSchema, + ZFindTemplatesResponseSchema, + ZGetTemplateByIdRequestSchema, + ZGetTemplateByIdResponseSchema, + ZMoveTemplateToTeamRequestSchema, + ZMoveTemplateToTeamResponseSchema, + ZToggleTemplateDirectLinkRequestSchema, + ZToggleTemplateDirectLinkResponseSchema, + ZUpdateTemplateRequestSchema, + ZUpdateTemplateResponseSchema, } from './schema'; export const templateRouter = router({ @@ -77,17 +59,20 @@ export const templateRouter = router({ .meta({ openapi: { method: 'GET', - path: '/template/find', + path: '/template', summary: 'Find templates', description: 'Find templates based on a search criteria', tags: ['Template'], }, }) - .input(ZFindTemplatesQuerySchema) + .input(ZFindTemplatesRequestSchema) .output(ZFindTemplatesResponseSchema) .query(async ({ input, ctx }) => { + const { teamId } = ctx; + return await findTemplates({ userId: ctx.user.id, + teamId, ...input, }); }), @@ -104,10 +89,11 @@ export const templateRouter = router({ tags: ['Template'], }, }) - .input(ZGetTemplateByIdQuerySchema) + .input(ZGetTemplateByIdRequestSchema) .output(ZGetTemplateByIdResponseSchema) .query(async ({ input, ctx }) => { - const { templateId, teamId } = input; + const { teamId } = ctx; + const { templateId } = input; return await getTemplateById({ id: templateId, @@ -117,22 +103,25 @@ export const templateRouter = router({ }), /** - * @public + * Wait until RR7 so we can passthrough documents. + * + * @private */ createTemplate: authenticatedProcedure - .meta({ - openapi: { - method: 'POST', - path: '/template/create', - summary: 'Create template', - description: 'Create a new template', - tags: ['Template'], - }, - }) + // .meta({ + // openapi: { + // method: 'POST', + // path: '/template/create', + // summary: 'Create template', + // description: 'Create a new template', + // tags: ['Template'], + // }, + // }) .input(ZCreateTemplateMutationSchema) .output(ZCreateTemplateResponseSchema) .mutation(async ({ input, ctx }) => { - const { teamId, title, templateDocumentDataId } = input; + const { teamId } = ctx; + const { title, templateDocumentDataId } = input; return await createTemplate({ userId: ctx.user.id, @@ -149,30 +138,25 @@ export const templateRouter = router({ .meta({ openapi: { method: 'POST', - path: '/template/{templateId}', + path: '/template/update', summary: 'Update template', tags: ['Template'], }, }) - .input(ZUpdateTemplateSettingsMutationSchema) - .output(ZUpdateTemplateSettingsResponseSchema) + .input(ZUpdateTemplateRequestSchema) + .output(ZUpdateTemplateResponseSchema) .mutation(async ({ input, ctx }) => { - const { templateId, teamId, data, meta } = input; + const { teamId } = ctx; + const { templateId, data, meta } = input; const userId = ctx.user.id; - const requestMetadata = extractNextApiRequestMetadata(ctx.req); - - return await updateTemplateSettings({ + return await updateTemplate({ userId, teamId, templateId, data, - meta: { - ...meta, - language: isValidLanguageCode(meta?.language) ? meta?.language : undefined, - }, - requestMetadata, + meta, }); }), @@ -183,7 +167,7 @@ export const templateRouter = router({ .meta({ openapi: { method: 'POST', - path: '/template/{templateId}/duplicate', + path: '/template/duplicate', summary: 'Duplicate template', tags: ['Template'], }, @@ -191,7 +175,8 @@ export const templateRouter = router({ .input(ZDuplicateTemplateMutationSchema) .output(ZDuplicateTemplateResponseSchema) .mutation(async ({ input, ctx }) => { - const { teamId, templateId } = input; + const { teamId } = ctx; + const { templateId } = input; return await duplicateTemplate({ userId: ctx.user.id, @@ -207,19 +192,22 @@ export const templateRouter = router({ .meta({ openapi: { method: 'POST', - path: '/template/{templateId}/delete', + path: '/template/delete', summary: 'Delete template', tags: ['Template'], }, }) .input(ZDeleteTemplateMutationSchema) - .output(z.void()) + .output(ZSuccessResponseSchema) .mutation(async ({ input, ctx }) => { - const { templateId, teamId } = input; + const { teamId } = ctx; + const { templateId } = input; const userId = ctx.user.id; await deleteTemplate({ userId, id: templateId, teamId }); + + return ZGenericSuccessResponse; }), /** @@ -229,16 +217,17 @@ export const templateRouter = router({ .meta({ openapi: { method: 'POST', - path: '/template/{templateId}/use', + path: '/template/use', summary: 'Use template', description: 'Use the template to create a document', tags: ['Template'], }, }) - .input(ZCreateDocumentFromTemplateMutationSchema) - .output(ZGetDocumentWithDetailsByIdResponseSchema) + .input(ZCreateDocumentFromTemplateRequestSchema) + .output(ZCreateDocumentFromTemplateResponseSchema) .mutation(async ({ ctx, input }) => { - const { templateId, teamId, recipients, distributeDocument, customDocumentDataId } = input; + const { teamId } = ctx; + const { templateId, recipients, distributeDocument, customDocumentDataId } = input; const limits = await getServerLimits({ email: ctx.user.email, teamId }); @@ -246,15 +235,13 @@ export const templateRouter = router({ throw new Error('You have reached your document limit.'); } - const requestMetadata = extractNextApiRequestMetadata(ctx.req); - const document: Document = await createDocumentFromTemplate({ templateId, teamId, userId: ctx.user.id, recipients, customDocumentDataId, - requestMetadata, + requestMetadata: ctx.metadata, }); if (distributeDocument) { @@ -262,7 +249,7 @@ export const templateRouter = router({ documentId: document.id, userId: ctx.user.id, teamId, - requestMetadata, + requestMetadata: ctx.metadata, }).catch((err) => { console.error(err); @@ -278,19 +265,21 @@ export const templateRouter = router({ }), /** - * @public + * Leaving this endpoint as private for now until there is a use case for it. + * + * @private */ createDocumentFromDirectTemplate: maybeAuthenticatedProcedure - .meta({ - openapi: { - method: 'POST', - path: '/template/use', - summary: 'Use direct template', - description: 'Use a direct template to create a document', - tags: ['Template'], - }, - }) - .input(ZCreateDocumentFromDirectTemplateMutationSchema) + // .meta({ + // openapi: { + // method: 'POST', + // path: '/template/direct/use', + // summary: 'Use direct template', + // description: 'Use a direct template to create a document', + // tags: ['Template'], + // }, + // }) + .input(ZCreateDocumentFromDirectTemplateRequestSchema) .output(ZCreateDocumentFromDirectTemplateResponseSchema) .mutation(async ({ input, ctx }) => { const { @@ -302,8 +291,6 @@ export const templateRouter = router({ templateUpdatedAt, } = input; - const requestMetadata = extractNextApiRequestMetadata(ctx.req); - return await createDocumentFromDirectTemplate({ directRecipientName, directRecipientEmail, @@ -318,25 +305,7 @@ export const templateRouter = router({ email: ctx.user.email, } : undefined, - requestMetadata, - }); - }), - - /** - * @private - */ - setSigningOrderForTemplate: authenticatedProcedure - .input(ZSetSigningOrderForTemplateMutationSchema) - .mutation(async ({ input, ctx }) => { - const { templateId, teamId, signingOrder } = input; - - return await updateTemplateSettings({ - templateId, - teamId, - data: {}, - meta: { signingOrder }, - userId: ctx.user.id, - requestMetadata: extractNextApiRequestMetadata(ctx.req), + requestMetadata: ctx.metadata, }); }), @@ -347,16 +316,17 @@ export const templateRouter = router({ .meta({ openapi: { method: 'POST', - path: '/template/{templateId}/direct/create', + path: '/template/direct/create', summary: 'Create direct link', description: 'Create a direct link for a template', tags: ['Template'], }, }) - .input(ZCreateTemplateDirectLinkMutationSchema) + .input(ZCreateTemplateDirectLinkRequestSchema) .output(ZCreateTemplateDirectLinkResponseSchema) .mutation(async ({ input, ctx }) => { - const { templateId, teamId, directRecipientId } = input; + const { teamId } = ctx; + const { templateId, directRecipientId } = input; const userId = ctx.user.id; @@ -370,7 +340,7 @@ export const templateRouter = router({ }); } - return await createTemplateDirectLink({ userId, templateId, directRecipientId }); + return await createTemplateDirectLink({ userId, teamId, templateId, directRecipientId }); }), /** @@ -380,20 +350,23 @@ export const templateRouter = router({ .meta({ openapi: { method: 'POST', - path: '/template/{templateId}/direct/delete', + path: '/template/direct/delete', summary: 'Delete direct link', description: 'Delete a direct link for a template', tags: ['Template'], }, }) - .input(ZDeleteTemplateDirectLinkMutationSchema) - .output(z.void()) + .input(ZDeleteTemplateDirectLinkRequestSchema) + .output(ZSuccessResponseSchema) .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; const { templateId } = input; const userId = ctx.user.id; - await deleteTemplateDirectLink({ userId, templateId }); + await deleteTemplateDirectLink({ userId, teamId, templateId }); + + return ZGenericSuccessResponse; }), /** @@ -403,20 +376,21 @@ export const templateRouter = router({ .meta({ openapi: { method: 'POST', - path: '/template/{templateId}/direct/toggle', + path: '/template/direct/toggle', summary: 'Toggle direct link', description: 'Enable or disable a direct link for a template', tags: ['Template'], }, }) - .input(ZToggleTemplateDirectLinkMutationSchema) + .input(ZToggleTemplateDirectLinkRequestSchema) .output(ZToggleTemplateDirectLinkResponseSchema) .mutation(async ({ input, ctx }) => { + const { teamId } = ctx; const { templateId, enabled } = input; const userId = ctx.user.id; - return await toggleTemplateDirectLink({ userId, templateId, enabled }); + return await toggleTemplateDirectLink({ userId, teamId, templateId, enabled }); }), /** @@ -426,13 +400,13 @@ export const templateRouter = router({ .meta({ openapi: { method: 'POST', - path: '/template/{templateId}/move', + path: '/template/move', summary: 'Move template', description: 'Move a template to a team', tags: ['Template'], }, }) - .input(ZMoveTemplatesToTeamSchema) + .input(ZMoveTemplateToTeamRequestSchema) .output(ZMoveTemplateToTeamResponseSchema) .mutation(async ({ input, ctx }) => { const { templateId, teamId } = input; @@ -448,16 +422,24 @@ export const templateRouter = router({ /** * @private */ - updateTemplateTypedSignatureSettings: authenticatedProcedure - .input(ZUpdateTemplateTypedSignatureSettingsMutationSchema) - .mutation(async ({ input, ctx }) => { - const { templateId, teamId, typedSignatureEnabled } = input; + uploadBulkSend: authenticatedProcedure + .input(ZBulkSendTemplateMutationSchema) + .mutation(async ({ ctx, input }) => { + const { templateId, teamId, csv, sendImmediately } = input; + const { user } = ctx; + + if (csv.length > 4 * 1024 * 1024) { + throw new TRPCError({ + code: 'BAD_REQUEST', + message: 'File size exceeds 4MB limit', + }); + } const template = await getTemplateById({ id: templateId, - userId: ctx.user.id, teamId, - }).catch(() => null); + userId: user.id, + }); if (!template) { throw new TRPCError({ @@ -466,15 +448,18 @@ export const templateRouter = router({ }); } - return await updateTemplateSettings({ - templateId, - teamId, - userId: ctx.user.id, - data: {}, - meta: { - typedSignatureEnabled, + await jobs.triggerJob({ + name: 'internal.bulk-send-template', + payload: { + userId: user.id, + teamId, + templateId, + csvContent: csv, + sendImmediately, + requestMetadata: ctx.metadata.requestMetadata, }, - requestMetadata: extractNextApiRequestMetadata(ctx.req), }); + + return { success: true }; }), }); diff --git a/packages/trpc/server/template-router/schema.ts b/packages/trpc/server/template-router/schema.ts index ac68926c1..78147fc6d 100644 --- a/packages/trpc/server/template-router/schema.ts +++ b/packages/trpc/server/template-router/schema.ts @@ -1,29 +1,38 @@ import { z } from 'zod'; -import { SUPPORTED_LANGUAGE_CODES } from '@documenso/lib/constants/i18n'; +import { ZDocumentSchema } from '@documenso/lib/types/document'; import { ZDocumentAccessAuthTypesSchema, ZDocumentActionAuthTypesSchema, } from '@documenso/lib/types/document-auth'; import { ZDocumentEmailSettingsSchema } from '@documenso/lib/types/document-email'; -import { ZFindSearchParamsSchema } from '@documenso/lib/types/search-params'; -import { isValidRedirectUrl } from '@documenso/lib/utils/is-valid-redirect-url'; +import { ZFindResultResponse, ZFindSearchParamsSchema } from '@documenso/lib/types/search-params'; import { - DocumentDistributionMethod, - DocumentSigningOrder, - DocumentVisibility, - TemplateType, -} from '@documenso/prisma/client'; + ZTemplateLiteSchema, + ZTemplateManySchema, + ZTemplateSchema, +} from '@documenso/lib/types/template'; +import { DocumentSigningOrder, DocumentVisibility, TemplateType } from '@documenso/prisma/client'; +import { TemplateDirectLinkSchema } from '@documenso/prisma/generated/zod'; +import { + ZDocumentMetaDateFormatSchema, + ZDocumentMetaDistributionMethodSchema, + ZDocumentMetaLanguageSchema, + ZDocumentMetaMessageSchema, + ZDocumentMetaRedirectUrlSchema, + ZDocumentMetaSubjectSchema, + ZDocumentMetaTimezoneSchema, + ZDocumentMetaTypedSignatureEnabledSchema, +} from '../document-router/schema'; import { ZSignFieldWithTokenMutationSchema } from '../field-router/schema'; export const ZCreateTemplateMutationSchema = z.object({ title: z.string().min(1).trim(), - teamId: z.number().optional(), templateDocumentDataId: z.string().min(1), }); -export const ZCreateDocumentFromDirectTemplateMutationSchema = z.object({ +export const ZCreateDocumentFromDirectTemplateRequestSchema = z.object({ directRecipientName: z.string().optional(), directRecipientEmail: z.string().email(), directTemplateToken: z.string().min(1), @@ -32,128 +41,161 @@ export const ZCreateDocumentFromDirectTemplateMutationSchema = z.object({ templateUpdatedAt: z.date(), }); -export const ZCreateDocumentFromTemplateMutationSchema = z.object({ +export const ZCreateDocumentFromTemplateRequestSchema = z.object({ templateId: z.number(), - teamId: z.number().optional(), recipients: z .array( z.object({ - id: z.number(), + id: z.number().describe('The ID of the recipient in the template.'), email: z.string().email(), name: z.string().optional(), }), ) + .describe('The information of the recipients to create the document with.') .refine((recipients) => { const emails = recipients.map((signer) => signer.email); + return new Set(emails).size === emails.length; }, 'Recipients must have unique emails'), - distributeDocument: z.boolean().optional(), - customDocumentDataId: z.string().optional(), + distributeDocument: z + .boolean() + .describe('Whether to create the document as pending and distribute it to recipients.') + .optional(), + customDocumentDataId: z + .string() + .describe( + 'The data ID of an alternative PDF to use when creating the document. If not provided, the PDF attached to the template will be used.', + ) + .optional(), }); +export const ZCreateDocumentFromTemplateResponseSchema = ZDocumentSchema; + export const ZDuplicateTemplateMutationSchema = z.object({ templateId: z.number(), - teamId: z.number().optional(), }); -export const ZCreateTemplateDirectLinkMutationSchema = z.object({ - templateId: z.number().min(1), - teamId: z.number().optional(), - directRecipientId: z.number().min(1).optional(), +export const ZDuplicateTemplateResponseSchema = ZTemplateLiteSchema; + +export const ZCreateTemplateDirectLinkRequestSchema = z.object({ + templateId: z.number(), + directRecipientId: z + .number() + .describe( + 'The of the recipient in the current template to transform into the primary recipient when the template is used.', + ) + .optional(), }); -export const ZDeleteTemplateDirectLinkMutationSchema = z.object({ - templateId: z.number().min(1), +const GenericDirectLinkResponseSchema = TemplateDirectLinkSchema.pick({ + id: true, + templateId: true, + token: true, + createdAt: true, + enabled: true, + directTemplateRecipientId: true, }); -export const ZToggleTemplateDirectLinkMutationSchema = z.object({ - templateId: z.number().min(1), +export const ZCreateTemplateDirectLinkResponseSchema = GenericDirectLinkResponseSchema; + +export const ZDeleteTemplateDirectLinkRequestSchema = z.object({ + templateId: z.number(), +}); + +export const ZToggleTemplateDirectLinkRequestSchema = z.object({ + templateId: z.number(), enabled: z.boolean(), }); +export const ZToggleTemplateDirectLinkResponseSchema = GenericDirectLinkResponseSchema; + export const ZDeleteTemplateMutationSchema = z.object({ - templateId: z.number().min(1), - teamId: z.number().optional(), + templateId: z.number(), }); export const MAX_TEMPLATE_PUBLIC_TITLE_LENGTH = 50; export const MAX_TEMPLATE_PUBLIC_DESCRIPTION_LENGTH = 256; -export const ZUpdateTemplateSettingsMutationSchema = z.object({ +export const ZUpdateTemplateRequestSchema = z.object({ templateId: z.number(), - teamId: z.number().min(1).optional(), - data: z.object({ - title: z.string().min(1).optional(), - externalId: z.string().nullish(), - visibility: z.nativeEnum(DocumentVisibility).optional(), - globalAccessAuth: ZDocumentAccessAuthTypesSchema.nullable().optional(), - globalActionAuth: ZDocumentActionAuthTypesSchema.nullable().optional(), - publicTitle: z.string().trim().min(1).max(MAX_TEMPLATE_PUBLIC_TITLE_LENGTH).optional(), - publicDescription: z - .string() - .trim() - .min(1) - .max(MAX_TEMPLATE_PUBLIC_DESCRIPTION_LENGTH) - .optional(), - type: z.nativeEnum(TemplateType).optional(), - language: z - .union([z.string(), z.enum(SUPPORTED_LANGUAGE_CODES)]) - .optional() - .default('en'), - }), + data: z + .object({ + title: z.string().min(1).optional(), + externalId: z.string().nullish(), + visibility: z.nativeEnum(DocumentVisibility).optional(), + globalAccessAuth: ZDocumentAccessAuthTypesSchema.nullable().optional(), + globalActionAuth: ZDocumentActionAuthTypesSchema.nullable().optional(), + publicTitle: z + .string() + .trim() + .min(1) + .max(MAX_TEMPLATE_PUBLIC_TITLE_LENGTH) + .describe( + 'The title of the template that will be displayed to the public. Only applicable for public templates.', + ) + .optional(), + publicDescription: z + .string() + .trim() + .min(1) + .max(MAX_TEMPLATE_PUBLIC_DESCRIPTION_LENGTH) + .describe( + 'The description of the template that will be displayed to the public. Only applicable for public templates.', + ) + .optional(), + type: z.nativeEnum(TemplateType).optional(), + }) + .optional(), meta: z .object({ - subject: z.string(), - message: z.string(), - timezone: z.string(), - dateFormat: z.string(), - distributionMethod: z.nativeEnum(DocumentDistributionMethod), - emailSettings: ZDocumentEmailSettingsSchema, - redirectUrl: z - .string() - .optional() - .refine((value) => value === undefined || value === '' || isValidRedirectUrl(value), { - message: - 'Please enter a valid URL, make sure you include http:// or https:// part of the url.', - }), - language: z.enum(SUPPORTED_LANGUAGE_CODES).optional(), - typedSignatureEnabled: z.boolean().optional(), + subject: ZDocumentMetaSubjectSchema.optional(), + message: ZDocumentMetaMessageSchema.optional(), + timezone: ZDocumentMetaTimezoneSchema.optional(), + dateFormat: ZDocumentMetaDateFormatSchema.optional(), + distributionMethod: ZDocumentMetaDistributionMethodSchema.optional(), + emailSettings: ZDocumentEmailSettingsSchema.optional(), + redirectUrl: ZDocumentMetaRedirectUrlSchema.optional(), + language: ZDocumentMetaLanguageSchema.optional(), + typedSignatureEnabled: ZDocumentMetaTypedSignatureEnabledSchema.optional(), + signingOrder: z.nativeEnum(DocumentSigningOrder).optional(), }) .optional(), }); -export const ZSetSigningOrderForTemplateMutationSchema = z.object({ +export const ZUpdateTemplateResponseSchema = ZTemplateLiteSchema; + +export const ZFindTemplatesRequestSchema = ZFindSearchParamsSchema.extend({ + type: z.nativeEnum(TemplateType).describe('Filter templates by type.').optional(), +}); + +export const ZFindTemplatesResponseSchema = ZFindResultResponse.extend({ + data: ZTemplateManySchema.array(), +}); + +export type TFindTemplatesResponse = z.infer; +export type FindTemplateRow = TFindTemplatesResponse['data'][number]; + +export const ZGetTemplateByIdRequestSchema = z.object({ + templateId: z.number(), +}); + +export const ZGetTemplateByIdResponseSchema = ZTemplateSchema; + +export const ZMoveTemplateToTeamRequestSchema = z.object({ + templateId: z.number().describe('The ID of the template to move to.'), + teamId: z.number().describe('The ID of the team to move the template to.'), +}); + +export const ZMoveTemplateToTeamResponseSchema = ZTemplateLiteSchema; + +export const ZBulkSendTemplateMutationSchema = z.object({ templateId: z.number(), teamId: z.number().optional(), - signingOrder: z.nativeEnum(DocumentSigningOrder), -}); - -export const ZFindTemplatesQuerySchema = ZFindSearchParamsSchema.extend({ - teamId: z.number().optional(), - type: z.nativeEnum(TemplateType).optional(), -}); - -export const ZGetTemplateByIdQuerySchema = z.object({ - templateId: z.number().min(1), - teamId: z.number().optional(), -}); - -export const ZMoveTemplatesToTeamSchema = z.object({ - templateId: z.number(), - teamId: z.number(), -}); - -export const ZUpdateTemplateTypedSignatureSettingsMutationSchema = z.object({ - templateId: z.number(), - teamId: z.number().optional(), - typedSignatureEnabled: z.boolean(), + csv: z.string().min(1), + sendImmediately: z.boolean(), }); export type TCreateTemplateMutationSchema = z.infer; -export type TCreateDocumentFromTemplateMutationSchema = z.infer< - typeof ZCreateDocumentFromTemplateMutationSchema ->; export type TDuplicateTemplateMutationSchema = z.infer; export type TDeleteTemplateMutationSchema = z.infer; -export type TGetTemplateByIdQuerySchema = z.infer; -export type TMoveTemplatesToSchema = z.infer; +export type TBulkSendTemplateMutationSchema = z.infer; diff --git a/packages/trpc/server/trpc.ts b/packages/trpc/server/trpc.ts index bbf08e854..0556be6c2 100644 --- a/packages/trpc/server/trpc.ts +++ b/packages/trpc/server/trpc.ts @@ -1,13 +1,35 @@ import { TRPCError, initTRPC } from '@trpc/server'; import SuperJSON from 'superjson'; -import type { OpenApiMeta } from 'trpc-openapi'; +import type { AnyZodObject } from 'zod'; import { AppError, genericErrorCodeToTrpcErrorCodeMap } from '@documenso/lib/errors/app-error'; import { isAdmin } from '@documenso/lib/next-auth/guards/is-admin'; import { getApiTokenByToken } from '@documenso/lib/server-only/public-api/get-api-token-by-token'; +import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import { extractNextApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; import type { TrpcContext } from './context'; +// Can't import type from trpc-to-openapi because it breaks nextjs build, not sure why. +type OpenApiMeta = { + openapi?: { + enabled?: boolean; + method: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE'; + path: `/${string}`; + summary?: string; + description?: string; + protect?: boolean; + tags?: string[]; + // eslint-disable-next-line @typescript-eslint/ban-types + contentTypes?: ('application/json' | 'application/x-www-form-urlencoded' | (string & {}))[]; + deprecated?: boolean; + requestHeaders?: AnyZodObject; + responseHeaders?: AnyZodObject; + successDescription?: string; + errorResponses?: number[] | Record; + }; +} & Record; + const t = initTRPC .meta() .context() @@ -62,8 +84,23 @@ export const authenticatedMiddleware = t.middleware(async ({ ctx, next }) => { ctx: { ...ctx, user: apiToken.user, + teamId: apiToken.teamId || undefined, session: null, - source: 'api', + metadata: { + ...ctx.metadata, + auditUser: apiToken.team + ? { + id: null, + email: null, + name: apiToken.team.name, + } + : { + id: apiToken.user.id, + email: apiToken.user.email, + name: apiToken.user.name, + }, + auth: 'api', + } satisfies ApiRequestMetadata, }, }); } @@ -71,7 +108,7 @@ export const authenticatedMiddleware = t.middleware(async ({ ctx, next }) => { if (!ctx.session) { throw new TRPCError({ code: 'UNAUTHORIZED', - message: 'You must be logged in to perform this action.', + message: 'Invalid session or API token.', }); } @@ -80,17 +117,39 @@ export const authenticatedMiddleware = t.middleware(async ({ ctx, next }) => { ...ctx, user: ctx.user, session: ctx.session, - source: 'app', + metadata: { + ...ctx.metadata, + auditUser: { + id: ctx.user.id, + name: ctx.user.name, + email: ctx.user.email, + }, + auth: 'session', + } satisfies ApiRequestMetadata, }, }); }); export const maybeAuthenticatedMiddleware = t.middleware(async ({ ctx, next }) => { + const requestMetadata = extractNextApiRequestMetadata(ctx.req); + return await next({ ctx: { ...ctx, user: ctx.user, session: ctx.session, + metadata: { + ...ctx.metadata, + auditUser: ctx.user + ? { + id: ctx.user.id, + name: ctx.user.name, + email: ctx.user.email, + } + : undefined, + requestMetadata, + auth: ctx.session ? 'session' : null, + } satisfies ApiRequestMetadata, }, }); }); @@ -117,6 +176,15 @@ export const adminMiddleware = t.middleware(async ({ ctx, next }) => { ...ctx, user: ctx.user, session: ctx.session, + metadata: { + ...ctx.metadata, + auditUser: { + id: ctx.user.id, + name: ctx.user.name, + email: ctx.user.email, + }, + auth: 'session', + } satisfies ApiRequestMetadata, }, }); }); diff --git a/packages/trpc/server/two-factor-authentication-router/router.ts b/packages/trpc/server/two-factor-authentication-router/router.ts index 5e4daab95..24f426caf 100644 --- a/packages/trpc/server/two-factor-authentication-router/router.ts +++ b/packages/trpc/server/two-factor-authentication-router/router.ts @@ -2,7 +2,6 @@ import { disableTwoFactorAuthentication } from '@documenso/lib/server-only/2fa/d import { enableTwoFactorAuthentication } from '@documenso/lib/server-only/2fa/enable-2fa'; import { setupTwoFactorAuthentication } from '@documenso/lib/server-only/2fa/setup-2fa'; import { viewBackupCodes } from '@documenso/lib/server-only/2fa/view-backup-codes'; -import { extractNextApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; import { authenticatedProcedure, router } from '../trpc'; import { @@ -28,7 +27,7 @@ export const twoFactorAuthenticationRouter = router({ return await enableTwoFactorAuthentication({ user, code, - requestMetadata: extractNextApiRequestMetadata(ctx.req), + requestMetadata: ctx.metadata.requestMetadata, }); }), @@ -41,7 +40,7 @@ export const twoFactorAuthenticationRouter = router({ user, totpCode: input.totpCode, backupCode: input.backupCode, - requestMetadata: extractNextApiRequestMetadata(ctx.req), + requestMetadata: ctx.metadata.requestMetadata, }); }), diff --git a/packages/ui/components/document/document-share-button.tsx b/packages/ui/components/document/document-share-button.tsx index bfaeb6afd..9d6a27b03 100644 --- a/packages/ui/components/document/document-share-button.tsx +++ b/packages/ui/components/document/document-share-button.tsx @@ -60,7 +60,7 @@ export const DocumentShareButton = ({ const { mutateAsync: createOrGetShareLink, data: shareLink, - isLoading: isCreatingOrGettingShareLink, + isPending: isCreatingOrGettingShareLink, } = trpc.shareLink.createOrGetShareLink.useMutation(); const isLoading = isCreatingOrGettingShareLink || isCopyingShareLink; diff --git a/packages/ui/package.json b/packages/ui/package.json index 858edca87..6fe04365f 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -23,7 +23,7 @@ "@types/react": "^18", "@types/react-dom": "^18", "react": "^18", - "typescript": "5.2.2" + "typescript": "5.6.2" }, "dependencies": { "@documenso/lib": "*", diff --git a/packages/ui/primitives/document-flow/add-settings.tsx b/packages/ui/primitives/document-flow/add-settings.tsx index c5882482d..0cc37d5a5 100644 --- a/packages/ui/primitives/document-flow/add-settings.tsx +++ b/packages/ui/primitives/document-flow/add-settings.tsx @@ -11,10 +11,10 @@ import { match } from 'ts-pattern'; import { DATE_FORMATS, DEFAULT_DOCUMENT_DATE_FORMAT } from '@documenso/lib/constants/date-formats'; import { SUPPORTED_LANGUAGES } from '@documenso/lib/constants/i18n'; import { DEFAULT_DOCUMENT_TIME_ZONE, TIME_ZONES } from '@documenso/lib/constants/time-zones'; +import type { TDocument } from '@documenso/lib/types/document'; import { extractDocumentAuthMethods } from '@documenso/lib/utils/document-auth'; import { DocumentVisibility, TeamMemberRole } from '@documenso/prisma/client'; import { DocumentStatus, type Field, type Recipient, SendStatus } from '@documenso/prisma/client'; -import type { DocumentWithData } from '@documenso/prisma/types/document-with-data'; import { DocumentGlobalAuthAccessSelect, DocumentGlobalAuthAccessTooltip, @@ -65,7 +65,7 @@ export type AddSettingsFormProps = { fields: Field[]; isDocumentEnterprise: boolean; isDocumentPdfLoaded: boolean; - document: DocumentWithData; + document: TDocument; currentTeamMemberRole?: TeamMemberRole; onSubmit: (_data: TAddSettingsFormSchema) => void; }; diff --git a/packages/ui/primitives/document-flow/add-settings.types.ts b/packages/ui/primitives/document-flow/add-settings.types.ts index dcdd98a72..1c0e1323e 100644 --- a/packages/ui/primitives/document-flow/add-settings.types.ts +++ b/packages/ui/primitives/document-flow/add-settings.types.ts @@ -9,6 +9,10 @@ import { } from '@documenso/lib/types/document-auth'; import { isValidRedirectUrl } from '@documenso/lib/utils/is-valid-redirect-url'; import { DocumentVisibility } from '@documenso/prisma/client'; +import { + ZDocumentMetaDateFormatSchema, + ZDocumentMetaTimezoneSchema, +} from '@documenso/trpc/server/document-router/schema'; export const ZMapNegativeOneToUndefinedSchema = z .string() @@ -32,8 +36,8 @@ export const ZAddSettingsFormSchema = z.object({ ZDocumentActionAuthTypesSchema.optional(), ), meta: z.object({ - timezone: z.string().optional().default(DEFAULT_DOCUMENT_TIME_ZONE), - dateFormat: z.string().optional().default(DEFAULT_DOCUMENT_DATE_FORMAT), + timezone: ZDocumentMetaTimezoneSchema.optional().default(DEFAULT_DOCUMENT_TIME_ZONE), + dateFormat: ZDocumentMetaDateFormatSchema.optional().default(DEFAULT_DOCUMENT_DATE_FORMAT), redirectUrl: z .string() .optional() diff --git a/packages/ui/primitives/document-flow/add-subject.tsx b/packages/ui/primitives/document-flow/add-subject.tsx index f98d21a28..24b976c32 100644 --- a/packages/ui/primitives/document-flow/add-subject.tsx +++ b/packages/ui/primitives/document-flow/add-subject.tsx @@ -7,6 +7,7 @@ import { AnimatePresence, motion } from 'framer-motion'; import { useForm } from 'react-hook-form'; import { RECIPIENT_ROLES_DESCRIPTION } from '@documenso/lib/constants/recipient-roles'; +import type { TDocument } from '@documenso/lib/types/document'; import { ZDocumentEmailSettingsSchema } from '@documenso/lib/types/document-email'; import { formatSigningLink } from '@documenso/lib/utils/recipients'; import type { Field, Recipient } from '@documenso/prisma/client'; @@ -15,7 +16,6 @@ import { DocumentStatus, RecipientRole, } from '@documenso/prisma/client'; -import type { DocumentWithData } from '@documenso/prisma/types/document-with-data'; import { DocumentSendEmailMessageHelper } from '@documenso/ui/components/document/document-send-email-message-helper'; import { Tabs, TabsList, TabsTrigger } from '@documenso/ui/primitives/tabs'; @@ -43,7 +43,7 @@ export type AddSubjectFormProps = { documentFlow: DocumentFlowStep; recipients: Recipient[]; fields: Field[]; - document: DocumentWithData; + document: TDocument; onSubmit: (_data: TAddSubjectFormSchema) => void; isDocumentPdfLoaded: boolean; }; diff --git a/packages/ui/primitives/document-flow/field-item-advanced-settings.tsx b/packages/ui/primitives/document-flow/field-item-advanced-settings.tsx index 6d0e12295..e30763a7f 100644 --- a/packages/ui/primitives/document-flow/field-item-advanced-settings.tsx +++ b/packages/ui/primitives/document-flow/field-item-advanced-settings.tsx @@ -2,9 +2,6 @@ import { forwardRef, useEffect, useState } from 'react'; -import { useParams } from 'next/navigation'; -import { usePathname } from 'next/navigation'; - import type { MessageDescriptor } from '@lingui/core'; import { msg } from '@lingui/macro'; import { useLingui } from '@lingui/react'; @@ -25,7 +22,6 @@ import { ZFieldMetaSchema, } from '@documenso/lib/types/field-meta'; import { FieldType } from '@documenso/prisma/client'; -import { trpc } from '@documenso/trpc/react'; import { useToast } from '@documenso/ui/primitives/use-toast'; import type { FieldFormType } from './add-fields'; @@ -75,21 +71,25 @@ const getDefaultState = (fieldType: FieldType): FieldMeta => { return { type: 'initials', fontSize: 14, + textAlign: 'left', }; case FieldType.NAME: return { type: 'name', fontSize: 14, + textAlign: 'left', }; case FieldType.EMAIL: return { type: 'email', fontSize: 14, + textAlign: 'left', }; case FieldType.DATE: return { type: 'date', fontSize: 14, + textAlign: 'left', }; case FieldType.TEXT: return { @@ -101,6 +101,7 @@ const getDefaultState = (fieldType: FieldType): FieldMeta => { fontSize: 14, required: false, readOnly: false, + textAlign: 'left', }; case FieldType.NUMBER: return { @@ -114,6 +115,7 @@ const getDefaultState = (fieldType: FieldType): FieldMeta => { required: false, readOnly: false, fontSize: 14, + textAlign: 'left', }; case FieldType.RADIO: return { @@ -146,50 +148,14 @@ const getDefaultState = (fieldType: FieldType): FieldMeta => { export const FieldAdvancedSettings = forwardRef( ( - { - title, - description, - field, - fields, - onAdvancedSettings, - isDocumentPdfLoaded = true, - onSave, - teamId, - }, + { title, description, field, fields, onAdvancedSettings, isDocumentPdfLoaded = true, onSave }, ref, ) => { const { _ } = useLingui(); const { toast } = useToast(); - const params = useParams(); - const pathname = usePathname(); - const id = params?.id; - const isTemplatePage = pathname?.includes('template'); - const isDocumentPage = pathname?.includes('document'); const [errors, setErrors] = useState([]); - const { data: template } = trpc.template.getTemplateById.useQuery( - { - templateId: Number(id), - teamId, - }, - { - enabled: isTemplatePage, - }, - ); - - const { data: document } = trpc.document.getDocumentById.useQuery( - { - documentId: Number(id), - teamId, - }, - { - enabled: isDocumentPage, - }, - ); - - const doesFieldExist = (!!document || !!template) && field.nativeId !== undefined; - const fieldMeta = field?.fieldMeta; const localStorageKey = `field_${field.formId}_${field.type}`; diff --git a/packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx b/packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx index c3108b20b..99fbba491 100644 --- a/packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx +++ b/packages/ui/primitives/document-flow/field-items-advanced-settings/date-field.tsx @@ -5,6 +5,13 @@ import { validateFields as validateDateFields } from '@documenso/lib/advanced-fi import { type TDateFieldMeta as DateFieldMeta } from '@documenso/lib/types/field-meta'; import { Input } from '@documenso/ui/primitives/input'; import { Label } from '@documenso/ui/primitives/label'; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@documenso/ui/primitives/select'; type DateFieldAdvancedSettingsProps = { fieldState: DateFieldMeta; @@ -66,6 +73,27 @@ export const DateFieldAdvancedSettings = ({ max={96} /> + +
    + + + +
    ); }; diff --git a/packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx b/packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx index 0b6c644eb..92ddafd3c 100644 --- a/packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx +++ b/packages/ui/primitives/document-flow/field-items-advanced-settings/email-field.tsx @@ -5,6 +5,13 @@ import { validateFields as validateEmailFields } from '@documenso/lib/advanced-f import { type TEmailFieldMeta as EmailFieldMeta } from '@documenso/lib/types/field-meta'; import { Input } from '@documenso/ui/primitives/input'; import { Label } from '@documenso/ui/primitives/label'; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@documenso/ui/primitives/select'; type EmailFieldAdvancedSettingsProps = { fieldState: EmailFieldMeta; @@ -48,6 +55,27 @@ export const EmailFieldAdvancedSettings = ({ max={96} /> + +
    + + + +
    ); }; diff --git a/packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx b/packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx index b117d0913..472d0c4ff 100644 --- a/packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx +++ b/packages/ui/primitives/document-flow/field-items-advanced-settings/initials-field.tsx @@ -6,6 +6,8 @@ import { type TInitialsFieldMeta as InitialsFieldMeta } from '@documenso/lib/typ import { Input } from '@documenso/ui/primitives/input'; import { Label } from '@documenso/ui/primitives/label'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../select'; + type InitialsFieldAdvancedSettingsProps = { fieldState: InitialsFieldMeta; handleFieldChange: (key: keyof InitialsFieldMeta, value: string | boolean) => void; @@ -48,6 +50,27 @@ export const InitialsFieldAdvancedSettings = ({ max={96} /> + +
    + + + +
    ); }; diff --git a/packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx b/packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx index d6159e0d5..e9b10e13c 100644 --- a/packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx +++ b/packages/ui/primitives/document-flow/field-items-advanced-settings/name-field.tsx @@ -5,6 +5,13 @@ import { validateFields as validateNameFields } from '@documenso/lib/advanced-fi import { type TNameFieldMeta as NameFieldMeta } from '@documenso/lib/types/field-meta'; import { Input } from '@documenso/ui/primitives/input'; import { Label } from '@documenso/ui/primitives/label'; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@documenso/ui/primitives/select'; type NameFieldAdvancedSettingsProps = { fieldState: NameFieldMeta; @@ -48,6 +55,27 @@ export const NameFieldAdvancedSettings = ({ max={96} /> + +
    + + + +
    ); }; diff --git a/packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx b/packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx index cf193c6e3..60d1cf538 100644 --- a/packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx +++ b/packages/ui/primitives/document-flow/field-items-advanced-settings/number-field.tsx @@ -38,12 +38,12 @@ export const NumberFieldAdvancedSettings = ({ const [showValidation, setShowValidation] = useState(false); const handleInput = (field: keyof NumberFieldMeta, value: string | boolean) => { - const userValue = field === 'value' ? value : fieldState.value ?? 0; + const userValue = field === 'value' ? value : (fieldState.value ?? 0); const userMinValue = field === 'minValue' ? Number(value) : Number(fieldState.minValue ?? 0); const userMaxValue = field === 'maxValue' ? Number(value) : Number(fieldState.maxValue ?? 0); const readOnly = field === 'readOnly' ? Boolean(value) : Boolean(fieldState.readOnly); const required = field === 'required' ? Boolean(value) : Boolean(fieldState.required); - const numberFormat = field === 'numberFormat' ? String(value) : fieldState.numberFormat ?? ''; + const numberFormat = field === 'numberFormat' ? String(value) : (fieldState.numberFormat ?? ''); const fontSize = field === 'fontSize' ? Number(value) : Number(fieldState.fontSize ?? 14); const valueErrors = validateNumberField(String(userValue), { @@ -135,6 +135,27 @@ export const NumberFieldAdvancedSettings = ({ /> +
    + + + +
    +
    { - const text = field === 'text' ? String(value) : fieldState.text ?? ''; + const text = field === 'text' ? String(value) : (fieldState.text ?? ''); const limit = field === 'characterLimit' ? Number(value) : Number(fieldState.characterLimit ?? 0); const fontSize = field === 'fontSize' ? Number(value) : Number(fieldState.fontSize ?? 14); @@ -112,6 +119,27 @@ export const TextFieldAdvancedSettings = ({ />
    +
    + + + +
    +
    { const { _ } = useLingui(); + const { toast } = useToast(); const { isWithinPageBounds, getFieldPosition, getPage } = useDocumentElement(); const { currentStep, totalSteps, previousStep } = useStep(); const [showAdvancedSettings, setShowAdvancedSettings] = useState(false); const [currentField, setCurrentField] = useState(); const [activeFieldId, setActiveFieldId] = useState(null); + const [lastActiveField, setLastActiveField] = useState< + TAddTemplateFieldsFormSchema['fields'][0] | null + >(null); + const [fieldClipboard, setFieldClipboard] = useState< + TAddTemplateFieldsFormSchema['fields'][0] | null + >(null); const form = useForm({ defaultValues: { @@ -126,25 +135,6 @@ export const AddTemplateFieldsFormPartial = ({ const onFormSubmit = form.handleSubmit(onSubmit); - const handleSavedFieldSettings = (fieldState: FieldMeta) => { - const initialValues = form.getValues(); - - const updatedFields = initialValues.fields.map((field) => { - if (field.formId === currentField?.formId) { - const parsedFieldMeta = ZFieldMetaSchema.parse(fieldState); - - return { - ...field, - fieldMeta: parsedFieldMeta, - }; - } - - return field; - }); - - form.setValue('fields', updatedFields); - }; - const { append, remove, @@ -164,6 +154,72 @@ export const AddTemplateFieldsFormPartial = ({ selectedSignerIndex === -1 ? 0 : selectedSignerIndex, ); + const onFieldCopy = useCallback( + (event?: KeyboardEvent | null, options?: { duplicate?: boolean }) => { + const { duplicate = false } = options ?? {}; + + if (lastActiveField) { + event?.preventDefault(); + + if (!duplicate) { + setFieldClipboard(lastActiveField); + + toast({ + title: 'Copied field', + description: 'Copied field to clipboard', + }); + + return; + } + + const newField: TAddTemplateFieldsFormSchema['fields'][0] = { + ...structuredClone(lastActiveField), + formId: nanoid(12), + signerEmail: selectedSigner?.email ?? lastActiveField.signerEmail, + signerId: selectedSigner?.id ?? lastActiveField.signerId, + signerToken: selectedSigner?.token ?? lastActiveField.signerToken, + pageX: lastActiveField.pageX + 3, + pageY: lastActiveField.pageY + 3, + }; + + append(newField); + } + }, + [ + append, + lastActiveField, + selectedSigner?.email, + selectedSigner?.id, + selectedSigner?.token, + toast, + ], + ); + + const onFieldPaste = useCallback( + (event: KeyboardEvent) => { + if (fieldClipboard) { + event.preventDefault(); + + const copiedField = structuredClone(fieldClipboard); + + append({ + ...copiedField, + formId: nanoid(12), + signerEmail: selectedSigner?.email ?? copiedField.signerEmail, + signerId: selectedSigner?.id ?? copiedField.signerId, + signerToken: selectedSigner?.token ?? copiedField.signerToken, + pageX: copiedField.pageX + 3, + pageY: copiedField.pageY + 3, + }); + } + }, + [append, fieldClipboard, selectedSigner?.email, selectedSigner?.id, selectedSigner?.token], + ); + + useHotkeys(['ctrl+c', 'meta+c'], (evt) => onFieldCopy(evt)); + useHotkeys(['ctrl+v', 'meta+v'], (evt) => onFieldPaste(evt)); + useHotkeys(['ctrl+d', 'meta+d'], (evt) => onFieldCopy(evt, { duplicate: true })); + const filterFieldsWithEmptyValues = (fields: typeof localFields, fieldType: string) => fields .filter((field) => field.type === fieldType) @@ -402,6 +458,25 @@ export const AddTemplateFieldsFormPartial = ({ setShowAdvancedSettings((prev) => !prev); }; + const handleSavedFieldSettings = (fieldState: FieldMeta) => { + const initialValues = form.getValues(); + + const updatedFields = initialValues.fields.map((field) => { + if (field.formId === currentField?.formId) { + const parsedFieldMeta = ZFieldMetaSchema.parse(fieldState); + + return { + ...field, + fieldMeta: parsedFieldMeta, + }; + } + + return field; + }); + + form.setValue('fields', updatedFields); + }; + const isTypedSignatureEnabled = form.watch('typedSignatureEnabled'); const handleTypedSignatureChange = (value: boolean) => { @@ -468,9 +543,12 @@ export const AddTemplateFieldsFormPartial = ({ defaultHeight={DEFAULT_HEIGHT_PX} defaultWidth={DEFAULT_WIDTH_PX} passive={isFieldWithinBounds && !!selectedField} + onFocus={() => setLastActiveField(field)} + onBlur={() => setLastActiveField(null)} onResize={(options) => onFieldResize(options, index)} onMove={(options) => onFieldMove(options, index)} onRemove={() => remove(index)} + onDuplicate={() => onFieldCopy(null, { duplicate: true })} onAdvancedSettings={() => { setCurrentField(field); handleAdvancedSettings(); diff --git a/packages/ui/primitives/template-flow/add-template-settings.tsx b/packages/ui/primitives/template-flow/add-template-settings.tsx index f0552343c..79117570d 100644 --- a/packages/ui/primitives/template-flow/add-template-settings.tsx +++ b/packages/ui/primitives/template-flow/add-template-settings.tsx @@ -14,10 +14,11 @@ import { DOCUMENT_DISTRIBUTION_METHODS } from '@documenso/lib/constants/document import { SUPPORTED_LANGUAGES } from '@documenso/lib/constants/i18n'; import { DEFAULT_DOCUMENT_TIME_ZONE, TIME_ZONES } from '@documenso/lib/constants/time-zones'; import { ZDocumentEmailSettingsSchema } from '@documenso/lib/types/document-email'; +import type { TTemplate } from '@documenso/lib/types/template'; import { extractDocumentAuthMethods } from '@documenso/lib/utils/document-auth'; import { DocumentVisibility, TeamMemberRole } from '@documenso/prisma/client'; import { DocumentDistributionMethod, type Field, type Recipient } from '@documenso/prisma/client'; -import type { TemplateWithData } from '@documenso/prisma/types/template'; +import type { TDocumentMetaDateFormat } from '@documenso/trpc/server/document-router/schema'; import { DocumentGlobalAuthAccessSelect, DocumentGlobalAuthAccessTooltip, @@ -71,7 +72,7 @@ export type AddTemplateSettingsFormProps = { fields: Field[]; isEnterprise: boolean; isDocumentPdfLoaded: boolean; - template: TemplateWithData; + template: TTemplate; currentTeamMemberRole?: TeamMemberRole; onSubmit: (_data: TAddTemplateSettingsFormSchema) => void; }; @@ -104,7 +105,9 @@ export const AddTemplateSettingsFormPartial = ({ subject: template.templateMeta?.subject ?? '', message: template.templateMeta?.message ?? '', timezone: template.templateMeta?.timezone ?? DEFAULT_DOCUMENT_TIME_ZONE, - dateFormat: template.templateMeta?.dateFormat ?? DEFAULT_DOCUMENT_DATE_FORMAT, + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + dateFormat: (template.templateMeta?.dateFormat ?? + DEFAULT_DOCUMENT_DATE_FORMAT) as TDocumentMetaDateFormat, distributionMethod: template.templateMeta?.distributionMethod || DocumentDistributionMethod.EMAIL, redirectUrl: template.templateMeta?.redirectUrl ?? '', diff --git a/packages/ui/primitives/template-flow/add-template-settings.types.tsx b/packages/ui/primitives/template-flow/add-template-settings.types.tsx index 855ed03c8..919fd46b3 100644 --- a/packages/ui/primitives/template-flow/add-template-settings.types.tsx +++ b/packages/ui/primitives/template-flow/add-template-settings.types.tsx @@ -10,6 +10,10 @@ import { import { ZDocumentEmailSettingsSchema } from '@documenso/lib/types/document-email'; import { isValidRedirectUrl } from '@documenso/lib/utils/is-valid-redirect-url'; import { DocumentVisibility } from '@documenso/prisma/client'; +import { + ZDocumentMetaDateFormatSchema, + ZDocumentMetaTimezoneSchema, +} from '@documenso/trpc/server/document-router/schema'; import { ZMapNegativeOneToUndefinedSchema } from '../document-flow/add-settings.types'; import { DocumentDistributionMethod } from '.prisma/client'; @@ -27,8 +31,8 @@ export const ZAddTemplateSettingsFormSchema = z.object({ meta: z.object({ subject: z.string(), message: z.string(), - timezone: z.string().optional().default(DEFAULT_DOCUMENT_TIME_ZONE), - dateFormat: z.string().optional().default(DEFAULT_DOCUMENT_DATE_FORMAT), + timezone: ZDocumentMetaTimezoneSchema.default(DEFAULT_DOCUMENT_TIME_ZONE), + dateFormat: ZDocumentMetaDateFormatSchema.default(DEFAULT_DOCUMENT_DATE_FORMAT), distributionMethod: z .nativeEnum(DocumentDistributionMethod) .optional()