Compare commits
14 Commits
feat/save-
...
v1.7.1-rc.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3da344fc5f | ||
|
|
404ca3202f | ||
|
|
c043fa9c06 | ||
|
|
9852e8971f | ||
|
|
5091112e4b | ||
|
|
e76f732990 | ||
|
|
b7c3deb6cd | ||
|
|
08114f7b97 | ||
|
|
6e368cc333 | ||
|
|
4ce4ca3f34 | ||
|
|
7644c0d855 | ||
|
|
fa6453e811 | ||
|
|
f7a20113e5 | ||
|
|
3d644db286 |
48
.cursorrules
Normal file
48
.cursorrules
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
Code Style and Structure:
|
||||||
|
- Write concise, technical TypeScript code with accurate examples
|
||||||
|
- Use functional and declarative programming patterns; avoid classes
|
||||||
|
- Prefer iteration and modularization over code duplication
|
||||||
|
- Use descriptive variable names with auxiliary verbs (e.g., isLoading, hasError)
|
||||||
|
- Structure files: exported component, subcomponents, helpers, static content, types
|
||||||
|
|
||||||
|
Naming Conventions:
|
||||||
|
- Use lowercase with dashes for directories (e.g., components/auth-wizard)
|
||||||
|
- Favor named exports for components
|
||||||
|
|
||||||
|
TypeScript Usage:
|
||||||
|
- Use TypeScript for all code; prefer interfaces over types
|
||||||
|
- Avoid enums; use maps instead
|
||||||
|
- Use functional components with TypeScript interfaces
|
||||||
|
|
||||||
|
Syntax and Formatting:
|
||||||
|
- Use the "function" keyword for pure functions
|
||||||
|
- Avoid unnecessary curly braces in conditionals; use concise syntax for simple statements
|
||||||
|
- Use declarative JSX
|
||||||
|
|
||||||
|
Error Handling and Validation:
|
||||||
|
- Prioritize error handling: handle errors and edge cases early
|
||||||
|
- Use early returns and guard clauses
|
||||||
|
- Implement proper error logging and user-friendly messages
|
||||||
|
- Use Zod for form validation
|
||||||
|
- Model expected errors as return values in Server Actions
|
||||||
|
- Use error boundaries for unexpected errors
|
||||||
|
|
||||||
|
UI and Styling:
|
||||||
|
- Use Shadcn UI, Radix, and Tailwind Aria for components and styling
|
||||||
|
- Implement responsive design with Tailwind CSS; use a mobile-first approach
|
||||||
|
|
||||||
|
Performance Optimization:
|
||||||
|
- Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC)
|
||||||
|
- Wrap client components in Suspense with fallback
|
||||||
|
- Use dynamic loading for non-critical components
|
||||||
|
- Optimize images: use WebP format, include size data, implement lazy loading
|
||||||
|
|
||||||
|
Key Conventions:
|
||||||
|
- Use 'nuqs' for URL search parameter state management
|
||||||
|
- Optimize Web Vitals (LCP, CLS, FID)
|
||||||
|
- Limit 'use client':
|
||||||
|
- Favor server components and Next.js SSR
|
||||||
|
- Use only for Web API access in small components
|
||||||
|
- Avoid for data fetching or state management
|
||||||
|
|
||||||
|
Follow Next.js docs for Data Fetching, Rendering, and Routing
|
||||||
@@ -10,6 +10,7 @@
|
|||||||
"signing-documents": "Signing Documents",
|
"signing-documents": "Signing Documents",
|
||||||
"templates": "Templates",
|
"templates": "Templates",
|
||||||
"direct-links": "Direct Signing Links",
|
"direct-links": "Direct Signing Links",
|
||||||
|
"document-visibility": "Document Visibility",
|
||||||
"-- Legal Overview": {
|
"-- Legal Overview": {
|
||||||
"type": "separator",
|
"type": "separator",
|
||||||
"title": "Legal Overview"
|
"title": "Legal Overview"
|
||||||
|
|||||||
18
apps/documentation/pages/users/document-visibility.mdx
Normal file
18
apps/documentation/pages/users/document-visibility.mdx
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
---
|
||||||
|
title: Document Visibility
|
||||||
|
description: Learn how to control the visibility of your team documents.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Team's Document Visibility
|
||||||
|
|
||||||
|
By default, all documents created in a team are visible to all team members. However, you can control the visibility of your documents by changing the document's visibility settings.
|
||||||
|
|
||||||
|
To set the visibility of a document, click on the **Document visibility** dropdown in the document's settings panel.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
The document visibility can be set to one of the following options:
|
||||||
|
|
||||||
|
- **Everyone** - The document is visible to all team members.
|
||||||
|
- **Managers and above** - The document is visible to people with the role of Manager or above.
|
||||||
|
- **Admin only** - The document is only visible to the team's admins.
|
||||||
BIN
apps/documentation/public/document-visibility-settings.webp
Normal file
BIN
apps/documentation/public/document-visibility-settings.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 72 KiB |
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@documenso/marketing",
|
"name": "@documenso/marketing",
|
||||||
"version": "1.7.1-rc.0",
|
"version": "1.7.1-rc.3",
|
||||||
"private": true,
|
"private": true,
|
||||||
"license": "AGPL-3.0",
|
"license": "AGPL-3.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -168,6 +168,7 @@ export const SinglePlayerClient = () => {
|
|||||||
sendStatus: 'NOT_SENT',
|
sendStatus: 'NOT_SENT',
|
||||||
role: 'SIGNER',
|
role: 'SIGNER',
|
||||||
authOptions: null,
|
authOptions: null,
|
||||||
|
signingOrder: null,
|
||||||
};
|
};
|
||||||
|
|
||||||
const onFileDrop = async (file: File) => {
|
const onFileDrop = async (file: File) => {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@documenso/web",
|
"name": "@documenso/web",
|
||||||
"version": "1.7.1-rc.0",
|
"version": "1.7.1-rc.3",
|
||||||
"private": true,
|
"private": true,
|
||||||
"license": "AGPL-3.0",
|
"license": "AGPL-3.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -12,10 +12,12 @@ import { getDocumentById } from '@documenso/lib/server-only/document/get-documen
|
|||||||
import { getServerComponentFlag } from '@documenso/lib/server-only/feature-flags/get-server-component-feature-flag';
|
import { getServerComponentFlag } from '@documenso/lib/server-only/feature-flags/get-server-component-feature-flag';
|
||||||
import { getFieldsForDocument } from '@documenso/lib/server-only/field/get-fields-for-document';
|
import { getFieldsForDocument } from '@documenso/lib/server-only/field/get-fields-for-document';
|
||||||
import { getRecipientsForDocument } from '@documenso/lib/server-only/recipient/get-recipients-for-document';
|
import { getRecipientsForDocument } from '@documenso/lib/server-only/recipient/get-recipients-for-document';
|
||||||
|
import { DocumentVisibility } from '@documenso/lib/types/document-visibility';
|
||||||
import { symmetricDecrypt } from '@documenso/lib/universal/crypto';
|
import { symmetricDecrypt } from '@documenso/lib/universal/crypto';
|
||||||
import { formatDocumentsPath } from '@documenso/lib/utils/teams';
|
import { formatDocumentsPath } from '@documenso/lib/utils/teams';
|
||||||
import { DocumentStatus } from '@documenso/prisma/client';
|
import { DocumentStatus } from '@documenso/prisma/client';
|
||||||
import type { Team, TeamEmail } from '@documenso/prisma/client';
|
import type { Team, TeamEmail } from '@documenso/prisma/client';
|
||||||
|
import { TeamMemberRole } from '@documenso/prisma/client';
|
||||||
import { Badge } from '@documenso/ui/primitives/badge';
|
import { Badge } from '@documenso/ui/primitives/badge';
|
||||||
import { Button } from '@documenso/ui/primitives/button';
|
import { Button } from '@documenso/ui/primitives/button';
|
||||||
import { Card, CardContent } from '@documenso/ui/primitives/card';
|
import { Card, CardContent } from '@documenso/ui/primitives/card';
|
||||||
@@ -39,7 +41,7 @@ export type DocumentPageViewProps = {
|
|||||||
params: {
|
params: {
|
||||||
id: string;
|
id: string;
|
||||||
};
|
};
|
||||||
team?: Team & { teamEmail: TeamEmail | null };
|
team?: Team & { teamEmail: TeamEmail | null } & { currentTeamMember: { role: TeamMemberRole } };
|
||||||
};
|
};
|
||||||
|
|
||||||
export const DocumentPageView = async ({ params, team }: DocumentPageViewProps) => {
|
export const DocumentPageView = async ({ params, team }: DocumentPageViewProps) => {
|
||||||
@@ -62,11 +64,35 @@ export const DocumentPageView = async ({ params, team }: DocumentPageViewProps)
|
|||||||
teamId: team?.id,
|
teamId: team?.id,
|
||||||
}).catch(() => null);
|
}).catch(() => null);
|
||||||
|
|
||||||
|
if (document?.teamId && !team?.url) {
|
||||||
|
redirect(documentRootPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
const documentVisibility = document?.visibility;
|
||||||
|
const currentTeamMemberRole = team?.currentTeamMember?.role;
|
||||||
|
const isRecipient = document?.Recipient.find((recipient) => recipient.email === user.email);
|
||||||
|
let canAccessDocument = true;
|
||||||
|
|
||||||
|
if (team && !isRecipient) {
|
||||||
|
canAccessDocument = match([documentVisibility, currentTeamMemberRole])
|
||||||
|
.with([DocumentVisibility.EVERYONE, TeamMemberRole.ADMIN], () => true)
|
||||||
|
.with([DocumentVisibility.EVERYONE, TeamMemberRole.MANAGER], () => true)
|
||||||
|
.with([DocumentVisibility.EVERYONE, TeamMemberRole.MEMBER], () => true)
|
||||||
|
.with([DocumentVisibility.MANAGER_AND_ABOVE, TeamMemberRole.ADMIN], () => true)
|
||||||
|
.with([DocumentVisibility.MANAGER_AND_ABOVE, TeamMemberRole.MANAGER], () => true)
|
||||||
|
.with([DocumentVisibility.ADMIN, TeamMemberRole.ADMIN], () => true)
|
||||||
|
.otherwise(() => false);
|
||||||
|
}
|
||||||
|
|
||||||
const isDocumentHistoryEnabled = await getServerComponentFlag(
|
const isDocumentHistoryEnabled = await getServerComponentFlag(
|
||||||
'app_document_page_view_history_sheet',
|
'app_document_page_view_history_sheet',
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!document || !document.documentData) {
|
if (!document || !document.documentData || (team && !canAccessDocument)) {
|
||||||
|
redirect(documentRootPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (team && !canAccessDocument) {
|
||||||
redirect(documentRootPath);
|
redirect(documentRootPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -85,6 +85,20 @@ export const EditDocumentForm = ({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const { mutateAsync: setSigningOrderForDocument } =
|
||||||
|
trpc.document.setSigningOrderForDocument.useMutation({
|
||||||
|
...DO_NOT_INVALIDATE_QUERY_ON_MUTATION,
|
||||||
|
onSuccess: (newData) => {
|
||||||
|
utils.document.getDocumentWithDetailsById.setData(
|
||||||
|
{
|
||||||
|
id: initialDocument.id,
|
||||||
|
teamId: team?.id,
|
||||||
|
},
|
||||||
|
(oldData) => ({ ...(oldData || initialDocument), ...newData, id: Number(newData.id) }),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
const { mutateAsync: addFields } = trpc.field.addFields.useMutation({
|
const { mutateAsync: addFields } = trpc.field.addFields.useMutation({
|
||||||
...DO_NOT_INVALIDATE_QUERY_ON_MUTATION,
|
...DO_NOT_INVALIDATE_QUERY_ON_MUTATION,
|
||||||
onSuccess: (newFields) => {
|
onSuccess: (newFields) => {
|
||||||
@@ -177,6 +191,7 @@ export const EditDocumentForm = ({
|
|||||||
data: {
|
data: {
|
||||||
title: data.title,
|
title: data.title,
|
||||||
externalId: data.externalId || null,
|
externalId: data.externalId || null,
|
||||||
|
visibility: data.visibility,
|
||||||
globalAccessAuth: data.globalAccessAuth ?? null,
|
globalAccessAuth: data.globalAccessAuth ?? null,
|
||||||
globalActionAuth: data.globalActionAuth ?? null,
|
globalActionAuth: data.globalActionAuth ?? null,
|
||||||
},
|
},
|
||||||
@@ -204,7 +219,13 @@ export const EditDocumentForm = ({
|
|||||||
|
|
||||||
const onAddSignersFormSubmit = async (data: TAddSignersFormSchema) => {
|
const onAddSignersFormSubmit = async (data: TAddSignersFormSchema) => {
|
||||||
try {
|
try {
|
||||||
await addSigners({
|
await Promise.all([
|
||||||
|
setSigningOrderForDocument({
|
||||||
|
documentId: document.id,
|
||||||
|
signingOrder: data.signingOrder,
|
||||||
|
}),
|
||||||
|
|
||||||
|
addSigners({
|
||||||
documentId: document.id,
|
documentId: document.id,
|
||||||
teamId: team?.id,
|
teamId: team?.id,
|
||||||
signers: data.signers.map((signer) => ({
|
signers: data.signers.map((signer) => ({
|
||||||
@@ -212,7 +233,8 @@ export const EditDocumentForm = ({
|
|||||||
// Explicitly set to null to indicate we want to remove auth if required.
|
// Explicitly set to null to indicate we want to remove auth if required.
|
||||||
actionAuth: signer.actionAuth || null,
|
actionAuth: signer.actionAuth || null,
|
||||||
})),
|
})),
|
||||||
});
|
}),
|
||||||
|
]);
|
||||||
|
|
||||||
// Router refresh is here to clear the router cache for when navigating to /documents.
|
// Router refresh is here to clear the router cache for when navigating to /documents.
|
||||||
router.refresh();
|
router.refresh();
|
||||||
@@ -339,6 +361,7 @@ export const EditDocumentForm = ({
|
|||||||
key={recipients.length}
|
key={recipients.length}
|
||||||
documentFlow={documentFlow.settings}
|
documentFlow={documentFlow.settings}
|
||||||
document={document}
|
document={document}
|
||||||
|
currentTeamMemberRole={team?.currentTeamMember?.role}
|
||||||
recipients={recipients}
|
recipients={recipients}
|
||||||
fields={fields}
|
fields={fields}
|
||||||
isDocumentEnterprise={isDocumentEnterprise}
|
isDocumentEnterprise={isDocumentEnterprise}
|
||||||
@@ -350,6 +373,7 @@ export const EditDocumentForm = ({
|
|||||||
key={recipients.length}
|
key={recipients.length}
|
||||||
documentFlow={documentFlow.signers}
|
documentFlow={documentFlow.signers}
|
||||||
recipients={recipients}
|
recipients={recipients}
|
||||||
|
signingOrder={document.documentMeta?.signingOrder}
|
||||||
fields={fields}
|
fields={fields}
|
||||||
isDocumentEnterprise={isDocumentEnterprise}
|
isDocumentEnterprise={isDocumentEnterprise}
|
||||||
onSubmit={onAddSignersFormSubmit}
|
onSubmit={onAddSignersFormSubmit}
|
||||||
|
|||||||
@@ -3,14 +3,17 @@ import { redirect } from 'next/navigation';
|
|||||||
|
|
||||||
import { Plural, Trans } from '@lingui/macro';
|
import { Plural, Trans } from '@lingui/macro';
|
||||||
import { ChevronLeft, Users2 } from 'lucide-react';
|
import { ChevronLeft, Users2 } from 'lucide-react';
|
||||||
|
import { match } from 'ts-pattern';
|
||||||
|
|
||||||
import { isUserEnterprise } from '@documenso/ee/server-only/util/is-document-enterprise';
|
import { isUserEnterprise } from '@documenso/ee/server-only/util/is-document-enterprise';
|
||||||
import { DOCUMENSO_ENCRYPTION_KEY } from '@documenso/lib/constants/crypto';
|
import { DOCUMENSO_ENCRYPTION_KEY } from '@documenso/lib/constants/crypto';
|
||||||
import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session';
|
import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session';
|
||||||
import { getDocumentWithDetailsById } from '@documenso/lib/server-only/document/get-document-with-details-by-id';
|
import { getDocumentWithDetailsById } from '@documenso/lib/server-only/document/get-document-with-details-by-id';
|
||||||
|
import { DocumentVisibility } from '@documenso/lib/types/document-visibility';
|
||||||
import { symmetricDecrypt } from '@documenso/lib/universal/crypto';
|
import { symmetricDecrypt } from '@documenso/lib/universal/crypto';
|
||||||
import { formatDocumentsPath } from '@documenso/lib/utils/teams';
|
import { formatDocumentsPath } from '@documenso/lib/utils/teams';
|
||||||
import type { Team } from '@documenso/prisma/client';
|
import type { Team } from '@documenso/prisma/client';
|
||||||
|
import { TeamMemberRole } from '@documenso/prisma/client';
|
||||||
import { DocumentStatus as InternalDocumentStatus } from '@documenso/prisma/client';
|
import { DocumentStatus as InternalDocumentStatus } from '@documenso/prisma/client';
|
||||||
|
|
||||||
import { EditDocumentForm } from '~/app/(dashboard)/documents/[id]/edit-document';
|
import { EditDocumentForm } from '~/app/(dashboard)/documents/[id]/edit-document';
|
||||||
@@ -21,7 +24,7 @@ export type DocumentEditPageViewProps = {
|
|||||||
params: {
|
params: {
|
||||||
id: string;
|
id: string;
|
||||||
};
|
};
|
||||||
team?: Team;
|
team?: Team & { currentTeamMember: { role: TeamMemberRole } };
|
||||||
};
|
};
|
||||||
|
|
||||||
export const DocumentEditPageView = async ({ params, team }: DocumentEditPageViewProps) => {
|
export const DocumentEditPageView = async ({ params, team }: DocumentEditPageViewProps) => {
|
||||||
@@ -43,10 +46,34 @@ export const DocumentEditPageView = async ({ params, team }: DocumentEditPageVie
|
|||||||
teamId: team?.id,
|
teamId: team?.id,
|
||||||
}).catch(() => null);
|
}).catch(() => null);
|
||||||
|
|
||||||
|
if (document?.teamId && !team?.url) {
|
||||||
|
redirect(documentRootPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
const documentVisibility = document?.visibility;
|
||||||
|
const currentTeamMemberRole = team?.currentTeamMember?.role;
|
||||||
|
const isRecipient = document?.Recipient.find((recipient) => recipient.email === user.email);
|
||||||
|
let canAccessDocument = true;
|
||||||
|
|
||||||
|
if (!isRecipient) {
|
||||||
|
canAccessDocument = match([documentVisibility, currentTeamMemberRole])
|
||||||
|
.with([DocumentVisibility.EVERYONE, TeamMemberRole.ADMIN], () => true)
|
||||||
|
.with([DocumentVisibility.EVERYONE, TeamMemberRole.MANAGER], () => true)
|
||||||
|
.with([DocumentVisibility.EVERYONE, TeamMemberRole.MEMBER], () => true)
|
||||||
|
.with([DocumentVisibility.MANAGER_AND_ABOVE, TeamMemberRole.ADMIN], () => true)
|
||||||
|
.with([DocumentVisibility.MANAGER_AND_ABOVE, TeamMemberRole.MANAGER], () => true)
|
||||||
|
.with([DocumentVisibility.ADMIN, TeamMemberRole.ADMIN], () => true)
|
||||||
|
.otherwise(() => false);
|
||||||
|
}
|
||||||
|
|
||||||
if (!document) {
|
if (!document) {
|
||||||
redirect(documentRootPath);
|
redirect(documentRootPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (team && !canAccessDocument) {
|
||||||
|
redirect(documentRootPath);
|
||||||
|
}
|
||||||
|
|
||||||
if (document.status === InternalDocumentStatus.COMPLETED) {
|
if (document.status === InternalDocumentStatus.COMPLETED) {
|
||||||
redirect(`${documentRootPath}/${documentId}`);
|
redirect(`${documentRootPath}/${documentId}`);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import type { GetStatsInput } from '@documenso/lib/server-only/document/get-stat
|
|||||||
import { getStats } from '@documenso/lib/server-only/document/get-stats';
|
import { getStats } from '@documenso/lib/server-only/document/get-stats';
|
||||||
import { parseToIntegerArray } from '@documenso/lib/utils/params';
|
import { parseToIntegerArray } from '@documenso/lib/utils/params';
|
||||||
import { formatDocumentsPath } from '@documenso/lib/utils/teams';
|
import { formatDocumentsPath } from '@documenso/lib/utils/teams';
|
||||||
import type { Team, TeamEmail } from '@documenso/prisma/client';
|
import type { Team, TeamEmail, TeamMemberRole } from '@documenso/prisma/client';
|
||||||
import { isExtendedDocumentStatus } from '@documenso/prisma/guards/is-extended-document-status';
|
import { isExtendedDocumentStatus } from '@documenso/prisma/guards/is-extended-document-status';
|
||||||
import { ExtendedDocumentStatus } from '@documenso/prisma/types/extended-document-status';
|
import { ExtendedDocumentStatus } from '@documenso/prisma/types/extended-document-status';
|
||||||
import { Avatar, AvatarFallback, AvatarImage } from '@documenso/ui/primitives/avatar';
|
import { Avatar, AvatarFallback, AvatarImage } from '@documenso/ui/primitives/avatar';
|
||||||
@@ -33,7 +33,7 @@ export type DocumentsPageViewProps = {
|
|||||||
perPage?: string;
|
perPage?: string;
|
||||||
senderIds?: string;
|
senderIds?: string;
|
||||||
};
|
};
|
||||||
team?: Team & { teamEmail?: TeamEmail | null };
|
team?: Team & { teamEmail?: TeamEmail | null } & { currentTeamMember?: { role: TeamMemberRole } };
|
||||||
};
|
};
|
||||||
|
|
||||||
export const DocumentsPageView = async ({ searchParams = {}, team }: DocumentsPageViewProps) => {
|
export const DocumentsPageView = async ({ searchParams = {}, team }: DocumentsPageViewProps) => {
|
||||||
@@ -47,6 +47,7 @@ export const DocumentsPageView = async ({ searchParams = {}, team }: DocumentsPa
|
|||||||
const currentTeam = team
|
const currentTeam = team
|
||||||
? { id: team.id, url: team.url, teamEmail: team.teamEmail?.email }
|
? { id: team.id, url: team.url, teamEmail: team.teamEmail?.email }
|
||||||
: undefined;
|
: undefined;
|
||||||
|
const currentTeamMemberRole = team?.currentTeamMember?.role;
|
||||||
|
|
||||||
const getStatOptions: GetStatsInput = {
|
const getStatOptions: GetStatsInput = {
|
||||||
user,
|
user,
|
||||||
@@ -58,6 +59,9 @@ export const DocumentsPageView = async ({ searchParams = {}, team }: DocumentsPa
|
|||||||
teamId: team.id,
|
teamId: team.id,
|
||||||
teamEmail: team.teamEmail?.email,
|
teamEmail: team.teamEmail?.email,
|
||||||
senderIds,
|
senderIds,
|
||||||
|
currentTeamMemberRole,
|
||||||
|
currentUserEmail: user.email,
|
||||||
|
userId: user.id,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ export const UserPasskeysDataTable = () => {
|
|||||||
cell: ({ row }) =>
|
cell: ({ row }) =>
|
||||||
row.original.lastUsedAt
|
row.original.lastUsedAt
|
||||||
? DateTime.fromJSDate(row.original.lastUsedAt).toRelative()
|
? DateTime.fromJSDate(row.original.lastUsedAt).toRelative()
|
||||||
: msg`Never`,
|
: _(msg`Never`),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'actions',
|
id: 'actions',
|
||||||
|
|||||||
@@ -103,6 +103,19 @@ export const EditTemplateForm = ({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const { mutateAsync: setSigningOrderForTemplate } =
|
||||||
|
trpc.template.setSigningOrderForTemplate.useMutation({
|
||||||
|
...DO_NOT_INVALIDATE_QUERY_ON_MUTATION,
|
||||||
|
onSuccess: (newData) => {
|
||||||
|
utils.template.getTemplateWithDetailsById.setData(
|
||||||
|
{
|
||||||
|
id: initialTemplate.id,
|
||||||
|
},
|
||||||
|
(oldData) => ({ ...(oldData || initialTemplate), ...newData }),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
const { mutateAsync: addTemplateFields } = trpc.field.addTemplateFields.useMutation({
|
const { mutateAsync: addTemplateFields } = trpc.field.addTemplateFields.useMutation({
|
||||||
...DO_NOT_INVALIDATE_QUERY_ON_MUTATION,
|
...DO_NOT_INVALIDATE_QUERY_ON_MUTATION,
|
||||||
onSuccess: (newData) => {
|
onSuccess: (newData) => {
|
||||||
@@ -160,11 +173,19 @@ export const EditTemplateForm = ({
|
|||||||
data: TAddTemplatePlacholderRecipientsFormSchema,
|
data: TAddTemplatePlacholderRecipientsFormSchema,
|
||||||
) => {
|
) => {
|
||||||
try {
|
try {
|
||||||
await addTemplateSigners({
|
await Promise.all([
|
||||||
|
setSigningOrderForTemplate({
|
||||||
|
templateId: template.id,
|
||||||
|
teamId: team?.id,
|
||||||
|
signingOrder: data.signingOrder,
|
||||||
|
}),
|
||||||
|
|
||||||
|
addTemplateSigners({
|
||||||
templateId: template.id,
|
templateId: template.id,
|
||||||
teamId: team?.id,
|
teamId: team?.id,
|
||||||
signers: data.signers,
|
signers: data.signers,
|
||||||
});
|
}),
|
||||||
|
]);
|
||||||
|
|
||||||
// Router refresh is here to clear the router cache for when navigating to /documents.
|
// Router refresh is here to clear the router cache for when navigating to /documents.
|
||||||
router.refresh();
|
router.refresh();
|
||||||
@@ -262,6 +283,7 @@ export const EditTemplateForm = ({
|
|||||||
documentFlow={documentFlow.signers}
|
documentFlow={documentFlow.signers}
|
||||||
recipients={recipients}
|
recipients={recipients}
|
||||||
fields={fields}
|
fields={fields}
|
||||||
|
signingOrder={template.templateMeta?.signingOrder}
|
||||||
templateDirectLink={template.directLink}
|
templateDirectLink={template.directLink}
|
||||||
onSubmit={onAddTemplatePlaceholderFormSubmit}
|
onSubmit={onAddTemplatePlaceholderFormSubmit}
|
||||||
isEnterprise={isEnterprise}
|
isEnterprise={isEnterprise}
|
||||||
|
|||||||
@@ -267,14 +267,14 @@ export const CheckboxField = ({
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
{field.inserted && (
|
{field.inserted && (
|
||||||
<div className="flex flex-col gap-y-2">
|
<div className="flex flex-col gap-y-1">
|
||||||
{values?.map((item: { id: number; value: string; checked: boolean }, index: number) => {
|
{values?.map((item: { id: number; value: string; checked: boolean }, index: number) => {
|
||||||
const itemValue = item.value || `empty-value-${item.id}`;
|
const itemValue = item.value || `empty-value-${item.id}`;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div key={index} className="flex items-center gap-x-1.5">
|
<div key={index} className="flex items-center gap-x-1.5">
|
||||||
<Checkbox
|
<Checkbox
|
||||||
className="h-4 w-4"
|
className="h-3 w-3"
|
||||||
checkClassName="text-white"
|
checkClassName="text-white"
|
||||||
id={`checkbox-${index}`}
|
id={`checkbox-${index}`}
|
||||||
checked={field.customText
|
checked={field.customText
|
||||||
@@ -283,7 +283,7 @@ export const CheckboxField = ({
|
|||||||
disabled={isLoading}
|
disabled={isLoading}
|
||||||
onCheckedChange={() => void handleCheckboxOptionClick(item)}
|
onCheckedChange={() => void handleCheckboxOptionClick(item)}
|
||||||
/>
|
/>
|
||||||
<Label htmlFor={`checkbox-${index}`}>
|
<Label htmlFor={`checkbox-${index}`} className="text-xs">
|
||||||
{item.value.includes('empty-value-') ? '' : item.value}
|
{item.value.includes('empty-value-') ? '' : item.value}
|
||||||
</Label>
|
</Label>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -204,14 +204,17 @@ export default async function CompletedSigningPage({
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div className="flex flex-col items-center">
|
||||||
{canSignUp && (
|
{canSignUp && (
|
||||||
<div className={`flex max-w-xl flex-col items-center justify-center p-4 md:p-12`}>
|
<div className="flex max-w-xl flex-col items-center justify-center p-4 md:p-12">
|
||||||
<h2 className="mt-8 text-center text-xl font-semibold md:mt-0">
|
<h2 className="mt-8 text-center text-xl font-semibold md:mt-0">
|
||||||
<Trans>Need to sign documents?</Trans>
|
<Trans>Need to sign documents?</Trans>
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<p className="text-muted-foreground/60 mt-4 max-w-[55ch] text-center leading-normal">
|
<p className="text-muted-foreground/60 mt-4 max-w-[55ch] text-center leading-normal">
|
||||||
<Trans>Create your account and start using state-of-the-art document signing.</Trans>
|
<Trans>
|
||||||
|
Create your account and start using state-of-the-art document signing.
|
||||||
|
</Trans>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<ClaimAccount defaultName={recipientName} defaultEmail={recipient.email} />
|
<ClaimAccount defaultName={recipientName} defaultEmail={recipient.email} />
|
||||||
@@ -219,11 +222,12 @@ export default async function CompletedSigningPage({
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
{isLoggedIn && (
|
{isLoggedIn && (
|
||||||
<Link href="/documents" className="text-documenso-700 hover:text-documenso-600 mt-36">
|
<Link href="/documents" className="text-documenso-700 hover:text-documenso-600">
|
||||||
<Trans>Go Back Home</Trans>
|
<Trans>Go Back Home</Trans>
|
||||||
</Link>
|
</Link>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<PollUntilDocumentCompleted document={document} />
|
<PollUntilDocumentCompleted document={document} />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -150,7 +150,7 @@ export const DateField = ({
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
{field.inserted && (
|
{field.inserted && (
|
||||||
<p className="text-muted-foreground dark:text-background/80 text-sm duration-200">
|
<p className="text-muted-foreground dark:text-background/80 text-[clamp(0.625rem,1cqw,0.825rem)] duration-200">
|
||||||
{localDateString}
|
{localDateString}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
|
|
||||||
|
import { useRouter } from 'next/navigation';
|
||||||
|
|
||||||
import { Trans } from '@lingui/macro';
|
import { Trans } from '@lingui/macro';
|
||||||
import { DateTime } from 'luxon';
|
|
||||||
import { signOut } from 'next-auth/react';
|
import { signOut } from 'next-auth/react';
|
||||||
|
|
||||||
import { RecipientRole } from '@documenso/prisma/client';
|
import { RecipientRole } from '@documenso/prisma/client';
|
||||||
import { trpc } from '@documenso/trpc/react';
|
|
||||||
import { Alert, AlertDescription } from '@documenso/ui/primitives/alert';
|
import { Alert, AlertDescription } from '@documenso/ui/primitives/alert';
|
||||||
import { Button } from '@documenso/ui/primitives/button';
|
import { Button } from '@documenso/ui/primitives/button';
|
||||||
import { DialogFooter } from '@documenso/ui/primitives/dialog';
|
import { DialogFooter } from '@documenso/ui/primitives/dialog';
|
||||||
@@ -25,22 +25,19 @@ export const DocumentActionAuthAccount = ({
|
|||||||
}: DocumentActionAuthAccountProps) => {
|
}: DocumentActionAuthAccountProps) => {
|
||||||
const { recipient } = useRequiredDocumentAuthContext();
|
const { recipient } = useRequiredDocumentAuthContext();
|
||||||
|
|
||||||
const [isSigningOut, setIsSigningOut] = useState(false);
|
const router = useRouter();
|
||||||
|
|
||||||
const { mutateAsync: encryptSecondaryData } = trpc.crypto.encryptSecondaryData.useMutation();
|
const [isSigningOut, setIsSigningOut] = useState(false);
|
||||||
|
|
||||||
const handleChangeAccount = async (email: string) => {
|
const handleChangeAccount = async (email: string) => {
|
||||||
try {
|
try {
|
||||||
setIsSigningOut(true);
|
setIsSigningOut(true);
|
||||||
|
|
||||||
const encryptedEmail = await encryptSecondaryData({
|
await signOut({
|
||||||
data: email,
|
redirect: false,
|
||||||
expiresAt: DateTime.now().plus({ days: 1 }).toMillis(),
|
|
||||||
});
|
});
|
||||||
|
|
||||||
await signOut({
|
router.push(`/signin#email=${email}`);
|
||||||
callbackUrl: `/signin?email=${encodeURIComponent(encryptedEmail)}`,
|
|
||||||
});
|
|
||||||
} catch {
|
} catch {
|
||||||
setIsSigningOut(false);
|
setIsSigningOut(false);
|
||||||
|
|
||||||
|
|||||||
@@ -189,7 +189,10 @@ export const DropdownField = ({
|
|||||||
},
|
},
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
<SelectValue placeholder={`${_(msg`Select`)}`} />
|
<SelectValue
|
||||||
|
className="text-[clamp(0.625rem,1cqw,0.825rem)]"
|
||||||
|
placeholder={`${_(msg`Select`)}`}
|
||||||
|
/>
|
||||||
</SelectTrigger>
|
</SelectTrigger>
|
||||||
<SelectContent className="w-full ring-0 focus:ring-0" position="popper">
|
<SelectContent className="w-full ring-0 focus:ring-0" position="popper">
|
||||||
{parsedFieldMeta?.values?.map((item, index) => (
|
{parsedFieldMeta?.values?.map((item, index) => (
|
||||||
@@ -203,7 +206,7 @@ export const DropdownField = ({
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
{field.inserted && (
|
{field.inserted && (
|
||||||
<p className="text-muted-foreground dark:text-background/80 flex items-center justify-center gap-x-1 duration-200">
|
<p className="text-muted-foreground dark:text-background/80 text-[clamp(0.625rem,1cqw,0.825rem)] duration-200">
|
||||||
{field.customText}
|
{field.customText}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ export const EmailField = ({ field, recipient, onSignField, onUnsignField }: Ema
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
{field.inserted && (
|
{field.inserted && (
|
||||||
<p className="text-muted-foreground dark:text-background/80 truncate duration-200">
|
<p className="text-muted-foreground dark:text-background/80 text-[clamp(0.625rem,1cqw,0.825rem)] duration-200">
|
||||||
{field.customText}
|
{field.customText}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -29,9 +29,16 @@ export type SigningFormProps = {
|
|||||||
recipient: Recipient;
|
recipient: Recipient;
|
||||||
fields: Field[];
|
fields: Field[];
|
||||||
redirectUrl?: string | null;
|
redirectUrl?: string | null;
|
||||||
|
isRecipientsTurn: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const SigningForm = ({ document, recipient, fields, redirectUrl }: SigningFormProps) => {
|
export const SigningForm = ({
|
||||||
|
document,
|
||||||
|
recipient,
|
||||||
|
fields,
|
||||||
|
redirectUrl,
|
||||||
|
isRecipientsTurn,
|
||||||
|
}: SigningFormProps) => {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const analytics = useAnalytics();
|
const analytics = useAnalytics();
|
||||||
const { data: session } = useSession();
|
const { data: session } = useSession();
|
||||||
@@ -150,6 +157,7 @@ export const SigningForm = ({ document, recipient, fields, redirectUrl }: Signin
|
|||||||
fields={fields}
|
fields={fields}
|
||||||
fieldsValidated={fieldsValidated}
|
fieldsValidated={fieldsValidated}
|
||||||
role={recipient.role}
|
role={recipient.role}
|
||||||
|
disabled={!isRecipientsTurn}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -213,6 +221,7 @@ export const SigningForm = ({ document, recipient, fields, redirectUrl }: Signin
|
|||||||
fields={fields}
|
fields={fields}
|
||||||
fieldsValidated={fieldsValidated}
|
fieldsValidated={fieldsValidated}
|
||||||
role={recipient.role}
|
role={recipient.role}
|
||||||
|
disabled={!isRecipientsTurn}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ export const InitialsField = ({
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
{field.inserted && (
|
{field.inserted && (
|
||||||
<p className="text-muted-foreground dark:text-background/80 truncate duration-200">
|
<p className="text-muted-foreground dark:text-background/80 text-[clamp(0.625rem,1cqw,0.825rem)] duration-200">
|
||||||
{field.customText}
|
{field.customText}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -172,7 +172,7 @@ export const NameField = ({ field, recipient, onSignField, onUnsignField }: Name
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
{field.inserted && (
|
{field.inserted && (
|
||||||
<p className="text-muted-foreground dark:text-background/80 truncate duration-200">
|
<p className="text-muted-foreground dark:text-background/80 text-[clamp(0.625rem,1cqw,0.825rem)] duration-200">
|
||||||
{field.customText}
|
{field.customText}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -259,7 +259,7 @@ export const NumberField = ({ field, recipient, onSignField, onUnsignField }: Nu
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
{field.inserted && (
|
{field.inserted && (
|
||||||
<p className="text-muted-foreground dark:text-background/80 flex items-center justify-center gap-x-1 duration-200">
|
<p className="text-muted-foreground dark:text-background/80 text-[clamp(0.625rem,1cqw,0.825rem)] duration-200">
|
||||||
{field.customText}
|
{field.customText}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
@@ -267,7 +267,7 @@ export const NumberField = ({ field, recipient, onSignField, onUnsignField }: Nu
|
|||||||
<Dialog open={showRadioModal} onOpenChange={setShowRadioModal}>
|
<Dialog open={showRadioModal} onOpenChange={setShowRadioModal}>
|
||||||
<DialogContent>
|
<DialogContent>
|
||||||
<DialogTitle>
|
<DialogTitle>
|
||||||
{parsedFieldMeta?.label ? parsedFieldMeta?.label : <Trans>Add number</Trans>}
|
{parsedFieldMeta?.label ? parsedFieldMeta?.label : <Trans>Number</Trans>}
|
||||||
</DialogTitle>
|
</DialogTitle>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import { isRecipientAuthorized } from '@documenso/lib/server-only/document/is-re
|
|||||||
import { viewedDocument } from '@documenso/lib/server-only/document/viewed-document';
|
import { viewedDocument } from '@documenso/lib/server-only/document/viewed-document';
|
||||||
import { getCompletedFieldsForToken } from '@documenso/lib/server-only/field/get-completed-fields-for-token';
|
import { getCompletedFieldsForToken } from '@documenso/lib/server-only/field/get-completed-fields-for-token';
|
||||||
import { getFieldsForToken } from '@documenso/lib/server-only/field/get-fields-for-token';
|
import { getFieldsForToken } from '@documenso/lib/server-only/field/get-fields-for-token';
|
||||||
|
import { getIsRecipientsTurnToSign } from '@documenso/lib/server-only/recipient/get-is-recipient-turn';
|
||||||
import { getRecipientByToken } from '@documenso/lib/server-only/recipient/get-recipient-by-token';
|
import { getRecipientByToken } from '@documenso/lib/server-only/recipient/get-recipient-by-token';
|
||||||
import { getRecipientSignatures } from '@documenso/lib/server-only/recipient/get-recipient-signatures';
|
import { getRecipientSignatures } from '@documenso/lib/server-only/recipient/get-recipient-signatures';
|
||||||
import { getUserByEmail } from '@documenso/lib/server-only/user/get-user-by-email';
|
import { getUserByEmail } from '@documenso/lib/server-only/user/get-user-by-email';
|
||||||
@@ -42,6 +43,12 @@ export default async function SigningPage({ params: { token } }: SigningPageProp
|
|||||||
|
|
||||||
const requestMetadata = extractNextHeaderRequestMetadata(requestHeaders);
|
const requestMetadata = extractNextHeaderRequestMetadata(requestHeaders);
|
||||||
|
|
||||||
|
const isRecipientsTurn = await getIsRecipientsTurnToSign({ token });
|
||||||
|
|
||||||
|
if (!isRecipientsTurn) {
|
||||||
|
return redirect(`/sign/${token}/waiting`);
|
||||||
|
}
|
||||||
|
|
||||||
const [document, fields, recipient, completedFields] = await Promise.all([
|
const [document, fields, recipient, completedFields] = await Promise.all([
|
||||||
getDocumentAndSenderByToken({
|
getDocumentAndSenderByToken({
|
||||||
token,
|
token,
|
||||||
@@ -146,6 +153,7 @@ export default async function SigningPage({ params: { token } }: SigningPageProp
|
|||||||
document={document}
|
document={document}
|
||||||
fields={fields}
|
fields={fields}
|
||||||
completedFields={completedFields}
|
completedFields={completedFields}
|
||||||
|
isRecipientsTurn={isRecipientsTurn}
|
||||||
/>
|
/>
|
||||||
</DocumentAuthProvider>
|
</DocumentAuthProvider>
|
||||||
</SigningProvider>
|
</SigningProvider>
|
||||||
|
|||||||
@@ -173,16 +173,16 @@ export const RadioField = ({ field, recipient, onSignField, onUnsignField }: Rad
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
{field.inserted && (
|
{field.inserted && (
|
||||||
<RadioGroup>
|
<RadioGroup className="gap-y-1">
|
||||||
{values?.map((item, index) => (
|
{values?.map((item, index) => (
|
||||||
<div key={index} className="flex items-center gap-x-1.5">
|
<div key={index} className="flex items-center gap-x-1.5">
|
||||||
<RadioGroupItem
|
<RadioGroupItem
|
||||||
className=""
|
className="h-3 w-3"
|
||||||
value={item.value}
|
value={item.value}
|
||||||
id={`option-${index}`}
|
id={`option-${index}`}
|
||||||
checked={item.value === field.customText}
|
checked={item.value === field.customText}
|
||||||
/>
|
/>
|
||||||
<Label htmlFor={`option-${index}`}>
|
<Label htmlFor={`option-${index}`} className="text-xs">
|
||||||
{item.value.includes('empty-value-') ? '' : item.value}
|
{item.value.includes('empty-value-') ? '' : item.value}
|
||||||
</Label>
|
</Label>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ export type SignDialogProps = {
|
|||||||
fieldsValidated: () => void | Promise<void>;
|
fieldsValidated: () => void | Promise<void>;
|
||||||
onSignatureComplete: () => void | Promise<void>;
|
onSignatureComplete: () => void | Promise<void>;
|
||||||
role: RecipientRole;
|
role: RecipientRole;
|
||||||
|
disabled?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const SignDialog = ({
|
export const SignDialog = ({
|
||||||
@@ -32,6 +33,7 @@ export const SignDialog = ({
|
|||||||
fieldsValidated,
|
fieldsValidated,
|
||||||
onSignatureComplete,
|
onSignatureComplete,
|
||||||
role,
|
role,
|
||||||
|
disabled = false,
|
||||||
}: SignDialogProps) => {
|
}: SignDialogProps) => {
|
||||||
const [showDialog, setShowDialog] = useState(false);
|
const [showDialog, setShowDialog] = useState(false);
|
||||||
const truncatedTitle = truncateTitle(documentTitle);
|
const truncatedTitle = truncateTitle(documentTitle);
|
||||||
@@ -54,6 +56,7 @@ export const SignDialog = ({
|
|||||||
size="lg"
|
size="lg"
|
||||||
onClick={fieldsValidated}
|
onClick={fieldsValidated}
|
||||||
loading={isSubmitting}
|
loading={isSubmitting}
|
||||||
|
disabled={disabled}
|
||||||
>
|
>
|
||||||
{isComplete ? <Trans>Complete</Trans> : <Trans>Next field</Trans>}
|
{isComplete ? <Trans>Complete</Trans> : <Trans>Next field</Trans>}
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@@ -2,12 +2,12 @@
|
|||||||
|
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
|
|
||||||
|
import { useRouter } from 'next/navigation';
|
||||||
|
|
||||||
import { Trans, msg } from '@lingui/macro';
|
import { Trans, msg } from '@lingui/macro';
|
||||||
import { useLingui } from '@lingui/react';
|
import { useLingui } from '@lingui/react';
|
||||||
import { DateTime } from 'luxon';
|
|
||||||
import { signOut } from 'next-auth/react';
|
import { signOut } from 'next-auth/react';
|
||||||
|
|
||||||
import { trpc } from '@documenso/trpc/react';
|
|
||||||
import { Button } from '@documenso/ui/primitives/button';
|
import { Button } from '@documenso/ui/primitives/button';
|
||||||
import { useToast } from '@documenso/ui/primitives/use-toast';
|
import { useToast } from '@documenso/ui/primitives/use-toast';
|
||||||
|
|
||||||
@@ -20,24 +20,19 @@ export const SigningAuthPageView = ({ email, emailHasAccount }: SigningAuthPageV
|
|||||||
const { _ } = useLingui();
|
const { _ } = useLingui();
|
||||||
const { toast } = useToast();
|
const { toast } = useToast();
|
||||||
|
|
||||||
const [isSigningOut, setIsSigningOut] = useState(false);
|
const router = useRouter();
|
||||||
|
|
||||||
const { mutateAsync: encryptSecondaryData } = trpc.crypto.encryptSecondaryData.useMutation();
|
const [isSigningOut, setIsSigningOut] = useState(false);
|
||||||
|
|
||||||
const handleChangeAccount = async (email: string) => {
|
const handleChangeAccount = async (email: string) => {
|
||||||
try {
|
try {
|
||||||
setIsSigningOut(true);
|
setIsSigningOut(true);
|
||||||
|
|
||||||
const encryptedEmail = await encryptSecondaryData({
|
await signOut({
|
||||||
data: email,
|
redirect: false,
|
||||||
expiresAt: DateTime.now().plus({ days: 1 }).toMillis(),
|
|
||||||
});
|
});
|
||||||
|
|
||||||
await signOut({
|
router.push(emailHasAccount ? `/signin#email=${email}` : `/signup#email=${email}`);
|
||||||
callbackUrl: emailHasAccount
|
|
||||||
? `/signin?email=${encodeURIComponent(encryptedEmail)}`
|
|
||||||
: `/signup?email=${encodeURIComponent(encryptedEmail)}`,
|
|
||||||
});
|
|
||||||
} catch {
|
} catch {
|
||||||
toast({
|
toast({
|
||||||
title: _(msg`Something went wrong`),
|
title: _(msg`Something went wrong`),
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ export const SigningFieldContainer = ({
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={cn(type === 'Checkbox' ? 'group' : '')}>
|
<div className={cn('[container-type:size]', type === 'Checkbox' ? 'group' : '')}>
|
||||||
<FieldRootContainer field={field}>
|
<FieldRootContainer field={field}>
|
||||||
{!field.inserted && !loading && !readOnlyField && (
|
{!field.inserted && !loading && !readOnlyField && (
|
||||||
<button
|
<button
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ export type SigningPageViewProps = {
|
|||||||
recipient: Recipient;
|
recipient: Recipient;
|
||||||
fields: Field[];
|
fields: Field[];
|
||||||
completedFields: CompletedField[];
|
completedFields: CompletedField[];
|
||||||
|
isRecipientsTurn: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const SigningPageView = ({
|
export const SigningPageView = ({
|
||||||
@@ -46,6 +47,7 @@ export const SigningPageView = ({
|
|||||||
recipient,
|
recipient,
|
||||||
fields,
|
fields,
|
||||||
completedFields,
|
completedFields,
|
||||||
|
isRecipientsTurn,
|
||||||
}: SigningPageViewProps) => {
|
}: SigningPageViewProps) => {
|
||||||
const { documentData, documentMeta } = document;
|
const { documentData, documentMeta } = document;
|
||||||
|
|
||||||
@@ -99,6 +101,7 @@ export const SigningPageView = ({
|
|||||||
recipient={recipient}
|
recipient={recipient}
|
||||||
fields={fields}
|
fields={fields}
|
||||||
redirectUrl={documentMeta?.redirectUrl}
|
redirectUrl={documentMeta?.redirectUrl}
|
||||||
|
isRecipientsTurn={isRecipientsTurn}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -253,7 +253,7 @@ export const TextField = ({ field, recipient, onSignField, onUnsignField }: Text
|
|||||||
>
|
>
|
||||||
<span className="flex items-center justify-center gap-x-1">
|
<span className="flex items-center justify-center gap-x-1">
|
||||||
<Type />
|
<Type />
|
||||||
{fieldDisplayName || <Trans>Add text</Trans>}
|
{fieldDisplayName || <Trans>Text</Trans>}
|
||||||
</span>
|
</span>
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
@@ -269,7 +269,7 @@ export const TextField = ({ field, recipient, onSignField, onUnsignField }: Text
|
|||||||
<Dialog open={showCustomTextModal} onOpenChange={setShowCustomTextModal}>
|
<Dialog open={showCustomTextModal} onOpenChange={setShowCustomTextModal}>
|
||||||
<DialogContent>
|
<DialogContent>
|
||||||
<DialogTitle>
|
<DialogTitle>
|
||||||
{parsedFieldMeta?.label ? parsedFieldMeta?.label : <Trans>Add Text</Trans>}
|
{parsedFieldMeta?.label ? parsedFieldMeta?.label : <Trans>Text</Trans>}
|
||||||
</DialogTitle>
|
</DialogTitle>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
100
apps/web/src/app/(signing)/sign/[token]/waiting/page.tsx
Normal file
100
apps/web/src/app/(signing)/sign/[token]/waiting/page.tsx
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
import Link from 'next/link';
|
||||||
|
import { notFound, redirect } from 'next/navigation';
|
||||||
|
|
||||||
|
import { Trans } from '@lingui/macro';
|
||||||
|
|
||||||
|
import { setupI18nSSR } from '@documenso/lib/client-only/providers/i18n.server';
|
||||||
|
import { getServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session';
|
||||||
|
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 { getRecipientByToken } from '@documenso/lib/server-only/recipient/get-recipient-by-token';
|
||||||
|
import { getTeamById } from '@documenso/lib/server-only/team/get-team';
|
||||||
|
import { formatDocumentsPath } from '@documenso/lib/utils/teams';
|
||||||
|
import type { Team } from '@documenso/prisma/client';
|
||||||
|
import { DocumentStatus } from '@documenso/prisma/client';
|
||||||
|
import { Button } from '@documenso/ui/primitives/button';
|
||||||
|
|
||||||
|
type WaitingForTurnToSignPageProps = {
|
||||||
|
params: { token?: string };
|
||||||
|
};
|
||||||
|
|
||||||
|
export default async function WaitingForTurnToSignPage({
|
||||||
|
params: { token },
|
||||||
|
}: WaitingForTurnToSignPageProps) {
|
||||||
|
setupI18nSSR();
|
||||||
|
|
||||||
|
if (!token) {
|
||||||
|
return notFound();
|
||||||
|
}
|
||||||
|
|
||||||
|
const { user } = await getServerComponentSession();
|
||||||
|
|
||||||
|
const [document, recipient] = await Promise.all([
|
||||||
|
getDocumentAndSenderByToken({ token }).catch(() => null),
|
||||||
|
getRecipientByToken({ token }).catch(() => null),
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (!document || !recipient) {
|
||||||
|
return notFound();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (document.status === DocumentStatus.COMPLETED) {
|
||||||
|
return redirect(`/sign/${token}/complete`);
|
||||||
|
}
|
||||||
|
|
||||||
|
let isOwnerOrTeamMember = false;
|
||||||
|
|
||||||
|
let team: Team | null = null;
|
||||||
|
|
||||||
|
if (user) {
|
||||||
|
isOwnerOrTeamMember = await getDocumentById({
|
||||||
|
id: document.id,
|
||||||
|
userId: user.id,
|
||||||
|
teamId: document.teamId ?? undefined,
|
||||||
|
})
|
||||||
|
.then((document) => !!document)
|
||||||
|
.catch(() => false);
|
||||||
|
|
||||||
|
if (document.teamId) {
|
||||||
|
team = await getTeamById({
|
||||||
|
userId: user.id,
|
||||||
|
teamId: document.teamId,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="relative flex flex-col items-center justify-center px-4 py-12 sm:px-6 lg:px-8">
|
||||||
|
<div className="w-full max-w-md text-center">
|
||||||
|
<h2 className="tracking-tigh text-3xl font-bold">
|
||||||
|
<Trans>Waiting for Your Turn</Trans>
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p className="text-muted-foreground mt-2 text-sm">
|
||||||
|
<Trans>
|
||||||
|
It's currently not your turn to sign. You will receive an email with instructions once
|
||||||
|
it's your turn to sign the document.
|
||||||
|
</Trans>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p className="text-muted-foreground mt-4 text-sm">
|
||||||
|
<Trans>Please check your email for updates.</Trans>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div className="mt-4">
|
||||||
|
{isOwnerOrTeamMember ? (
|
||||||
|
<Button variant="link" asChild>
|
||||||
|
<Link href={`${formatDocumentsPath(team?.url)}/${document.id}`}>
|
||||||
|
<Trans>Were you trying to edit this document instead?</Trans>
|
||||||
|
</Link>
|
||||||
|
</Button>
|
||||||
|
) : (
|
||||||
|
<Button variant="link" asChild>
|
||||||
|
<Link href="/documents">Return Home</Link>
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
import type { Metadata } from 'next';
|
import type { Metadata } from 'next';
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
import { redirect } from 'next/navigation';
|
|
||||||
|
|
||||||
import { Trans } from '@lingui/macro';
|
import { Trans } from '@lingui/macro';
|
||||||
import { env } from 'next-runtime-env';
|
import { env } from 'next-runtime-env';
|
||||||
@@ -11,7 +10,6 @@ import {
|
|||||||
IS_OIDC_SSO_ENABLED,
|
IS_OIDC_SSO_ENABLED,
|
||||||
OIDC_PROVIDER_LABEL,
|
OIDC_PROVIDER_LABEL,
|
||||||
} from '@documenso/lib/constants/auth';
|
} from '@documenso/lib/constants/auth';
|
||||||
import { decryptSecondaryData } from '@documenso/lib/server-only/crypto/decrypt';
|
|
||||||
|
|
||||||
import { SignInForm } from '~/components/forms/signin';
|
import { SignInForm } from '~/components/forms/signin';
|
||||||
|
|
||||||
@@ -19,24 +17,11 @@ export const metadata: Metadata = {
|
|||||||
title: 'Sign In',
|
title: 'Sign In',
|
||||||
};
|
};
|
||||||
|
|
||||||
type SignInPageProps = {
|
export default function SignInPage() {
|
||||||
searchParams: {
|
|
||||||
email?: string;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
export default function SignInPage({ searchParams }: SignInPageProps) {
|
|
||||||
setupI18nSSR();
|
setupI18nSSR();
|
||||||
|
|
||||||
const NEXT_PUBLIC_DISABLE_SIGNUP = env('NEXT_PUBLIC_DISABLE_SIGNUP');
|
const NEXT_PUBLIC_DISABLE_SIGNUP = env('NEXT_PUBLIC_DISABLE_SIGNUP');
|
||||||
|
|
||||||
const rawEmail = typeof searchParams.email === 'string' ? searchParams.email : undefined;
|
|
||||||
const email = rawEmail ? decryptSecondaryData(rawEmail) : null;
|
|
||||||
|
|
||||||
if (!email && rawEmail) {
|
|
||||||
redirect('/signin');
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="w-screen max-w-lg px-4">
|
<div className="w-screen max-w-lg px-4">
|
||||||
<div className="border-border dark:bg-background z-10 rounded-xl border bg-neutral-100 p-6">
|
<div className="border-border dark:bg-background z-10 rounded-xl border bg-neutral-100 p-6">
|
||||||
@@ -50,7 +35,6 @@ export default function SignInPage({ searchParams }: SignInPageProps) {
|
|||||||
<hr className="-mx-6 my-4" />
|
<hr className="-mx-6 my-4" />
|
||||||
|
|
||||||
<SignInForm
|
<SignInForm
|
||||||
initialEmail={email || undefined}
|
|
||||||
isGoogleSSOEnabled={IS_GOOGLE_SSO_ENABLED}
|
isGoogleSSOEnabled={IS_GOOGLE_SSO_ENABLED}
|
||||||
isOIDCSSOEnabled={IS_OIDC_SSO_ENABLED}
|
isOIDCSSOEnabled={IS_OIDC_SSO_ENABLED}
|
||||||
oidcProviderLabel={OIDC_PROVIDER_LABEL}
|
oidcProviderLabel={OIDC_PROVIDER_LABEL}
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import { env } from 'next-runtime-env';
|
|||||||
|
|
||||||
import { setupI18nSSR } from '@documenso/lib/client-only/providers/i18n.server';
|
import { setupI18nSSR } from '@documenso/lib/client-only/providers/i18n.server';
|
||||||
import { IS_GOOGLE_SSO_ENABLED, IS_OIDC_SSO_ENABLED } from '@documenso/lib/constants/auth';
|
import { IS_GOOGLE_SSO_ENABLED, IS_OIDC_SSO_ENABLED } from '@documenso/lib/constants/auth';
|
||||||
import { decryptSecondaryData } from '@documenso/lib/server-only/crypto/decrypt';
|
|
||||||
|
|
||||||
import { SignUpFormV2 } from '~/components/forms/v2/signup';
|
import { SignUpFormV2 } from '~/components/forms/v2/signup';
|
||||||
|
|
||||||
@@ -13,13 +12,7 @@ export const metadata: Metadata = {
|
|||||||
title: 'Sign Up',
|
title: 'Sign Up',
|
||||||
};
|
};
|
||||||
|
|
||||||
type SignUpPageProps = {
|
export default function SignUpPage() {
|
||||||
searchParams: {
|
|
||||||
email?: string;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
export default function SignUpPage({ searchParams }: SignUpPageProps) {
|
|
||||||
setupI18nSSR();
|
setupI18nSSR();
|
||||||
|
|
||||||
const NEXT_PUBLIC_DISABLE_SIGNUP = env('NEXT_PUBLIC_DISABLE_SIGNUP');
|
const NEXT_PUBLIC_DISABLE_SIGNUP = env('NEXT_PUBLIC_DISABLE_SIGNUP');
|
||||||
@@ -28,17 +21,9 @@ export default function SignUpPage({ searchParams }: SignUpPageProps) {
|
|||||||
redirect('/signin');
|
redirect('/signin');
|
||||||
}
|
}
|
||||||
|
|
||||||
const rawEmail = typeof searchParams.email === 'string' ? searchParams.email : undefined;
|
|
||||||
const email = rawEmail ? decryptSecondaryData(rawEmail) : null;
|
|
||||||
|
|
||||||
if (!email && rawEmail) {
|
|
||||||
redirect('/signup');
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SignUpFormV2
|
<SignUpFormV2
|
||||||
className="w-screen max-w-screen-2xl px-4 md:px-16 lg:-my-16"
|
className="w-screen max-w-screen-2xl px-4 md:px-16 lg:-my-16"
|
||||||
initialEmail={email || undefined}
|
|
||||||
isGoogleSSOEnabled={IS_GOOGLE_SSO_ENABLED}
|
isGoogleSSOEnabled={IS_GOOGLE_SSO_ENABLED}
|
||||||
isOIDCSSOEnabled={IS_OIDC_SSO_ENABLED}
|
isOIDCSSOEnabled={IS_OIDC_SSO_ENABLED}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
import { z } from 'zod';
|
import { z } from 'zod';
|
||||||
|
|
||||||
export const ZBaseEmbedDataSchema = z.object({
|
export const ZBaseEmbedDataSchema = z.object({
|
||||||
css: z.string().optional().transform(value => value || undefined),
|
css: z
|
||||||
|
.string()
|
||||||
|
.optional()
|
||||||
|
.transform((value) => value || undefined),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -18,15 +18,18 @@ export const EmbedDocumentCompleted = ({ name, signature }: EmbedDocumentComplet
|
|||||||
|
|
||||||
<div className="mt-8 w-full max-w-md">
|
<div className="mt-8 w-full max-w-md">
|
||||||
<SigningCard3D
|
<SigningCard3D
|
||||||
className='w-full mx-auto'
|
className="mx-auto w-full"
|
||||||
name={name || 'Documenso'}
|
name={name || 'Documenso'}
|
||||||
signature={signature}
|
signature={signature}
|
||||||
signingCelebrationImage={signingCelebration}
|
signingCelebrationImage={signingCelebration}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p className="mt-8 max-w-[50ch] text-center text-muted-foreground text-sm">
|
<p className="text-muted-foreground mt-8 max-w-[50ch] text-center text-sm">
|
||||||
<Trans>The document is now completed, please follow any instructions provided within the parent application.</Trans>
|
<Trans>
|
||||||
|
The document is now completed, please follow any instructions provided within the parent
|
||||||
|
application.
|
||||||
|
</Trans>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import { useSearchParams } from 'next/navigation';
|
|||||||
|
|
||||||
import { Trans, msg } from '@lingui/macro';
|
import { Trans, msg } from '@lingui/macro';
|
||||||
import { useLingui } from '@lingui/react';
|
import { useLingui } from '@lingui/react';
|
||||||
|
import { LucideChevronDown, LucideChevronUp } from 'lucide-react';
|
||||||
import { DateTime } from 'luxon';
|
import { DateTime } from 'luxon';
|
||||||
|
|
||||||
import { useThrottleFn } from '@documenso/lib/client-only/hooks/use-throttle-fn';
|
import { useThrottleFn } from '@documenso/lib/client-only/hooks/use-throttle-fn';
|
||||||
@@ -14,7 +15,7 @@ import { PDF_VIEWER_PAGE_SELECTOR } from '@documenso/lib/constants/pdf-viewer';
|
|||||||
import { DEFAULT_DOCUMENT_TIME_ZONE } from '@documenso/lib/constants/time-zones';
|
import { DEFAULT_DOCUMENT_TIME_ZONE } from '@documenso/lib/constants/time-zones';
|
||||||
import { validateFieldsInserted } from '@documenso/lib/utils/fields';
|
import { validateFieldsInserted } from '@documenso/lib/utils/fields';
|
||||||
import type { DocumentMeta, Recipient, TemplateMeta } from '@documenso/prisma/client';
|
import type { DocumentMeta, Recipient, TemplateMeta } from '@documenso/prisma/client';
|
||||||
import { FieldType, type DocumentData, type Field } from '@documenso/prisma/client';
|
import { type DocumentData, type Field, FieldType } from '@documenso/prisma/client';
|
||||||
import { trpc } from '@documenso/trpc/react';
|
import { trpc } from '@documenso/trpc/react';
|
||||||
import type {
|
import type {
|
||||||
TRemovedSignedFieldWithTokenMutationSchema,
|
TRemovedSignedFieldWithTokenMutationSchema,
|
||||||
@@ -34,7 +35,6 @@ import type { DirectTemplateLocalField } from '~/app/(recipient)/d/[token]/sign-
|
|||||||
import { useRequiredSigningContext } from '~/app/(signing)/sign/[token]/provider';
|
import { useRequiredSigningContext } from '~/app/(signing)/sign/[token]/provider';
|
||||||
import { Logo } from '~/components/branding/logo';
|
import { Logo } from '~/components/branding/logo';
|
||||||
|
|
||||||
import { LucideChevronDown, LucideChevronUp } from 'lucide-react';
|
|
||||||
import { EmbedClientLoading } from '../../client-loading';
|
import { EmbedClientLoading } from '../../client-loading';
|
||||||
import { EmbedDocumentCompleted } from '../../completed';
|
import { EmbedDocumentCompleted } from '../../completed';
|
||||||
import { EmbedDocumentFields } from '../../document-fields';
|
import { EmbedDocumentFields } from '../../document-fields';
|
||||||
@@ -307,7 +307,7 @@ export const EmbedDirectTemplateClientPage = ({
|
|||||||
<div className="relative mx-auto flex min-h-[100dvh] max-w-screen-lg flex-col items-center justify-center p-6">
|
<div className="relative mx-auto flex min-h-[100dvh] max-w-screen-lg flex-col items-center justify-center p-6">
|
||||||
{(!hasFinishedInit || !hasDocumentLoaded) && <EmbedClientLoading />}
|
{(!hasFinishedInit || !hasDocumentLoaded) && <EmbedClientLoading />}
|
||||||
|
|
||||||
<div className="relative flex flex-col md:flex-row w-full gap-x-6 gap-y-12">
|
<div className="relative flex w-full flex-col gap-x-6 gap-y-12 md:flex-row">
|
||||||
{/* Viewer */}
|
{/* Viewer */}
|
||||||
<div className="flex-1">
|
<div className="flex-1">
|
||||||
<LazyPDFViewer
|
<LazyPDFViewer
|
||||||
@@ -318,26 +318,26 @@ export const EmbedDirectTemplateClientPage = ({
|
|||||||
|
|
||||||
{/* Widget */}
|
{/* Widget */}
|
||||||
<div
|
<div
|
||||||
className="group/document-widget fixed md:sticky md:top-4 left-0 w-full bottom-8 px-6 md:px-0 z-50 md:z-auto md:w-[350px] flex-shrink-0 h-fit"
|
className="group/document-widget fixed bottom-8 left-0 z-50 h-fit w-full flex-shrink-0 px-6 md:sticky md:top-4 md:z-auto md:w-[350px] md:px-0"
|
||||||
data-expanded={isExpanded || undefined}
|
data-expanded={isExpanded || undefined}
|
||||||
>
|
>
|
||||||
<div className="w-full border-border bg-widget flex md:min-h-[min(calc(100dvh-2rem),48rem)] h-fit flex-col rounded-xl border px-4 py-4 md:py-6">
|
<div className="border-border bg-widget flex h-fit w-full flex-col rounded-xl border px-4 py-4 md:min-h-[min(calc(100dvh-2rem),48rem)] md:py-6">
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div>
|
<div>
|
||||||
<div className="flex items-center justify-between gap-x-2">
|
<div className="flex items-center justify-between gap-x-2">
|
||||||
<h3 className="text-foreground text-xl md:text-2xl font-semibold">
|
<h3 className="text-foreground text-xl font-semibold md:text-2xl">
|
||||||
<Trans>Sign document</Trans>
|
<Trans>Sign document</Trans>
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<Button variant="outline" className="h-8 w-8 p-0 md:hidden">
|
<Button variant="outline" className="h-8 w-8 p-0 md:hidden">
|
||||||
{isExpanded ? (
|
{isExpanded ? (
|
||||||
<LucideChevronDown
|
<LucideChevronDown
|
||||||
className="h-5 w-5 text-muted-foreground"
|
className="text-muted-foreground h-5 w-5"
|
||||||
onClick={() => setIsExpanded(false)}
|
onClick={() => setIsExpanded(false)}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
<LucideChevronUp
|
<LucideChevronUp
|
||||||
className="h-5 w-5 text-muted-foreground"
|
className="text-muted-foreground h-5 w-5"
|
||||||
onClick={() => setIsExpanded(true)}
|
onClick={() => setIsExpanded(true)}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
@@ -354,7 +354,7 @@ export const EmbedDirectTemplateClientPage = ({
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Form */}
|
{/* Form */}
|
||||||
<div className="-mx-2 px-2 hidden group-data-[expanded]/document-widget:block md:block">
|
<div className="-mx-2 hidden px-2 group-data-[expanded]/document-widget:block md:block">
|
||||||
<div className="flex flex-1 flex-col gap-y-4">
|
<div className="flex flex-1 flex-col gap-y-4">
|
||||||
<div>
|
<div>
|
||||||
<Label htmlFor="full-name">
|
<Label htmlFor="full-name">
|
||||||
@@ -408,9 +408,9 @@ export const EmbedDirectTemplateClientPage = ({
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex-1 hidden group-data-[expanded]/document-widget:block md:block" />
|
<div className="hidden flex-1 group-data-[expanded]/document-widget:block md:block" />
|
||||||
|
|
||||||
<div className="w-full grid-cols-2 items-center mt-4 hidden group-data-[expanded]/document-widget:grid md:grid">
|
<div className="mt-4 hidden w-full grid-cols-2 items-center group-data-[expanded]/document-widget:grid md:grid">
|
||||||
{pendingFields.length > 0 ? (
|
{pendingFields.length > 0 ? (
|
||||||
<Button className="col-start-2" onClick={() => onNextFieldClick()}>
|
<Button className="col-start-2" onClick={() => onNextFieldClick()}>
|
||||||
<Trans>Next</Trans>
|
<Trans>Next</Trans>
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
export default function EmbedDirectTemplateNotFound() {
|
export default function EmbedDirectTemplateNotFound() {
|
||||||
return <div>Not Found</div>
|
return <div>Not Found</div>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,11 +73,7 @@ export default async function EmbedDirectTemplatePage({ params }: EmbedDirectTem
|
|||||||
const fields = template.Field.filter((field) => field.recipientId === directTemplateRecipientId);
|
const fields = template.Field.filter((field) => field.recipientId === directTemplateRecipientId);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SigningProvider
|
<SigningProvider email={user?.email} fullName={user?.name} signature={user?.signature}>
|
||||||
email={user?.email}
|
|
||||||
fullName={user?.name}
|
|
||||||
signature={user?.signature}
|
|
||||||
>
|
|
||||||
<DocumentAuthProvider
|
<DocumentAuthProvider
|
||||||
documentAuthOptions={template.authOptions}
|
documentAuthOptions={template.authOptions}
|
||||||
recipient={recipient}
|
recipient={recipient}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import {
|
|||||||
ZTextFieldMeta,
|
ZTextFieldMeta,
|
||||||
} from '@documenso/lib/types/field-meta';
|
} from '@documenso/lib/types/field-meta';
|
||||||
import type { DocumentMeta, Recipient, TemplateMeta } from '@documenso/prisma/client';
|
import type { DocumentMeta, Recipient, TemplateMeta } from '@documenso/prisma/client';
|
||||||
import { FieldType, type Field } from '@documenso/prisma/client';
|
import { type Field, FieldType } from '@documenso/prisma/client';
|
||||||
import type { FieldWithSignatureAndFieldMeta } from '@documenso/prisma/types/field-with-signature-and-fieldmeta';
|
import type { FieldWithSignatureAndFieldMeta } from '@documenso/prisma/types/field-with-signature-and-fieldmeta';
|
||||||
import type {
|
import type {
|
||||||
TRemovedSignedFieldWithTokenMutationSchema,
|
TRemovedSignedFieldWithTokenMutationSchema,
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
export const EmbedPaywall = () => {
|
export const EmbedPaywall = () => {
|
||||||
return <div>
|
return (
|
||||||
|
<div>
|
||||||
<h1>Paywall</h1>
|
<h1>Paywall</h1>
|
||||||
</div>
|
</div>
|
||||||
}
|
);
|
||||||
|
};
|
||||||
|
|||||||
@@ -1,15 +1,17 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
|
import { useEffect, useState } from 'react';
|
||||||
|
|
||||||
|
import { Trans, msg } from '@lingui/macro';
|
||||||
|
import { useLingui } from '@lingui/react';
|
||||||
|
import { LucideChevronDown, LucideChevronUp } from 'lucide-react';
|
||||||
|
|
||||||
import { useThrottleFn } from '@documenso/lib/client-only/hooks/use-throttle-fn';
|
import { useThrottleFn } from '@documenso/lib/client-only/hooks/use-throttle-fn';
|
||||||
import { PDF_VIEWER_PAGE_SELECTOR } from '@documenso/lib/constants/pdf-viewer';
|
import { PDF_VIEWER_PAGE_SELECTOR } from '@documenso/lib/constants/pdf-viewer';
|
||||||
import { validateFieldsInserted } from '@documenso/lib/utils/fields';
|
import { validateFieldsInserted } from '@documenso/lib/utils/fields';
|
||||||
import type { DocumentMeta, Recipient, TemplateMeta } from '@documenso/prisma/client';
|
import type { DocumentMeta, Recipient, TemplateMeta } from '@documenso/prisma/client';
|
||||||
import { type DocumentData, type Field } from '@documenso/prisma/client';
|
import { type DocumentData, type Field } from '@documenso/prisma/client';
|
||||||
import { trpc } from '@documenso/trpc/react';
|
import { trpc } from '@documenso/trpc/react';
|
||||||
import { Trans, msg } from '@lingui/macro';
|
|
||||||
import { useLingui } from '@lingui/react';
|
|
||||||
import { useEffect, useState } from 'react';
|
|
||||||
|
|
||||||
import { FieldToolTip } from '@documenso/ui/components/field/field-tooltip';
|
import { FieldToolTip } from '@documenso/ui/components/field/field-tooltip';
|
||||||
import { Button } from '@documenso/ui/primitives/button';
|
import { Button } from '@documenso/ui/primitives/button';
|
||||||
import { Card, CardContent } from '@documenso/ui/primitives/card';
|
import { Card, CardContent } from '@documenso/ui/primitives/card';
|
||||||
@@ -20,9 +22,9 @@ import { LazyPDFViewer } from '@documenso/ui/primitives/lazy-pdf-viewer';
|
|||||||
import { SignaturePad } from '@documenso/ui/primitives/signature-pad';
|
import { SignaturePad } from '@documenso/ui/primitives/signature-pad';
|
||||||
import { useToast } from '@documenso/ui/primitives/use-toast';
|
import { useToast } from '@documenso/ui/primitives/use-toast';
|
||||||
|
|
||||||
import { LucideChevronDown, LucideChevronUp } from 'lucide-react';
|
|
||||||
import { useRequiredSigningContext } from '~/app/(signing)/sign/[token]/provider';
|
import { useRequiredSigningContext } from '~/app/(signing)/sign/[token]/provider';
|
||||||
import { Logo } from '~/components/branding/logo';
|
import { Logo } from '~/components/branding/logo';
|
||||||
|
|
||||||
import { EmbedClientLoading } from '../../client-loading';
|
import { EmbedClientLoading } from '../../client-loading';
|
||||||
import { EmbedDocumentCompleted } from '../../completed';
|
import { EmbedDocumentCompleted } from '../../completed';
|
||||||
import { EmbedDocumentFields } from '../../document-fields';
|
import { EmbedDocumentFields } from '../../document-fields';
|
||||||
@@ -185,7 +187,7 @@ export const EmbedSignDocumentClientPage = ({
|
|||||||
<div className="relative mx-auto flex min-h-[100dvh] max-w-screen-lg flex-col items-center justify-center p-6">
|
<div className="relative mx-auto flex min-h-[100dvh] max-w-screen-lg flex-col items-center justify-center p-6">
|
||||||
{(!hasFinishedInit || !hasDocumentLoaded) && <EmbedClientLoading />}
|
{(!hasFinishedInit || !hasDocumentLoaded) && <EmbedClientLoading />}
|
||||||
|
|
||||||
<div className="relative flex flex-col md:flex-row w-full gap-x-6 gap-y-12">
|
<div className="relative flex w-full flex-col gap-x-6 gap-y-12 md:flex-row">
|
||||||
{/* Viewer */}
|
{/* Viewer */}
|
||||||
<div className="flex-1">
|
<div className="flex-1">
|
||||||
<LazyPDFViewer
|
<LazyPDFViewer
|
||||||
@@ -196,26 +198,26 @@ export const EmbedSignDocumentClientPage = ({
|
|||||||
|
|
||||||
{/* Widget */}
|
{/* Widget */}
|
||||||
<div
|
<div
|
||||||
className="group/document-widget fixed md:sticky md:top-4 left-0 w-full bottom-8 px-6 md:px-0 z-50 md:z-auto md:w-[350px] flex-shrink-0 h-fit"
|
className="group/document-widget fixed bottom-8 left-0 z-50 h-fit w-full flex-shrink-0 px-6 md:sticky md:top-4 md:z-auto md:w-[350px] md:px-0"
|
||||||
data-expanded={isExpanded || undefined}
|
data-expanded={isExpanded || undefined}
|
||||||
>
|
>
|
||||||
<div className="w-full border-border bg-widget flex flex-col rounded-xl border px-4 py-4 md:py-6">
|
<div className="border-border bg-widget flex w-full flex-col rounded-xl border px-4 py-4 md:py-6">
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div>
|
<div>
|
||||||
<div className="flex items-center justify-between gap-x-2">
|
<div className="flex items-center justify-between gap-x-2">
|
||||||
<h3 className="text-foreground text-xl md:text-2xl font-semibold">
|
<h3 className="text-foreground text-xl font-semibold md:text-2xl">
|
||||||
<Trans>Sign document</Trans>
|
<Trans>Sign document</Trans>
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<Button variant="outline" className="h-8 w-8 p-0 md:hidden">
|
<Button variant="outline" className="h-8 w-8 p-0 md:hidden">
|
||||||
{isExpanded ? (
|
{isExpanded ? (
|
||||||
<LucideChevronDown
|
<LucideChevronDown
|
||||||
className="h-5 w-5 text-muted-foreground"
|
className="text-muted-foreground h-5 w-5"
|
||||||
onClick={() => setIsExpanded(false)}
|
onClick={() => setIsExpanded(false)}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
<LucideChevronUp
|
<LucideChevronUp
|
||||||
className="h-5 w-5 text-muted-foreground"
|
className="text-muted-foreground h-5 w-5"
|
||||||
onClick={() => setIsExpanded(true)}
|
onClick={() => setIsExpanded(true)}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
@@ -232,7 +234,7 @@ export const EmbedSignDocumentClientPage = ({
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Form */}
|
{/* Form */}
|
||||||
<div className="-mx-2 px-2 hidden group-data-[expanded]/document-widget:block md:block">
|
<div className="-mx-2 hidden px-2 group-data-[expanded]/document-widget:block md:block">
|
||||||
<div className="flex flex-1 flex-col gap-y-4">
|
<div className="flex flex-1 flex-col gap-y-4">
|
||||||
<div>
|
<div>
|
||||||
<Label htmlFor="full-name">
|
<Label htmlFor="full-name">
|
||||||
@@ -285,9 +287,9 @@ export const EmbedSignDocumentClientPage = ({
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex-1 hidden group-data-[expanded]/document-widget:block md:block" />
|
<div className="hidden flex-1 group-data-[expanded]/document-widget:block md:block" />
|
||||||
|
|
||||||
<div className="w-full grid-cols-2 items-center mt-4 hidden group-data-[expanded]/document-widget:grid md:grid">
|
<div className="mt-4 hidden w-full grid-cols-2 items-center group-data-[expanded]/document-widget:grid md:grid">
|
||||||
{pendingFields.length > 0 ? (
|
{pendingFields.length > 0 ? (
|
||||||
<Button className="col-start-2" onClick={() => onNextFieldClick()}>
|
<Button className="col-start-2" onClick={() => onNextFieldClick()}>
|
||||||
<Trans>Next</Trans>
|
<Trans>Next</Trans>
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
export default function EmbedDirectTemplateNotFound() {
|
export default function EmbedDirectTemplateNotFound() {
|
||||||
return <div>Not Found</div>
|
return <div>Not Found</div>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,8 +4,12 @@ import { match } from 'ts-pattern';
|
|||||||
|
|
||||||
import { IS_BILLING_ENABLED } from '@documenso/lib/constants/app';
|
import { IS_BILLING_ENABLED } from '@documenso/lib/constants/app';
|
||||||
import { getServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session';
|
import { getServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session';
|
||||||
|
import { getDocumentAndSenderByToken } from '@documenso/lib/server-only/document/get-document-by-token';
|
||||||
|
import { getFieldsForToken } from '@documenso/lib/server-only/field/get-fields-for-token';
|
||||||
|
import { getRecipientByToken } from '@documenso/lib/server-only/recipient/get-recipient-by-token';
|
||||||
import { DocumentAccessAuth } from '@documenso/lib/types/document-auth';
|
import { DocumentAccessAuth } from '@documenso/lib/types/document-auth';
|
||||||
import { extractDocumentAuthMethods } from '@documenso/lib/utils/document-auth';
|
import { extractDocumentAuthMethods } from '@documenso/lib/utils/document-auth';
|
||||||
|
import { DocumentStatus } from '@documenso/prisma/client';
|
||||||
|
|
||||||
import { DocumentAuthProvider } from '~/app/(signing)/sign/[token]/document-auth-provider';
|
import { DocumentAuthProvider } from '~/app/(signing)/sign/[token]/document-auth-provider';
|
||||||
import { SigningProvider } from '~/app/(signing)/sign/[token]/provider';
|
import { SigningProvider } from '~/app/(signing)/sign/[token]/provider';
|
||||||
@@ -13,10 +17,6 @@ import { SigningProvider } from '~/app/(signing)/sign/[token]/provider';
|
|||||||
import { EmbedAuthenticateView } from '../../authenticate';
|
import { EmbedAuthenticateView } from '../../authenticate';
|
||||||
import { EmbedPaywall } from '../../paywall';
|
import { EmbedPaywall } from '../../paywall';
|
||||||
import { EmbedSignDocumentClientPage } from './client';
|
import { EmbedSignDocumentClientPage } from './client';
|
||||||
import { getFieldsForToken } from '@documenso/lib/server-only/field/get-fields-for-token';
|
|
||||||
import { getRecipientByToken } from '@documenso/lib/server-only/recipient/get-recipient-by-token';
|
|
||||||
import { getDocumentAndSenderByToken } from '@documenso/lib/server-only/document/get-document-by-token';
|
|
||||||
import { DocumentStatus } from '@documenso/prisma/client';
|
|
||||||
|
|
||||||
export type EmbedSignDocumentPageProps = {
|
export type EmbedSignDocumentPageProps = {
|
||||||
params: {
|
params: {
|
||||||
@@ -66,7 +66,12 @@ export default async function EmbedSignDocumentPage({ params }: EmbedSignDocumen
|
|||||||
.exhaustive();
|
.exhaustive();
|
||||||
|
|
||||||
if (!isAccessAuthValid) {
|
if (!isAccessAuthValid) {
|
||||||
return <EmbedAuthenticateView email={user?.email || recipient.email} returnTo={`/embed/direct/${token}`} />;
|
return (
|
||||||
|
<EmbedAuthenticateView
|
||||||
|
email={user?.email || recipient.email}
|
||||||
|
returnTo={`/embed/direct/${token}`}
|
||||||
|
/>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -335,6 +335,23 @@ export const DocumentHistorySheet = ({
|
|||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
))
|
))
|
||||||
|
.with(
|
||||||
|
{ type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_VISIBILITY_UPDATED },
|
||||||
|
({ data }) => (
|
||||||
|
<DocumentHistorySheetChanges
|
||||||
|
values={[
|
||||||
|
{
|
||||||
|
key: 'Old',
|
||||||
|
value: data.from,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'New',
|
||||||
|
value: data.to,
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
)
|
||||||
.exhaustive()}
|
.exhaustive()}
|
||||||
|
|
||||||
{isUserDetailsVisible && (
|
{isUserDetailsVisible && (
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import { useMemo, useState } from 'react';
|
import { useEffect, useMemo, useState } from 'react';
|
||||||
|
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
import { useRouter } from 'next/navigation';
|
import { useRouter } from 'next/navigation';
|
||||||
@@ -307,6 +307,18 @@ export const SignInForm = ({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const hash = window.location.hash.slice(1);
|
||||||
|
|
||||||
|
const params = new URLSearchParams(hash);
|
||||||
|
|
||||||
|
const email = params.get('email');
|
||||||
|
|
||||||
|
if (email) {
|
||||||
|
form.setValue('email', email);
|
||||||
|
}
|
||||||
|
}, [form]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Form {...form}>
|
<Form {...form}>
|
||||||
<form
|
<form
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import { useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
|
|
||||||
import Image from 'next/image';
|
import Image from 'next/image';
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
@@ -203,6 +203,18 @@ export const SignUpFormV2 = ({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const hash = window.location.hash.slice(1);
|
||||||
|
|
||||||
|
const params = new URLSearchParams(hash);
|
||||||
|
|
||||||
|
const email = params.get('email');
|
||||||
|
|
||||||
|
if (email) {
|
||||||
|
form.setValue('email', email);
|
||||||
|
}
|
||||||
|
}, [form]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={cn('flex justify-center gap-x-12', className)}>
|
<div className={cn('flex justify-center gap-x-12', className)}>
|
||||||
<div className="border-border relative hidden flex-1 overflow-hidden rounded-xl border xl:flex">
|
<div className="border-border relative hidden flex-1 overflow-hidden rounded-xl border xl:flex">
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ async function middleware(req: NextRequest): Promise<NextResponse> {
|
|||||||
// Allow third parties to iframe the document.
|
// Allow third parties to iframe the document.
|
||||||
res.headers.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
|
res.headers.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
|
||||||
res.headers.set('Access-Control-Allow-Origin', '*');
|
res.headers.set('Access-Control-Allow-Origin', '*');
|
||||||
res.headers.set('Content-Security-Policy', "frame-ancestors *");
|
res.headers.set('Content-Security-Policy', 'frame-ancestors *');
|
||||||
res.headers.set('Referrer-Policy', 'strict-origin-when-cross-origin');
|
res.headers.set('Referrer-Policy', 'strict-origin-when-cross-origin');
|
||||||
res.headers.set('X-Content-Type-Options', 'nosniff');
|
res.headers.set('X-Content-Type-Options', 'nosniff');
|
||||||
res.headers.set('X-Frame-Options', 'ALLOW-ALL');
|
res.headers.set('X-Frame-Options', 'ALLOW-ALL');
|
||||||
|
|||||||
@@ -3,14 +3,14 @@
|
|||||||
import { createContext, useContext } from 'react';
|
import { createContext, useContext } from 'react';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
import type { Team } from '@documenso/prisma/client';
|
import type { GetTeamResponse } from '@documenso/lib/server-only/team/get-team';
|
||||||
|
|
||||||
interface TeamProviderProps {
|
interface TeamProviderProps {
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
team: Team;
|
team: GetTeamResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
const TeamContext = createContext<Team | null>(null);
|
const TeamContext = createContext<GetTeamResponse | null>(null);
|
||||||
|
|
||||||
export const useCurrentTeam = () => {
|
export const useCurrentTeam = () => {
|
||||||
const context = useContext(TeamContext);
|
const context = useContext(TeamContext);
|
||||||
|
|||||||
132
package-lock.json
generated
132
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "@documenso/root",
|
"name": "@documenso/root",
|
||||||
"version": "1.7.1-rc.0",
|
"version": "1.7.1-rc.3",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "@documenso/root",
|
"name": "@documenso/root",
|
||||||
"version": "1.7.1-rc.0",
|
"version": "1.7.1-rc.3",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"apps/*",
|
"apps/*",
|
||||||
"packages/*"
|
"packages/*"
|
||||||
@@ -80,7 +80,7 @@
|
|||||||
},
|
},
|
||||||
"apps/marketing": {
|
"apps/marketing": {
|
||||||
"name": "@documenso/marketing",
|
"name": "@documenso/marketing",
|
||||||
"version": "1.7.1-rc.0",
|
"version": "1.7.1-rc.3",
|
||||||
"license": "AGPL-3.0",
|
"license": "AGPL-3.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@documenso/assets": "*",
|
"@documenso/assets": "*",
|
||||||
@@ -424,7 +424,7 @@
|
|||||||
},
|
},
|
||||||
"apps/web": {
|
"apps/web": {
|
||||||
"name": "@documenso/web",
|
"name": "@documenso/web",
|
||||||
"version": "1.7.1-rc.0",
|
"version": "1.7.1-rc.3",
|
||||||
"license": "AGPL-3.0",
|
"license": "AGPL-3.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@documenso/api": "*",
|
"@documenso/api": "*",
|
||||||
@@ -3433,6 +3433,34 @@
|
|||||||
"react-dom": "^16 || ^17 || ^18"
|
"react-dom": "^16 || ^17 || ^18"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@hello-pangea/dnd": {
|
||||||
|
"version": "16.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@hello-pangea/dnd/-/dnd-16.6.0.tgz",
|
||||||
|
"integrity": "sha512-vfZ4GydqbtUPXSLfAvKvXQ6xwRzIjUSjVU0Sx+70VOhc2xx6CdmJXJ8YhH70RpbTUGjxctslQTHul9sIOxCfFQ==",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/runtime": "^7.24.1",
|
||||||
|
"css-box-model": "^1.2.1",
|
||||||
|
"memoize-one": "^6.0.0",
|
||||||
|
"raf-schd": "^4.0.3",
|
||||||
|
"react-redux": "^8.1.3",
|
||||||
|
"redux": "^4.2.1",
|
||||||
|
"use-memo-one": "^1.1.3"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"react": "^16.8.5 || ^17.0.0 || ^18.0.0",
|
||||||
|
"react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@hello-pangea/dnd/node_modules/redux": {
|
||||||
|
"version": "4.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz",
|
||||||
|
"integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/runtime": "^7.9.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@hexagon/base64": {
|
"node_modules/@hexagon/base64": {
|
||||||
"version": "1.1.28",
|
"version": "1.1.28",
|
||||||
"resolved": "https://registry.npmjs.org/@hexagon/base64/-/base64-1.1.28.tgz",
|
"resolved": "https://registry.npmjs.org/@hexagon/base64/-/base64-1.1.28.tgz",
|
||||||
@@ -11048,6 +11076,16 @@
|
|||||||
"@types/unist": "^2"
|
"@types/unist": "^2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/hoist-non-react-statics": {
|
||||||
|
"version": "3.3.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz",
|
||||||
|
"integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@types/react": "*",
|
||||||
|
"hoist-non-react-statics": "^3.3.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@types/http-cache-semantics": {
|
"node_modules/@types/http-cache-semantics": {
|
||||||
"version": "4.0.4",
|
"version": "4.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz",
|
||||||
@@ -14663,6 +14701,15 @@
|
|||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/css-box-model": {
|
||||||
|
"version": "1.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz",
|
||||||
|
"integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"tiny-invariant": "^1.0.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/css.escape": {
|
"node_modules/css.escape": {
|
||||||
"version": "1.5.1",
|
"version": "1.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
|
"resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
|
||||||
@@ -19256,6 +19303,15 @@
|
|||||||
"node": "*"
|
"node": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/hoist-non-react-statics": {
|
||||||
|
"version": "3.3.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
|
||||||
|
"integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
|
||||||
|
"license": "BSD-3-Clause",
|
||||||
|
"dependencies": {
|
||||||
|
"react-is": "^16.7.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/hosted-git-info": {
|
"node_modules/hosted-git-info": {
|
||||||
"version": "4.1.0",
|
"version": "4.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
|
||||||
@@ -22639,6 +22695,12 @@
|
|||||||
"node": ">= 4.0.0"
|
"node": ">= 4.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/memoize-one": {
|
||||||
|
"version": "6.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
|
||||||
|
"integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/meow": {
|
"node_modules/meow": {
|
||||||
"version": "8.1.2",
|
"version": "8.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz",
|
||||||
@@ -27686,6 +27748,12 @@
|
|||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/raf-schd": {
|
||||||
|
"version": "4.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz",
|
||||||
|
"integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/railroad-diagrams": {
|
"node_modules/railroad-diagrams": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz",
|
||||||
@@ -28523,6 +28591,51 @@
|
|||||||
"resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.0.tgz",
|
||||||
"integrity": "sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw=="
|
"integrity": "sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw=="
|
||||||
},
|
},
|
||||||
|
"node_modules/react-redux": {
|
||||||
|
"version": "8.1.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz",
|
||||||
|
"integrity": "sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/runtime": "^7.12.1",
|
||||||
|
"@types/hoist-non-react-statics": "^3.3.1",
|
||||||
|
"@types/use-sync-external-store": "^0.0.3",
|
||||||
|
"hoist-non-react-statics": "^3.3.2",
|
||||||
|
"react-is": "^18.0.0",
|
||||||
|
"use-sync-external-store": "^1.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@types/react": "^16.8 || ^17.0 || ^18.0",
|
||||||
|
"@types/react-dom": "^16.8 || ^17.0 || ^18.0",
|
||||||
|
"react": "^16.8 || ^17.0 || ^18.0",
|
||||||
|
"react-dom": "^16.8 || ^17.0 || ^18.0",
|
||||||
|
"react-native": ">=0.59",
|
||||||
|
"redux": "^4 || ^5.0.0-beta.0"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"@types/react": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"@types/react-dom": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"react-dom": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"react-native": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"redux": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/react-redux/node_modules/react-is": {
|
||||||
|
"version": "18.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
|
||||||
|
"integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/react-remove-scroll": {
|
"node_modules/react-remove-scroll": {
|
||||||
"version": "2.5.5",
|
"version": "2.5.5",
|
||||||
"resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz",
|
"resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz",
|
||||||
@@ -34082,6 +34195,15 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/use-memo-one": {
|
||||||
|
"version": "1.1.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz",
|
||||||
|
"integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==",
|
||||||
|
"license": "MIT",
|
||||||
|
"peerDependencies": {
|
||||||
|
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/use-sidecar": {
|
"node_modules/use-sidecar": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz",
|
||||||
@@ -36828,6 +36950,7 @@
|
|||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@documenso/lib": "*",
|
"@documenso/lib": "*",
|
||||||
|
"@hello-pangea/dnd": "^16.6.0",
|
||||||
"@hookform/resolvers": "^3.3.0",
|
"@hookform/resolvers": "^3.3.0",
|
||||||
"@lingui/macro": "^4.11.3",
|
"@lingui/macro": "^4.11.3",
|
||||||
"@lingui/react": "^4.11.3",
|
"@lingui/react": "^4.11.3",
|
||||||
@@ -36874,6 +36997,7 @@
|
|||||||
"react-hook-form": "^7.45.4",
|
"react-hook-form": "^7.45.4",
|
||||||
"react-pdf": "7.7.3",
|
"react-pdf": "7.7.3",
|
||||||
"react-rnd": "^10.4.1",
|
"react-rnd": "^10.4.1",
|
||||||
|
"remeda": "^1.27.1",
|
||||||
"tailwind-merge": "^1.12.0",
|
"tailwind-merge": "^1.12.0",
|
||||||
"tailwindcss-animate": "^1.0.5",
|
"tailwindcss-animate": "^1.0.5",
|
||||||
"ts-pattern": "^5.0.5",
|
"ts-pattern": "^5.0.5",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.7.1-rc.0",
|
"version": "1.7.1-rc.3",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "turbo run build",
|
"build": "turbo run build",
|
||||||
"build:web": "turbo run build --filter=@documenso/web",
|
"build:web": "turbo run build --filter=@documenso/web",
|
||||||
|
|||||||
@@ -293,6 +293,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, {
|
|||||||
timezone,
|
timezone,
|
||||||
dateFormat: dateFormat?.value,
|
dateFormat: dateFormat?.value,
|
||||||
redirectUrl: body.meta.redirectUrl,
|
redirectUrl: body.meta.redirectUrl,
|
||||||
|
signingOrder: body.meta.signingOrder,
|
||||||
requestMetadata: extractNextApiRequestMetadata(args.req),
|
requestMetadata: extractNextApiRequestMetadata(args.req),
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -301,7 +302,9 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, {
|
|||||||
documentId: document.id,
|
documentId: document.id,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
teamId: team?.id,
|
teamId: team?.id,
|
||||||
data: body.authOptions,
|
data: {
|
||||||
|
...body.authOptions,
|
||||||
|
},
|
||||||
requestMetadata: extractNextApiRequestMetadata(args.req),
|
requestMetadata: extractNextApiRequestMetadata(args.req),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -325,6 +328,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, {
|
|||||||
email: recipient.email,
|
email: recipient.email,
|
||||||
token: recipient.token,
|
token: recipient.token,
|
||||||
role: recipient.role,
|
role: recipient.role,
|
||||||
|
signingOrder: recipient.signingOrder,
|
||||||
|
|
||||||
signingUrl: `${NEXT_PUBLIC_WEBAPP_URL()}/sign/${recipient.token}`,
|
signingUrl: `${NEXT_PUBLIC_WEBAPP_URL()}/sign/${recipient.token}`,
|
||||||
})),
|
})),
|
||||||
@@ -496,6 +500,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, {
|
|||||||
email: recipient.email,
|
email: recipient.email,
|
||||||
token: recipient.token,
|
token: recipient.token,
|
||||||
role: recipient.role,
|
role: recipient.role,
|
||||||
|
signingOrder: recipient.signingOrder,
|
||||||
|
|
||||||
signingUrl: `${NEXT_PUBLIC_WEBAPP_URL()}/sign/${recipient.token}`,
|
signingUrl: `${NEXT_PUBLIC_WEBAPP_URL()}/sign/${recipient.token}`,
|
||||||
})),
|
})),
|
||||||
@@ -588,6 +593,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, {
|
|||||||
email: recipient.email,
|
email: recipient.email,
|
||||||
token: recipient.token,
|
token: recipient.token,
|
||||||
role: recipient.role,
|
role: recipient.role,
|
||||||
|
signingOrder: recipient.signingOrder,
|
||||||
|
|
||||||
signingUrl: `${NEXT_PUBLIC_WEBAPP_URL()}/sign/${recipient.token}`,
|
signingUrl: `${NEXT_PUBLIC_WEBAPP_URL()}/sign/${recipient.token}`,
|
||||||
})),
|
})),
|
||||||
@@ -713,7 +719,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, {
|
|||||||
|
|
||||||
createRecipient: authenticatedMiddleware(async (args, user, team) => {
|
createRecipient: authenticatedMiddleware(async (args, user, team) => {
|
||||||
const { id: documentId } = args.params;
|
const { id: documentId } = args.params;
|
||||||
const { name, email, role, authOptions } = args.body;
|
const { name, email, role, authOptions, signingOrder } = args.body;
|
||||||
|
|
||||||
const document = await getDocumentById({
|
const document = await getDocumentById({
|
||||||
id: Number(documentId),
|
id: Number(documentId),
|
||||||
@@ -762,11 +768,16 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, {
|
|||||||
userId: user.id,
|
userId: user.id,
|
||||||
teamId: team?.id,
|
teamId: team?.id,
|
||||||
recipients: [
|
recipients: [
|
||||||
...recipients,
|
...recipients.map(({ email, name }) => ({
|
||||||
|
email,
|
||||||
|
name,
|
||||||
|
role,
|
||||||
|
})),
|
||||||
{
|
{
|
||||||
email,
|
email,
|
||||||
name,
|
name,
|
||||||
role,
|
role,
|
||||||
|
signingOrder,
|
||||||
actionAuth: authOptions?.actionAuth ?? null,
|
actionAuth: authOptions?.actionAuth ?? null,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@@ -799,7 +810,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, {
|
|||||||
|
|
||||||
updateRecipient: authenticatedMiddleware(async (args, user, team) => {
|
updateRecipient: authenticatedMiddleware(async (args, user, team) => {
|
||||||
const { id: documentId, recipientId } = args.params;
|
const { id: documentId, recipientId } = args.params;
|
||||||
const { name, email, role, authOptions } = args.body;
|
const { name, email, role, authOptions, signingOrder } = args.body;
|
||||||
|
|
||||||
const document = await getDocumentById({
|
const document = await getDocumentById({
|
||||||
id: Number(documentId),
|
id: Number(documentId),
|
||||||
@@ -833,6 +844,7 @@ export const ApiContractV1Implementation = createNextRoute(ApiContractV1, {
|
|||||||
email,
|
email,
|
||||||
name,
|
name,
|
||||||
role,
|
role,
|
||||||
|
signingOrder,
|
||||||
actionAuth: authOptions?.actionAuth,
|
actionAuth: authOptions?.actionAuth,
|
||||||
requestMetadata: extractNextApiRequestMetadata(args.req),
|
requestMetadata: extractNextApiRequestMetadata(args.req),
|
||||||
}).catch(() => null);
|
}).catch(() => null);
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import {
|
|||||||
import { ZFieldMetaSchema } from '@documenso/lib/types/field-meta';
|
import { ZFieldMetaSchema } from '@documenso/lib/types/field-meta';
|
||||||
import {
|
import {
|
||||||
DocumentDataType,
|
DocumentDataType,
|
||||||
|
DocumentSigningOrder,
|
||||||
FieldType,
|
FieldType,
|
||||||
ReadStatus,
|
ReadStatus,
|
||||||
RecipientRole,
|
RecipientRole,
|
||||||
@@ -103,6 +104,7 @@ export const ZCreateDocumentMutationSchema = z.object({
|
|||||||
name: z.string().min(1),
|
name: z.string().min(1),
|
||||||
email: z.string().email().min(1),
|
email: z.string().email().min(1),
|
||||||
role: z.nativeEnum(RecipientRole).optional().default(RecipientRole.SIGNER),
|
role: z.nativeEnum(RecipientRole).optional().default(RecipientRole.SIGNER),
|
||||||
|
signingOrder: z.number().nullish(),
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
meta: z
|
meta: z
|
||||||
@@ -123,6 +125,7 @@ export const ZCreateDocumentMutationSchema = z.object({
|
|||||||
enum: DATE_FORMATS.map((format) => format.value),
|
enum: DATE_FORMATS.map((format) => format.value),
|
||||||
}),
|
}),
|
||||||
redirectUrl: z.string(),
|
redirectUrl: z.string(),
|
||||||
|
signingOrder: z.nativeEnum(DocumentSigningOrder).optional(),
|
||||||
})
|
})
|
||||||
.partial(),
|
.partial(),
|
||||||
authOptions: z
|
authOptions: z
|
||||||
@@ -147,6 +150,7 @@ export const ZCreateDocumentMutationResponseSchema = z.object({
|
|||||||
email: z.string().email().min(1),
|
email: z.string().email().min(1),
|
||||||
token: z.string(),
|
token: z.string(),
|
||||||
role: z.nativeEnum(RecipientRole),
|
role: z.nativeEnum(RecipientRole),
|
||||||
|
signingOrder: z.number().nullish(),
|
||||||
|
|
||||||
signingUrl: z.string(),
|
signingUrl: z.string(),
|
||||||
}),
|
}),
|
||||||
@@ -165,6 +169,7 @@ export const ZCreateDocumentFromTemplateMutationSchema = z.object({
|
|||||||
name: z.string().min(1),
|
name: z.string().min(1),
|
||||||
email: z.string().email().min(1),
|
email: z.string().email().min(1),
|
||||||
role: z.nativeEnum(RecipientRole).optional().default(RecipientRole.SIGNER),
|
role: z.nativeEnum(RecipientRole).optional().default(RecipientRole.SIGNER),
|
||||||
|
signingOrder: z.number().nullish(),
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
meta: z
|
meta: z
|
||||||
@@ -174,6 +179,7 @@ export const ZCreateDocumentFromTemplateMutationSchema = z.object({
|
|||||||
timezone: z.string(),
|
timezone: z.string(),
|
||||||
dateFormat: z.string(),
|
dateFormat: z.string(),
|
||||||
redirectUrl: z.string(),
|
redirectUrl: z.string(),
|
||||||
|
signingOrder: z.nativeEnum(DocumentSigningOrder).optional(),
|
||||||
})
|
})
|
||||||
.partial()
|
.partial()
|
||||||
.optional(),
|
.optional(),
|
||||||
@@ -200,6 +206,7 @@ export const ZCreateDocumentFromTemplateMutationResponseSchema = z.object({
|
|||||||
email: z.string().email().min(1),
|
email: z.string().email().min(1),
|
||||||
token: z.string(),
|
token: z.string(),
|
||||||
role: z.nativeEnum(RecipientRole).optional().default(RecipientRole.SIGNER),
|
role: z.nativeEnum(RecipientRole).optional().default(RecipientRole.SIGNER),
|
||||||
|
signingOrder: z.number().nullish(),
|
||||||
|
|
||||||
signingUrl: z.string(),
|
signingUrl: z.string(),
|
||||||
}),
|
}),
|
||||||
@@ -219,6 +226,7 @@ export const ZGenerateDocumentFromTemplateMutationSchema = z.object({
|
|||||||
id: z.number(),
|
id: z.number(),
|
||||||
name: z.string().optional(),
|
name: z.string().optional(),
|
||||||
email: z.string().email().min(1),
|
email: z.string().email().min(1),
|
||||||
|
signingOrder: z.number().nullish(),
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
.refine(
|
.refine(
|
||||||
@@ -237,6 +245,7 @@ export const ZGenerateDocumentFromTemplateMutationSchema = z.object({
|
|||||||
timezone: z.string(),
|
timezone: z.string(),
|
||||||
dateFormat: z.string(),
|
dateFormat: z.string(),
|
||||||
redirectUrl: ZUrlSchema,
|
redirectUrl: ZUrlSchema,
|
||||||
|
signingOrder: z.nativeEnum(DocumentSigningOrder).optional(),
|
||||||
})
|
})
|
||||||
.partial()
|
.partial()
|
||||||
.optional(),
|
.optional(),
|
||||||
@@ -263,6 +272,7 @@ export const ZGenerateDocumentFromTemplateMutationResponseSchema = z.object({
|
|||||||
email: z.string().email().min(1),
|
email: z.string().email().min(1),
|
||||||
token: z.string(),
|
token: z.string(),
|
||||||
role: z.nativeEnum(RecipientRole),
|
role: z.nativeEnum(RecipientRole),
|
||||||
|
signingOrder: z.number().nullish(),
|
||||||
|
|
||||||
signingUrl: z.string(),
|
signingUrl: z.string(),
|
||||||
}),
|
}),
|
||||||
@@ -277,6 +287,7 @@ export const ZCreateRecipientMutationSchema = z.object({
|
|||||||
name: z.string().min(1),
|
name: z.string().min(1),
|
||||||
email: z.string().email().min(1),
|
email: z.string().email().min(1),
|
||||||
role: z.nativeEnum(RecipientRole).optional().default(RecipientRole.SIGNER),
|
role: z.nativeEnum(RecipientRole).optional().default(RecipientRole.SIGNER),
|
||||||
|
signingOrder: z.number().nullish(),
|
||||||
authOptions: z
|
authOptions: z
|
||||||
.object({
|
.object({
|
||||||
actionAuth: ZRecipientActionAuthTypesSchema.optional(),
|
actionAuth: ZRecipientActionAuthTypesSchema.optional(),
|
||||||
@@ -305,6 +316,7 @@ export const ZSuccessfulRecipientResponseSchema = z.object({
|
|||||||
email: z.string().email().min(1),
|
email: z.string().email().min(1),
|
||||||
name: z.string(),
|
name: z.string(),
|
||||||
role: z.nativeEnum(RecipientRole),
|
role: z.nativeEnum(RecipientRole),
|
||||||
|
signingOrder: z.number().nullish(),
|
||||||
token: z.string(),
|
token: z.string(),
|
||||||
// !: Not used for now
|
// !: Not used for now
|
||||||
// expired: z.string(),
|
// expired: z.string(),
|
||||||
@@ -422,6 +434,7 @@ export const ZTemplateMetaSchema = z.object({
|
|||||||
dateFormat: z.string().nullish(),
|
dateFormat: z.string().nullish(),
|
||||||
templateId: z.number(),
|
templateId: z.number(),
|
||||||
redirectUrl: z.string().nullish(),
|
redirectUrl: z.string().nullish(),
|
||||||
|
signingOrder: z.nativeEnum(DocumentSigningOrder).nullish().default(DocumentSigningOrder.PARALLEL),
|
||||||
});
|
});
|
||||||
|
|
||||||
export const ZTemplateSchema = z.object({
|
export const ZTemplateSchema = z.object({
|
||||||
@@ -443,6 +456,7 @@ export const ZRecipientSchema = z.object({
|
|||||||
email: z.string().email().min(1),
|
email: z.string().email().min(1),
|
||||||
name: z.string(),
|
name: z.string(),
|
||||||
token: z.string(),
|
token: z.string(),
|
||||||
|
signingOrder: z.number().nullish(),
|
||||||
documentDeletedAt: z.date().nullish(),
|
documentDeletedAt: z.date().nullish(),
|
||||||
expired: z.date().nullish(),
|
expired: z.date().nullish(),
|
||||||
signedAt: z.date().nullish(),
|
signedAt: z.date().nullish(),
|
||||||
@@ -496,6 +510,7 @@ export const ZTemplateWithDataSchema = ZTemplateSchema.extend({
|
|||||||
id: true,
|
id: true,
|
||||||
email: true,
|
email: true,
|
||||||
name: true,
|
name: true,
|
||||||
|
signingOrder: true,
|
||||||
authOptions: true,
|
authOptions: true,
|
||||||
role: true,
|
role: true,
|
||||||
}).array(),
|
}).array(),
|
||||||
|
|||||||
@@ -41,11 +41,10 @@ test.describe('[EE_ONLY]', () => {
|
|||||||
// Add 2 signers.
|
// Add 2 signers.
|
||||||
await page.getByPlaceholder('Email').fill('recipient1@documenso.com');
|
await page.getByPlaceholder('Email').fill('recipient1@documenso.com');
|
||||||
await page.getByPlaceholder('Name').fill('Recipient 1');
|
await page.getByPlaceholder('Name').fill('Recipient 1');
|
||||||
|
|
||||||
await page.getByRole('button', { name: 'Add Signer' }).click();
|
await page.getByRole('button', { name: 'Add Signer' }).click();
|
||||||
await page
|
await page.getByLabel('Email').nth(1).fill('recipient2@documenso.com');
|
||||||
.getByRole('textbox', { name: 'Email', exact: true })
|
await page.getByLabel('Name').nth(1).fill('Recipient 2');
|
||||||
.fill('recipient2@documenso.com');
|
|
||||||
await page.getByRole('textbox', { name: 'Name', exact: true }).nth(1).fill('Recipient 2');
|
|
||||||
|
|
||||||
// Display advanced settings.
|
// Display advanced settings.
|
||||||
await page.getByLabel('Show advanced settings').check();
|
await page.getByLabel('Show advanced settings').check();
|
||||||
@@ -77,9 +76,11 @@ test('[DOCUMENT_FLOW]: add signers', async ({ page }) => {
|
|||||||
// Add 2 signers.
|
// Add 2 signers.
|
||||||
await page.getByPlaceholder('Email').fill('recipient1@documenso.com');
|
await page.getByPlaceholder('Email').fill('recipient1@documenso.com');
|
||||||
await page.getByPlaceholder('Name').fill('Recipient 1');
|
await page.getByPlaceholder('Name').fill('Recipient 1');
|
||||||
|
|
||||||
await page.getByRole('button', { name: 'Add Signer' }).click();
|
await page.getByRole('button', { name: 'Add Signer' }).click();
|
||||||
await page.getByRole('textbox', { name: 'Email', exact: true }).fill('recipient2@documenso.com');
|
|
||||||
await page.getByRole('textbox', { name: 'Name', exact: true }).nth(1).fill('Recipient 2');
|
await page.getByLabel('Email').nth(1).fill('recipient2@documenso.com');
|
||||||
|
await page.getByLabel('Name').nth(1).fill('Recipient 2');
|
||||||
|
|
||||||
// Advanced settings should not be visible for non EE users.
|
// Advanced settings should not be visible for non EE users.
|
||||||
await expect(page.getByLabel('Show advanced settings')).toBeHidden();
|
await expect(page.getByLabel('Show advanced settings')).toBeHidden();
|
||||||
|
|||||||
@@ -4,7 +4,13 @@ import path from 'node:path';
|
|||||||
|
|
||||||
import { getRecipientByEmail } from '@documenso/lib/server-only/recipient/get-recipient-by-email';
|
import { getRecipientByEmail } from '@documenso/lib/server-only/recipient/get-recipient-by-email';
|
||||||
import { prisma } from '@documenso/prisma';
|
import { prisma } from '@documenso/prisma';
|
||||||
import { DocumentStatus, FieldType, RecipientRole } from '@documenso/prisma/client';
|
import {
|
||||||
|
DocumentSigningOrder,
|
||||||
|
DocumentStatus,
|
||||||
|
FieldType,
|
||||||
|
RecipientRole,
|
||||||
|
SigningStatus,
|
||||||
|
} from '@documenso/prisma/client';
|
||||||
import {
|
import {
|
||||||
seedBlankDocument,
|
seedBlankDocument,
|
||||||
seedPendingDocumentWithFullFields,
|
seedPendingDocumentWithFullFields,
|
||||||
@@ -137,8 +143,9 @@ test('[DOCUMENT_FLOW]: should be able to create a document with multiple recipie
|
|||||||
await page.getByPlaceholder('Email').fill('user1@example.com');
|
await page.getByPlaceholder('Email').fill('user1@example.com');
|
||||||
await page.getByPlaceholder('Name').fill('User 1');
|
await page.getByPlaceholder('Name').fill('User 1');
|
||||||
await page.getByRole('button', { name: 'Add Signer' }).click();
|
await page.getByRole('button', { name: 'Add Signer' }).click();
|
||||||
await page.getByRole('textbox', { name: 'Email', exact: true }).fill('user2@example.com');
|
|
||||||
await page.getByRole('textbox', { name: 'Name', exact: true }).nth(1).fill('User 2');
|
await page.getByLabel('Email').nth(1).fill('user2@example.com');
|
||||||
|
await page.getByLabel('Name').nth(1).fill('User 2');
|
||||||
|
|
||||||
await page.getByRole('button', { name: 'Continue' }).click();
|
await page.getByRole('button', { name: 'Continue' }).click();
|
||||||
|
|
||||||
@@ -217,20 +224,20 @@ test('[DOCUMENT_FLOW]: should be able to create a document with multiple recipie
|
|||||||
await page.getByPlaceholder('Name').fill('User 1');
|
await page.getByPlaceholder('Name').fill('User 1');
|
||||||
await page.getByRole('button', { name: 'Add Signer' }).click();
|
await page.getByRole('button', { name: 'Add Signer' }).click();
|
||||||
|
|
||||||
await page.getByRole('textbox', { name: 'Email', exact: true }).fill('user2@example.com');
|
await page.getByLabel('Email').nth(1).fill('user2@example.com');
|
||||||
await page.getByRole('textbox', { name: 'Name', exact: true }).nth(1).fill('User 2');
|
await page.getByLabel('Name').nth(1).fill('User 2');
|
||||||
await page.locator('button[role="combobox"]').nth(1).click();
|
await page.locator('button[role="combobox"]').nth(1).click();
|
||||||
await page.getByLabel('Receives copy').click();
|
await page.getByLabel('Receives copy').click();
|
||||||
await page.getByRole('button', { name: 'Add Signer' }).click();
|
await page.getByRole('button', { name: 'Add Signer' }).click();
|
||||||
|
|
||||||
await page.getByRole('textbox', { name: 'Email', exact: true }).nth(1).fill('user3@example.com');
|
await page.getByLabel('Email').nth(2).fill('user3@example.com');
|
||||||
await page.getByRole('textbox', { name: 'Name', exact: true }).nth(2).fill('User 3');
|
await page.getByLabel('Name').nth(2).fill('User 3');
|
||||||
await page.locator('button[role="combobox"]').nth(2).click();
|
await page.locator('button[role="combobox"]').nth(2).click();
|
||||||
await page.getByLabel('Needs to approve').click();
|
await page.getByLabel('Needs to approve').click();
|
||||||
await page.getByRole('button', { name: 'Add Signer' }).click();
|
await page.getByRole('button', { name: 'Add Signer' }).click();
|
||||||
|
|
||||||
await page.getByRole('textbox', { name: 'Email', exact: true }).nth(2).fill('user4@example.com');
|
await page.getByLabel('Email').nth(3).fill('user4@example.com');
|
||||||
await page.getByRole('textbox', { name: 'Name', exact: true }).nth(3).fill('User 4');
|
await page.getByLabel('Name').nth(3).fill('User 4');
|
||||||
await page.locator('button[role="combobox"]').nth(3).click();
|
await page.locator('button[role="combobox"]').nth(3).click();
|
||||||
await page.getByLabel('Needs to view').click();
|
await page.getByLabel('Needs to view').click();
|
||||||
|
|
||||||
@@ -503,3 +510,163 @@ test('[DOCUMENT_FLOW]: should be able to sign a document with custom date', asyn
|
|||||||
expect(completedStatus).toBe(DocumentStatus.COMPLETED);
|
expect(completedStatus).toBe(DocumentStatus.COMPLETED);
|
||||||
}).toPass();
|
}).toPass();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('[DOCUMENT_FLOW]: should be able to create and sign a document with 3 recipients in sequential order', async ({
|
||||||
|
page,
|
||||||
|
}) => {
|
||||||
|
const user = await seedUser();
|
||||||
|
const document = await seedBlankDocument(user);
|
||||||
|
|
||||||
|
await apiSignin({
|
||||||
|
page,
|
||||||
|
email: user.email,
|
||||||
|
redirectPath: `/documents/${document.id}/edit`,
|
||||||
|
});
|
||||||
|
|
||||||
|
const documentTitle = `Sequential-Signing-${Date.now()}.pdf`;
|
||||||
|
|
||||||
|
await expect(page.getByRole('heading', { name: 'General' })).toBeVisible();
|
||||||
|
await page.getByLabel('Title').fill(documentTitle);
|
||||||
|
await page.getByRole('button', { name: 'Continue' }).click();
|
||||||
|
|
||||||
|
await expect(page.getByRole('heading', { name: 'Add Signers' })).toBeVisible();
|
||||||
|
await page.getByLabel('Enable signing order').check();
|
||||||
|
|
||||||
|
for (let i = 1; i <= 3; i++) {
|
||||||
|
if (i > 1) {
|
||||||
|
await page.getByRole('button', { name: 'Add Signer' }).click();
|
||||||
|
}
|
||||||
|
await page
|
||||||
|
.getByPlaceholder('Email')
|
||||||
|
.nth(i - 1)
|
||||||
|
.fill(`user${i}@example.com`);
|
||||||
|
await page
|
||||||
|
.getByPlaceholder('Name')
|
||||||
|
.nth(i - 1)
|
||||||
|
.fill(`User ${i}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
await page.getByRole('button', { name: 'Continue' }).click();
|
||||||
|
|
||||||
|
await expect(page.getByRole('heading', { name: 'Add Fields' })).toBeVisible();
|
||||||
|
|
||||||
|
for (let i = 1; i <= 3; i++) {
|
||||||
|
if (i > 1) {
|
||||||
|
await page.getByText(`User ${i} (user${i}@example.com)`).click();
|
||||||
|
}
|
||||||
|
await page.getByRole('button', { name: 'Signature' }).click();
|
||||||
|
await page.locator('canvas').click({
|
||||||
|
position: {
|
||||||
|
x: 100,
|
||||||
|
y: 100 * i,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
await page.getByText(`User ${i} (user${i}@example.com)`).click();
|
||||||
|
}
|
||||||
|
|
||||||
|
await page.getByRole('button', { name: 'Continue' }).click();
|
||||||
|
|
||||||
|
await expect(page.getByRole('heading', { name: 'Add Subject' })).toBeVisible();
|
||||||
|
await page.getByRole('button', { name: 'Send' }).click();
|
||||||
|
|
||||||
|
await page.waitForURL('/documents');
|
||||||
|
|
||||||
|
await expect(page.getByRole('link', { name: documentTitle })).toBeVisible();
|
||||||
|
|
||||||
|
const createdDocument = await prisma.document.findFirst({
|
||||||
|
where: { title: documentTitle },
|
||||||
|
include: { Recipient: true },
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(createdDocument).not.toBeNull();
|
||||||
|
expect(createdDocument?.Recipient.length).toBe(3);
|
||||||
|
|
||||||
|
for (let i = 0; i < 3; i++) {
|
||||||
|
const recipient = createdDocument?.Recipient.find(
|
||||||
|
(r) => r.email === `user${i + 1}@example.com`,
|
||||||
|
);
|
||||||
|
expect(recipient).not.toBeNull();
|
||||||
|
|
||||||
|
const fields = await prisma.field.findMany({
|
||||||
|
where: { recipientId: recipient?.id, documentId: createdDocument?.id },
|
||||||
|
});
|
||||||
|
const recipientField = fields[0];
|
||||||
|
|
||||||
|
if (i > 0) {
|
||||||
|
const previousRecipient = await prisma.recipient.findFirst({
|
||||||
|
where: { email: `user${i}@example.com`, documentId: createdDocument?.id },
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(previousRecipient?.signingStatus).toBe(SigningStatus.SIGNED);
|
||||||
|
}
|
||||||
|
|
||||||
|
await page.goto(`/sign/${recipient?.token}`);
|
||||||
|
await expect(page.getByRole('heading', { name: 'Sign Document' })).toBeVisible();
|
||||||
|
|
||||||
|
await page.locator(`#field-${recipientField.id}`).getByRole('button').click();
|
||||||
|
|
||||||
|
const canvas = page.locator('canvas#signature');
|
||||||
|
const box = await canvas.boundingBox();
|
||||||
|
if (box) {
|
||||||
|
await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2);
|
||||||
|
await page.mouse.down();
|
||||||
|
await page.mouse.move(box.x + box.width / 4, box.y + box.height / 4);
|
||||||
|
await page.mouse.up();
|
||||||
|
}
|
||||||
|
|
||||||
|
await page.getByRole('button', { name: 'Sign', exact: true }).click();
|
||||||
|
await page.getByRole('button', { name: 'Complete' }).click();
|
||||||
|
await page.getByRole('button', { name: 'Sign' }).click();
|
||||||
|
|
||||||
|
await page.waitForURL(`/sign/${recipient?.token}/complete`);
|
||||||
|
await expect(page.getByText('Document Signed')).toBeVisible();
|
||||||
|
|
||||||
|
const updatedRecipient = await prisma.recipient.findFirst({
|
||||||
|
where: { id: recipient?.id },
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(updatedRecipient?.signingStatus).toBe(SigningStatus.SIGNED);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for the document to be signed.
|
||||||
|
await page.waitForTimeout(5000);
|
||||||
|
|
||||||
|
const finalDocument = await prisma.document.findFirst({
|
||||||
|
where: { id: createdDocument?.id },
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(finalDocument?.status).toBe(DocumentStatus.COMPLETED);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('[DOCUMENT_FLOW]: should prevent out-of-order signing in sequential mode', async ({
|
||||||
|
page,
|
||||||
|
}) => {
|
||||||
|
const user = await seedUser();
|
||||||
|
|
||||||
|
const { document, recipients } = await seedPendingDocumentWithFullFields({
|
||||||
|
owner: user,
|
||||||
|
recipients: ['user1@example.com', 'user2@example.com', 'user3@example.com'],
|
||||||
|
fields: [FieldType.SIGNATURE],
|
||||||
|
recipientsCreateOptions: [{ signingOrder: 1 }, { signingOrder: 2 }, { signingOrder: 3 }],
|
||||||
|
updateDocumentOptions: {
|
||||||
|
documentMeta: {
|
||||||
|
create: {
|
||||||
|
signingOrder: DocumentSigningOrder.SEQUENTIAL,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const pendingRecipient = recipients.find((r) => r.signingOrder === 2);
|
||||||
|
|
||||||
|
await page.goto(`/sign/${pendingRecipient?.token}`);
|
||||||
|
|
||||||
|
await expect(page).toHaveURL(`/sign/${pendingRecipient?.token}/waiting`);
|
||||||
|
|
||||||
|
const activeRecipient = recipients.find((r) => r.signingOrder === 1);
|
||||||
|
|
||||||
|
await page.goto(`/sign/${activeRecipient?.token}`);
|
||||||
|
|
||||||
|
await expect(page).not.toHaveURL(`/sign/${activeRecipient?.token}/waiting`);
|
||||||
|
await expect(page.getByRole('heading', { name: 'Sign Document' })).toBeVisible();
|
||||||
|
});
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import { expect, test } from '@playwright/test';
|
import { expect, test } from '@playwright/test';
|
||||||
|
|
||||||
import { DocumentStatus } from '@documenso/prisma/client';
|
import { DocumentStatus, TeamMemberRole } from '@documenso/prisma/client';
|
||||||
import { seedDocuments, seedTeamDocuments } from '@documenso/prisma/seed/documents';
|
import { seedDocuments, seedTeamDocuments } from '@documenso/prisma/seed/documents';
|
||||||
import { seedTeamEmail } from '@documenso/prisma/seed/teams';
|
import { seedTeam, seedTeamEmail, seedTeamMember } from '@documenso/prisma/seed/teams';
|
||||||
import { seedUser } from '@documenso/prisma/seed/users';
|
import { seedUser } from '@documenso/prisma/seed/users';
|
||||||
|
|
||||||
import { apiSignin, apiSignout } from '../fixtures/authentication';
|
import { apiSignin, apiSignout } from '../fixtures/authentication';
|
||||||
@@ -355,3 +355,354 @@ test('[TEAMS]: delete completed team document', async ({ page }) => {
|
|||||||
await apiSignout({ page });
|
await apiSignout({ page });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('[TEAMS]: check document visibility based on team member role', async ({ page }) => {
|
||||||
|
const team = await seedTeam();
|
||||||
|
|
||||||
|
// Seed users with different roles
|
||||||
|
const adminUser = await seedTeamMember({
|
||||||
|
teamId: team.id,
|
||||||
|
role: TeamMemberRole.ADMIN,
|
||||||
|
});
|
||||||
|
|
||||||
|
const managerUser = await seedTeamMember({
|
||||||
|
teamId: team.id,
|
||||||
|
role: TeamMemberRole.MANAGER,
|
||||||
|
});
|
||||||
|
|
||||||
|
const memberUser = await seedTeamMember({
|
||||||
|
teamId: team.id,
|
||||||
|
role: TeamMemberRole.MEMBER,
|
||||||
|
});
|
||||||
|
|
||||||
|
const outsideUser = await seedUser();
|
||||||
|
|
||||||
|
// Seed documents with different visibility levels
|
||||||
|
await seedDocuments([
|
||||||
|
{
|
||||||
|
sender: team.owner,
|
||||||
|
recipients: [],
|
||||||
|
type: DocumentStatus.COMPLETED,
|
||||||
|
documentOptions: {
|
||||||
|
teamId: team.id,
|
||||||
|
visibility: 'EVERYONE',
|
||||||
|
title: 'Document Visible to Everyone',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
sender: team.owner,
|
||||||
|
recipients: [],
|
||||||
|
type: DocumentStatus.COMPLETED,
|
||||||
|
documentOptions: {
|
||||||
|
teamId: team.id,
|
||||||
|
visibility: 'MANAGER_AND_ABOVE',
|
||||||
|
title: 'Document Visible to Manager and Above',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
sender: team.owner,
|
||||||
|
recipients: [],
|
||||||
|
type: DocumentStatus.COMPLETED,
|
||||||
|
documentOptions: {
|
||||||
|
teamId: team.id,
|
||||||
|
visibility: 'ADMIN',
|
||||||
|
title: 'Document Visible to Admin',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
sender: team.owner,
|
||||||
|
recipients: [outsideUser],
|
||||||
|
type: DocumentStatus.COMPLETED,
|
||||||
|
documentOptions: {
|
||||||
|
teamId: team.id,
|
||||||
|
visibility: 'ADMIN',
|
||||||
|
title: 'Document Visible to Admin with Recipient',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Test cases for each role
|
||||||
|
const testCases = [
|
||||||
|
{
|
||||||
|
user: adminUser,
|
||||||
|
expectedDocuments: [
|
||||||
|
'Document Visible to Everyone',
|
||||||
|
'Document Visible to Manager and Above',
|
||||||
|
'Document Visible to Admin',
|
||||||
|
'Document Visible to Admin with Recipient',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
user: managerUser,
|
||||||
|
expectedDocuments: ['Document Visible to Everyone', 'Document Visible to Manager and Above'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
user: memberUser,
|
||||||
|
expectedDocuments: ['Document Visible to Everyone'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
user: outsideUser,
|
||||||
|
expectedDocuments: ['Document Visible to Admin with Recipient'],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
for (const testCase of testCases) {
|
||||||
|
await apiSignin({
|
||||||
|
page,
|
||||||
|
email: testCase.user.email,
|
||||||
|
redirectPath: `/t/${team.url}/documents?status=COMPLETED`,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Check that the user sees the expected documents
|
||||||
|
for (const documentTitle of testCase.expectedDocuments) {
|
||||||
|
await expect(page.getByRole('link', { name: documentTitle, exact: true })).toBeVisible();
|
||||||
|
}
|
||||||
|
|
||||||
|
await apiSignout({ page });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
test('[TEAMS]: ensure recipient can see document regardless of visibility', async ({ page }) => {
|
||||||
|
const team = await seedTeam();
|
||||||
|
|
||||||
|
// Seed a member user
|
||||||
|
const memberUser = await seedTeamMember({
|
||||||
|
teamId: team.id,
|
||||||
|
role: TeamMemberRole.MEMBER,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Seed a document with ADMIN visibility but make the member user a recipient
|
||||||
|
await seedDocuments([
|
||||||
|
{
|
||||||
|
sender: team.owner,
|
||||||
|
recipients: [memberUser],
|
||||||
|
type: DocumentStatus.COMPLETED,
|
||||||
|
documentOptions: {
|
||||||
|
teamId: team.id,
|
||||||
|
visibility: 'ADMIN',
|
||||||
|
title: 'Admin Document with Member Recipient',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
await apiSignin({
|
||||||
|
page,
|
||||||
|
email: memberUser.email,
|
||||||
|
redirectPath: `/t/${team.url}/documents?status=COMPLETED`,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Check that the member user can see the document
|
||||||
|
await expect(
|
||||||
|
page.getByRole('link', { name: 'Admin Document with Member Recipient', exact: true }),
|
||||||
|
).toBeVisible();
|
||||||
|
|
||||||
|
await apiSignout({ page });
|
||||||
|
});
|
||||||
|
|
||||||
|
test('[TEAMS]: check that members cannot see ADMIN-only documents', async ({ page }) => {
|
||||||
|
const team = await seedTeam();
|
||||||
|
|
||||||
|
// Seed a member user
|
||||||
|
const memberUser = await seedTeamMember({
|
||||||
|
teamId: team.id,
|
||||||
|
role: TeamMemberRole.MEMBER,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Seed an ADMIN-only document
|
||||||
|
await seedDocuments([
|
||||||
|
{
|
||||||
|
sender: team.owner,
|
||||||
|
recipients: [],
|
||||||
|
type: DocumentStatus.COMPLETED,
|
||||||
|
documentOptions: {
|
||||||
|
teamId: team.id,
|
||||||
|
visibility: 'ADMIN',
|
||||||
|
title: 'Admin Only Document',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
await apiSignin({
|
||||||
|
page,
|
||||||
|
email: memberUser.email,
|
||||||
|
redirectPath: `/t/${team.url}/documents?status=COMPLETED`,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Check that the member user cannot see the ADMIN-only document
|
||||||
|
await expect(
|
||||||
|
page.getByRole('link', { name: 'Admin Only Document', exact: true }),
|
||||||
|
).not.toBeVisible();
|
||||||
|
|
||||||
|
await apiSignout({ page });
|
||||||
|
});
|
||||||
|
|
||||||
|
test('[TEAMS]: check that managers cannot see ADMIN-only documents', async ({ page }) => {
|
||||||
|
const team = await seedTeam();
|
||||||
|
|
||||||
|
// Seed a manager user
|
||||||
|
const managerUser = await seedTeamMember({
|
||||||
|
teamId: team.id,
|
||||||
|
role: TeamMemberRole.MANAGER,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Seed an ADMIN-only document
|
||||||
|
await seedDocuments([
|
||||||
|
{
|
||||||
|
sender: team.owner,
|
||||||
|
recipients: [],
|
||||||
|
type: DocumentStatus.COMPLETED,
|
||||||
|
documentOptions: {
|
||||||
|
teamId: team.id,
|
||||||
|
visibility: 'ADMIN',
|
||||||
|
title: 'Admin Only Document',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
await apiSignin({
|
||||||
|
page,
|
||||||
|
email: managerUser.email,
|
||||||
|
redirectPath: `/t/${team.url}/documents?status=COMPLETED`,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Check that the manager user cannot see the ADMIN-only document
|
||||||
|
await expect(
|
||||||
|
page.getByRole('link', { name: 'Admin Only Document', exact: true }),
|
||||||
|
).not.toBeVisible();
|
||||||
|
|
||||||
|
await apiSignout({ page });
|
||||||
|
});
|
||||||
|
|
||||||
|
test('[TEAMS]: check that admin can see MANAGER_AND_ABOVE documents', async ({ page }) => {
|
||||||
|
const team = await seedTeam();
|
||||||
|
|
||||||
|
// Seed an admin user
|
||||||
|
const adminUser = await seedTeamMember({
|
||||||
|
teamId: team.id,
|
||||||
|
role: TeamMemberRole.ADMIN,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Seed a MANAGER_AND_ABOVE document
|
||||||
|
await seedDocuments([
|
||||||
|
{
|
||||||
|
sender: team.owner,
|
||||||
|
recipients: [],
|
||||||
|
type: DocumentStatus.COMPLETED,
|
||||||
|
documentOptions: {
|
||||||
|
teamId: team.id,
|
||||||
|
visibility: 'MANAGER_AND_ABOVE',
|
||||||
|
title: 'Manager and Above Document',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
await apiSignin({
|
||||||
|
page,
|
||||||
|
email: adminUser.email,
|
||||||
|
redirectPath: `/t/${team.url}/documents?status=COMPLETED`,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Check that the admin user can see the MANAGER_AND_ABOVE document
|
||||||
|
await expect(
|
||||||
|
page.getByRole('link', { name: 'Manager and Above Document', exact: true }),
|
||||||
|
).toBeVisible();
|
||||||
|
|
||||||
|
await apiSignout({ page });
|
||||||
|
});
|
||||||
|
|
||||||
|
test('[TEAMS]: users cannot see documents from other teams', async ({ page }) => {
|
||||||
|
// Seed two teams with documents
|
||||||
|
const { team: teamA, teamMember2: teamAMember } = await seedTeamDocuments();
|
||||||
|
const { team: teamB, teamMember2: teamBMember } = await seedTeamDocuments();
|
||||||
|
|
||||||
|
// Seed a document in team B
|
||||||
|
await seedDocuments([
|
||||||
|
{
|
||||||
|
sender: teamB.owner,
|
||||||
|
recipients: [],
|
||||||
|
type: DocumentStatus.COMPLETED,
|
||||||
|
documentOptions: {
|
||||||
|
teamId: teamB.id,
|
||||||
|
visibility: 'EVERYONE',
|
||||||
|
title: 'Team B Document',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Sign in as a member of team A
|
||||||
|
await apiSignin({
|
||||||
|
page,
|
||||||
|
email: teamAMember.email,
|
||||||
|
redirectPath: `/t/${teamA.url}/documents?status=COMPLETED`,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Verify that the user cannot see the document from team B
|
||||||
|
await expect(page.getByRole('link', { name: 'Team B Document', exact: true })).not.toBeVisible();
|
||||||
|
|
||||||
|
await apiSignout({ page });
|
||||||
|
});
|
||||||
|
|
||||||
|
test('[TEAMS]: personal documents are not visible in team context', async ({ page }) => {
|
||||||
|
// Seed a team and a user with personal documents
|
||||||
|
const { team, teamMember2 } = await seedTeamDocuments();
|
||||||
|
const personalUser = await seedUser();
|
||||||
|
|
||||||
|
// Seed a personal document for teamMember2
|
||||||
|
await seedDocuments([
|
||||||
|
{
|
||||||
|
sender: teamMember2,
|
||||||
|
recipients: [],
|
||||||
|
type: DocumentStatus.COMPLETED,
|
||||||
|
documentOptions: {
|
||||||
|
teamId: null, // Indicates a personal document
|
||||||
|
visibility: 'EVERYONE',
|
||||||
|
title: 'Personal Document',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Sign in as teamMember2 in the team context
|
||||||
|
await apiSignin({
|
||||||
|
page,
|
||||||
|
email: teamMember2.email,
|
||||||
|
redirectPath: `/t/${team.url}/documents?status=COMPLETED`,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Verify that the personal document is not visible in the team context
|
||||||
|
await expect(
|
||||||
|
page.getByRole('link', { name: 'Personal Document', exact: true }),
|
||||||
|
).not.toBeVisible();
|
||||||
|
|
||||||
|
await apiSignout({ page });
|
||||||
|
});
|
||||||
|
|
||||||
|
test('[PERSONAL]: team documents are not visible in personal account', async ({ page }) => {
|
||||||
|
// Seed a team and a user with personal documents
|
||||||
|
const { team, teamMember2 } = await seedTeamDocuments();
|
||||||
|
|
||||||
|
// Seed a team document
|
||||||
|
await seedDocuments([
|
||||||
|
{
|
||||||
|
sender: teamMember2,
|
||||||
|
recipients: [],
|
||||||
|
type: DocumentStatus.COMPLETED,
|
||||||
|
documentOptions: {
|
||||||
|
teamId: team.id,
|
||||||
|
visibility: 'EVERYONE',
|
||||||
|
title: 'Team Document',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Sign in as teamMember2 in the personal context
|
||||||
|
await apiSignin({
|
||||||
|
page,
|
||||||
|
email: teamMember2.email,
|
||||||
|
redirectPath: `/documents?status=COMPLETED`,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Verify that the team document is not visible in the personal context
|
||||||
|
await expect(page.getByRole('link', { name: 'Team Document', exact: true })).not.toBeVisible();
|
||||||
|
|
||||||
|
await apiSignout({ page });
|
||||||
|
});
|
||||||
|
|||||||
@@ -42,10 +42,8 @@ test.describe('[EE_ONLY]', () => {
|
|||||||
await page.getByPlaceholder('Email').fill('recipient1@documenso.com');
|
await page.getByPlaceholder('Email').fill('recipient1@documenso.com');
|
||||||
await page.getByPlaceholder('Name').fill('Recipient 1');
|
await page.getByPlaceholder('Name').fill('Recipient 1');
|
||||||
await page.getByRole('button', { name: 'Add Placeholder Recipient' }).click();
|
await page.getByRole('button', { name: 'Add Placeholder Recipient' }).click();
|
||||||
await page
|
await page.getByPlaceholder('Email').nth(1).fill('recipient2@documenso.com');
|
||||||
.getByRole('textbox', { name: 'Email', exact: true })
|
await page.getByPlaceholder('Name').nth(1).fill('Recipient 2');
|
||||||
.fill('recipient2@documenso.com');
|
|
||||||
await page.getByRole('textbox', { name: 'Name', exact: true }).nth(1).fill('Recipient 2');
|
|
||||||
|
|
||||||
// Display advanced settings.
|
// Display advanced settings.
|
||||||
await page.getByLabel('Show advanced settings').check();
|
await page.getByLabel('Show advanced settings').check();
|
||||||
@@ -94,8 +92,8 @@ test('[TEMPLATE_FLOW]: add placeholder', async ({ page }) => {
|
|||||||
await page.getByPlaceholder('Email').fill('recipient1@documenso.com');
|
await page.getByPlaceholder('Email').fill('recipient1@documenso.com');
|
||||||
await page.getByPlaceholder('Name').fill('Recipient 1');
|
await page.getByPlaceholder('Name').fill('Recipient 1');
|
||||||
await page.getByRole('button', { name: 'Add Placeholder Recipient' }).click();
|
await page.getByRole('button', { name: 'Add Placeholder Recipient' }).click();
|
||||||
await page.getByRole('textbox', { name: 'Email', exact: true }).fill('recipient2@documenso.com');
|
await page.getByPlaceholder('Email').nth(1).fill('recipient2@documenso.com');
|
||||||
await page.getByRole('textbox', { name: 'Name', exact: true }).nth(1).fill('Recipient 2');
|
await page.getByPlaceholder('Name').nth(1).fill('Recipient 2');
|
||||||
|
|
||||||
// Advanced settings should not be visible for non EE users.
|
// Advanced settings should not be visible for non EE users.
|
||||||
await expect(page.getByLabel('Show advanced settings')).toBeHidden();
|
await expect(page.getByLabel('Show advanced settings')).toBeHidden();
|
||||||
|
|||||||
@@ -76,8 +76,8 @@ test('[TEMPLATE]: should create a document from a template', async ({ page }) =>
|
|||||||
await page.getByPlaceholder('Email').fill('recipient1@documenso.com');
|
await page.getByPlaceholder('Email').fill('recipient1@documenso.com');
|
||||||
await page.getByPlaceholder('Name').fill('Recipient 1');
|
await page.getByPlaceholder('Name').fill('Recipient 1');
|
||||||
await page.getByRole('button', { name: 'Add Placeholder Recipient' }).click();
|
await page.getByRole('button', { name: 'Add Placeholder Recipient' }).click();
|
||||||
await page.getByRole('textbox', { name: 'Email', exact: true }).fill('recipient2@documenso.com');
|
await page.getByPlaceholder('Email').nth(1).fill('recipient2@documenso.com');
|
||||||
await page.getByRole('textbox', { name: 'Name', exact: true }).nth(1).fill('Recipient 2');
|
await page.getByPlaceholder('Name').nth(1).fill('Recipient 2');
|
||||||
|
|
||||||
// Apply require passkey for Recipient 1.
|
// Apply require passkey for Recipient 1.
|
||||||
if (isBillingEnabled) {
|
if (isBillingEnabled) {
|
||||||
@@ -211,8 +211,8 @@ test('[TEMPLATE]: should create a team document from a team template', async ({
|
|||||||
await page.getByPlaceholder('Email').fill('recipient1@documenso.com');
|
await page.getByPlaceholder('Email').fill('recipient1@documenso.com');
|
||||||
await page.getByPlaceholder('Name').fill('Recipient 1');
|
await page.getByPlaceholder('Name').fill('Recipient 1');
|
||||||
await page.getByRole('button', { name: 'Add Placeholder Recipient' }).click();
|
await page.getByRole('button', { name: 'Add Placeholder Recipient' }).click();
|
||||||
await page.getByRole('textbox', { name: 'Email', exact: true }).fill('recipient2@documenso.com');
|
await page.getByPlaceholder('Email').nth(1).fill('recipient2@documenso.com');
|
||||||
await page.getByRole('textbox', { name: 'Name', exact: true }).nth(1).fill('Recipient 2');
|
await page.getByPlaceholder('Name').nth(1).fill('Recipient 2');
|
||||||
|
|
||||||
// Apply require passkey for Recipient 1.
|
// Apply require passkey for Recipient 1.
|
||||||
if (isBillingEnabled) {
|
if (isBillingEnabled) {
|
||||||
|
|||||||
@@ -3,12 +3,12 @@ import { useCallback, useRef, useState } from 'react';
|
|||||||
type ThrottleOptions = {
|
type ThrottleOptions = {
|
||||||
leading?: boolean;
|
leading?: boolean;
|
||||||
trailing?: boolean;
|
trailing?: boolean;
|
||||||
}
|
};
|
||||||
|
|
||||||
export function useThrottleFn<T extends (...args: unknown[]) => unknown>(
|
export function useThrottleFn<T extends (...args: unknown[]) => unknown>(
|
||||||
fn: T,
|
fn: T,
|
||||||
ms = 500,
|
ms = 500,
|
||||||
options: ThrottleOptions = {}
|
options: ThrottleOptions = {},
|
||||||
): [(...args: Parameters<T>) => void, boolean, () => void] {
|
): [(...args: Parameters<T>) => void, boolean, () => void] {
|
||||||
const [isThrottling, setIsThrottling] = useState(false);
|
const [isThrottling, setIsThrottling] = useState(false);
|
||||||
const $isThrottling = useRef(false);
|
const $isThrottling = useRef(false);
|
||||||
@@ -44,7 +44,7 @@ export function useThrottleFn<T extends (...args: unknown[]) => unknown>(
|
|||||||
$lastArgs.current = args;
|
$lastArgs.current = args;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[fn, ms, leading, trailing, $setIsThrottling]
|
[fn, ms, leading, trailing, $setIsThrottling],
|
||||||
);
|
);
|
||||||
|
|
||||||
const cancel = useCallback(() => {
|
const cancel = useCallback(() => {
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ export const APP_DOCUMENT_UPLOAD_SIZE_LIMIT =
|
|||||||
|
|
||||||
export const NEXT_PUBLIC_WEBAPP_URL = () => env('NEXT_PUBLIC_WEBAPP_URL');
|
export const NEXT_PUBLIC_WEBAPP_URL = () => env('NEXT_PUBLIC_WEBAPP_URL');
|
||||||
export const NEXT_PUBLIC_MARKETING_URL = () => env('NEXT_PUBLIC_MARKETING_URL');
|
export const NEXT_PUBLIC_MARKETING_URL = () => env('NEXT_PUBLIC_MARKETING_URL');
|
||||||
export const NEXT_PRIVATE_INTERNAL_WEBAPP_URL = process.env.NEXT_PRIVATE_INTERNAL_WEBAPP_URL ?? NEXT_PUBLIC_WEBAPP_URL();
|
export const NEXT_PRIVATE_INTERNAL_WEBAPP_URL =
|
||||||
|
process.env.NEXT_PRIVATE_INTERNAL_WEBAPP_URL ?? NEXT_PUBLIC_WEBAPP_URL();
|
||||||
|
|
||||||
export const IS_APP_MARKETING = process.env.NEXT_PUBLIC_PROJECT === 'marketing';
|
export const IS_APP_MARKETING = process.env.NEXT_PUBLIC_PROJECT === 'marketing';
|
||||||
export const IS_APP_WEB = process.env.NEXT_PUBLIC_PROJECT === 'web';
|
export const IS_APP_WEB = process.env.NEXT_PUBLIC_PROJECT === 'web';
|
||||||
|
|||||||
23
packages/lib/constants/document-visibility.ts
Normal file
23
packages/lib/constants/document-visibility.ts
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
import { DocumentVisibility } from '@documenso/lib/types/document-visibility';
|
||||||
|
|
||||||
|
import type { TDocumentVisibility } from '../types/document-visibility';
|
||||||
|
|
||||||
|
type DocumentVisibilityTypeData = {
|
||||||
|
key: TDocumentVisibility;
|
||||||
|
value: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const DOCUMENT_VISIBILITY: Record<string, DocumentVisibilityTypeData> = {
|
||||||
|
[DocumentVisibility.ADMIN]: {
|
||||||
|
key: DocumentVisibility.ADMIN,
|
||||||
|
value: 'Admins only',
|
||||||
|
},
|
||||||
|
[DocumentVisibility.EVERYONE]: {
|
||||||
|
key: DocumentVisibility.EVERYONE,
|
||||||
|
value: 'Everyone',
|
||||||
|
},
|
||||||
|
[DocumentVisibility.MANAGER_AND_ABOVE]: {
|
||||||
|
key: DocumentVisibility.MANAGER_AND_ABOVE,
|
||||||
|
value: 'Managers and above',
|
||||||
|
},
|
||||||
|
} satisfies Record<TDocumentVisibility, DocumentVisibilityTypeData>;
|
||||||
@@ -7,6 +7,7 @@ import {
|
|||||||
diffDocumentMetaChanges,
|
diffDocumentMetaChanges,
|
||||||
} from '@documenso/lib/utils/document-audit-logs';
|
} from '@documenso/lib/utils/document-audit-logs';
|
||||||
import { prisma } from '@documenso/prisma';
|
import { prisma } from '@documenso/prisma';
|
||||||
|
import type { DocumentSigningOrder } from '@documenso/prisma/client';
|
||||||
|
|
||||||
export type CreateDocumentMetaOptions = {
|
export type CreateDocumentMetaOptions = {
|
||||||
documentId: number;
|
documentId: number;
|
||||||
@@ -16,6 +17,7 @@ export type CreateDocumentMetaOptions = {
|
|||||||
password?: string;
|
password?: string;
|
||||||
dateFormat?: string;
|
dateFormat?: string;
|
||||||
redirectUrl?: string;
|
redirectUrl?: string;
|
||||||
|
signingOrder?: DocumentSigningOrder;
|
||||||
userId: number;
|
userId: number;
|
||||||
requestMetadata: RequestMetadata;
|
requestMetadata: RequestMetadata;
|
||||||
};
|
};
|
||||||
@@ -29,6 +31,7 @@ export const upsertDocumentMeta = async ({
|
|||||||
password,
|
password,
|
||||||
userId,
|
userId,
|
||||||
redirectUrl,
|
redirectUrl,
|
||||||
|
signingOrder,
|
||||||
requestMetadata,
|
requestMetadata,
|
||||||
}: CreateDocumentMetaOptions) => {
|
}: CreateDocumentMetaOptions) => {
|
||||||
const user = await prisma.user.findFirstOrThrow({
|
const user = await prisma.user.findFirstOrThrow({
|
||||||
@@ -78,6 +81,7 @@ export const upsertDocumentMeta = async ({
|
|||||||
timezone,
|
timezone,
|
||||||
documentId,
|
documentId,
|
||||||
redirectUrl,
|
redirectUrl,
|
||||||
|
signingOrder,
|
||||||
},
|
},
|
||||||
update: {
|
update: {
|
||||||
subject,
|
subject,
|
||||||
@@ -86,6 +90,7 @@ export const upsertDocumentMeta = async ({
|
|||||||
dateFormat,
|
dateFormat,
|
||||||
timezone,
|
timezone,
|
||||||
redirectUrl,
|
redirectUrl,
|
||||||
|
signingOrder,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -2,11 +2,18 @@ import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-log
|
|||||||
import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata';
|
import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata';
|
||||||
import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs';
|
import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs';
|
||||||
import { prisma } from '@documenso/prisma';
|
import { prisma } from '@documenso/prisma';
|
||||||
import { DocumentStatus, SigningStatus } from '@documenso/prisma/client';
|
import {
|
||||||
|
DocumentSigningOrder,
|
||||||
|
DocumentStatus,
|
||||||
|
RecipientRole,
|
||||||
|
SendStatus,
|
||||||
|
SigningStatus,
|
||||||
|
} from '@documenso/prisma/client';
|
||||||
import { WebhookTriggerEvents } from '@documenso/prisma/client';
|
import { WebhookTriggerEvents } from '@documenso/prisma/client';
|
||||||
|
|
||||||
import { jobs } from '../../jobs/client';
|
import { jobs } from '../../jobs/client';
|
||||||
import type { TRecipientActionAuth } from '../../types/document-auth';
|
import type { TRecipientActionAuth } from '../../types/document-auth';
|
||||||
|
import { getIsRecipientsTurnToSign } from '../recipient/get-is-recipient-turn';
|
||||||
import { triggerWebhook } from '../webhooks/trigger/trigger-webhook';
|
import { triggerWebhook } from '../webhooks/trigger/trigger-webhook';
|
||||||
import { sendPendingEmail } from './send-pending-email';
|
import { sendPendingEmail } from './send-pending-email';
|
||||||
|
|
||||||
@@ -29,6 +36,7 @@ const getDocument = async ({ token, documentId }: CompleteDocumentWithTokenOptio
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
include: {
|
include: {
|
||||||
|
documentMeta: true,
|
||||||
Recipient: {
|
Recipient: {
|
||||||
where: {
|
where: {
|
||||||
token,
|
token,
|
||||||
@@ -59,6 +67,16 @@ export const completeDocumentWithToken = async ({
|
|||||||
throw new Error(`Recipient ${recipient.id} has already signed`);
|
throw new Error(`Recipient ${recipient.id} has already signed`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (document.documentMeta?.signingOrder === DocumentSigningOrder.SEQUENTIAL) {
|
||||||
|
const isRecipientsTurn = await getIsRecipientsTurnToSign({ token: recipient.token });
|
||||||
|
|
||||||
|
if (!isRecipientsTurn) {
|
||||||
|
throw new Error(
|
||||||
|
`Recipient ${recipient.id} attempted to complete the document before it was their turn`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const fields = await prisma.field.findMany({
|
const fields = await prisma.field.findMany({
|
||||||
where: {
|
where: {
|
||||||
documentId: document.id,
|
documentId: document.id,
|
||||||
@@ -120,17 +138,48 @@ export const completeDocumentWithToken = async ({
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
const pendingRecipients = await prisma.recipient.count({
|
const pendingRecipients = await prisma.recipient.findMany({
|
||||||
|
select: {
|
||||||
|
id: true,
|
||||||
|
signingOrder: true,
|
||||||
|
},
|
||||||
where: {
|
where: {
|
||||||
documentId: document.id,
|
documentId: document.id,
|
||||||
signingStatus: {
|
signingStatus: {
|
||||||
not: SigningStatus.SIGNED,
|
not: SigningStatus.SIGNED,
|
||||||
},
|
},
|
||||||
|
role: {
|
||||||
|
not: RecipientRole.CC,
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
// Composite sort so our next recipient is always the one with the lowest signing order or id
|
||||||
|
// if there is a tie.
|
||||||
|
orderBy: [{ signingOrder: { sort: 'asc', nulls: 'last' } }, { id: 'asc' }],
|
||||||
});
|
});
|
||||||
|
|
||||||
if (pendingRecipients > 0) {
|
if (pendingRecipients.length > 0) {
|
||||||
await sendPendingEmail({ documentId, recipientId: recipient.id });
|
await sendPendingEmail({ documentId, recipientId: recipient.id });
|
||||||
|
|
||||||
|
if (document.documentMeta?.signingOrder === DocumentSigningOrder.SEQUENTIAL) {
|
||||||
|
const [nextRecipient] = pendingRecipients;
|
||||||
|
|
||||||
|
await prisma.$transaction(async (tx) => {
|
||||||
|
await tx.recipient.update({
|
||||||
|
where: { id: nextRecipient.id },
|
||||||
|
data: { sendStatus: SendStatus.SENT },
|
||||||
|
});
|
||||||
|
|
||||||
|
await jobs.triggerJob({
|
||||||
|
name: 'send.signing.requested.email',
|
||||||
|
payload: {
|
||||||
|
userId: document.userId,
|
||||||
|
documentId: document.id,
|
||||||
|
recipientId: nextRecipient.id,
|
||||||
|
requestMetadata,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const haveAllRecipientsSigned = await prisma.document.findFirst({
|
const haveAllRecipientsSigned = await prisma.document.findFirst({
|
||||||
@@ -138,7 +187,7 @@ export const completeDocumentWithToken = async ({
|
|||||||
id: document.id,
|
id: document.id,
|
||||||
Recipient: {
|
Recipient: {
|
||||||
every: {
|
every: {
|
||||||
signingStatus: SigningStatus.SIGNED,
|
OR: [{ signingStatus: SigningStatus.SIGNED }, { role: RecipientRole.CC }],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2,10 +2,11 @@ import { DateTime } from 'luxon';
|
|||||||
import { P, match } from 'ts-pattern';
|
import { P, match } from 'ts-pattern';
|
||||||
|
|
||||||
import { prisma } from '@documenso/prisma';
|
import { prisma } from '@documenso/prisma';
|
||||||
import { RecipientRole, SigningStatus } from '@documenso/prisma/client';
|
import { RecipientRole, SigningStatus, TeamMemberRole } from '@documenso/prisma/client';
|
||||||
import type { Document, Prisma, Team, TeamEmail, User } from '@documenso/prisma/client';
|
import type { Document, Prisma, Team, TeamEmail, User } from '@documenso/prisma/client';
|
||||||
import { ExtendedDocumentStatus } from '@documenso/prisma/types/extended-document-status';
|
import { ExtendedDocumentStatus } from '@documenso/prisma/types/extended-document-status';
|
||||||
|
|
||||||
|
import { DocumentVisibility } from '../../types/document-visibility';
|
||||||
import type { FindResultSet } from '../../types/find-result-set';
|
import type { FindResultSet } from '../../types/find-result-set';
|
||||||
import { maskRecipientTokensForDocument } from '../../utils/mask-recipient-tokens-for-document';
|
import { maskRecipientTokensForDocument } from '../../utils/mask-recipient-tokens-for-document';
|
||||||
|
|
||||||
@@ -58,6 +59,14 @@ export const findDocuments = async ({
|
|||||||
},
|
},
|
||||||
include: {
|
include: {
|
||||||
teamEmail: true,
|
teamEmail: true,
|
||||||
|
members: {
|
||||||
|
where: {
|
||||||
|
userId,
|
||||||
|
},
|
||||||
|
select: {
|
||||||
|
role: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -70,6 +79,7 @@ export const findDocuments = async ({
|
|||||||
|
|
||||||
const orderByColumn = orderBy?.column ?? 'createdAt';
|
const orderByColumn = orderBy?.column ?? 'createdAt';
|
||||||
const orderByDirection = orderBy?.direction ?? 'desc';
|
const orderByDirection = orderBy?.direction ?? 'desc';
|
||||||
|
const teamMemberRole = team?.members[0].role ?? null;
|
||||||
|
|
||||||
const termFilters = match(term)
|
const termFilters = match(term)
|
||||||
.with(P.string.minLength(1), () => {
|
.with(P.string.minLength(1), () => {
|
||||||
@@ -82,7 +92,37 @@ export const findDocuments = async ({
|
|||||||
})
|
})
|
||||||
.otherwise(() => undefined);
|
.otherwise(() => undefined);
|
||||||
|
|
||||||
const filters = team ? findTeamDocumentsFilter(status, team) : findDocumentsFilter(status, user);
|
const visibilityFilters = [
|
||||||
|
match(teamMemberRole)
|
||||||
|
.with(TeamMemberRole.ADMIN, () => ({
|
||||||
|
visibility: {
|
||||||
|
in: [
|
||||||
|
DocumentVisibility.EVERYONE,
|
||||||
|
DocumentVisibility.MANAGER_AND_ABOVE,
|
||||||
|
DocumentVisibility.ADMIN,
|
||||||
|
],
|
||||||
|
},
|
||||||
|
}))
|
||||||
|
.with(TeamMemberRole.MANAGER, () => ({
|
||||||
|
visibility: {
|
||||||
|
in: [DocumentVisibility.EVERYONE, DocumentVisibility.MANAGER_AND_ABOVE],
|
||||||
|
},
|
||||||
|
}))
|
||||||
|
.otherwise(() => ({ visibility: DocumentVisibility.EVERYONE })),
|
||||||
|
{
|
||||||
|
Recipient: {
|
||||||
|
some: {
|
||||||
|
email: user.email,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
let filters: Prisma.DocumentWhereInput | null = findDocumentsFilter(status, user);
|
||||||
|
|
||||||
|
if (team) {
|
||||||
|
filters = findTeamDocumentsFilter(status, team, visibilityFilters);
|
||||||
|
}
|
||||||
|
|
||||||
if (filters === null) {
|
if (filters === null) {
|
||||||
return {
|
return {
|
||||||
@@ -148,9 +188,7 @@ export const findDocuments = async ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const whereClause: Prisma.DocumentWhereInput = {
|
const whereClause: Prisma.DocumentWhereInput = {
|
||||||
...termFilters,
|
AND: [{ ...termFilters }, { ...filters }, { ...deletedFilter }],
|
||||||
...filters,
|
|
||||||
...deletedFilter,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if (period) {
|
if (period) {
|
||||||
@@ -333,6 +371,7 @@ const findDocumentsFilter = (status: ExtendedDocumentStatus, user: User) => {
|
|||||||
const findTeamDocumentsFilter = (
|
const findTeamDocumentsFilter = (
|
||||||
status: ExtendedDocumentStatus,
|
status: ExtendedDocumentStatus,
|
||||||
team: Team & { teamEmail: TeamEmail | null },
|
team: Team & { teamEmail: TeamEmail | null },
|
||||||
|
visibilityFilters: Prisma.DocumentWhereInput[],
|
||||||
) => {
|
) => {
|
||||||
const teamEmail = team.teamEmail?.email ?? null;
|
const teamEmail = team.teamEmail?.email ?? null;
|
||||||
|
|
||||||
@@ -343,6 +382,7 @@ const findTeamDocumentsFilter = (
|
|||||||
OR: [
|
OR: [
|
||||||
{
|
{
|
||||||
teamId: team.id,
|
teamId: team.id,
|
||||||
|
OR: visibilityFilters,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
@@ -358,6 +398,7 @@ const findTeamDocumentsFilter = (
|
|||||||
email: teamEmail,
|
email: teamEmail,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
OR: visibilityFilters,
|
||||||
});
|
});
|
||||||
|
|
||||||
// Filter to display all documents that have been sent by the team email.
|
// Filter to display all documents that have been sent by the team email.
|
||||||
@@ -365,6 +406,7 @@ const findTeamDocumentsFilter = (
|
|||||||
User: {
|
User: {
|
||||||
email: teamEmail,
|
email: teamEmail,
|
||||||
},
|
},
|
||||||
|
OR: visibilityFilters,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -389,6 +431,7 @@ const findTeamDocumentsFilter = (
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
OR: visibilityFilters,
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
.with(ExtendedDocumentStatus.DRAFT, () => {
|
.with(ExtendedDocumentStatus.DRAFT, () => {
|
||||||
@@ -397,6 +440,7 @@ const findTeamDocumentsFilter = (
|
|||||||
{
|
{
|
||||||
teamId: team.id,
|
teamId: team.id,
|
||||||
status: ExtendedDocumentStatus.DRAFT,
|
status: ExtendedDocumentStatus.DRAFT,
|
||||||
|
OR: visibilityFilters,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
@@ -407,6 +451,7 @@ const findTeamDocumentsFilter = (
|
|||||||
User: {
|
User: {
|
||||||
email: teamEmail,
|
email: teamEmail,
|
||||||
},
|
},
|
||||||
|
OR: visibilityFilters,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -418,6 +463,7 @@ const findTeamDocumentsFilter = (
|
|||||||
{
|
{
|
||||||
teamId: team.id,
|
teamId: team.id,
|
||||||
status: ExtendedDocumentStatus.PENDING,
|
status: ExtendedDocumentStatus.PENDING,
|
||||||
|
OR: visibilityFilters,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
@@ -436,11 +482,13 @@ const findTeamDocumentsFilter = (
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
OR: visibilityFilters,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
User: {
|
User: {
|
||||||
email: teamEmail,
|
email: teamEmail,
|
||||||
},
|
},
|
||||||
|
OR: visibilityFilters,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
@@ -454,6 +502,7 @@ const findTeamDocumentsFilter = (
|
|||||||
OR: [
|
OR: [
|
||||||
{
|
{
|
||||||
teamId: team.id,
|
teamId: team.id,
|
||||||
|
OR: visibilityFilters,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
@@ -466,11 +515,13 @@ const findTeamDocumentsFilter = (
|
|||||||
email: teamEmail,
|
email: teamEmail,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
OR: visibilityFilters,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
User: {
|
User: {
|
||||||
email: teamEmail,
|
email: teamEmail,
|
||||||
},
|
},
|
||||||
|
OR: visibilityFilters,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
|
import { match } from 'ts-pattern';
|
||||||
|
|
||||||
import { prisma } from '@documenso/prisma';
|
import { prisma } from '@documenso/prisma';
|
||||||
import type { Prisma } from '@documenso/prisma/client';
|
import type { Prisma } from '@documenso/prisma/client';
|
||||||
|
import { TeamMemberRole } from '@documenso/prisma/client';
|
||||||
|
|
||||||
|
import { DocumentVisibility } from '../../types/document-visibility';
|
||||||
import { getTeamById } from '../team/get-team';
|
import { getTeamById } from '../team/get-team';
|
||||||
|
|
||||||
export type GetDocumentByIdOptions = {
|
export type GetDocumentByIdOptions = {
|
||||||
@@ -28,6 +32,11 @@ export const getDocumentById = async ({ id, userId, teamId }: GetDocumentByIdOpt
|
|||||||
email: true,
|
email: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
Recipient: {
|
||||||
|
select: {
|
||||||
|
email: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
team: {
|
team: {
|
||||||
select: {
|
select: {
|
||||||
id: true,
|
id: true,
|
||||||
@@ -115,5 +124,35 @@ export const getDocumentWhereInput = async ({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return documentWhereInput;
|
const user = await prisma.user.findFirstOrThrow({
|
||||||
|
where: {
|
||||||
|
id: userId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const visibilityFilters = [
|
||||||
|
...match(team.currentTeamMember?.role)
|
||||||
|
.with(TeamMemberRole.ADMIN, () => [
|
||||||
|
{ visibility: DocumentVisibility.EVERYONE },
|
||||||
|
{ visibility: DocumentVisibility.MANAGER_AND_ABOVE },
|
||||||
|
{ visibility: DocumentVisibility.ADMIN },
|
||||||
|
])
|
||||||
|
.with(TeamMemberRole.MANAGER, () => [
|
||||||
|
{ visibility: DocumentVisibility.EVERYONE },
|
||||||
|
{ visibility: DocumentVisibility.MANAGER_AND_ABOVE },
|
||||||
|
])
|
||||||
|
.otherwise(() => [{ visibility: DocumentVisibility.EVERYONE }]),
|
||||||
|
{
|
||||||
|
Recipient: {
|
||||||
|
some: {
|
||||||
|
email: user.email,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
return {
|
||||||
|
...documentWhereInput,
|
||||||
|
OR: [...visibilityFilters],
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,12 +1,16 @@
|
|||||||
import { DateTime } from 'luxon';
|
import { DateTime } from 'luxon';
|
||||||
|
import { match } from 'ts-pattern';
|
||||||
|
|
||||||
import type { PeriodSelectorValue } from '@documenso/lib/server-only/document/find-documents';
|
import type { PeriodSelectorValue } from '@documenso/lib/server-only/document/find-documents';
|
||||||
import { prisma } from '@documenso/prisma';
|
import { prisma } from '@documenso/prisma';
|
||||||
|
import { TeamMemberRole } from '@documenso/prisma/client';
|
||||||
import type { Prisma, User } from '@documenso/prisma/client';
|
import type { Prisma, User } from '@documenso/prisma/client';
|
||||||
import { SigningStatus } from '@documenso/prisma/client';
|
import { SigningStatus } from '@documenso/prisma/client';
|
||||||
import { isExtendedDocumentStatus } from '@documenso/prisma/guards/is-extended-document-status';
|
import { isExtendedDocumentStatus } from '@documenso/prisma/guards/is-extended-document-status';
|
||||||
import { ExtendedDocumentStatus } from '@documenso/prisma/types/extended-document-status';
|
import { ExtendedDocumentStatus } from '@documenso/prisma/types/extended-document-status';
|
||||||
|
|
||||||
|
import { DocumentVisibility } from '../../types/document-visibility';
|
||||||
|
|
||||||
export type GetStatsInput = {
|
export type GetStatsInput = {
|
||||||
user: User;
|
user: User;
|
||||||
team?: Omit<GetTeamCountsOption, 'createdAt'>;
|
team?: Omit<GetTeamCountsOption, 'createdAt'>;
|
||||||
@@ -27,7 +31,7 @@ export const getStats = async ({ user, period, ...options }: GetStatsInput) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const [ownerCounts, notSignedCounts, hasSignedCounts] = await (options.team
|
const [ownerCounts, notSignedCounts, hasSignedCounts] = await (options.team
|
||||||
? getTeamCounts({ ...options.team, createdAt })
|
? getTeamCounts({ ...options.team, createdAt, currentUserEmail: user.email, userId: user.id })
|
||||||
: getCounts({ user, createdAt }));
|
: getCounts({ user, createdAt }));
|
||||||
|
|
||||||
const stats: Record<ExtendedDocumentStatus, number> = {
|
const stats: Record<ExtendedDocumentStatus, number> = {
|
||||||
@@ -147,7 +151,10 @@ type GetTeamCountsOption = {
|
|||||||
teamId: number;
|
teamId: number;
|
||||||
teamEmail?: string;
|
teamEmail?: string;
|
||||||
senderIds?: number[];
|
senderIds?: number[];
|
||||||
|
currentUserEmail: string;
|
||||||
|
userId: number;
|
||||||
createdAt: Prisma.DocumentWhereInput['createdAt'];
|
createdAt: Prisma.DocumentWhereInput['createdAt'];
|
||||||
|
currentTeamMemberRole?: TeamMemberRole;
|
||||||
};
|
};
|
||||||
|
|
||||||
const getTeamCounts = async (options: GetTeamCountsOption) => {
|
const getTeamCounts = async (options: GetTeamCountsOption) => {
|
||||||
@@ -172,6 +179,49 @@ const getTeamCounts = async (options: GetTeamCountsOption) => {
|
|||||||
let notSignedCountsGroupByArgs = null;
|
let notSignedCountsGroupByArgs = null;
|
||||||
let hasSignedCountsGroupByArgs = null;
|
let hasSignedCountsGroupByArgs = null;
|
||||||
|
|
||||||
|
const visibilityFilters = [
|
||||||
|
...match(options.currentTeamMemberRole)
|
||||||
|
.with(TeamMemberRole.ADMIN, () => [
|
||||||
|
{ visibility: DocumentVisibility.EVERYONE },
|
||||||
|
{ visibility: DocumentVisibility.MANAGER_AND_ABOVE },
|
||||||
|
{ visibility: DocumentVisibility.ADMIN },
|
||||||
|
])
|
||||||
|
.with(TeamMemberRole.MANAGER, () => [
|
||||||
|
{ visibility: DocumentVisibility.EVERYONE },
|
||||||
|
{ visibility: DocumentVisibility.MANAGER_AND_ABOVE },
|
||||||
|
])
|
||||||
|
.otherwise(() => [{ visibility: DocumentVisibility.EVERYONE }]),
|
||||||
|
];
|
||||||
|
|
||||||
|
ownerCountsWhereInput = {
|
||||||
|
...ownerCountsWhereInput,
|
||||||
|
OR: [
|
||||||
|
{
|
||||||
|
AND: [
|
||||||
|
{
|
||||||
|
visibility: {
|
||||||
|
in: visibilityFilters.map((filter) => filter.visibility),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Recipient: {
|
||||||
|
none: {
|
||||||
|
email: options.currentUserEmail,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Recipient: {
|
||||||
|
some: {
|
||||||
|
email: options.currentUserEmail,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
if (teamEmail) {
|
if (teamEmail) {
|
||||||
ownerCountsWhereInput = {
|
ownerCountsWhereInput = {
|
||||||
userId: userIdWhereClause,
|
userId: userIdWhereClause,
|
||||||
|
|||||||
@@ -3,7 +3,13 @@ import type { RequestMetadata } from '@documenso/lib/universal/extract-request-m
|
|||||||
import { putPdfFile } from '@documenso/lib/universal/upload/put-file';
|
import { putPdfFile } from '@documenso/lib/universal/upload/put-file';
|
||||||
import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs';
|
import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs';
|
||||||
import { prisma } from '@documenso/prisma';
|
import { prisma } from '@documenso/prisma';
|
||||||
import { DocumentStatus, RecipientRole, SendStatus, SigningStatus } from '@documenso/prisma/client';
|
import {
|
||||||
|
DocumentSigningOrder,
|
||||||
|
DocumentStatus,
|
||||||
|
RecipientRole,
|
||||||
|
SendStatus,
|
||||||
|
SigningStatus,
|
||||||
|
} from '@documenso/prisma/client';
|
||||||
import { WebhookTriggerEvents } from '@documenso/prisma/client';
|
import { WebhookTriggerEvents } from '@documenso/prisma/client';
|
||||||
|
|
||||||
import { jobs } from '../../jobs/client';
|
import { jobs } from '../../jobs/client';
|
||||||
@@ -57,7 +63,9 @@ export const sendDocument = async ({
|
|||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
include: {
|
include: {
|
||||||
Recipient: true,
|
Recipient: {
|
||||||
|
orderBy: [{ signingOrder: { sort: 'asc', nulls: 'last' } }, { id: 'asc' }],
|
||||||
|
},
|
||||||
documentMeta: true,
|
documentMeta: true,
|
||||||
documentData: true,
|
documentData: true,
|
||||||
},
|
},
|
||||||
@@ -75,6 +83,21 @@ export const sendDocument = async ({
|
|||||||
throw new Error('Can not send completed document');
|
throw new Error('Can not send completed document');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const signingOrder = document.documentMeta?.signingOrder || DocumentSigningOrder.PARALLEL;
|
||||||
|
|
||||||
|
let recipientsToNotify = document.Recipient;
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
// Secondary filter so we aren't resending if the current active recipient has already
|
||||||
|
// received the document.
|
||||||
|
recipientsToNotify.filter((r) => r.sendStatus !== SendStatus.SENT);
|
||||||
|
}
|
||||||
|
|
||||||
const { documentData } = document;
|
const { documentData } = document;
|
||||||
|
|
||||||
if (!documentData.data) {
|
if (!documentData.data) {
|
||||||
@@ -135,7 +158,7 @@ export const sendDocument = async ({
|
|||||||
|
|
||||||
if (sendEmail) {
|
if (sendEmail) {
|
||||||
await Promise.all(
|
await Promise.all(
|
||||||
document.Recipient.map(async (recipient) => {
|
recipientsToNotify.map(async (recipient) => {
|
||||||
if (recipient.sendStatus === SendStatus.SENT || recipient.role === RecipientRole.CC) {
|
if (recipient.sendStatus === SendStatus.SENT || recipient.role === RecipientRole.CC) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import type { RequestMetadata } from '@documenso/lib/universal/extract-request-m
|
|||||||
import type { CreateDocumentAuditLogDataResponse } from '@documenso/lib/utils/document-audit-logs';
|
import type { CreateDocumentAuditLogDataResponse } from '@documenso/lib/utils/document-audit-logs';
|
||||||
import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs';
|
import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs';
|
||||||
import { prisma } from '@documenso/prisma';
|
import { prisma } from '@documenso/prisma';
|
||||||
|
import type { DocumentVisibility } from '@documenso/prisma/client';
|
||||||
import { DocumentStatus } from '@documenso/prisma/client';
|
import { DocumentStatus } from '@documenso/prisma/client';
|
||||||
|
|
||||||
import { AppError, AppErrorCode } from '../../errors/app-error';
|
import { AppError, AppErrorCode } from '../../errors/app-error';
|
||||||
@@ -19,6 +20,7 @@ export type UpdateDocumentSettingsOptions = {
|
|||||||
data: {
|
data: {
|
||||||
title?: string;
|
title?: string;
|
||||||
externalId?: string | null;
|
externalId?: string | null;
|
||||||
|
visibility?: string | null;
|
||||||
globalAccessAuth?: TDocumentAccessAuthTypes | null;
|
globalAccessAuth?: TDocumentAccessAuthTypes | null;
|
||||||
globalActionAuth?: TDocumentActionAuthTypes | null;
|
globalActionAuth?: TDocumentActionAuthTypes | null;
|
||||||
};
|
};
|
||||||
@@ -91,10 +93,14 @@ export const updateDocumentSettings = async ({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const isTitleSame = data.title === document.title;
|
const isTitleSame = data.title === undefined || data.title === document.title;
|
||||||
const isExternalIdSame = data.externalId === document.externalId;
|
const isExternalIdSame = data.externalId === undefined || data.externalId === document.externalId;
|
||||||
const isGlobalAccessSame = documentGlobalAccessAuth === newGlobalAccessAuth;
|
const isGlobalAccessSame =
|
||||||
const isGlobalActionSame = documentGlobalActionAuth === newGlobalActionAuth;
|
documentGlobalAccessAuth === undefined || documentGlobalAccessAuth === newGlobalAccessAuth;
|
||||||
|
const isGlobalActionSame =
|
||||||
|
documentGlobalActionAuth === undefined || documentGlobalActionAuth === newGlobalActionAuth;
|
||||||
|
const isDocumentVisibilitySame =
|
||||||
|
data.visibility === undefined || data.visibility === document.visibility;
|
||||||
|
|
||||||
const auditLogs: CreateDocumentAuditLogDataResponse[] = [];
|
const auditLogs: CreateDocumentAuditLogDataResponse[] = [];
|
||||||
|
|
||||||
@@ -165,6 +171,21 @@ export const updateDocumentSettings = async ({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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.
|
// Early return if nothing is required.
|
||||||
if (auditLogs.length === 0) {
|
if (auditLogs.length === 0) {
|
||||||
return document;
|
return document;
|
||||||
@@ -182,7 +203,8 @@ export const updateDocumentSettings = async ({
|
|||||||
},
|
},
|
||||||
data: {
|
data: {
|
||||||
title: data.title,
|
title: data.title,
|
||||||
externalId: data.externalId || null,
|
externalId: data.externalId,
|
||||||
|
visibility: data.visibility as DocumentVisibility,
|
||||||
authOptions,
|
authOptions,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
46
packages/lib/server-only/recipient/get-is-recipient-turn.ts
Normal file
46
packages/lib/server-only/recipient/get-is-recipient-turn.ts
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
import { prisma } from '@documenso/prisma';
|
||||||
|
import { DocumentSigningOrder, SigningStatus } from '@documenso/prisma/client';
|
||||||
|
|
||||||
|
export type GetIsRecipientTurnOptions = {
|
||||||
|
token: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export async function getIsRecipientsTurnToSign({ token }: GetIsRecipientTurnOptions) {
|
||||||
|
const document = await prisma.document.findFirstOrThrow({
|
||||||
|
where: {
|
||||||
|
Recipient: {
|
||||||
|
some: {
|
||||||
|
token,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
include: {
|
||||||
|
documentMeta: true,
|
||||||
|
Recipient: {
|
||||||
|
orderBy: {
|
||||||
|
signingOrder: 'asc',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (document.documentMeta?.signingOrder !== DocumentSigningOrder.SEQUENTIAL) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const recipients = document.Recipient;
|
||||||
|
|
||||||
|
const currentRecipientIndex = recipients.findIndex((r) => r.token === token);
|
||||||
|
|
||||||
|
if (currentRecipientIndex === -1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = 0; i < currentRecipientIndex; i++) {
|
||||||
|
if (recipients[i].signingStatus !== SigningStatus.SIGNED) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
@@ -27,6 +27,7 @@ export interface SetRecipientsForDocumentOptions {
|
|||||||
email: string;
|
email: string;
|
||||||
name: string;
|
name: string;
|
||||||
role: RecipientRole;
|
role: RecipientRole;
|
||||||
|
signingOrder?: number | null;
|
||||||
actionAuth?: TRecipientActionAuthTypes | null;
|
actionAuth?: TRecipientActionAuthTypes | null;
|
||||||
}[];
|
}[];
|
||||||
requestMetadata?: RequestMetadata;
|
requestMetadata?: RequestMetadata;
|
||||||
@@ -156,6 +157,7 @@ export const setRecipientsForDocument = async ({
|
|||||||
name: recipient.name,
|
name: recipient.name,
|
||||||
email: recipient.email,
|
email: recipient.email,
|
||||||
role: recipient.role,
|
role: recipient.role,
|
||||||
|
signingOrder: recipient.signingOrder,
|
||||||
documentId,
|
documentId,
|
||||||
sendStatus: recipient.role === RecipientRole.CC ? SendStatus.SENT : SendStatus.NOT_SENT,
|
sendStatus: recipient.role === RecipientRole.CC ? SendStatus.SENT : SendStatus.NOT_SENT,
|
||||||
signingStatus:
|
signingStatus:
|
||||||
@@ -166,6 +168,7 @@ export const setRecipientsForDocument = async ({
|
|||||||
name: recipient.name,
|
name: recipient.name,
|
||||||
email: recipient.email,
|
email: recipient.email,
|
||||||
role: recipient.role,
|
role: recipient.role,
|
||||||
|
signingOrder: recipient.signingOrder,
|
||||||
token: nanoid(),
|
token: nanoid(),
|
||||||
documentId,
|
documentId,
|
||||||
sendStatus: recipient.role === RecipientRole.CC ? SendStatus.SENT : SendStatus.NOT_SENT,
|
sendStatus: recipient.role === RecipientRole.CC ? SendStatus.SENT : SendStatus.NOT_SENT,
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ export type SetRecipientsForTemplateOptions = {
|
|||||||
email: string;
|
email: string;
|
||||||
name: string;
|
name: string;
|
||||||
role: RecipientRole;
|
role: RecipientRole;
|
||||||
|
signingOrder?: number | null;
|
||||||
actionAuth?: TRecipientActionAuthTypes | null;
|
actionAuth?: TRecipientActionAuthTypes | null;
|
||||||
}[];
|
}[];
|
||||||
};
|
};
|
||||||
@@ -162,6 +163,7 @@ export const setRecipientsForTemplate = async ({
|
|||||||
name: recipient.name,
|
name: recipient.name,
|
||||||
email: recipient.email,
|
email: recipient.email,
|
||||||
role: recipient.role,
|
role: recipient.role,
|
||||||
|
signingOrder: recipient.signingOrder,
|
||||||
templateId,
|
templateId,
|
||||||
authOptions,
|
authOptions,
|
||||||
},
|
},
|
||||||
@@ -169,6 +171,7 @@ export const setRecipientsForTemplate = async ({
|
|||||||
name: recipient.name,
|
name: recipient.name,
|
||||||
email: recipient.email,
|
email: recipient.email,
|
||||||
role: recipient.role,
|
role: recipient.role,
|
||||||
|
signingOrder: recipient.signingOrder,
|
||||||
token: nanoid(),
|
token: nanoid(),
|
||||||
templateId,
|
templateId,
|
||||||
authOptions,
|
authOptions,
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ export type UpdateRecipientOptions = {
|
|||||||
email?: string;
|
email?: string;
|
||||||
name?: string;
|
name?: string;
|
||||||
role?: RecipientRole;
|
role?: RecipientRole;
|
||||||
|
signingOrder?: number | null;
|
||||||
actionAuth?: TRecipientActionAuthTypes | null;
|
actionAuth?: TRecipientActionAuthTypes | null;
|
||||||
userId: number;
|
userId: number;
|
||||||
teamId?: number;
|
teamId?: number;
|
||||||
@@ -30,6 +31,7 @@ export const updateRecipient = async ({
|
|||||||
email,
|
email,
|
||||||
name,
|
name,
|
||||||
role,
|
role,
|
||||||
|
signingOrder,
|
||||||
actionAuth,
|
actionAuth,
|
||||||
userId,
|
userId,
|
||||||
teamId,
|
teamId,
|
||||||
@@ -112,6 +114,7 @@ export const updateRecipient = async ({
|
|||||||
email: email?.toLowerCase() ?? recipient.email,
|
email: email?.toLowerCase() ?? recipient.email,
|
||||||
name: name ?? recipient.name,
|
name: name ?? recipient.name,
|
||||||
role: role ?? recipient.role,
|
role: role ?? recipient.role,
|
||||||
|
signingOrder,
|
||||||
authOptions: createRecipientAuthOptions({
|
authOptions: createRecipientAuthOptions({
|
||||||
accessAuth: recipientAuthOptions.accessAuth,
|
accessAuth: recipientAuthOptions.accessAuth,
|
||||||
actionAuth: actionAuth ?? null,
|
actionAuth: actionAuth ?? null,
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ export type GetTeamByIdOptions = {
|
|||||||
teamId: number;
|
teamId: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type GetTeamResponse = Awaited<ReturnType<typeof getTeamById>>;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a team given a teamId.
|
* Get a team given a teamId.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ export type CreateDocumentFromTemplateLegacyOptions = {
|
|||||||
name?: string;
|
name?: string;
|
||||||
email: string;
|
email: string;
|
||||||
role?: RecipientRole;
|
role?: RecipientRole;
|
||||||
|
signingOrder?: number | null;
|
||||||
}[];
|
}[];
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -73,6 +74,7 @@ export const createDocumentFromTemplateLegacy = async ({
|
|||||||
email: recipient.email,
|
email: recipient.email,
|
||||||
name: recipient.name,
|
name: recipient.name,
|
||||||
role: recipient.role,
|
role: recipient.role,
|
||||||
|
signingOrder: recipient.signingOrder,
|
||||||
token: nanoid(),
|
token: nanoid(),
|
||||||
})),
|
})),
|
||||||
},
|
},
|
||||||
@@ -129,12 +131,14 @@ export const createDocumentFromTemplateLegacy = async ({
|
|||||||
name: recipient.name,
|
name: recipient.name,
|
||||||
email: recipient.email,
|
email: recipient.email,
|
||||||
role: recipient.role,
|
role: recipient.role,
|
||||||
|
signingOrder: recipient.signingOrder,
|
||||||
},
|
},
|
||||||
create: {
|
create: {
|
||||||
documentId: document.id,
|
documentId: document.id,
|
||||||
email: recipient.email,
|
email: recipient.email,
|
||||||
name: recipient.name,
|
name: recipient.name,
|
||||||
role: recipient.role,
|
role: recipient.role,
|
||||||
|
signingOrder: recipient.signingOrder,
|
||||||
token: nanoid(),
|
token: nanoid(),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { nanoid } from '@documenso/lib/universal/id';
|
import { nanoid } from '@documenso/lib/universal/id';
|
||||||
import { prisma } from '@documenso/prisma';
|
import { prisma } from '@documenso/prisma';
|
||||||
import type { Field } from '@documenso/prisma/client';
|
import type { DocumentSigningOrder, Field } from '@documenso/prisma/client';
|
||||||
import {
|
import {
|
||||||
DocumentSource,
|
DocumentSource,
|
||||||
type Recipient,
|
type Recipient,
|
||||||
@@ -41,6 +41,7 @@ export type CreateDocumentFromTemplateOptions = {
|
|||||||
id: number;
|
id: number;
|
||||||
name?: string;
|
name?: string;
|
||||||
email: string;
|
email: string;
|
||||||
|
signingOrder?: number | null;
|
||||||
}[];
|
}[];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -54,6 +55,7 @@ export type CreateDocumentFromTemplateOptions = {
|
|||||||
password?: string;
|
password?: string;
|
||||||
dateFormat?: string;
|
dateFormat?: string;
|
||||||
redirectUrl?: string;
|
redirectUrl?: string;
|
||||||
|
signingOrder?: DocumentSigningOrder;
|
||||||
};
|
};
|
||||||
requestMetadata?: RequestMetadata;
|
requestMetadata?: RequestMetadata;
|
||||||
};
|
};
|
||||||
@@ -134,6 +136,7 @@ export const createDocumentFromTemplate = async ({
|
|||||||
name: foundRecipient ? foundRecipient.name ?? '' : templateRecipient.name,
|
name: foundRecipient ? foundRecipient.name ?? '' : templateRecipient.name,
|
||||||
email: foundRecipient ? foundRecipient.email : templateRecipient.email,
|
email: foundRecipient ? foundRecipient.email : templateRecipient.email,
|
||||||
role: templateRecipient.role,
|
role: templateRecipient.role,
|
||||||
|
signingOrder: foundRecipient?.signingOrder ?? templateRecipient.signingOrder,
|
||||||
authOptions: templateRecipient.authOptions,
|
authOptions: templateRecipient.authOptions,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
@@ -168,6 +171,8 @@ export const createDocumentFromTemplate = async ({
|
|||||||
password: override?.password || template.templateMeta?.password,
|
password: override?.password || template.templateMeta?.password,
|
||||||
dateFormat: override?.dateFormat || template.templateMeta?.dateFormat,
|
dateFormat: override?.dateFormat || template.templateMeta?.dateFormat,
|
||||||
redirectUrl: override?.redirectUrl || template.templateMeta?.redirectUrl,
|
redirectUrl: override?.redirectUrl || template.templateMeta?.redirectUrl,
|
||||||
|
signingOrder:
|
||||||
|
override?.signingOrder || template.templateMeta?.signingOrder || undefined,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Recipient: {
|
Recipient: {
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ export const updateTemplateSettings = async ({
|
|||||||
meta,
|
meta,
|
||||||
data,
|
data,
|
||||||
}: UpdateTemplateSettingsOptions) => {
|
}: UpdateTemplateSettingsOptions) => {
|
||||||
if (Object.values(data).length === 0) {
|
if (Object.values(data).length === 0 && Object.keys(meta ?? {}).length === 0) {
|
||||||
throw new AppError(AppErrorCode.INVALID_BODY, 'Missing data to update');
|
throw new AppError(AppErrorCode.INVALID_BODY, 'Missing data to update');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ msgstr ""
|
|||||||
"Language: de\n"
|
"Language: de\n"
|
||||||
"Project-Id-Version: documenso-app\n"
|
"Project-Id-Version: documenso-app\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2024-09-05 06:04\n"
|
"PO-Revision-Date: 2024-09-16 16:03\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: German\n"
|
"Language-Team: German\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
@@ -60,12 +60,12 @@ msgstr "<0>Passkey erforderlich</0> - Der Empfänger muss ein Konto haben und de
|
|||||||
msgid "Add a document"
|
msgid "Add a document"
|
||||||
msgstr "Dokument hinzufügen"
|
msgstr "Dokument hinzufügen"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-settings.tsx:305
|
#: packages/ui/primitives/document-flow/add-settings.tsx:336
|
||||||
#: packages/ui/primitives/template-flow/add-template-settings.tsx:339
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:339
|
||||||
msgid "Add a URL to redirect the user to once the document is signed"
|
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"
|
msgstr "Fügen Sie eine URL hinzu, um den Benutzer nach der Unterzeichnung des Dokuments weiterzuleiten"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-settings.tsx:217
|
#: packages/ui/primitives/document-flow/add-settings.tsx:248
|
||||||
msgid "Add an external ID to the document. This can be used to identify the document in external systems."
|
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."
|
msgstr "Fügen Sie dem Dokument eine externe ID hinzu. Diese kann verwendet werden, um das Dokument in externen Systemen zu identifizieren."
|
||||||
|
|
||||||
@@ -82,19 +82,19 @@ msgstr "Weitere Option hinzufügen"
|
|||||||
msgid "Add another value"
|
msgid "Add another value"
|
||||||
msgstr "Weiteren Wert hinzufügen"
|
msgstr "Weiteren Wert hinzufügen"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-signers.tsx:359
|
#: packages/ui/primitives/document-flow/add-signers.tsx:653
|
||||||
msgid "Add myself"
|
msgid "Add myself"
|
||||||
msgstr "Mich selbst hinzufügen"
|
msgstr "Mich selbst hinzufügen"
|
||||||
|
|
||||||
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:369
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:637
|
||||||
msgid "Add Myself"
|
msgid "Add Myself"
|
||||||
msgstr "Mich hinzufügen"
|
msgstr "Mich hinzufügen"
|
||||||
|
|
||||||
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:355
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:623
|
||||||
msgid "Add Placeholder Recipient"
|
msgid "Add Placeholder Recipient"
|
||||||
msgstr "Platzhalterempfänger hinzufügen"
|
msgstr "Platzhalterempfänger hinzufügen"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-signers.tsx:348
|
#: packages/ui/primitives/document-flow/add-signers.tsx:642
|
||||||
msgid "Add Signer"
|
msgid "Add Signer"
|
||||||
msgstr "Unterzeichner hinzufügen"
|
msgstr "Unterzeichner hinzufügen"
|
||||||
|
|
||||||
@@ -110,12 +110,12 @@ msgstr "Text zum Feld hinzufügen"
|
|||||||
msgid "Admin"
|
msgid "Admin"
|
||||||
msgstr "Admin"
|
msgstr "Admin"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-settings.tsx:199
|
#: packages/ui/primitives/document-flow/add-settings.tsx:230
|
||||||
#: packages/ui/primitives/template-flow/add-template-settings.tsx:238
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:238
|
||||||
msgid "Advanced Options"
|
msgid "Advanced Options"
|
||||||
msgstr "Erweiterte Optionen"
|
msgstr "Erweiterte Optionen"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:510
|
#: packages/ui/primitives/document-flow/add-fields.tsx:522
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:402
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:402
|
||||||
msgid "Advanced settings"
|
msgid "Advanced settings"
|
||||||
msgstr "Erweiterte Einstellungen"
|
msgstr "Erweiterte Einstellungen"
|
||||||
@@ -142,18 +142,18 @@ msgstr "Genehmigung"
|
|||||||
|
|
||||||
#: packages/ui/primitives/signature-pad/signature-pad.tsx:276
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:276
|
||||||
msgid "Black"
|
msgid "Black"
|
||||||
msgstr ""
|
msgstr "Schwarz"
|
||||||
|
|
||||||
#: packages/ui/primitives/signature-pad/signature-pad.tsx:290
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:290
|
||||||
msgid "Blue"
|
msgid "Blue"
|
||||||
msgstr ""
|
msgstr "Blau"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:287
|
#: packages/ui/primitives/document-flow/field-item-advanced-settings.tsx:287
|
||||||
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:58
|
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:58
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Abbrechen"
|
msgstr "Abbrechen"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-signers.tsx:164
|
#: packages/ui/primitives/document-flow/add-signers.tsx:194
|
||||||
msgid "Cannot remove signer"
|
msgid "Cannot remove signer"
|
||||||
msgstr "Unterzeichner kann nicht entfernt werden"
|
msgstr "Unterzeichner kann nicht entfernt werden"
|
||||||
|
|
||||||
@@ -174,7 +174,7 @@ msgstr "CC'd"
|
|||||||
msgid "Character Limit"
|
msgid "Character Limit"
|
||||||
msgstr "Zeichenbeschränkung"
|
msgstr "Zeichenbeschränkung"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:932
|
#: packages/ui/primitives/document-flow/add-fields.tsx:944
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:788
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:788
|
||||||
msgid "Checkbox"
|
msgid "Checkbox"
|
||||||
msgstr "Checkbox"
|
msgstr "Checkbox"
|
||||||
@@ -203,7 +203,7 @@ msgstr "Schließen"
|
|||||||
msgid "Configure Direct Recipient"
|
msgid "Configure Direct Recipient"
|
||||||
msgstr "Direkten Empfänger konfigurieren"
|
msgstr "Direkten Empfänger konfigurieren"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:511
|
#: packages/ui/primitives/document-flow/add-fields.tsx:523
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:403
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:403
|
||||||
msgid "Configure the {0} field"
|
msgid "Configure the {0} field"
|
||||||
msgstr "Konfigurieren Sie das Feld {0}"
|
msgstr "Konfigurieren Sie das Feld {0}"
|
||||||
@@ -220,22 +220,22 @@ msgstr "In die Zwischenablage kopiert"
|
|||||||
msgid "Custom Text"
|
msgid "Custom Text"
|
||||||
msgstr "Benutzerdefinierter Text"
|
msgstr "Benutzerdefinierter Text"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:828
|
#: packages/ui/primitives/document-flow/add-fields.tsx:840
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:684
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:684
|
||||||
msgid "Date"
|
msgid "Date"
|
||||||
msgstr "Datum"
|
msgstr "Datum"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-settings.tsx:240
|
#: packages/ui/primitives/document-flow/add-settings.tsx:271
|
||||||
#: packages/ui/primitives/template-flow/add-template-settings.tsx:279
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:279
|
||||||
msgid "Date Format"
|
msgid "Date Format"
|
||||||
msgstr "Datumsformat"
|
msgstr "Datumsformat"
|
||||||
|
|
||||||
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:312
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:570
|
||||||
msgid "Direct link receiver"
|
msgid "Direct link receiver"
|
||||||
msgstr "Empfänger des direkten Links"
|
msgstr "Empfänger des direkten Links"
|
||||||
|
|
||||||
#: packages/ui/components/document/document-global-auth-access-select.tsx:62
|
#: packages/ui/components/document/document-global-auth-access-select.tsx:62
|
||||||
#: packages/ui/primitives/document-flow/add-settings.tsx:166
|
#: packages/ui/primitives/document-flow/add-settings.tsx:174
|
||||||
#: packages/ui/primitives/template-flow/add-template-settings.tsx:151
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:151
|
||||||
msgid "Document access"
|
msgid "Document access"
|
||||||
msgstr "Dokumentenzugriff"
|
msgstr "Dokumentenzugriff"
|
||||||
@@ -252,7 +252,7 @@ msgstr "Herunterladen"
|
|||||||
msgid "Drag & drop your PDF here."
|
msgid "Drag & drop your PDF here."
|
||||||
msgstr "Ziehen Sie Ihr PDF hierher."
|
msgstr "Ziehen Sie Ihr PDF hierher."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:958
|
#: packages/ui/primitives/document-flow/add-fields.tsx:970
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:814
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:814
|
||||||
msgid "Dropdown"
|
msgid "Dropdown"
|
||||||
msgstr "Dropdown"
|
msgstr "Dropdown"
|
||||||
@@ -261,13 +261,12 @@ msgstr "Dropdown"
|
|||||||
msgid "Dropdown options"
|
msgid "Dropdown options"
|
||||||
msgstr "Dropdown-Optionen"
|
msgstr "Dropdown-Optionen"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:776
|
#: packages/ui/primitives/document-flow/add-fields.tsx:788
|
||||||
#: packages/ui/primitives/document-flow/add-signature.tsx:272
|
#: packages/ui/primitives/document-flow/add-signature.tsx:272
|
||||||
#: packages/ui/primitives/document-flow/add-signers.tsx:232
|
#: packages/ui/primitives/document-flow/add-signers.tsx:491
|
||||||
#: packages/ui/primitives/document-flow/add-signers.tsx:239
|
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:632
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:632
|
||||||
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:210
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:463
|
||||||
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:217
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:470
|
||||||
msgid "Email"
|
msgid "Email"
|
||||||
msgstr "E-Mail"
|
msgstr "E-Mail"
|
||||||
|
|
||||||
@@ -279,6 +278,11 @@ msgstr "E-Mail-Optionen"
|
|||||||
msgid "Enable Direct Link Signing"
|
msgid "Enable Direct Link Signing"
|
||||||
msgstr "Direktlink-Signierung aktivieren"
|
msgstr "Direktlink-Signierung aktivieren"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-signers.tsx:392
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:362
|
||||||
|
msgid "Enable signing order"
|
||||||
|
msgstr "Aktiviere die Signaturreihenfolge"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-password-dialog.tsx:84
|
#: packages/ui/primitives/document-password-dialog.tsx:84
|
||||||
msgid "Enter password"
|
msgid "Enter password"
|
||||||
msgstr "Passwort eingeben"
|
msgstr "Passwort eingeben"
|
||||||
@@ -287,7 +291,7 @@ msgstr "Passwort eingeben"
|
|||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr "Fehler"
|
msgstr "Fehler"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-settings.tsx:210
|
#: packages/ui/primitives/document-flow/add-settings.tsx:241
|
||||||
#: packages/ui/primitives/template-flow/add-template-settings.tsx:249
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:249
|
||||||
msgid "External ID"
|
msgid "External ID"
|
||||||
msgstr "Externe ID"
|
msgstr "Externe ID"
|
||||||
@@ -322,7 +326,7 @@ msgstr "Zurück"
|
|||||||
|
|
||||||
#: packages/ui/primitives/signature-pad/signature-pad.tsx:297
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:297
|
||||||
msgid "Green"
|
msgid "Green"
|
||||||
msgstr ""
|
msgstr "Grün"
|
||||||
|
|
||||||
#: packages/lib/constants/recipient-roles.ts:72
|
#: packages/lib/constants/recipient-roles.ts:72
|
||||||
msgid "I am a signer of this document"
|
msgid "I am a signer of this document"
|
||||||
@@ -376,12 +380,13 @@ msgstr "Nachricht <0>(Optional)</0>"
|
|||||||
msgid "Min"
|
msgid "Min"
|
||||||
msgstr "Min"
|
msgstr "Min"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:802
|
#: packages/ui/primitives/document-flow/add-fields.tsx:814
|
||||||
#: packages/ui/primitives/document-flow/add-signature.tsx:298
|
#: packages/ui/primitives/document-flow/add-signature.tsx:298
|
||||||
#: packages/ui/primitives/document-flow/add-signers.tsx:265
|
#: packages/ui/primitives/document-flow/add-signers.tsx:526
|
||||||
|
#: packages/ui/primitives/document-flow/add-signers.tsx:532
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:658
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:658
|
||||||
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:245
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:498
|
||||||
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:251
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:504
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Name"
|
msgstr "Name"
|
||||||
|
|
||||||
@@ -397,12 +402,12 @@ msgstr "Muss unterzeichnen"
|
|||||||
msgid "Needs to view"
|
msgid "Needs to view"
|
||||||
msgstr "Muss sehen"
|
msgstr "Muss sehen"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:613
|
#: packages/ui/primitives/document-flow/add-fields.tsx:625
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:497
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:497
|
||||||
msgid "No recipient matching this description was found."
|
msgid "No recipient matching this description was found."
|
||||||
msgstr "Kein passender Empfänger mit dieser Beschreibung gefunden."
|
msgstr "Kein passender Empfänger mit dieser Beschreibung gefunden."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:629
|
#: packages/ui/primitives/document-flow/add-fields.tsx:641
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:513
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:513
|
||||||
msgid "No recipients with this role"
|
msgid "No recipients with this role"
|
||||||
msgstr "Keine Empfänger mit dieser Rolle"
|
msgstr "Keine Empfänger mit dieser Rolle"
|
||||||
@@ -427,7 +432,7 @@ msgstr "Kein Unterschriftsfeld gefunden"
|
|||||||
msgid "No value found."
|
msgid "No value found."
|
||||||
msgstr "Kein Wert gefunden."
|
msgstr "Kein Wert gefunden."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:880
|
#: packages/ui/primitives/document-flow/add-fields.tsx:892
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:736
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:736
|
||||||
msgid "Number"
|
msgid "Number"
|
||||||
msgstr "Nummer"
|
msgstr "Nummer"
|
||||||
@@ -462,7 +467,7 @@ msgstr "Wählen Sie eine Zahl"
|
|||||||
msgid "Placeholder"
|
msgid "Placeholder"
|
||||||
msgstr "Platzhalter"
|
msgstr "Platzhalter"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:906
|
#: packages/ui/primitives/document-flow/add-fields.tsx:918
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:762
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:762
|
||||||
msgid "Radio"
|
msgid "Radio"
|
||||||
msgstr "Radio"
|
msgstr "Radio"
|
||||||
@@ -484,21 +489,21 @@ msgid "Receives copy"
|
|||||||
msgstr "Erhält Kopie"
|
msgstr "Erhält Kopie"
|
||||||
|
|
||||||
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:39
|
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:39
|
||||||
#: packages/ui/primitives/document-flow/add-settings.tsx:184
|
#: packages/ui/primitives/document-flow/add-settings.tsx:215
|
||||||
#: packages/ui/primitives/template-flow/add-template-settings.tsx:169
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:169
|
||||||
msgid "Recipient action authentication"
|
msgid "Recipient action authentication"
|
||||||
msgstr "Empfängeraktion Authentifizierung"
|
msgstr "Empfängeraktion Authentifizierung"
|
||||||
|
|
||||||
#: packages/ui/primitives/signature-pad/signature-pad.tsx:283
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:283
|
||||||
msgid "Red"
|
msgid "Red"
|
||||||
msgstr ""
|
msgstr "Rot"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-settings.tsx:298
|
#: packages/ui/primitives/document-flow/add-settings.tsx:329
|
||||||
#: packages/ui/primitives/template-flow/add-template-settings.tsx:332
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:332
|
||||||
msgid "Redirect URL"
|
msgid "Redirect URL"
|
||||||
msgstr "Weiterleitungs-URL"
|
msgstr "Weiterleitungs-URL"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:996
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1008
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Entfernen"
|
msgstr "Entfernen"
|
||||||
|
|
||||||
@@ -560,8 +565,8 @@ msgstr "Unterschriftenkarte teilen"
|
|||||||
msgid "Share the Link"
|
msgid "Share the Link"
|
||||||
msgstr "Link teilen"
|
msgstr "Link teilen"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-signers.tsx:377
|
#: packages/ui/primitives/document-flow/add-signers.tsx:671
|
||||||
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:387
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:655
|
||||||
msgid "Show advanced settings"
|
msgid "Show advanced settings"
|
||||||
msgstr "Erweiterte Einstellungen anzeigen"
|
msgstr "Erweiterte Einstellungen anzeigen"
|
||||||
|
|
||||||
@@ -569,7 +574,7 @@ msgstr "Erweiterte Einstellungen anzeigen"
|
|||||||
msgid "Sign"
|
msgid "Sign"
|
||||||
msgstr "Unterschreiben"
|
msgstr "Unterschreiben"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:724
|
#: packages/ui/primitives/document-flow/add-fields.tsx:736
|
||||||
#: packages/ui/primitives/document-flow/add-signature.tsx:323
|
#: packages/ui/primitives/document-flow/add-signature.tsx:323
|
||||||
#: packages/ui/primitives/document-flow/field-icon.tsx:52
|
#: packages/ui/primitives/document-flow/field-icon.tsx:52
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:580
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:580
|
||||||
@@ -617,7 +622,7 @@ msgstr "Einreichen"
|
|||||||
msgid "Template title"
|
msgid "Template title"
|
||||||
msgstr "Vorlagentitel"
|
msgstr "Vorlagentitel"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:854
|
#: packages/ui/primitives/document-flow/add-fields.tsx:866
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:710
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:710
|
||||||
msgid "Text"
|
msgid "Text"
|
||||||
msgstr "Text"
|
msgstr "Text"
|
||||||
@@ -678,7 +683,7 @@ msgstr "Der Name des Unterzeichners"
|
|||||||
msgid "This can be overriden by setting the authentication requirements directly on each recipient in the next step."
|
msgid "This can be overriden by setting the authentication requirements directly on each recipient in the next step."
|
||||||
msgstr "Dies kann überschrieben werden, indem die Authentifizierungsanforderungen im nächsten Schritt direkt für jeden Empfänger festgelegt werden."
|
msgstr "Dies kann überschrieben werden, indem die Authentifizierungsanforderungen im nächsten Schritt direkt für jeden Empfänger festgelegt werden."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:685
|
#: packages/ui/primitives/document-flow/add-fields.tsx:697
|
||||||
msgid "This document has already been sent to this recipient. You can no longer edit this recipient."
|
msgid "This document has already been sent to this recipient. You can no longer edit this recipient."
|
||||||
msgstr "Dieses Dokument wurde bereits an diesen Empfänger gesendet. Sie können diesen Empfänger nicht mehr bearbeiten."
|
msgstr "Dieses Dokument wurde bereits an diesen Empfänger gesendet. Sie können diesen Empfänger nicht mehr bearbeiten."
|
||||||
|
|
||||||
@@ -686,11 +691,11 @@ msgstr "Dieses Dokument wurde bereits an diesen Empfänger gesendet. Sie können
|
|||||||
msgid "This document is password protected. Please enter the password to view the document."
|
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."
|
msgstr "Dieses Dokument ist durch ein Passwort geschützt. Bitte geben Sie das Passwort ein, um das Dokument anzusehen."
|
||||||
|
|
||||||
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:315
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:573
|
||||||
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."
|
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."
|
msgstr "Dieses Feld kann nicht geändert oder gelöscht werden. Wenn Sie den direkten Link dieser Vorlage teilen oder zu Ihrem öffentlichen Profil hinzufügen, kann jeder, der darauf zugreift, seinen Namen und seine E-Mail-Adresse eingeben und die ihm zugewiesenen Felder ausfüllen."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-signers.tsx:165
|
#: packages/ui/primitives/document-flow/add-signers.tsx:195
|
||||||
msgid "This signer has already received the document."
|
msgid "This signer has already received the document."
|
||||||
msgstr "Dieser Unterzeichner hat das Dokument bereits erhalten."
|
msgstr "Dieser Unterzeichner hat das Dokument bereits erhalten."
|
||||||
|
|
||||||
@@ -698,16 +703,16 @@ msgstr "Dieser Unterzeichner hat das Dokument bereits erhalten."
|
|||||||
msgid "This will override any global settings."
|
msgid "This will override any global settings."
|
||||||
msgstr "Dies überschreibt alle globalen Einstellungen."
|
msgstr "Dies überschreibt alle globalen Einstellungen."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-settings.tsx:274
|
#: packages/ui/primitives/document-flow/add-settings.tsx:305
|
||||||
#: packages/ui/primitives/template-flow/add-template-settings.tsx:309
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:309
|
||||||
msgid "Time Zone"
|
msgid "Time Zone"
|
||||||
msgstr "Zeitzone"
|
msgstr "Zeitzone"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-settings.tsx:145
|
#: packages/ui/primitives/document-flow/add-settings.tsx:153
|
||||||
msgid "Title"
|
msgid "Title"
|
||||||
msgstr "Titel"
|
msgstr "Titel"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:971
|
#: packages/ui/primitives/document-flow/add-fields.tsx:983
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:828
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:828
|
||||||
msgid "To proceed further, please set at least one value for the {0} field."
|
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."
|
msgstr "Um fortzufahren, legen Sie bitte mindestens einen Wert für das Feld {0} fest."
|
||||||
@@ -756,7 +761,7 @@ msgstr "Viewing"
|
|||||||
|
|
||||||
#: packages/ui/primitives/signature-pad/signature-pad.tsx:280
|
#: packages/ui/primitives/signature-pad/signature-pad.tsx:280
|
||||||
#~ msgid "White"
|
#~ msgid "White"
|
||||||
#~ msgstr ""
|
#~ msgstr "White"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/send-document-action-dialog.tsx:44
|
#: 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?"
|
msgid "You are about to send this document to the recipients. Are you sure you want to continue?"
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -8,7 +8,7 @@ msgstr ""
|
|||||||
"Language: de\n"
|
"Language: de\n"
|
||||||
"Project-Id-Version: documenso-app\n"
|
"Project-Id-Version: documenso-app\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2024-09-05 06:04\n"
|
"PO-Revision-Date: 2024-09-16 14:04\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: German\n"
|
"Language-Team: German\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
@@ -431,7 +431,7 @@ msgstr "Sparen Sie $60 oder $120"
|
|||||||
|
|
||||||
#: apps/marketing/src/components/(marketing)/i18n-switcher.tsx:47
|
#: apps/marketing/src/components/(marketing)/i18n-switcher.tsx:47
|
||||||
#~ msgid "Search languages..."
|
#~ msgid "Search languages..."
|
||||||
#~ msgstr "Sprachen suchen..."
|
#~ msgstr "Search languages..."
|
||||||
|
|
||||||
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:109
|
#: apps/marketing/src/app/(marketing)/pricing/page.tsx:109
|
||||||
msgid "Securely. Our data centers are located in Frankfurt (Germany), giving us the best local privacy laws. We are very aware of the sensitive nature of our data and follow best practices to ensure the security and integrity of the data entrusted to us."
|
msgid "Securely. Our data centers are located in Frankfurt (Germany), giving us the best local privacy laws. We are very aware of the sensitive nature of our data and follow best practices to ensure the security and integrity of the data entrusted to us."
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -8,7 +8,7 @@ msgstr ""
|
|||||||
"Language: de\n"
|
"Language: de\n"
|
||||||
"Project-Id-Version: documenso-app\n"
|
"Project-Id-Version: documenso-app\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2024-09-05 06:04\n"
|
"PO-Revision-Date: 2024-09-16 16:03\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: German\n"
|
"Language-Team: German\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
@@ -26,15 +26,15 @@ msgstr "\"{0}\" wird im Dokument erscheinen, da es eine Zeitzone von \"{timezone
|
|||||||
msgid "\"{documentTitle}\" has been successfully deleted"
|
msgid "\"{documentTitle}\" has been successfully deleted"
|
||||||
msgstr "\"{documentTitle}\" wurde erfolgreich gelöscht"
|
msgstr "\"{documentTitle}\" wurde erfolgreich gelöscht"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:76
|
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:78
|
||||||
msgid "({0}) has invited you to approve this document"
|
msgid "({0}) has invited you to approve this document"
|
||||||
msgstr "({0}) hat dich eingeladen, dieses Dokument zu genehmigen"
|
msgstr "({0}) hat dich eingeladen, dieses Dokument zu genehmigen"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:73
|
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:75
|
||||||
msgid "({0}) has invited you to sign this document"
|
msgid "({0}) has invited you to sign this document"
|
||||||
msgstr "({0}) hat dich eingeladen, dieses Dokument zu unterzeichnen"
|
msgstr "({0}) hat dich eingeladen, dieses Dokument zu unterzeichnen"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:70
|
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:72
|
||||||
msgid "({0}) has invited you to view this document"
|
msgid "({0}) has invited you to view this document"
|
||||||
msgstr "({0}) hat dich eingeladen, dieses Dokument zu betrachten"
|
msgstr "({0}) hat dich eingeladen, dieses Dokument zu betrachten"
|
||||||
|
|
||||||
@@ -60,11 +60,11 @@ msgstr "{0, plural, one {# Sitz} other {# Sitze}}"
|
|||||||
msgid "{0, plural, one {<0>You have <1>1</1> pending team invitation</0>} other {<2>You have <3>#</3> pending team invitations</2>}}"
|
msgid "{0, plural, one {<0>You have <1>1</1> pending team invitation</0>} other {<2>You have <3>#</3> pending team invitations</2>}}"
|
||||||
msgstr "{0, plural, one {<0>Du hast <1>1</1> ausstehende Team-Einladung</0>} other {<2>Du hast <3>#</3> ausstehende Team-Einladungen</2>}}"
|
msgstr "{0, plural, one {<0>Du hast <1>1</1> ausstehende Team-Einladung</0>} other {<2>Du hast <3>#</3> ausstehende Team-Einladungen</2>}}"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit/document-edit-page-view.tsx:102
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit/document-edit-page-view.tsx:129
|
||||||
msgid "{0, plural, one {1 Recipient} other {# Recipients}}"
|
msgid "{0, plural, one {1 Recipient} other {# Recipients}}"
|
||||||
msgstr "{0, plural, one {1 Empfänger} other {# Empfänger}}"
|
msgstr "{0, plural, one {1 Empfänger} other {# Empfänger}}"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:204
|
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:230
|
||||||
msgid "{0, plural, one {Waiting on 1 recipient} other {Waiting on # recipients}}"
|
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}}"
|
msgstr "{0, plural, one {Warte auf 1 Empfänger} other {Warte auf # Empfänger}}"
|
||||||
|
|
||||||
@@ -84,7 +84,7 @@ msgstr "{0} Dokument"
|
|||||||
msgid "{0} of {1} documents remaining this month."
|
msgid "{0} of {1} documents remaining this month."
|
||||||
msgstr "{0} von {1} Dokumenten verbleibend in diesem Monat."
|
msgstr "{0} von {1} Dokumenten verbleibend in diesem Monat."
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:139
|
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:165
|
||||||
msgid "{0} Recipient(s)"
|
msgid "{0} Recipient(s)"
|
||||||
msgstr "{0} Empfänger(in) / -n"
|
msgstr "{0} Empfänger(in) / -n"
|
||||||
|
|
||||||
@@ -220,7 +220,7 @@ msgstr "Aktive Abonnements"
|
|||||||
msgid "Add"
|
msgid "Add"
|
||||||
msgstr "Hinzufügen"
|
msgstr "Hinzufügen"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:143
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:157
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:87
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:87
|
||||||
msgid "Add all relevant fields for each recipient."
|
msgid "Add all relevant fields for each recipient."
|
||||||
msgstr "Fügen Sie alle relevanten Felder für jeden Empfänger hinzu."
|
msgstr "Fügen Sie alle relevanten Felder für jeden Empfänger hinzu."
|
||||||
@@ -241,7 +241,7 @@ msgstr "Fügen Sie einen Authenticator hinzu, um als sekundäre Authentifizierun
|
|||||||
msgid "Add email"
|
msgid "Add email"
|
||||||
msgstr "E-Mail hinzufügen"
|
msgstr "E-Mail hinzufügen"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:142
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:156
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:86
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:86
|
||||||
msgid "Add Fields"
|
msgid "Add Fields"
|
||||||
msgstr "Felder hinzufügen"
|
msgstr "Felder hinzufügen"
|
||||||
@@ -251,8 +251,8 @@ msgid "Add more"
|
|||||||
msgstr "Mehr hinzufügen"
|
msgstr "Mehr hinzufügen"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:270
|
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:270
|
||||||
msgid "Add number"
|
#~ msgid "Add number"
|
||||||
msgstr "Nummer hinzufügen"
|
#~ msgstr "Add number"
|
||||||
|
|
||||||
#: 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:146
|
||||||
#: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:154
|
#: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:154
|
||||||
@@ -263,11 +263,11 @@ msgstr "Passkey hinzufügen"
|
|||||||
msgid "Add Placeholders"
|
msgid "Add Placeholders"
|
||||||
msgstr "Platzhalter hinzufügen"
|
msgstr "Platzhalter hinzufügen"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:137
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:151
|
||||||
msgid "Add Signers"
|
msgid "Add Signers"
|
||||||
msgstr "Unterzeichner hinzufügen"
|
msgstr "Unterzeichner hinzufügen"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:147
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:161
|
||||||
msgid "Add Subject"
|
msgid "Add Subject"
|
||||||
msgstr "Betreff hinzufügen"
|
msgstr "Betreff hinzufügen"
|
||||||
|
|
||||||
@@ -276,14 +276,14 @@ msgid "Add team email"
|
|||||||
msgstr "Team-E-Mail hinzufügen"
|
msgstr "Team-E-Mail hinzufügen"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:256
|
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:256
|
||||||
msgid "Add text"
|
#~ msgid "Add text"
|
||||||
msgstr "Text hinzufügen"
|
#~ msgstr "Add text"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:272
|
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:272
|
||||||
msgid "Add Text"
|
#~ msgid "Add Text"
|
||||||
msgstr "Text hinzufügen"
|
#~ msgstr "Add Text"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:138
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:152
|
||||||
msgid "Add the people who will sign the document."
|
msgid "Add the people who will sign the document."
|
||||||
msgstr "Fügen Sie die Personen hinzu, die das Dokument unterschreiben werden."
|
msgstr "Fügen Sie die Personen hinzu, die das Dokument unterschreiben werden."
|
||||||
|
|
||||||
@@ -291,7 +291,7 @@ msgstr "Fügen Sie die Personen hinzu, die das Dokument unterschreiben werden."
|
|||||||
msgid "Add the recipients to create the document with"
|
msgid "Add the recipients to create the document with"
|
||||||
msgstr "Fügen Sie die Empfänger hinzu, um das Dokument zu erstellen"
|
msgstr "Fügen Sie die Empfänger hinzu, um das Dokument zu erstellen"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:148
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:162
|
||||||
msgid "Add the subject and message you wish to send to signers."
|
msgid "Add the subject and message you wish to send to signers."
|
||||||
msgstr "Fügen Sie den Betreff und die Nachricht hinzu, die Sie den Unterzeichnern senden möchten."
|
msgstr "Fügen Sie den Betreff und die Nachricht hinzu, die Sie den Unterzeichnern senden möchten."
|
||||||
|
|
||||||
@@ -339,7 +339,7 @@ msgstr "Alle Zeiten"
|
|||||||
msgid "Allows authenticating using biometrics, password managers, hardware keys, etc."
|
msgid "Allows authenticating using biometrics, password managers, hardware keys, etc."
|
||||||
msgstr "Erlaubt die Authentifizierung mit biometrischen Daten, Passwort-Managern, Hardware-Schlüsseln usw."
|
msgstr "Erlaubt die Authentifizierung mit biometrischen Daten, Passwort-Managern, Hardware-Schlüsseln usw."
|
||||||
|
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:411
|
#: apps/web/src/components/forms/v2/signup.tsx:423
|
||||||
msgid "Already have an account? <0>Sign in instead</0>"
|
msgid "Already have an account? <0>Sign in instead</0>"
|
||||||
msgstr "Hast du bereits ein Konto? <0>Stattdessen anmelden</0>"
|
msgstr "Hast du bereits ein Konto? <0>Stattdessen anmelden</0>"
|
||||||
|
|
||||||
@@ -370,13 +370,13 @@ msgstr "Eine E-Mail, in der die Übertragung dieses Teams angefordert wird, wurd
|
|||||||
msgid "An error occurred"
|
msgid "An error occurred"
|
||||||
msgstr "Ein Fehler ist aufgetreten"
|
msgstr "Ein Fehler ist aufgetreten"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:226
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:248
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:176
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:197
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:210
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:231
|
||||||
msgid "An error occurred while adding signers."
|
msgid "An error occurred while adding signers."
|
||||||
msgstr "Ein Fehler ist aufgetreten, während Unterzeichner hinzugefügt wurden."
|
msgstr "Ein Fehler ist aufgetreten, während Unterzeichner hinzugefügt wurden."
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:256
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:278
|
||||||
msgid "An error occurred while adding the fields."
|
msgid "An error occurred while adding the fields."
|
||||||
msgstr "Ein Fehler ist aufgetreten, während die Felder hinzugefügt wurden."
|
msgstr "Ein Fehler ist aufgetreten, während die Felder hinzugefügt wurden."
|
||||||
|
|
||||||
@@ -434,7 +434,7 @@ msgstr "Ein Fehler ist aufgetreten, während die Unterschrift entfernt wurde."
|
|||||||
msgid "An error occurred while removing the text."
|
msgid "An error occurred while removing the text."
|
||||||
msgstr "Ein Fehler ist aufgetreten, während der Text entfernt wurde."
|
msgstr "Ein Fehler ist aufgetreten, während der Text entfernt wurde."
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:287
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:309
|
||||||
msgid "An error occurred while sending the document."
|
msgid "An error occurred while sending the document."
|
||||||
msgstr "Ein Fehler ist aufgetreten, während das Dokument gesendet wurde."
|
msgstr "Ein Fehler ist aufgetreten, während das Dokument gesendet wurde."
|
||||||
|
|
||||||
@@ -458,8 +458,8 @@ msgstr "Ein Fehler ist aufgetreten, während das Dokument unterzeichnet wurde."
|
|||||||
msgid "An error occurred while trying to create a checkout session."
|
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."
|
msgstr "Ein Fehler ist aufgetreten, während versucht wurde, eine Checkout-Sitzung zu erstellen."
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:199
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:214
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:153
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:166
|
||||||
msgid "An error occurred while updating the document settings."
|
msgid "An error occurred while updating the document settings."
|
||||||
msgstr "Ein Fehler ist aufgetreten, während die Dokumenteinstellungen aktualisiert wurden."
|
msgstr "Ein Fehler ist aufgetreten, während die Dokumenteinstellungen aktualisiert wurden."
|
||||||
|
|
||||||
@@ -539,7 +539,7 @@ msgstr "App-Version"
|
|||||||
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:89
|
#: 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-button.tsx:120
|
||||||
#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:144
|
#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:144
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:122
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:125
|
||||||
msgid "Approve"
|
msgid "Approve"
|
||||||
msgstr "Genehmigen"
|
msgstr "Genehmigen"
|
||||||
|
|
||||||
@@ -578,7 +578,7 @@ msgid "Audit Log"
|
|||||||
msgstr "Audit-Protokoll"
|
msgstr "Audit-Protokoll"
|
||||||
|
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:41
|
#: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:41
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:57
|
#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:52
|
||||||
msgid "Authentication required"
|
msgid "Authentication required"
|
||||||
msgstr "Authentifizierung erforderlich"
|
msgstr "Authentifizierung erforderlich"
|
||||||
|
|
||||||
@@ -596,7 +596,7 @@ msgstr "Warte auf E-Mail-Bestätigung"
|
|||||||
|
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:369
|
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:369
|
||||||
#: apps/web/src/components/(dashboard)/settings/layout/activity-back.tsx:20
|
#: apps/web/src/components/(dashboard)/settings/layout/activity-back.tsx:20
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:497
|
#: apps/web/src/components/forms/v2/signup.tsx:509
|
||||||
msgid "Back"
|
msgid "Back"
|
||||||
msgstr "Zurück"
|
msgstr "Zurück"
|
||||||
|
|
||||||
@@ -609,7 +609,7 @@ msgid "Background Color"
|
|||||||
msgstr "Hintergrundfarbe"
|
msgstr "Hintergrundfarbe"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx:167
|
#: apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx:167
|
||||||
#: apps/web/src/components/forms/signin.tsx:473
|
#: apps/web/src/components/forms/signin.tsx:485
|
||||||
msgid "Backup Code"
|
msgid "Backup Code"
|
||||||
msgstr "Backup-Code"
|
msgstr "Backup-Code"
|
||||||
|
|
||||||
@@ -621,7 +621,7 @@ msgstr "Backup-Codes"
|
|||||||
msgid "Banner Updated"
|
msgid "Banner Updated"
|
||||||
msgstr "Banner aktualisiert"
|
msgstr "Banner aktualisiert"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:460
|
#: apps/web/src/components/forms/v2/signup.tsx:472
|
||||||
msgid "Basic details"
|
msgid "Basic details"
|
||||||
msgstr "Basisdetails"
|
msgstr "Basisdetails"
|
||||||
|
|
||||||
@@ -662,13 +662,13 @@ msgstr "Durch die Aktivierung von 2FA müssen Sie jedes Mal, wenn Sie sich anmel
|
|||||||
#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:119
|
#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:119
|
||||||
#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:470
|
#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:470
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:178
|
#: 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:74
|
#: 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:164
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:189
|
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:189
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:143
|
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:150
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:215
|
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:215
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:327
|
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:327
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:110
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:113
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:250
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:250
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:333
|
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:333
|
||||||
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121
|
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121
|
||||||
@@ -720,7 +720,7 @@ msgstr "Wählen..."
|
|||||||
msgid "Claim account"
|
msgid "Claim account"
|
||||||
msgstr "Konto beanspruchen"
|
msgstr "Konto beanspruchen"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:469
|
#: apps/web/src/components/forms/v2/signup.tsx:481
|
||||||
msgid "Claim username"
|
msgid "Claim username"
|
||||||
msgstr "Benutzername beanspruchen"
|
msgstr "Benutzername beanspruchen"
|
||||||
|
|
||||||
@@ -728,7 +728,7 @@ msgstr "Benutzername beanspruchen"
|
|||||||
msgid "Claim your profile later"
|
msgid "Claim your profile later"
|
||||||
msgstr "Profile später beanspruchen"
|
msgstr "Profile später beanspruchen"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:267
|
#: apps/web/src/components/forms/v2/signup.tsx:279
|
||||||
msgid "Claim your username now"
|
msgid "Claim your username now"
|
||||||
msgstr "Benutzername jetzt beanspruchen"
|
msgstr "Benutzername jetzt beanspruchen"
|
||||||
|
|
||||||
@@ -752,9 +752,9 @@ msgid "Click to copy signing link for sending to recipient"
|
|||||||
msgstr "Klicken Sie, um den Signatur-Link zu kopieren, um ihn an den Empfänger zu senden"
|
msgstr "Klicken Sie, um den Signatur-Link zu kopieren, um ihn an den Empfänger zu senden"
|
||||||
|
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:175
|
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:175
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:107
|
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:114
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:435
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:435
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:312
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:314
|
||||||
msgid "Click to insert field"
|
msgid "Click to insert field"
|
||||||
msgstr "Klicken Sie, um das Feld einzufügen"
|
msgstr "Klicken Sie, um das Feld einzufügen"
|
||||||
|
|
||||||
@@ -770,22 +770,22 @@ msgstr "Klicken Sie, um das Feld einzufügen"
|
|||||||
msgid "Close"
|
msgid "Close"
|
||||||
msgstr "Schließen"
|
msgstr "Schließen"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:58
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:61
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:425
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:425
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:302
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:304
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:522
|
#: apps/web/src/components/forms/v2/signup.tsx:534
|
||||||
msgid "Complete"
|
msgid "Complete"
|
||||||
msgstr "Vollständig"
|
msgstr "Vollständig"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:67
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:70
|
||||||
msgid "Complete Approval"
|
msgid "Complete Approval"
|
||||||
msgstr "Genehmigung abschließen"
|
msgstr "Genehmigung abschließen"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:66
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:69
|
||||||
msgid "Complete Signing"
|
msgid "Complete Signing"
|
||||||
msgstr "Unterzeichnung abschließen"
|
msgstr "Unterzeichnung abschließen"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:65
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:68
|
||||||
msgid "Complete Viewing"
|
msgid "Complete Viewing"
|
||||||
msgstr "Betrachten abschließen"
|
msgstr "Betrachten abschließen"
|
||||||
|
|
||||||
@@ -802,7 +802,7 @@ msgstr "Abgeschlossene Dokumente"
|
|||||||
msgid "Completed Documents"
|
msgid "Completed Documents"
|
||||||
msgstr "Abgeschlossene Dokumente"
|
msgstr "Abgeschlossene Dokumente"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:133
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:147
|
||||||
msgid "Configure general settings for the document."
|
msgid "Configure general settings for the document."
|
||||||
msgstr "Konfigurieren Sie die allgemeinen Einstellungen für das Dokument."
|
msgstr "Konfigurieren Sie die allgemeinen Einstellungen für das Dokument."
|
||||||
|
|
||||||
@@ -887,7 +887,7 @@ msgstr "Token kopieren"
|
|||||||
msgid "Create"
|
msgid "Create"
|
||||||
msgstr "Erstellen"
|
msgstr "Erstellen"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:252
|
#: apps/web/src/components/forms/v2/signup.tsx:264
|
||||||
msgid "Create a new account"
|
msgid "Create a new account"
|
||||||
msgstr "Ein neues Konto erstellen"
|
msgstr "Ein neues Konto erstellen"
|
||||||
|
|
||||||
@@ -952,11 +952,11 @@ msgstr "Webhook erstellen"
|
|||||||
msgid "Create Webhook"
|
msgid "Create Webhook"
|
||||||
msgstr "Webhook erstellen"
|
msgstr "Webhook erstellen"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/complete/page.tsx:214
|
#: apps/web/src/app/(signing)/sign/[token]/complete/page.tsx:215
|
||||||
msgid "Create your account and start using state-of-the-art document signing."
|
msgid "Create your account and start using state-of-the-art document signing."
|
||||||
msgstr "Erstellen Sie Ihr Konto und beginnen Sie mit dem modernen Dokumentensignieren."
|
msgstr "Erstellen Sie Ihr Konto und beginnen Sie mit dem modernen Dokumentensignieren."
|
||||||
|
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:256
|
#: apps/web/src/components/forms/v2/signup.tsx:268
|
||||||
msgid "Create your account and start using state-of-the-art document signing. Open and beautiful signing is within your grasp."
|
msgid "Create your account and start using state-of-the-art document signing. Open and beautiful signing is within your grasp."
|
||||||
msgstr "Erstellen Sie Ihr Konto und beginnen Sie mit dem modernen Dokumentensignieren. Offenes und schönes Signieren liegt in Ihrer Reichweite."
|
msgstr "Erstellen Sie Ihr Konto und beginnen Sie mit dem modernen Dokumentensignieren. Offenes und schönes Signieren liegt in Ihrer Reichweite."
|
||||||
|
|
||||||
@@ -986,10 +986,12 @@ msgstr "Erstellt am"
|
|||||||
#: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:88
|
#: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:88
|
||||||
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/page.tsx:93
|
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/page.tsx:93
|
||||||
msgid "Created on {0}"
|
msgid "Created on {0}"
|
||||||
msgstr ""
|
msgstr "Erstellt am {0}"
|
||||||
|
|
||||||
|
#: apps/web/src/app/(dashboard)/settings/webhooks/page.tsx:89
|
||||||
|
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/webhooks/page.tsx:94
|
||||||
#~ msgid "Created on <0/>"
|
#~ msgid "Created on <0/>"
|
||||||
#~ msgstr ""
|
#~ msgstr "Created on <0/>"
|
||||||
|
|
||||||
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:100
|
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:100
|
||||||
msgid "Created on{0}"
|
msgid "Created on{0}"
|
||||||
@@ -1218,7 +1220,7 @@ msgid "Document created"
|
|||||||
msgstr "Dokument erstellt"
|
msgstr "Dokument erstellt"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:51
|
#: 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:147
|
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:173
|
||||||
#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:59
|
#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:59
|
||||||
msgid "Document deleted"
|
msgid "Document deleted"
|
||||||
msgstr "Dokument gelöscht"
|
msgstr "Dokument gelöscht"
|
||||||
@@ -1231,7 +1233,7 @@ msgstr "Dokument-Entwurf"
|
|||||||
msgid "Document Duplicated"
|
msgid "Document Duplicated"
|
||||||
msgstr "Dokument dupliziert"
|
msgstr "Dokument dupliziert"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:158
|
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:184
|
||||||
#: apps/web/src/components/document/document-history-sheet.tsx:104
|
#: apps/web/src/components/document/document-history-sheet.tsx:104
|
||||||
msgid "Document history"
|
msgid "Document history"
|
||||||
msgstr "Dokumentverlauf"
|
msgstr "Dokumentverlauf"
|
||||||
@@ -1272,7 +1274,7 @@ msgstr "Dokument erneut gesendet"
|
|||||||
msgid "Document resealed"
|
msgid "Document resealed"
|
||||||
msgstr "Dokument wieder versiegelt"
|
msgstr "Dokument wieder versiegelt"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:276
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:298
|
||||||
msgid "Document sent"
|
msgid "Document sent"
|
||||||
msgstr "Dokument gesendet"
|
msgstr "Dokument gesendet"
|
||||||
|
|
||||||
@@ -1310,11 +1312,11 @@ msgstr "Dokument wird dauerhaft gelöscht"
|
|||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/admin/nav.tsx:65
|
#: 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)/admin/users/data-table-users.tsx:92
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:113
|
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:139
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit/document-edit-page-view.tsx:82
|
#: 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]/loading.tsx:16
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/sent/page.tsx:15
|
#: apps/web/src/app/(dashboard)/documents/[id]/sent/page.tsx:15
|
||||||
#: apps/web/src/app/(dashboard)/documents/documents-page-view.tsx:110
|
#: apps/web/src/app/(dashboard)/documents/documents-page-view.tsx:114
|
||||||
#: apps/web/src/app/(profile)/p/[url]/page.tsx:166
|
#: apps/web/src/app/(profile)/p/[url]/page.tsx:166
|
||||||
#: apps/web/src/app/not-found.tsx:21
|
#: apps/web/src/app/not-found.tsx:21
|
||||||
#: apps/web/src/components/(dashboard)/common/command-menu.tsx:205
|
#: apps/web/src/components/(dashboard)/common/command-menu.tsx:205
|
||||||
@@ -1333,7 +1335,7 @@ msgid "Documents Viewed"
|
|||||||
msgstr "Dokumente angesehen"
|
msgstr "Dokumente angesehen"
|
||||||
|
|
||||||
#: apps/web/src/app/(unauthenticated)/reset-password/[token]/page.tsx:40
|
#: apps/web/src/app/(unauthenticated)/reset-password/[token]/page.tsx:40
|
||||||
#: apps/web/src/app/(unauthenticated)/signin/page.tsx:61
|
#: apps/web/src/app/(unauthenticated)/signin/page.tsx:45
|
||||||
msgid "Don't have an account? <0>Sign up</0>"
|
msgid "Don't have an account? <0>Sign up</0>"
|
||||||
msgstr "Haben Sie kein Konto? <0>Registrieren</0>"
|
msgstr "Haben Sie kein Konto? <0>Registrieren</0>"
|
||||||
|
|
||||||
@@ -1405,12 +1407,12 @@ msgstr "Webhook bearbeiten"
|
|||||||
#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:118
|
#: 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/(signing)/sign/[token]/email-field.tsx:126
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:376
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:376
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:254
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:256
|
||||||
#: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:169
|
#: 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/(teams)/dialogs/update-team-email-dialog.tsx:153
|
||||||
#: apps/web/src/components/forms/forgot-password.tsx:81
|
#: apps/web/src/components/forms/forgot-password.tsx:81
|
||||||
#: apps/web/src/components/forms/profile.tsx:122
|
#: apps/web/src/components/forms/profile.tsx:122
|
||||||
#: apps/web/src/components/forms/signin.tsx:326
|
#: apps/web/src/components/forms/signin.tsx:338
|
||||||
#: apps/web/src/components/forms/signup.tsx:180
|
#: apps/web/src/components/forms/signup.tsx:180
|
||||||
msgid "Email"
|
msgid "Email"
|
||||||
msgstr "E-Mail"
|
msgstr "E-Mail"
|
||||||
@@ -1421,7 +1423,7 @@ msgstr "E-Mail"
|
|||||||
msgid "Email address"
|
msgid "Email address"
|
||||||
msgstr "E-Mail-Adresse"
|
msgstr "E-Mail-Adresse"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:316
|
#: apps/web/src/components/forms/v2/signup.tsx:328
|
||||||
msgid "Email Address"
|
msgid "Email Address"
|
||||||
msgstr "E-Mail-Adresse"
|
msgstr "E-Mail-Adresse"
|
||||||
|
|
||||||
@@ -1489,16 +1491,16 @@ 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/documents/[id]/admin-actions.tsx:41
|
||||||
#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:78
|
#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:78
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:198
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:213
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:225
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:247
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:255
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:277
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:286
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:308
|
||||||
#: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:57
|
#: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:57
|
||||||
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106
|
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106
|
||||||
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:112
|
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:112
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:152
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:165
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:175
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:196
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:209
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:230
|
||||||
#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51
|
#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51
|
||||||
#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:56
|
#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:56
|
||||||
#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:152
|
#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:152
|
||||||
@@ -1542,8 +1544,10 @@ msgstr "Zeitüberschreitung überschritten"
|
|||||||
msgid "Expired"
|
msgid "Expired"
|
||||||
msgstr "Abgelaufen"
|
msgstr "Abgelaufen"
|
||||||
|
|
||||||
|
#: apps/web/src/app/(dashboard)/settings/tokens/page.tsx:73
|
||||||
|
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:106
|
||||||
#~ msgid "Expires on"
|
#~ msgid "Expires on"
|
||||||
#~ msgstr ""
|
#~ msgstr "Expires on"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/settings/tokens/page.tsx:71
|
#: apps/web/src/app/(dashboard)/settings/tokens/page.tsx:71
|
||||||
msgid "Expires on {0}"
|
msgid "Expires on {0}"
|
||||||
@@ -1556,7 +1560,7 @@ msgstr ">>>>>>> 4ca18b99 (fix: refactor dates)"
|
|||||||
|
|
||||||
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:107
|
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx:107
|
||||||
msgid "Expires on{0}"
|
msgid "Expires on{0}"
|
||||||
msgstr ""
|
msgstr "Läuft ab am{0}"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:42
|
#: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:42
|
||||||
msgid "Failed to reseal document"
|
msgid "Failed to reseal document"
|
||||||
@@ -1580,20 +1584,20 @@ 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"
|
msgstr "Die Datei darf nicht größer als {APP_DOCUMENT_UPLOAD_SIZE_LIMIT} MB sein"
|
||||||
|
|
||||||
#: apps/web/src/app/(unauthenticated)/forgot-password/page.tsx:21
|
#: apps/web/src/app/(unauthenticated)/forgot-password/page.tsx:21
|
||||||
#: apps/web/src/components/forms/signin.tsx:358
|
#: apps/web/src/components/forms/signin.tsx:370
|
||||||
msgid "Forgot your password?"
|
msgid "Forgot your password?"
|
||||||
msgstr "Haben Sie Ihr Passwort vergessen?"
|
msgstr "Haben Sie Ihr Passwort vergessen?"
|
||||||
|
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:326
|
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:326
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:193
|
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:193
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:361
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:361
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:239
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:241
|
||||||
#: apps/web/src/components/forms/profile.tsx:110
|
#: apps/web/src/components/forms/profile.tsx:110
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:300
|
#: apps/web/src/components/forms/v2/signup.tsx:312
|
||||||
msgid "Full Name"
|
msgid "Full Name"
|
||||||
msgstr "Vollständiger Name"
|
msgstr "Vollständiger Name"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:132
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:146
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:76
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:76
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:60
|
#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:60
|
||||||
#: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:43
|
#: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:43
|
||||||
@@ -1616,7 +1620,7 @@ msgstr "Zurück"
|
|||||||
msgid "Go back home"
|
msgid "Go back home"
|
||||||
msgstr "Zurück nach Hause"
|
msgstr "Zurück nach Hause"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/complete/page.tsx:223
|
#: apps/web/src/app/(signing)/sign/[token]/complete/page.tsx:226
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/no-longer-available.tsx:57
|
#: apps/web/src/app/(signing)/sign/[token]/no-longer-available.tsx:57
|
||||||
msgid "Go Back Home"
|
msgid "Go Back Home"
|
||||||
msgstr "Zurück nach Hause"
|
msgstr "Zurück nach Hause"
|
||||||
@@ -1774,9 +1778,13 @@ msgstr "Es scheint, dass kein Token bereitgestellt wurde. Wenn Sie versuchen, Ih
|
|||||||
msgid "It seems that there is no token provided. Please check your email and try again."
|
msgid "It seems that there is no token provided. Please check your email and try again."
|
||||||
msgstr "Es scheint, dass kein Token bereitgestellt wurde. Bitte überprüfen Sie Ihre E-Mail und versuchen Sie es erneut."
|
msgstr "Es scheint, dass kein Token bereitgestellt wurde. Bitte überprüfen Sie Ihre E-Mail und versuchen Sie es erneut."
|
||||||
|
|
||||||
|
#: 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 "Es ist derzeit nicht deine Reihe zu unterschreiben. Du erhältst eine E-Mail mit Anweisungen, sobald es deine Reihe ist, das Dokument zu unterschreiben."
|
||||||
|
|
||||||
#: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:286
|
#: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:286
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr ""
|
msgstr "Sprache"
|
||||||
|
|
||||||
#: apps/web/src/components/(dashboard)/period-selector/period-selector.tsx:61
|
#: apps/web/src/components/(dashboard)/period-selector/period-selector.tsx:61
|
||||||
msgid "Last 14 days"
|
msgid "Last 14 days"
|
||||||
@@ -1856,8 +1864,8 @@ msgid "Loading..."
|
|||||||
msgstr "Wird geladen..."
|
msgstr "Wird geladen..."
|
||||||
|
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:54
|
#: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:54
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:78
|
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:75
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:72
|
#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:67
|
||||||
msgid "Login"
|
msgid "Login"
|
||||||
msgstr "Anmelden"
|
msgstr "Anmelden"
|
||||||
|
|
||||||
@@ -1929,7 +1937,7 @@ msgstr "Verwalten Sie Ihre Passkeys."
|
|||||||
msgid "Manage your site settings here"
|
msgid "Manage your site settings here"
|
||||||
msgstr "Verwalten Sie hier Ihre Seiteneinstellungen"
|
msgstr "Verwalten Sie hier Ihre Seiteneinstellungen"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:120
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:123
|
||||||
msgid "Mark as Viewed"
|
msgid "Mark as Viewed"
|
||||||
msgstr "Als angesehen markieren"
|
msgstr "Als angesehen markieren"
|
||||||
|
|
||||||
@@ -2008,7 +2016,7 @@ msgstr "Meine Vorlagen"
|
|||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Name"
|
msgstr "Name"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/complete/page.tsx:210
|
#: apps/web/src/app/(signing)/sign/[token]/complete/page.tsx:211
|
||||||
msgid "Need to sign documents?"
|
msgid "Need to sign documents?"
|
||||||
msgstr "Müssen Dokumente signieren?"
|
msgstr "Müssen Dokumente signieren?"
|
||||||
|
|
||||||
@@ -2030,12 +2038,12 @@ msgid "New Template"
|
|||||||
msgstr "Neue Vorlage"
|
msgstr "Neue Vorlage"
|
||||||
|
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:416
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:416
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:293
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:295
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:509
|
#: apps/web/src/components/forms/v2/signup.tsx:521
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr "Nächster"
|
msgstr "Nächster"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:58
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:61
|
||||||
msgid "Next field"
|
msgid "Next field"
|
||||||
msgstr "Nächstes Feld"
|
msgstr "Nächstes Feld"
|
||||||
|
|
||||||
@@ -2093,6 +2101,10 @@ msgstr "Nicht unterstützt"
|
|||||||
msgid "Nothing to do"
|
msgid "Nothing to do"
|
||||||
msgstr "Nichts zu tun"
|
msgstr "Nichts zu tun"
|
||||||
|
|
||||||
|
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:270
|
||||||
|
msgid "Number"
|
||||||
|
msgstr "Nummer"
|
||||||
|
|
||||||
#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:128
|
#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:128
|
||||||
msgid "On this page, you can create a new webhook."
|
msgid "On this page, you can create a new webhook."
|
||||||
msgstr "Auf dieser Seite können Sie einen neuen Webhook erstellen."
|
msgstr "Auf dieser Seite können Sie einen neuen Webhook erstellen."
|
||||||
@@ -2138,11 +2150,11 @@ 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:337
|
||||||
#: apps/web/src/components/forms/signup.tsx:243
|
#: apps/web/src/components/forms/signup.tsx:243
|
||||||
#: apps/web/src/components/forms/signup.tsx:267
|
#: apps/web/src/components/forms/signup.tsx:267
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:371
|
#: apps/web/src/components/forms/v2/signup.tsx:383
|
||||||
msgid "Or"
|
msgid "Or"
|
||||||
msgstr "Oder"
|
msgstr "Oder"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/signin.tsx:378
|
#: apps/web/src/components/forms/signin.tsx:390
|
||||||
msgid "Or continue with"
|
msgid "Or continue with"
|
||||||
msgstr "Oder fahren Sie fort mit"
|
msgstr "Oder fahren Sie fort mit"
|
||||||
|
|
||||||
@@ -2159,7 +2171,7 @@ msgstr "Besitzer"
|
|||||||
msgid "Paid"
|
msgid "Paid"
|
||||||
msgstr "Bezahlt"
|
msgstr "Bezahlt"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/signin.tsx:423
|
#: apps/web/src/components/forms/signin.tsx:435
|
||||||
msgid "Passkey"
|
msgid "Passkey"
|
||||||
msgstr "Passkey"
|
msgstr "Passkey"
|
||||||
|
|
||||||
@@ -2199,9 +2211,9 @@ msgstr "Passkeys werden von diesem Browser nicht unterstützt"
|
|||||||
#: apps/web/src/components/(dashboard)/common/command-menu.tsx:70
|
#: apps/web/src/components/(dashboard)/common/command-menu.tsx:70
|
||||||
#: apps/web/src/components/forms/password.tsx:123
|
#: apps/web/src/components/forms/password.tsx:123
|
||||||
#: apps/web/src/components/forms/reset-password.tsx:110
|
#: apps/web/src/components/forms/reset-password.tsx:110
|
||||||
#: apps/web/src/components/forms/signin.tsx:344
|
#: apps/web/src/components/forms/signin.tsx:356
|
||||||
#: apps/web/src/components/forms/signup.tsx:196
|
#: apps/web/src/components/forms/signup.tsx:196
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:332
|
#: apps/web/src/components/forms/v2/signup.tsx:344
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr "Passwort"
|
msgstr "Passwort"
|
||||||
|
|
||||||
@@ -2266,6 +2278,10 @@ msgstr "Wählen Sie eine der folgenden Vereinbarungen aus und beginnen Sie das S
|
|||||||
msgid "Please check the CSV file and make sure it is according to our format"
|
msgid "Please check the CSV file and make sure it is according to our format"
|
||||||
msgstr "Bitte prüfen Sie die CSV-Datei und stellen Sie sicher, dass sie unserem Format entspricht"
|
msgstr "Bitte prüfen Sie die CSV-Datei und stellen Sie sicher, dass sie unserem Format entspricht"
|
||||||
|
|
||||||
|
#: apps/web/src/app/(signing)/sign/[token]/waiting/page.tsx:81
|
||||||
|
msgid "Please check your email for updates."
|
||||||
|
msgstr "Bitte überprüfe deine E-Mail auf Updates."
|
||||||
|
|
||||||
#: apps/web/src/app/(unauthenticated)/reset-password/[token]/page.tsx:34
|
#: apps/web/src/app/(unauthenticated)/reset-password/[token]/page.tsx:34
|
||||||
msgid "Please choose your new password"
|
msgid "Please choose your new password"
|
||||||
msgstr "Bitte wählen Sie Ihr neues Passwort"
|
msgstr "Bitte wählen Sie Ihr neues Passwort"
|
||||||
@@ -2278,7 +2294,7 @@ msgstr "Bitte kontaktieren Sie den Support, wenn Sie diese Aktion rückgängig m
|
|||||||
msgid "Please enter a meaningful name for your token. This will help you identify it later."
|
msgid "Please enter a meaningful name for your token. This will help you identify it later."
|
||||||
msgstr "Bitte geben Sie einen aussagekräftigen Namen für Ihr Token ein. Dies wird Ihnen helfen, es später zu identifizieren."
|
msgstr "Bitte geben Sie einen aussagekräftigen Namen für Ihr Token ein. Dies wird Ihnen helfen, es später zu identifizieren."
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:127
|
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:134
|
||||||
msgid "Please mark as viewed to complete"
|
msgid "Please mark as viewed to complete"
|
||||||
msgstr "Bitte als angesehen markieren, um abzuschließen"
|
msgstr "Bitte als angesehen markieren, um abzuschließen"
|
||||||
|
|
||||||
@@ -2388,7 +2404,7 @@ msgstr "Öffentliches Profil"
|
|||||||
msgid "Public profile URL"
|
msgid "Public profile URL"
|
||||||
msgstr "Öffentlicher Profil-URL"
|
msgstr "Öffentlicher Profil-URL"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:438
|
#: apps/web/src/components/forms/v2/signup.tsx:450
|
||||||
msgid "Public profile username"
|
msgid "Public profile username"
|
||||||
msgstr "Öffentlicher Profil-Benutzername"
|
msgstr "Öffentlicher Profil-Benutzername"
|
||||||
|
|
||||||
@@ -2609,7 +2625,7 @@ msgstr "Sicherheit"
|
|||||||
msgid "Security activity"
|
msgid "Security activity"
|
||||||
msgstr "Sicherheitsaktivität"
|
msgstr "Sicherheitsaktivität"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:192
|
#: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:194
|
||||||
msgid "Select"
|
msgid "Select"
|
||||||
msgstr "Auswählen"
|
msgstr "Auswählen"
|
||||||
|
|
||||||
@@ -2713,7 +2729,7 @@ msgstr "Vorlagen in Ihrem Team-Öffentliches Profil anzeigen, damit Ihre Zielgru
|
|||||||
#: apps/web/src/app/(profile)/p/[url]/page.tsx:192
|
#: apps/web/src/app/(profile)/p/[url]/page.tsx:192
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:182
|
#: 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:224
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:121
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:124
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:259
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:259
|
||||||
#: apps/web/src/components/ui/user-profile-skeleton.tsx:75
|
#: apps/web/src/components/ui/user-profile-skeleton.tsx:75
|
||||||
#: apps/web/src/components/ui/user-profile-timur.tsx:81
|
#: apps/web/src/components/ui/user-profile-timur.tsx:81
|
||||||
@@ -2733,7 +2749,7 @@ msgid "Sign as<0>{0} <1>({1})</1></0>"
|
|||||||
msgstr "Unterzeichnen als<0>{0} <1>({1})</1></0>"
|
msgstr "Unterzeichnen als<0>{0} <1>({1})</1></0>"
|
||||||
|
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:329
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:329
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:207
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:209
|
||||||
msgid "Sign document"
|
msgid "Sign document"
|
||||||
msgstr "Dokument unterschreiben"
|
msgstr "Dokument unterschreiben"
|
||||||
|
|
||||||
@@ -2742,17 +2758,17 @@ msgid "Sign field"
|
|||||||
msgstr "Unterzeichnen-Feld"
|
msgstr "Unterzeichnen-Feld"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/signup.tsx:212
|
#: apps/web/src/components/forms/signup.tsx:212
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:350
|
#: apps/web/src/components/forms/v2/signup.tsx:362
|
||||||
msgid "Sign Here"
|
msgid "Sign Here"
|
||||||
msgstr "Hier unterzeichnen"
|
msgstr "Hier unterzeichnen"
|
||||||
|
|
||||||
#: apps/web/src/app/not-found.tsx:29
|
#: apps/web/src/app/not-found.tsx:29
|
||||||
#: apps/web/src/components/forms/signin.tsx:371
|
#: apps/web/src/components/forms/signin.tsx:383
|
||||||
#: apps/web/src/components/forms/signin.tsx:498
|
#: apps/web/src/components/forms/signin.tsx:510
|
||||||
msgid "Sign In"
|
msgid "Sign In"
|
||||||
msgstr "Einloggen"
|
msgstr "Einloggen"
|
||||||
|
|
||||||
#: apps/web/src/app/(unauthenticated)/signin/page.tsx:44
|
#: apps/web/src/app/(unauthenticated)/signin/page.tsx:29
|
||||||
msgid "Sign in to your account"
|
msgid "Sign in to your account"
|
||||||
msgstr "Melden Sie sich bei Ihrem Konto an"
|
msgstr "Melden Sie sich bei Ihrem Konto an"
|
||||||
|
|
||||||
@@ -2762,11 +2778,11 @@ msgid "Sign Out"
|
|||||||
msgstr "Ausloggen"
|
msgstr "Ausloggen"
|
||||||
|
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:350
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:350
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:228
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:230
|
||||||
msgid "Sign the document to complete the process."
|
msgid "Sign the document to complete the process."
|
||||||
msgstr "Unterschreiben Sie das Dokument, um den Vorgang abzuschließen."
|
msgstr "Unterschreiben Sie das Dokument, um den Vorgang abzuschließen."
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:72
|
#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:67
|
||||||
msgid "Sign up"
|
msgid "Sign up"
|
||||||
msgstr "Registrieren"
|
msgstr "Registrieren"
|
||||||
|
|
||||||
@@ -2775,12 +2791,12 @@ msgid "Sign Up"
|
|||||||
msgstr "Registrieren"
|
msgstr "Registrieren"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/signup.tsx:257
|
#: apps/web/src/components/forms/signup.tsx:257
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:389
|
#: apps/web/src/components/forms/v2/signup.tsx:401
|
||||||
msgid "Sign Up with Google"
|
msgid "Sign Up with Google"
|
||||||
msgstr "Registrieren mit Google"
|
msgstr "Registrieren mit Google"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/signup.tsx:281
|
#: apps/web/src/components/forms/signup.tsx:281
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:405
|
#: apps/web/src/components/forms/v2/signup.tsx:417
|
||||||
msgid "Sign Up with OIDC"
|
msgid "Sign Up with OIDC"
|
||||||
msgstr "Registrieren mit OIDC"
|
msgstr "Registrieren mit OIDC"
|
||||||
|
|
||||||
@@ -2789,7 +2805,7 @@ msgstr "Registrieren mit OIDC"
|
|||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:197
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:197
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:227
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:227
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:391
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:391
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:268
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:270
|
||||||
#: apps/web/src/components/forms/profile.tsx:132
|
#: apps/web/src/components/forms/profile.tsx:132
|
||||||
msgid "Signature"
|
msgid "Signature"
|
||||||
msgstr "Unterschrift"
|
msgstr "Unterschrift"
|
||||||
@@ -2806,8 +2822,8 @@ msgstr "Unterschriften erscheinen, sobald das Dokument abgeschlossen ist"
|
|||||||
msgid "Signed"
|
msgid "Signed"
|
||||||
msgstr "Unterzeichnet"
|
msgstr "Unterzeichnet"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/signin.tsx:371
|
#: apps/web/src/components/forms/signin.tsx:383
|
||||||
#: apps/web/src/components/forms/signin.tsx:498
|
#: apps/web/src/components/forms/signin.tsx:510
|
||||||
msgid "Signing in..."
|
msgid "Signing in..."
|
||||||
msgstr "Anmeldung..."
|
msgstr "Anmeldung..."
|
||||||
|
|
||||||
@@ -2852,12 +2868,12 @@ msgstr "Website Einstellungen"
|
|||||||
#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:151
|
#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:151
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:117
|
#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:117
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:27
|
#: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:27
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:43
|
#: 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]/layout-billing-banner.tsx:53
|
||||||
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx:39
|
#: 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/(unauthenticated)/verify-email/[token]/page.tsx:61
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:243
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:243
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:123
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:125
|
||||||
#: apps/web/src/components/(teams)/dialogs/create-team-checkout-dialog.tsx:50
|
#: 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/create-team-checkout-dialog.tsx:99
|
||||||
#: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:210
|
#: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:210
|
||||||
@@ -3113,7 +3129,7 @@ msgstr "Template has been updated."
|
|||||||
msgid "Template moved"
|
msgid "Template moved"
|
||||||
msgstr "Template moved"
|
msgstr "Template moved"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:198
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:219
|
||||||
msgid "Template saved"
|
msgid "Template saved"
|
||||||
msgstr "Template saved"
|
msgstr "Template saved"
|
||||||
|
|
||||||
@@ -3129,6 +3145,11 @@ msgstr "Templates"
|
|||||||
msgid "Templates allow you to quickly generate documents with pre-filled recipients and fields."
|
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."
|
msgstr "Templates allow you to quickly generate documents with pre-filled recipients and fields."
|
||||||
|
|
||||||
|
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:256
|
||||||
|
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:272
|
||||||
|
msgid "Text"
|
||||||
|
msgstr "Text"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:166
|
#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:166
|
||||||
msgid "Text Color"
|
msgid "Text Color"
|
||||||
msgstr "Text Color"
|
msgstr "Text Color"
|
||||||
@@ -3306,11 +3327,11 @@ msgstr "This document has been cancelled by the owner and is no longer available
|
|||||||
msgid "This document has been cancelled by the owner."
|
msgid "This document has been cancelled by the owner."
|
||||||
msgstr "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:193
|
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:219
|
||||||
msgid "This document has been signed by all recipients"
|
msgid "This document has been signed by all recipients"
|
||||||
msgstr "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:196
|
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:222
|
||||||
msgid "This document is currently a draft and has not been sent"
|
msgid "This document is currently a draft and has not been sent"
|
||||||
msgstr "This document is currently a draft and has not been sent"
|
msgstr "This document is currently a draft and has not been sent"
|
||||||
|
|
||||||
@@ -3413,7 +3434,7 @@ msgstr "To enable two-factor authentication, scan the following QR code using yo
|
|||||||
msgid "To gain access to your account, please confirm your email address by clicking on the confirmation link from your inbox."
|
msgid "To gain access to your account, please confirm your email address by clicking on the confirmation link from your inbox."
|
||||||
msgstr "To gain access to your account, please confirm your email address by clicking on the confirmation link from your inbox."
|
msgstr "To gain access to your account, please confirm your email address by clicking on the confirmation link from your inbox."
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:57
|
#: 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}</0>"
|
msgid "To mark this document as viewed, you need to be logged in as <0>{0}</0>"
|
||||||
msgstr "To mark this document as viewed, you need to be logged in as <0>{0}</0>"
|
msgstr "To mark this document as viewed, you need to be logged in as <0>{0}</0>"
|
||||||
|
|
||||||
@@ -3502,7 +3523,7 @@ msgstr "Two factor authentication"
|
|||||||
msgid "Two factor authentication recovery codes are used to access your account in the event that you lose access to your authenticator app."
|
msgid "Two factor authentication recovery codes are used to access your account in the event that you lose access to your authenticator app."
|
||||||
msgstr "Two factor authentication recovery codes are used to access your account in the event that you lose access to your authenticator app."
|
msgstr "Two factor authentication recovery codes are used to access your account in the event that you lose access to your authenticator app."
|
||||||
|
|
||||||
#: apps/web/src/components/forms/signin.tsx:436
|
#: apps/web/src/components/forms/signin.tsx:448
|
||||||
msgid "Two-Factor Authentication"
|
msgid "Two-Factor Authentication"
|
||||||
msgstr "Two-Factor Authentication"
|
msgstr "Two-Factor Authentication"
|
||||||
|
|
||||||
@@ -3537,7 +3558,7 @@ msgstr "Uh oh! Looks like you're missing a token"
|
|||||||
|
|
||||||
#: apps/web/src/components/(dashboard)/common/command-menu.tsx:303
|
#: apps/web/src/components/(dashboard)/common/command-menu.tsx:303
|
||||||
msgid "Unable to change the language at this time. Please try again later."
|
msgid "Unable to change the language at this time. Please try again later."
|
||||||
msgstr ""
|
msgstr "Derzeit kann die Sprache nicht geändert werden. Bitte versuchen Sie es später erneut."
|
||||||
|
|
||||||
#: apps/web/src/components/forms/2fa/recovery-code-list.tsx:31
|
#: apps/web/src/components/forms/2fa/recovery-code-list.tsx:31
|
||||||
msgid "Unable to copy recovery code"
|
msgid "Unable to copy recovery code"
|
||||||
@@ -3712,12 +3733,12 @@ msgid "Uploaded file not an allowed file type"
|
|||||||
msgstr "Die hochgeladene Datei ist kein zulässiger Dateityp"
|
msgstr "Die hochgeladene Datei ist kein zulässiger Dateityp"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx:187
|
#: apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx:187
|
||||||
#: apps/web/src/components/forms/signin.tsx:493
|
#: apps/web/src/components/forms/signin.tsx:505
|
||||||
msgid "Use Authenticator"
|
msgid "Use Authenticator"
|
||||||
msgstr "Authenticator verwenden"
|
msgstr "Authenticator verwenden"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx:185
|
#: apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx:185
|
||||||
#: apps/web/src/components/forms/signin.tsx:491
|
#: apps/web/src/components/forms/signin.tsx:503
|
||||||
msgid "Use Backup Code"
|
msgid "Use Backup Code"
|
||||||
msgstr "Backup-Code verwenden"
|
msgstr "Backup-Code verwenden"
|
||||||
|
|
||||||
@@ -3733,7 +3754,7 @@ msgstr "Benutzer"
|
|||||||
msgid "User ID"
|
msgid "User ID"
|
||||||
msgstr "Benutzer-ID"
|
msgstr "Benutzer-ID"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:222
|
#: apps/web/src/components/forms/v2/signup.tsx:234
|
||||||
msgid "User profiles are here!"
|
msgid "User profiles are here!"
|
||||||
msgstr "Benutzerprofile sind hier!"
|
msgstr "Benutzerprofile sind hier!"
|
||||||
|
|
||||||
@@ -3835,6 +3856,10 @@ msgstr "Warten"
|
|||||||
msgid "Waiting for others to sign"
|
msgid "Waiting for others to sign"
|
||||||
msgstr "Warten auf andere, um zu unterschreiben"
|
msgstr "Warten auf andere, um zu unterschreiben"
|
||||||
|
|
||||||
|
#: apps/web/src/app/(signing)/sign/[token]/waiting/page.tsx:70
|
||||||
|
msgid "Waiting for Your Turn"
|
||||||
|
msgstr "Warten auf deine Reihe"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/no-longer-available.tsx:61
|
#: 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.</0>"
|
msgid "Want to send slick signing links like this one? <0>Check out Documenso.</0>"
|
||||||
msgstr "Möchten Sie auffällige Signatur-Links wie diesen senden? <0>Überprüfen Sie Documenso.</0>"
|
msgstr "Möchten Sie auffällige Signatur-Links wie diesen senden? <0>Überprüfen Sie Documenso.</0>"
|
||||||
@@ -4008,7 +4033,7 @@ msgid "We were unable to disable two-factor authentication for your account. Ple
|
|||||||
msgstr "Wir konnten die Zwei-Faktor-Authentifizierung für Ihr Konto nicht deaktivieren. Bitte stellen Sie sicher, dass Sie Ihr Passwort und den Backup-Code korrekt eingegeben haben und versuchen Sie es erneut."
|
msgstr "Wir konnten die Zwei-Faktor-Authentifizierung für Ihr Konto nicht deaktivieren. Bitte stellen Sie sicher, dass Sie Ihr Passwort und den Backup-Code korrekt eingegeben haben und versuchen Sie es erneut."
|
||||||
|
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:28
|
#: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:28
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:44
|
#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:39
|
||||||
msgid "We were unable to log you out at this time."
|
msgid "We were unable to log you out at this time."
|
||||||
msgstr "Wir konnten Sie zurzeit nicht abmelden."
|
msgstr "Wir konnten Sie zurzeit nicht abmelden."
|
||||||
|
|
||||||
@@ -4023,7 +4048,7 @@ msgstr "Wir konnten die Zwei-Faktor-Authentifizierung für Ihr Konto nicht einri
|
|||||||
|
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:119
|
#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:119
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:245
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:245
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:125
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:127
|
||||||
msgid "We were unable to submit this document at this time. Please try again later."
|
msgid "We were unable to submit this document at this time. Please try again later."
|
||||||
msgstr "Wir konnten dieses Dokument zurzeit nicht einreichen. Bitte versuchen Sie es später erneut."
|
msgstr "Wir konnten dieses Dokument zurzeit nicht einreichen. Bitte versuchen Sie es später erneut."
|
||||||
|
|
||||||
@@ -4075,10 +4100,14 @@ msgstr "Webhooks"
|
|||||||
msgid "Weekly"
|
msgid "Weekly"
|
||||||
msgstr "Wöchentlich"
|
msgstr "Wöchentlich"
|
||||||
|
|
||||||
#: apps/web/src/app/(unauthenticated)/signin/page.tsx:48
|
#: apps/web/src/app/(unauthenticated)/signin/page.tsx:33
|
||||||
msgid "Welcome back, we are lucky to have you."
|
msgid "Welcome back, we are lucky to have you."
|
||||||
msgstr "Willkommen zurück, wir freuen uns, Sie zu haben."
|
msgstr "Willkommen zurück, wir freuen uns, Sie zu haben."
|
||||||
|
|
||||||
|
#: apps/web/src/app/(signing)/sign/[token]/waiting/page.tsx:88
|
||||||
|
msgid "Were you trying to edit this document instead?"
|
||||||
|
msgstr "Hast du stattdessen versucht, dieses Dokument zu bearbeiten?"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:189
|
#: 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."
|
msgid "When you click continue, you will be prompted to add the first available authenticator on your system."
|
||||||
msgstr "Wenn Sie auf Fortfahren klicken, werden Sie aufgefordert, den ersten verfügbaren Authenticator auf Ihrem System hinzuzufügen."
|
msgstr "Wenn Sie auf Fortfahren klicken, werden Sie aufgefordert, den ersten verfügbaren Authenticator auf Ihrem System hinzuzufügen."
|
||||||
@@ -4107,15 +4136,15 @@ msgstr "Jährlich"
|
|||||||
msgid "You"
|
msgid "You"
|
||||||
msgstr "Sie"
|
msgstr "Sie"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:90
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:93
|
||||||
msgid "You are about to complete approving \"{truncatedTitle}\".<0/> Are you sure?"
|
msgid "You are about to complete approving \"{truncatedTitle}\".<0/> Are you sure?"
|
||||||
msgstr "Sie stehen kurz davor, die Genehmigung für \"{truncatedTitle}\" abzuschließen.<0/> Sind Sie sicher?"
|
msgstr "Sie stehen kurz davor, die Genehmigung für \"{truncatedTitle}\" abzuschließen.<0/> Sind Sie sicher?"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:82
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:85
|
||||||
msgid "You are about to complete signing \"{truncatedTitle}\".<0/> Are you sure?"
|
msgid "You are about to complete signing \"{truncatedTitle}\".<0/> Are you sure?"
|
||||||
msgstr "Sie stehen kurz davor, \"{truncatedTitle}\" zu unterzeichnen.<0/> Sind Sie sicher?"
|
msgstr "Sie stehen kurz davor, \"{truncatedTitle}\" zu unterzeichnen.<0/> Sind Sie sicher?"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:74
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:77
|
||||||
msgid "You are about to complete viewing \"{truncatedTitle}\".<0/> Are you sure?"
|
msgid "You are about to complete viewing \"{truncatedTitle}\".<0/> Are you sure?"
|
||||||
msgstr "Sie stehen kurz davor, \"{truncatedTitle}\" anzusehen.<0/> Sind Sie sicher?"
|
msgstr "Sie stehen kurz davor, \"{truncatedTitle}\" anzusehen.<0/> Sind Sie sicher?"
|
||||||
|
|
||||||
@@ -4297,7 +4326,7 @@ msgstr "Sie müssen mindestens einen anderen Teamkollegen haben, um die Eigentum
|
|||||||
msgid "You must set a profile URL before enabling your public profile."
|
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."
|
msgstr "Sie müssen eine Profil-URL festlegen, bevor Sie Ihr öffentliches Profil aktivieren."
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:61
|
#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:56
|
||||||
msgid "You need to be logged in as <0>{email}</0> to view this page."
|
msgid "You need to be logged in as <0>{email}</0> to view this page."
|
||||||
msgstr "Sie müssen als <0>{email}</0> angemeldet sein, um diese Seite anzuzeigen."
|
msgstr "Sie müssen als <0>{email}</0> angemeldet sein, um diese Seite anzuzeigen."
|
||||||
|
|
||||||
@@ -4309,7 +4338,7 @@ msgstr "Sie müssen angemeldet sein, um diese Seite anzuzeigen."
|
|||||||
msgid "You need to setup 2FA to mark this document as viewed."
|
msgid "You need to setup 2FA to mark this document as viewed."
|
||||||
msgstr "Sie müssen 2FA einrichten, um dieses Dokument als angesehen zu markieren."
|
msgstr "Sie müssen 2FA einrichten, um dieses Dokument als angesehen zu markieren."
|
||||||
|
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:271
|
#: apps/web/src/components/forms/v2/signup.tsx:283
|
||||||
msgid "You will get notified & be able to set up your documenso public profile when we launch the feature."
|
msgid "You will get notified & be able to set up your documenso public profile when we launch the feature."
|
||||||
msgstr "Sie werden benachrichtigt und können Ihr Documenso öffentliches Profil einrichten, wenn wir die Funktion starten."
|
msgstr "Sie werden benachrichtigt und können Ihr Documenso öffentliches Profil einrichten, wenn wir die Funktion starten."
|
||||||
|
|
||||||
@@ -4353,7 +4382,7 @@ msgstr "Ihr Dokument wurde erfolgreich aus der Vorlage erstellt."
|
|||||||
msgid "Your document has been re-sent successfully."
|
msgid "Your document has been re-sent successfully."
|
||||||
msgstr "Ihr Dokument wurde erfolgreich erneut gesendet."
|
msgstr "Ihr Dokument wurde erfolgreich erneut gesendet."
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:277
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:299
|
||||||
msgid "Your document has been sent successfully."
|
msgid "Your document has been sent successfully."
|
||||||
msgstr "Ihr Dokument wurde erfolgreich gesendet."
|
msgstr "Ihr Dokument wurde erfolgreich gesendet."
|
||||||
|
|
||||||
@@ -4444,7 +4473,7 @@ msgstr "Ihre Vorlage wurde erfolgreich gelöscht."
|
|||||||
msgid "Your template will be duplicated."
|
msgid "Your template will be duplicated."
|
||||||
msgstr "Ihre Vorlage wird dupliziert."
|
msgstr "Ihre Vorlage wird dupliziert."
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:199
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:220
|
||||||
msgid "Your templates has been saved successfully."
|
msgid "Your templates has been saved successfully."
|
||||||
msgstr "Ihre Vorlagen wurden erfolgreich gespeichert."
|
msgstr "Ihre Vorlagen wurden erfolgreich gespeichert."
|
||||||
|
|
||||||
|
|||||||
@@ -55,12 +55,12 @@ msgstr "<0>Require passkey</0> - The recipient must have an account and passkey
|
|||||||
msgid "Add a document"
|
msgid "Add a document"
|
||||||
msgstr "Add a document"
|
msgstr "Add a document"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-settings.tsx:305
|
#: packages/ui/primitives/document-flow/add-settings.tsx:336
|
||||||
#: packages/ui/primitives/template-flow/add-template-settings.tsx:339
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:339
|
||||||
msgid "Add a URL to redirect the user to once the document is signed"
|
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"
|
msgstr "Add a URL to redirect the user to once the document is signed"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-settings.tsx:217
|
#: packages/ui/primitives/document-flow/add-settings.tsx:248
|
||||||
msgid "Add an external ID to the document. This can be used to identify the document in external systems."
|
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."
|
msgstr "Add an external ID to the document. This can be used to identify the document in external systems."
|
||||||
|
|
||||||
@@ -77,19 +77,19 @@ msgstr "Add another option"
|
|||||||
msgid "Add another value"
|
msgid "Add another value"
|
||||||
msgstr "Add another value"
|
msgstr "Add another value"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-signers.tsx:359
|
#: packages/ui/primitives/document-flow/add-signers.tsx:653
|
||||||
msgid "Add myself"
|
msgid "Add myself"
|
||||||
msgstr "Add myself"
|
msgstr "Add myself"
|
||||||
|
|
||||||
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:369
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:637
|
||||||
msgid "Add Myself"
|
msgid "Add Myself"
|
||||||
msgstr "Add Myself"
|
msgstr "Add Myself"
|
||||||
|
|
||||||
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:355
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:623
|
||||||
msgid "Add Placeholder Recipient"
|
msgid "Add Placeholder Recipient"
|
||||||
msgstr "Add Placeholder Recipient"
|
msgstr "Add Placeholder Recipient"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-signers.tsx:348
|
#: packages/ui/primitives/document-flow/add-signers.tsx:642
|
||||||
msgid "Add Signer"
|
msgid "Add Signer"
|
||||||
msgstr "Add Signer"
|
msgstr "Add Signer"
|
||||||
|
|
||||||
@@ -105,12 +105,12 @@ msgstr "Add text to the field"
|
|||||||
msgid "Admin"
|
msgid "Admin"
|
||||||
msgstr "Admin"
|
msgstr "Admin"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-settings.tsx:199
|
#: packages/ui/primitives/document-flow/add-settings.tsx:230
|
||||||
#: packages/ui/primitives/template-flow/add-template-settings.tsx:238
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:238
|
||||||
msgid "Advanced Options"
|
msgid "Advanced Options"
|
||||||
msgstr "Advanced Options"
|
msgstr "Advanced Options"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:510
|
#: packages/ui/primitives/document-flow/add-fields.tsx:522
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:402
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:402
|
||||||
msgid "Advanced settings"
|
msgid "Advanced settings"
|
||||||
msgstr "Advanced settings"
|
msgstr "Advanced settings"
|
||||||
@@ -148,7 +148,7 @@ msgstr "Blue"
|
|||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Cancel"
|
msgstr "Cancel"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-signers.tsx:164
|
#: packages/ui/primitives/document-flow/add-signers.tsx:194
|
||||||
msgid "Cannot remove signer"
|
msgid "Cannot remove signer"
|
||||||
msgstr "Cannot remove signer"
|
msgstr "Cannot remove signer"
|
||||||
|
|
||||||
@@ -169,7 +169,7 @@ msgstr "CC'd"
|
|||||||
msgid "Character Limit"
|
msgid "Character Limit"
|
||||||
msgstr "Character Limit"
|
msgstr "Character Limit"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:932
|
#: packages/ui/primitives/document-flow/add-fields.tsx:944
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:788
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:788
|
||||||
msgid "Checkbox"
|
msgid "Checkbox"
|
||||||
msgstr "Checkbox"
|
msgstr "Checkbox"
|
||||||
@@ -198,7 +198,7 @@ msgstr "Close"
|
|||||||
msgid "Configure Direct Recipient"
|
msgid "Configure Direct Recipient"
|
||||||
msgstr "Configure Direct Recipient"
|
msgstr "Configure Direct Recipient"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:511
|
#: packages/ui/primitives/document-flow/add-fields.tsx:523
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:403
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:403
|
||||||
msgid "Configure the {0} field"
|
msgid "Configure the {0} field"
|
||||||
msgstr "Configure the {0} field"
|
msgstr "Configure the {0} field"
|
||||||
@@ -215,22 +215,22 @@ msgstr "Copied to clipboard"
|
|||||||
msgid "Custom Text"
|
msgid "Custom Text"
|
||||||
msgstr "Custom Text"
|
msgstr "Custom Text"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:828
|
#: packages/ui/primitives/document-flow/add-fields.tsx:840
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:684
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:684
|
||||||
msgid "Date"
|
msgid "Date"
|
||||||
msgstr "Date"
|
msgstr "Date"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-settings.tsx:240
|
#: packages/ui/primitives/document-flow/add-settings.tsx:271
|
||||||
#: packages/ui/primitives/template-flow/add-template-settings.tsx:279
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:279
|
||||||
msgid "Date Format"
|
msgid "Date Format"
|
||||||
msgstr "Date Format"
|
msgstr "Date Format"
|
||||||
|
|
||||||
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:312
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:570
|
||||||
msgid "Direct link receiver"
|
msgid "Direct link receiver"
|
||||||
msgstr "Direct link receiver"
|
msgstr "Direct link receiver"
|
||||||
|
|
||||||
#: packages/ui/components/document/document-global-auth-access-select.tsx:62
|
#: packages/ui/components/document/document-global-auth-access-select.tsx:62
|
||||||
#: packages/ui/primitives/document-flow/add-settings.tsx:166
|
#: packages/ui/primitives/document-flow/add-settings.tsx:174
|
||||||
#: packages/ui/primitives/template-flow/add-template-settings.tsx:151
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:151
|
||||||
msgid "Document access"
|
msgid "Document access"
|
||||||
msgstr "Document access"
|
msgstr "Document access"
|
||||||
@@ -247,7 +247,7 @@ msgstr "Download"
|
|||||||
msgid "Drag & drop your PDF here."
|
msgid "Drag & drop your PDF here."
|
||||||
msgstr "Drag & drop your PDF here."
|
msgstr "Drag & drop your PDF here."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:958
|
#: packages/ui/primitives/document-flow/add-fields.tsx:970
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:814
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:814
|
||||||
msgid "Dropdown"
|
msgid "Dropdown"
|
||||||
msgstr "Dropdown"
|
msgstr "Dropdown"
|
||||||
@@ -256,13 +256,12 @@ msgstr "Dropdown"
|
|||||||
msgid "Dropdown options"
|
msgid "Dropdown options"
|
||||||
msgstr "Dropdown options"
|
msgstr "Dropdown options"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:776
|
#: packages/ui/primitives/document-flow/add-fields.tsx:788
|
||||||
#: packages/ui/primitives/document-flow/add-signature.tsx:272
|
#: packages/ui/primitives/document-flow/add-signature.tsx:272
|
||||||
#: packages/ui/primitives/document-flow/add-signers.tsx:232
|
#: packages/ui/primitives/document-flow/add-signers.tsx:491
|
||||||
#: packages/ui/primitives/document-flow/add-signers.tsx:239
|
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:632
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:632
|
||||||
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:210
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:463
|
||||||
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:217
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:470
|
||||||
msgid "Email"
|
msgid "Email"
|
||||||
msgstr "Email"
|
msgstr "Email"
|
||||||
|
|
||||||
@@ -274,6 +273,11 @@ msgstr "Email Options"
|
|||||||
msgid "Enable Direct Link Signing"
|
msgid "Enable Direct Link Signing"
|
||||||
msgstr "Enable Direct Link Signing"
|
msgstr "Enable Direct Link Signing"
|
||||||
|
|
||||||
|
#: packages/ui/primitives/document-flow/add-signers.tsx:392
|
||||||
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:362
|
||||||
|
msgid "Enable signing order"
|
||||||
|
msgstr "Enable signing order"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-password-dialog.tsx:84
|
#: packages/ui/primitives/document-password-dialog.tsx:84
|
||||||
msgid "Enter password"
|
msgid "Enter password"
|
||||||
msgstr "Enter password"
|
msgstr "Enter password"
|
||||||
@@ -282,7 +286,7 @@ msgstr "Enter password"
|
|||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr "Error"
|
msgstr "Error"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-settings.tsx:210
|
#: packages/ui/primitives/document-flow/add-settings.tsx:241
|
||||||
#: packages/ui/primitives/template-flow/add-template-settings.tsx:249
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:249
|
||||||
msgid "External ID"
|
msgid "External ID"
|
||||||
msgstr "External ID"
|
msgstr "External ID"
|
||||||
@@ -371,12 +375,13 @@ msgstr "Message <0>(Optional)</0>"
|
|||||||
msgid "Min"
|
msgid "Min"
|
||||||
msgstr "Min"
|
msgstr "Min"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:802
|
#: packages/ui/primitives/document-flow/add-fields.tsx:814
|
||||||
#: packages/ui/primitives/document-flow/add-signature.tsx:298
|
#: packages/ui/primitives/document-flow/add-signature.tsx:298
|
||||||
#: packages/ui/primitives/document-flow/add-signers.tsx:265
|
#: packages/ui/primitives/document-flow/add-signers.tsx:526
|
||||||
|
#: packages/ui/primitives/document-flow/add-signers.tsx:532
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:658
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:658
|
||||||
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:245
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:498
|
||||||
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:251
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:504
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Name"
|
msgstr "Name"
|
||||||
|
|
||||||
@@ -392,12 +397,12 @@ msgstr "Needs to sign"
|
|||||||
msgid "Needs to view"
|
msgid "Needs to view"
|
||||||
msgstr "Needs to view"
|
msgstr "Needs to view"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:613
|
#: packages/ui/primitives/document-flow/add-fields.tsx:625
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:497
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:497
|
||||||
msgid "No recipient matching this description was found."
|
msgid "No recipient matching this description was found."
|
||||||
msgstr "No recipient matching this description was found."
|
msgstr "No recipient matching this description was found."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:629
|
#: packages/ui/primitives/document-flow/add-fields.tsx:641
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:513
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:513
|
||||||
msgid "No recipients with this role"
|
msgid "No recipients with this role"
|
||||||
msgstr "No recipients with this role"
|
msgstr "No recipients with this role"
|
||||||
@@ -422,7 +427,7 @@ msgstr "No signature field found"
|
|||||||
msgid "No value found."
|
msgid "No value found."
|
||||||
msgstr "No value found."
|
msgstr "No value found."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:880
|
#: packages/ui/primitives/document-flow/add-fields.tsx:892
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:736
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:736
|
||||||
msgid "Number"
|
msgid "Number"
|
||||||
msgstr "Number"
|
msgstr "Number"
|
||||||
@@ -457,7 +462,7 @@ msgstr "Pick a number"
|
|||||||
msgid "Placeholder"
|
msgid "Placeholder"
|
||||||
msgstr "Placeholder"
|
msgstr "Placeholder"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:906
|
#: packages/ui/primitives/document-flow/add-fields.tsx:918
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:762
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:762
|
||||||
msgid "Radio"
|
msgid "Radio"
|
||||||
msgstr "Radio"
|
msgstr "Radio"
|
||||||
@@ -479,7 +484,7 @@ msgid "Receives copy"
|
|||||||
msgstr "Receives copy"
|
msgstr "Receives copy"
|
||||||
|
|
||||||
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:39
|
#: packages/ui/components/recipient/recipient-action-auth-select.tsx:39
|
||||||
#: packages/ui/primitives/document-flow/add-settings.tsx:184
|
#: packages/ui/primitives/document-flow/add-settings.tsx:215
|
||||||
#: packages/ui/primitives/template-flow/add-template-settings.tsx:169
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:169
|
||||||
msgid "Recipient action authentication"
|
msgid "Recipient action authentication"
|
||||||
msgstr "Recipient action authentication"
|
msgstr "Recipient action authentication"
|
||||||
@@ -488,12 +493,12 @@ msgstr "Recipient action authentication"
|
|||||||
msgid "Red"
|
msgid "Red"
|
||||||
msgstr "Red"
|
msgstr "Red"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-settings.tsx:298
|
#: packages/ui/primitives/document-flow/add-settings.tsx:329
|
||||||
#: packages/ui/primitives/template-flow/add-template-settings.tsx:332
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:332
|
||||||
msgid "Redirect URL"
|
msgid "Redirect URL"
|
||||||
msgstr "Redirect URL"
|
msgstr "Redirect URL"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:996
|
#: packages/ui/primitives/document-flow/add-fields.tsx:1008
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Remove"
|
msgstr "Remove"
|
||||||
|
|
||||||
@@ -555,8 +560,8 @@ msgstr "Share Signature Card"
|
|||||||
msgid "Share the Link"
|
msgid "Share the Link"
|
||||||
msgstr "Share the Link"
|
msgstr "Share the Link"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-signers.tsx:377
|
#: packages/ui/primitives/document-flow/add-signers.tsx:671
|
||||||
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:387
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:655
|
||||||
msgid "Show advanced settings"
|
msgid "Show advanced settings"
|
||||||
msgstr "Show advanced settings"
|
msgstr "Show advanced settings"
|
||||||
|
|
||||||
@@ -564,7 +569,7 @@ msgstr "Show advanced settings"
|
|||||||
msgid "Sign"
|
msgid "Sign"
|
||||||
msgstr "Sign"
|
msgstr "Sign"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:724
|
#: packages/ui/primitives/document-flow/add-fields.tsx:736
|
||||||
#: packages/ui/primitives/document-flow/add-signature.tsx:323
|
#: packages/ui/primitives/document-flow/add-signature.tsx:323
|
||||||
#: packages/ui/primitives/document-flow/field-icon.tsx:52
|
#: packages/ui/primitives/document-flow/field-icon.tsx:52
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:580
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:580
|
||||||
@@ -612,7 +617,7 @@ msgstr "Submit"
|
|||||||
msgid "Template title"
|
msgid "Template title"
|
||||||
msgstr "Template title"
|
msgstr "Template title"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:854
|
#: packages/ui/primitives/document-flow/add-fields.tsx:866
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:710
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:710
|
||||||
msgid "Text"
|
msgid "Text"
|
||||||
msgstr "Text"
|
msgstr "Text"
|
||||||
@@ -673,7 +678,7 @@ msgstr "The signer's name"
|
|||||||
msgid "This can be overriden by setting the authentication requirements directly on each recipient in the next step."
|
msgid "This can be overriden by setting the authentication requirements directly on each recipient in the next step."
|
||||||
msgstr "This can be overriden by setting the authentication requirements directly on each recipient in the next step."
|
msgstr "This can be overriden by setting the authentication requirements directly on each recipient in the next step."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:685
|
#: packages/ui/primitives/document-flow/add-fields.tsx:697
|
||||||
msgid "This document has already been sent to this recipient. You can no longer edit this recipient."
|
msgid "This document has already been sent to this recipient. You can no longer edit this recipient."
|
||||||
msgstr "This document has already been sent to this recipient. You can no longer edit this recipient."
|
msgstr "This document has already been sent to this recipient. You can no longer edit this recipient."
|
||||||
|
|
||||||
@@ -681,11 +686,11 @@ msgstr "This document has already been sent to this recipient. You can no longer
|
|||||||
msgid "This document is password protected. Please enter the password to view the document."
|
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."
|
msgstr "This document is password protected. Please enter the password to view the document."
|
||||||
|
|
||||||
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:315
|
#: packages/ui/primitives/template-flow/add-template-placeholder-recipients.tsx:573
|
||||||
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."
|
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."
|
msgstr "This field cannot be modified or deleted. When you share this template's direct link or add it to your public profile, anyone who accesses it can input their name and email, and fill in the fields assigned to them."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-signers.tsx:165
|
#: packages/ui/primitives/document-flow/add-signers.tsx:195
|
||||||
msgid "This signer has already received the document."
|
msgid "This signer has already received the document."
|
||||||
msgstr "This signer has already received the document."
|
msgstr "This signer has already received the document."
|
||||||
|
|
||||||
@@ -693,16 +698,16 @@ msgstr "This signer has already received the document."
|
|||||||
msgid "This will override any global settings."
|
msgid "This will override any global settings."
|
||||||
msgstr "This will override any global settings."
|
msgstr "This will override any global settings."
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-settings.tsx:274
|
#: packages/ui/primitives/document-flow/add-settings.tsx:305
|
||||||
#: packages/ui/primitives/template-flow/add-template-settings.tsx:309
|
#: packages/ui/primitives/template-flow/add-template-settings.tsx:309
|
||||||
msgid "Time Zone"
|
msgid "Time Zone"
|
||||||
msgstr "Time Zone"
|
msgstr "Time Zone"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-settings.tsx:145
|
#: packages/ui/primitives/document-flow/add-settings.tsx:153
|
||||||
msgid "Title"
|
msgid "Title"
|
||||||
msgstr "Title"
|
msgstr "Title"
|
||||||
|
|
||||||
#: packages/ui/primitives/document-flow/add-fields.tsx:971
|
#: packages/ui/primitives/document-flow/add-fields.tsx:983
|
||||||
#: packages/ui/primitives/template-flow/add-template-fields.tsx:828
|
#: packages/ui/primitives/template-flow/add-template-fields.tsx:828
|
||||||
msgid "To proceed further, please set at least one value for the {0} field."
|
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."
|
msgstr "To proceed further, please set at least one value for the {0} field."
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -21,15 +21,15 @@ msgstr "\"{0}\" will appear on the document as it has a timezone of \"{timezone}
|
|||||||
msgid "\"{documentTitle}\" has been successfully deleted"
|
msgid "\"{documentTitle}\" has been successfully deleted"
|
||||||
msgstr "\"{documentTitle}\" has been successfully deleted"
|
msgstr "\"{documentTitle}\" has been successfully deleted"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:76
|
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:78
|
||||||
msgid "({0}) has invited you to approve this document"
|
msgid "({0}) has invited you to approve this document"
|
||||||
msgstr "({0}) has invited you to approve this document"
|
msgstr "({0}) has invited you to approve this document"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:73
|
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:75
|
||||||
msgid "({0}) has invited you to sign this document"
|
msgid "({0}) has invited you to sign this document"
|
||||||
msgstr "({0}) has invited you to sign this document"
|
msgstr "({0}) has invited you to sign this document"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:70
|
#: apps/web/src/app/(signing)/sign/[token]/signing-page-view.tsx:72
|
||||||
msgid "({0}) has invited you to view this document"
|
msgid "({0}) has invited you to view this document"
|
||||||
msgstr "({0}) has invited you to view this document"
|
msgstr "({0}) has invited you to view this document"
|
||||||
|
|
||||||
@@ -55,11 +55,11 @@ msgstr "{0, plural, one {# Seat} other {# Seats}}"
|
|||||||
msgid "{0, plural, one {<0>You have <1>1</1> pending team invitation</0>} other {<2>You have <3>#</3> pending team invitations</2>}}"
|
msgid "{0, plural, one {<0>You have <1>1</1> pending team invitation</0>} other {<2>You have <3>#</3> pending team invitations</2>}}"
|
||||||
msgstr "{0, plural, one {<0>You have <1>1</1> pending team invitation</0>} other {<2>You have <3>#</3> pending team invitations</2>}}"
|
msgstr "{0, plural, one {<0>You have <1>1</1> pending team invitation</0>} other {<2>You have <3>#</3> pending team invitations</2>}}"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit/document-edit-page-view.tsx:102
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit/document-edit-page-view.tsx:129
|
||||||
msgid "{0, plural, one {1 Recipient} other {# Recipients}}"
|
msgid "{0, plural, one {1 Recipient} other {# Recipients}}"
|
||||||
msgstr "{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:204
|
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:230
|
||||||
msgid "{0, plural, one {Waiting on 1 recipient} other {Waiting on # recipients}}"
|
msgid "{0, plural, one {Waiting on 1 recipient} other {Waiting on # recipients}}"
|
||||||
msgstr "{0, plural, one {Waiting on 1 recipient} other {Waiting on # recipients}}"
|
msgstr "{0, plural, one {Waiting on 1 recipient} other {Waiting on # recipients}}"
|
||||||
|
|
||||||
@@ -79,7 +79,7 @@ msgstr "{0} document"
|
|||||||
msgid "{0} of {1} documents remaining this month."
|
msgid "{0} of {1} documents remaining this month."
|
||||||
msgstr "{0} of {1} documents remaining this month."
|
msgstr "{0} of {1} documents remaining this month."
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:139
|
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:165
|
||||||
msgid "{0} Recipient(s)"
|
msgid "{0} Recipient(s)"
|
||||||
msgstr "{0} Recipient(s)"
|
msgstr "{0} Recipient(s)"
|
||||||
|
|
||||||
@@ -215,7 +215,7 @@ msgstr "Active Subscriptions"
|
|||||||
msgid "Add"
|
msgid "Add"
|
||||||
msgstr "Add"
|
msgstr "Add"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:143
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:157
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:87
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:87
|
||||||
msgid "Add all relevant fields for each recipient."
|
msgid "Add all relevant fields for each recipient."
|
||||||
msgstr "Add all relevant fields for each recipient."
|
msgstr "Add all relevant fields for each recipient."
|
||||||
@@ -236,7 +236,7 @@ msgstr "Add an authenticator to serve as a secondary authentication method when
|
|||||||
msgid "Add email"
|
msgid "Add email"
|
||||||
msgstr "Add email"
|
msgstr "Add email"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:142
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:156
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:86
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:86
|
||||||
msgid "Add Fields"
|
msgid "Add Fields"
|
||||||
msgstr "Add Fields"
|
msgstr "Add Fields"
|
||||||
@@ -246,8 +246,8 @@ msgid "Add more"
|
|||||||
msgstr "Add more"
|
msgstr "Add more"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:270
|
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:270
|
||||||
msgid "Add number"
|
#~ msgid "Add number"
|
||||||
msgstr "Add number"
|
#~ msgstr "Add number"
|
||||||
|
|
||||||
#: 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:146
|
||||||
#: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:154
|
#: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:154
|
||||||
@@ -258,11 +258,11 @@ msgstr "Add passkey"
|
|||||||
msgid "Add Placeholders"
|
msgid "Add Placeholders"
|
||||||
msgstr "Add Placeholders"
|
msgstr "Add Placeholders"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:137
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:151
|
||||||
msgid "Add Signers"
|
msgid "Add Signers"
|
||||||
msgstr "Add Signers"
|
msgstr "Add Signers"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:147
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:161
|
||||||
msgid "Add Subject"
|
msgid "Add Subject"
|
||||||
msgstr "Add Subject"
|
msgstr "Add Subject"
|
||||||
|
|
||||||
@@ -271,14 +271,14 @@ msgid "Add team email"
|
|||||||
msgstr "Add team email"
|
msgstr "Add team email"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:256
|
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:256
|
||||||
msgid "Add text"
|
#~ msgid "Add text"
|
||||||
msgstr "Add text"
|
#~ msgstr "Add text"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:272
|
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:272
|
||||||
msgid "Add Text"
|
#~ msgid "Add Text"
|
||||||
msgstr "Add Text"
|
#~ msgstr "Add Text"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:138
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:152
|
||||||
msgid "Add the people who will sign the document."
|
msgid "Add the people who will sign the document."
|
||||||
msgstr "Add the people who will sign the document."
|
msgstr "Add the people who will sign the document."
|
||||||
|
|
||||||
@@ -286,7 +286,7 @@ msgstr "Add the people who will sign the document."
|
|||||||
msgid "Add the recipients to create the document with"
|
msgid "Add the recipients to create the document with"
|
||||||
msgstr "Add the recipients to create the document with"
|
msgstr "Add the recipients to create the document with"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:148
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:162
|
||||||
msgid "Add the subject and message you wish to send to signers."
|
msgid "Add the subject and message you wish to send to signers."
|
||||||
msgstr "Add the subject and message you wish to send to signers."
|
msgstr "Add the subject and message you wish to send to signers."
|
||||||
|
|
||||||
@@ -334,7 +334,7 @@ msgstr "All Time"
|
|||||||
msgid "Allows authenticating using biometrics, password managers, hardware keys, etc."
|
msgid "Allows authenticating using biometrics, password managers, hardware keys, etc."
|
||||||
msgstr "Allows authenticating using biometrics, password managers, hardware keys, etc."
|
msgstr "Allows authenticating using biometrics, password managers, hardware keys, etc."
|
||||||
|
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:411
|
#: apps/web/src/components/forms/v2/signup.tsx:423
|
||||||
msgid "Already have an account? <0>Sign in instead</0>"
|
msgid "Already have an account? <0>Sign in instead</0>"
|
||||||
msgstr "Already have an account? <0>Sign in instead</0>"
|
msgstr "Already have an account? <0>Sign in instead</0>"
|
||||||
|
|
||||||
@@ -365,13 +365,13 @@ msgstr "An email requesting the transfer of this team has been sent."
|
|||||||
msgid "An error occurred"
|
msgid "An error occurred"
|
||||||
msgstr "An error occurred"
|
msgstr "An error occurred"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:226
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:248
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:176
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:197
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:210
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:231
|
||||||
msgid "An error occurred while adding signers."
|
msgid "An error occurred while adding signers."
|
||||||
msgstr "An error occurred while adding signers."
|
msgstr "An error occurred while adding signers."
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:256
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:278
|
||||||
msgid "An error occurred while adding the fields."
|
msgid "An error occurred while adding the fields."
|
||||||
msgstr "An error occurred while adding the fields."
|
msgstr "An error occurred while adding the fields."
|
||||||
|
|
||||||
@@ -429,7 +429,7 @@ msgstr "An error occurred while removing the signature."
|
|||||||
msgid "An error occurred while removing the text."
|
msgid "An error occurred while removing the text."
|
||||||
msgstr "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:287
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:309
|
||||||
msgid "An error occurred while sending the document."
|
msgid "An error occurred while sending the document."
|
||||||
msgstr "An error occurred while sending the document."
|
msgstr "An error occurred while sending the document."
|
||||||
|
|
||||||
@@ -453,8 +453,8 @@ msgstr "An error occurred while signing the document."
|
|||||||
msgid "An error occurred while trying to create a checkout session."
|
msgid "An error occurred while trying to create a checkout session."
|
||||||
msgstr "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:199
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:214
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:153
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:166
|
||||||
msgid "An error occurred while updating the document settings."
|
msgid "An error occurred while updating the document settings."
|
||||||
msgstr "An error occurred while updating the document settings."
|
msgstr "An error occurred while updating the document settings."
|
||||||
|
|
||||||
@@ -534,7 +534,7 @@ msgstr "App Version"
|
|||||||
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view-button.tsx:89
|
#: 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-button.tsx:120
|
||||||
#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:144
|
#: apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx:144
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:122
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:125
|
||||||
msgid "Approve"
|
msgid "Approve"
|
||||||
msgstr "Approve"
|
msgstr "Approve"
|
||||||
|
|
||||||
@@ -573,7 +573,7 @@ msgid "Audit Log"
|
|||||||
msgstr "Audit Log"
|
msgstr "Audit Log"
|
||||||
|
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:41
|
#: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:41
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:57
|
#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:52
|
||||||
msgid "Authentication required"
|
msgid "Authentication required"
|
||||||
msgstr "Authentication required"
|
msgstr "Authentication required"
|
||||||
|
|
||||||
@@ -591,7 +591,7 @@ msgstr "Awaiting email confirmation"
|
|||||||
|
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:369
|
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:369
|
||||||
#: apps/web/src/components/(dashboard)/settings/layout/activity-back.tsx:20
|
#: apps/web/src/components/(dashboard)/settings/layout/activity-back.tsx:20
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:497
|
#: apps/web/src/components/forms/v2/signup.tsx:509
|
||||||
msgid "Back"
|
msgid "Back"
|
||||||
msgstr "Back"
|
msgstr "Back"
|
||||||
|
|
||||||
@@ -604,7 +604,7 @@ msgid "Background Color"
|
|||||||
msgstr "Background Color"
|
msgstr "Background Color"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx:167
|
#: apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx:167
|
||||||
#: apps/web/src/components/forms/signin.tsx:473
|
#: apps/web/src/components/forms/signin.tsx:485
|
||||||
msgid "Backup Code"
|
msgid "Backup Code"
|
||||||
msgstr "Backup Code"
|
msgstr "Backup Code"
|
||||||
|
|
||||||
@@ -616,7 +616,7 @@ msgstr "Backup codes"
|
|||||||
msgid "Banner Updated"
|
msgid "Banner Updated"
|
||||||
msgstr "Banner Updated"
|
msgstr "Banner Updated"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:460
|
#: apps/web/src/components/forms/v2/signup.tsx:472
|
||||||
msgid "Basic details"
|
msgid "Basic details"
|
||||||
msgstr "Basic details"
|
msgstr "Basic details"
|
||||||
|
|
||||||
@@ -657,13 +657,13 @@ msgstr "By enabling 2FA, you will be required to enter a code from your authenti
|
|||||||
#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:119
|
#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:119
|
||||||
#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:470
|
#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:470
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:178
|
#: 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:74
|
#: 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:164
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:189
|
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx:189
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:143
|
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:150
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:215
|
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:215
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:327
|
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:327
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:110
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:113
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:250
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:250
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:333
|
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:333
|
||||||
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121
|
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx:121
|
||||||
@@ -715,7 +715,7 @@ msgstr "Choose..."
|
|||||||
msgid "Claim account"
|
msgid "Claim account"
|
||||||
msgstr "Claim account"
|
msgstr "Claim account"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:469
|
#: apps/web/src/components/forms/v2/signup.tsx:481
|
||||||
msgid "Claim username"
|
msgid "Claim username"
|
||||||
msgstr "Claim username"
|
msgstr "Claim username"
|
||||||
|
|
||||||
@@ -723,7 +723,7 @@ msgstr "Claim username"
|
|||||||
msgid "Claim your profile later"
|
msgid "Claim your profile later"
|
||||||
msgstr "Claim your profile later"
|
msgstr "Claim your profile later"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:267
|
#: apps/web/src/components/forms/v2/signup.tsx:279
|
||||||
msgid "Claim your username now"
|
msgid "Claim your username now"
|
||||||
msgstr "Claim your username now"
|
msgstr "Claim your username now"
|
||||||
|
|
||||||
@@ -747,9 +747,9 @@ msgid "Click to copy signing link for sending to recipient"
|
|||||||
msgstr "Click to copy signing link for sending to recipient"
|
msgstr "Click to copy signing link for sending to recipient"
|
||||||
|
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:175
|
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:175
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:107
|
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:114
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:435
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:435
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:312
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:314
|
||||||
msgid "Click to insert field"
|
msgid "Click to insert field"
|
||||||
msgstr "Click to insert field"
|
msgstr "Click to insert field"
|
||||||
|
|
||||||
@@ -765,22 +765,22 @@ msgstr "Click to insert field"
|
|||||||
msgid "Close"
|
msgid "Close"
|
||||||
msgstr "Close"
|
msgstr "Close"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:58
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:61
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:425
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:425
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:302
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:304
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:522
|
#: apps/web/src/components/forms/v2/signup.tsx:534
|
||||||
msgid "Complete"
|
msgid "Complete"
|
||||||
msgstr "Complete"
|
msgstr "Complete"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:67
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:70
|
||||||
msgid "Complete Approval"
|
msgid "Complete Approval"
|
||||||
msgstr "Complete Approval"
|
msgstr "Complete Approval"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:66
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:69
|
||||||
msgid "Complete Signing"
|
msgid "Complete Signing"
|
||||||
msgstr "Complete Signing"
|
msgstr "Complete Signing"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:65
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:68
|
||||||
msgid "Complete Viewing"
|
msgid "Complete Viewing"
|
||||||
msgstr "Complete Viewing"
|
msgstr "Complete Viewing"
|
||||||
|
|
||||||
@@ -797,7 +797,7 @@ msgstr "Completed documents"
|
|||||||
msgid "Completed Documents"
|
msgid "Completed Documents"
|
||||||
msgstr "Completed Documents"
|
msgstr "Completed Documents"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:133
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:147
|
||||||
msgid "Configure general settings for the document."
|
msgid "Configure general settings for the document."
|
||||||
msgstr "Configure general settings for the document."
|
msgstr "Configure general settings for the document."
|
||||||
|
|
||||||
@@ -882,7 +882,7 @@ msgstr "Copy token"
|
|||||||
msgid "Create"
|
msgid "Create"
|
||||||
msgstr "Create"
|
msgstr "Create"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:252
|
#: apps/web/src/components/forms/v2/signup.tsx:264
|
||||||
msgid "Create a new account"
|
msgid "Create a new account"
|
||||||
msgstr "Create a new account"
|
msgstr "Create a new account"
|
||||||
|
|
||||||
@@ -947,11 +947,11 @@ msgstr "Create webhook"
|
|||||||
msgid "Create Webhook"
|
msgid "Create Webhook"
|
||||||
msgstr "Create Webhook"
|
msgstr "Create Webhook"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/complete/page.tsx:214
|
#: apps/web/src/app/(signing)/sign/[token]/complete/page.tsx:215
|
||||||
msgid "Create your account and start using state-of-the-art document signing."
|
msgid "Create your account and start using state-of-the-art document signing."
|
||||||
msgstr "Create your account and start using state-of-the-art document signing."
|
msgstr "Create your account and start using state-of-the-art document signing."
|
||||||
|
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:256
|
#: apps/web/src/components/forms/v2/signup.tsx:268
|
||||||
msgid "Create your account and start using state-of-the-art document signing. Open and beautiful signing is within your grasp."
|
msgid "Create your account and start using state-of-the-art document signing. Open and beautiful signing is within your grasp."
|
||||||
msgstr "Create your account and start using state-of-the-art document signing. Open and beautiful signing is within your grasp."
|
msgstr "Create your account and start using state-of-the-art document signing. Open and beautiful signing is within your grasp."
|
||||||
|
|
||||||
@@ -1215,7 +1215,7 @@ msgid "Document created"
|
|||||||
msgstr "Document created"
|
msgstr "Document created"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx:51
|
#: 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:147
|
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:173
|
||||||
#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:59
|
#: apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx:59
|
||||||
msgid "Document deleted"
|
msgid "Document deleted"
|
||||||
msgstr "Document deleted"
|
msgstr "Document deleted"
|
||||||
@@ -1228,7 +1228,7 @@ msgstr "Document draft"
|
|||||||
msgid "Document Duplicated"
|
msgid "Document Duplicated"
|
||||||
msgstr "Document Duplicated"
|
msgstr "Document Duplicated"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:158
|
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:184
|
||||||
#: apps/web/src/components/document/document-history-sheet.tsx:104
|
#: apps/web/src/components/document/document-history-sheet.tsx:104
|
||||||
msgid "Document history"
|
msgid "Document history"
|
||||||
msgstr "Document history"
|
msgstr "Document history"
|
||||||
@@ -1269,7 +1269,7 @@ msgstr "Document re-sent"
|
|||||||
msgid "Document resealed"
|
msgid "Document resealed"
|
||||||
msgstr "Document resealed"
|
msgstr "Document resealed"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:276
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:298
|
||||||
msgid "Document sent"
|
msgid "Document sent"
|
||||||
msgstr "Document sent"
|
msgstr "Document sent"
|
||||||
|
|
||||||
@@ -1307,11 +1307,11 @@ msgstr "Document will be permanently deleted"
|
|||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/admin/nav.tsx:65
|
#: 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)/admin/users/data-table-users.tsx:92
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:113
|
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:139
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit/document-edit-page-view.tsx:82
|
#: 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]/loading.tsx:16
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/sent/page.tsx:15
|
#: apps/web/src/app/(dashboard)/documents/[id]/sent/page.tsx:15
|
||||||
#: apps/web/src/app/(dashboard)/documents/documents-page-view.tsx:110
|
#: apps/web/src/app/(dashboard)/documents/documents-page-view.tsx:114
|
||||||
#: apps/web/src/app/(profile)/p/[url]/page.tsx:166
|
#: apps/web/src/app/(profile)/p/[url]/page.tsx:166
|
||||||
#: apps/web/src/app/not-found.tsx:21
|
#: apps/web/src/app/not-found.tsx:21
|
||||||
#: apps/web/src/components/(dashboard)/common/command-menu.tsx:205
|
#: apps/web/src/components/(dashboard)/common/command-menu.tsx:205
|
||||||
@@ -1330,7 +1330,7 @@ msgid "Documents Viewed"
|
|||||||
msgstr "Documents Viewed"
|
msgstr "Documents Viewed"
|
||||||
|
|
||||||
#: apps/web/src/app/(unauthenticated)/reset-password/[token]/page.tsx:40
|
#: apps/web/src/app/(unauthenticated)/reset-password/[token]/page.tsx:40
|
||||||
#: apps/web/src/app/(unauthenticated)/signin/page.tsx:61
|
#: apps/web/src/app/(unauthenticated)/signin/page.tsx:45
|
||||||
msgid "Don't have an account? <0>Sign up</0>"
|
msgid "Don't have an account? <0>Sign up</0>"
|
||||||
msgstr "Don't have an account? <0>Sign up</0>"
|
msgstr "Don't have an account? <0>Sign up</0>"
|
||||||
|
|
||||||
@@ -1402,12 +1402,12 @@ msgstr "Edit webhook"
|
|||||||
#: apps/web/src/app/(recipient)/d/[token]/configure-direct-template.tsx:118
|
#: 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/(signing)/sign/[token]/email-field.tsx:126
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:376
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:376
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:254
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:256
|
||||||
#: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:169
|
#: 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/(teams)/dialogs/update-team-email-dialog.tsx:153
|
||||||
#: apps/web/src/components/forms/forgot-password.tsx:81
|
#: apps/web/src/components/forms/forgot-password.tsx:81
|
||||||
#: apps/web/src/components/forms/profile.tsx:122
|
#: apps/web/src/components/forms/profile.tsx:122
|
||||||
#: apps/web/src/components/forms/signin.tsx:326
|
#: apps/web/src/components/forms/signin.tsx:338
|
||||||
#: apps/web/src/components/forms/signup.tsx:180
|
#: apps/web/src/components/forms/signup.tsx:180
|
||||||
msgid "Email"
|
msgid "Email"
|
||||||
msgstr "Email"
|
msgstr "Email"
|
||||||
@@ -1418,7 +1418,7 @@ msgstr "Email"
|
|||||||
msgid "Email address"
|
msgid "Email address"
|
||||||
msgstr "Email address"
|
msgstr "Email address"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:316
|
#: apps/web/src/components/forms/v2/signup.tsx:328
|
||||||
msgid "Email Address"
|
msgid "Email Address"
|
||||||
msgstr "Email Address"
|
msgstr "Email Address"
|
||||||
|
|
||||||
@@ -1486,16 +1486,16 @@ msgstr "Enter your text here"
|
|||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:41
|
#: apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx:41
|
||||||
#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:78
|
#: apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx:78
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:198
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:213
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:225
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:247
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:255
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:277
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:286
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:308
|
||||||
#: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:57
|
#: apps/web/src/app/(dashboard)/documents/move-document-dialog.tsx:57
|
||||||
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106
|
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:106
|
||||||
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:112
|
#: apps/web/src/app/(dashboard)/documents/upload-document.tsx:112
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:152
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:165
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:175
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:196
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:209
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:230
|
||||||
#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51
|
#: apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx:51
|
||||||
#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:56
|
#: apps/web/src/app/(dashboard)/templates/move-template-dialog.tsx:56
|
||||||
#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:152
|
#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:152
|
||||||
@@ -1579,20 +1579,20 @@ msgid "File cannot be larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
|
|||||||
msgstr "File cannot be larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
|
msgstr "File cannot be larger than {APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB"
|
||||||
|
|
||||||
#: apps/web/src/app/(unauthenticated)/forgot-password/page.tsx:21
|
#: apps/web/src/app/(unauthenticated)/forgot-password/page.tsx:21
|
||||||
#: apps/web/src/components/forms/signin.tsx:358
|
#: apps/web/src/components/forms/signin.tsx:370
|
||||||
msgid "Forgot your password?"
|
msgid "Forgot your password?"
|
||||||
msgstr "Forgot your password?"
|
msgstr "Forgot your password?"
|
||||||
|
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:326
|
#: apps/web/src/app/(recipient)/d/[token]/sign-direct-template.tsx:326
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:193
|
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:193
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:361
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:361
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:239
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:241
|
||||||
#: apps/web/src/components/forms/profile.tsx:110
|
#: apps/web/src/components/forms/profile.tsx:110
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:300
|
#: apps/web/src/components/forms/v2/signup.tsx:312
|
||||||
msgid "Full Name"
|
msgid "Full Name"
|
||||||
msgstr "Full Name"
|
msgstr "Full Name"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:132
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:146
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:76
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:76
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:60
|
#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:60
|
||||||
#: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:43
|
#: apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx:43
|
||||||
@@ -1615,7 +1615,7 @@ msgstr "Go Back"
|
|||||||
msgid "Go back home"
|
msgid "Go back home"
|
||||||
msgstr "Go back home"
|
msgstr "Go back home"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/complete/page.tsx:223
|
#: apps/web/src/app/(signing)/sign/[token]/complete/page.tsx:226
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/no-longer-available.tsx:57
|
#: apps/web/src/app/(signing)/sign/[token]/no-longer-available.tsx:57
|
||||||
msgid "Go Back Home"
|
msgid "Go Back Home"
|
||||||
msgstr "Go Back Home"
|
msgstr "Go Back Home"
|
||||||
@@ -1773,6 +1773,10 @@ msgstr "It seems that there is no token provided, if you are trying to verify yo
|
|||||||
msgid "It seems that there is no token provided. Please check your email and try again."
|
msgid "It seems that there is no token provided. Please check your email and try again."
|
||||||
msgstr "It seems that there is no token provided. Please check your email and try again."
|
msgstr "It seems that there is no token provided. Please check your email and try again."
|
||||||
|
|
||||||
|
#: 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 "It's currently not your turn to sign. You will receive an email with instructions once it's your turn to sign the document."
|
||||||
|
|
||||||
#: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:286
|
#: apps/web/src/components/(dashboard)/layout/menu-switcher.tsx:286
|
||||||
msgid "Language"
|
msgid "Language"
|
||||||
msgstr "Language"
|
msgstr "Language"
|
||||||
@@ -1855,8 +1859,8 @@ msgid "Loading..."
|
|||||||
msgstr "Loading..."
|
msgstr "Loading..."
|
||||||
|
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:54
|
#: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:54
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:78
|
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:75
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:72
|
#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:67
|
||||||
msgid "Login"
|
msgid "Login"
|
||||||
msgstr "Login"
|
msgstr "Login"
|
||||||
|
|
||||||
@@ -1928,7 +1932,7 @@ msgstr "Manage your passkeys."
|
|||||||
msgid "Manage your site settings here"
|
msgid "Manage your site settings here"
|
||||||
msgstr "Manage your site settings here"
|
msgstr "Manage your site settings here"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:120
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:123
|
||||||
msgid "Mark as Viewed"
|
msgid "Mark as Viewed"
|
||||||
msgstr "Mark as Viewed"
|
msgstr "Mark as Viewed"
|
||||||
|
|
||||||
@@ -2007,7 +2011,7 @@ msgstr "My templates"
|
|||||||
msgid "Name"
|
msgid "Name"
|
||||||
msgstr "Name"
|
msgstr "Name"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/complete/page.tsx:210
|
#: apps/web/src/app/(signing)/sign/[token]/complete/page.tsx:211
|
||||||
msgid "Need to sign documents?"
|
msgid "Need to sign documents?"
|
||||||
msgstr "Need to sign documents?"
|
msgstr "Need to sign documents?"
|
||||||
|
|
||||||
@@ -2029,12 +2033,12 @@ msgid "New Template"
|
|||||||
msgstr "New Template"
|
msgstr "New Template"
|
||||||
|
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:416
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:416
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:293
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:295
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:509
|
#: apps/web/src/components/forms/v2/signup.tsx:521
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr "Next"
|
msgstr "Next"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:58
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:61
|
||||||
msgid "Next field"
|
msgid "Next field"
|
||||||
msgstr "Next field"
|
msgstr "Next field"
|
||||||
|
|
||||||
@@ -2092,6 +2096,10 @@ msgstr "Not supported"
|
|||||||
msgid "Nothing to do"
|
msgid "Nothing to do"
|
||||||
msgstr "Nothing to do"
|
msgstr "Nothing to do"
|
||||||
|
|
||||||
|
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:270
|
||||||
|
msgid "Number"
|
||||||
|
msgstr "Number"
|
||||||
|
|
||||||
#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:128
|
#: apps/web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx:128
|
||||||
msgid "On this page, you can create a new webhook."
|
msgid "On this page, you can create a new webhook."
|
||||||
msgstr "On this page, you can create a new webhook."
|
msgstr "On this page, you can create a new webhook."
|
||||||
@@ -2137,11 +2145,11 @@ 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:337
|
||||||
#: apps/web/src/components/forms/signup.tsx:243
|
#: apps/web/src/components/forms/signup.tsx:243
|
||||||
#: apps/web/src/components/forms/signup.tsx:267
|
#: apps/web/src/components/forms/signup.tsx:267
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:371
|
#: apps/web/src/components/forms/v2/signup.tsx:383
|
||||||
msgid "Or"
|
msgid "Or"
|
||||||
msgstr "Or"
|
msgstr "Or"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/signin.tsx:378
|
#: apps/web/src/components/forms/signin.tsx:390
|
||||||
msgid "Or continue with"
|
msgid "Or continue with"
|
||||||
msgstr "Or continue with"
|
msgstr "Or continue with"
|
||||||
|
|
||||||
@@ -2158,7 +2166,7 @@ msgstr "Owner"
|
|||||||
msgid "Paid"
|
msgid "Paid"
|
||||||
msgstr "Paid"
|
msgstr "Paid"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/signin.tsx:423
|
#: apps/web/src/components/forms/signin.tsx:435
|
||||||
msgid "Passkey"
|
msgid "Passkey"
|
||||||
msgstr "Passkey"
|
msgstr "Passkey"
|
||||||
|
|
||||||
@@ -2198,9 +2206,9 @@ msgstr "Passkeys are not supported on this browser"
|
|||||||
#: apps/web/src/components/(dashboard)/common/command-menu.tsx:70
|
#: apps/web/src/components/(dashboard)/common/command-menu.tsx:70
|
||||||
#: apps/web/src/components/forms/password.tsx:123
|
#: apps/web/src/components/forms/password.tsx:123
|
||||||
#: apps/web/src/components/forms/reset-password.tsx:110
|
#: apps/web/src/components/forms/reset-password.tsx:110
|
||||||
#: apps/web/src/components/forms/signin.tsx:344
|
#: apps/web/src/components/forms/signin.tsx:356
|
||||||
#: apps/web/src/components/forms/signup.tsx:196
|
#: apps/web/src/components/forms/signup.tsx:196
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:332
|
#: apps/web/src/components/forms/v2/signup.tsx:344
|
||||||
msgid "Password"
|
msgid "Password"
|
||||||
msgstr "Password"
|
msgstr "Password"
|
||||||
|
|
||||||
@@ -2265,6 +2273,10 @@ msgstr "Pick any of the following agreements below and start signing to get star
|
|||||||
msgid "Please check the CSV file and make sure it is according to our format"
|
msgid "Please check the CSV file and make sure it is according to our format"
|
||||||
msgstr "Please check the CSV file and make sure it is according to our format"
|
msgstr "Please check the CSV file and make sure it is according to our format"
|
||||||
|
|
||||||
|
#: apps/web/src/app/(signing)/sign/[token]/waiting/page.tsx:81
|
||||||
|
msgid "Please check your email for updates."
|
||||||
|
msgstr "Please check your email for updates."
|
||||||
|
|
||||||
#: apps/web/src/app/(unauthenticated)/reset-password/[token]/page.tsx:34
|
#: apps/web/src/app/(unauthenticated)/reset-password/[token]/page.tsx:34
|
||||||
msgid "Please choose your new password"
|
msgid "Please choose your new password"
|
||||||
msgstr "Please choose your new password"
|
msgstr "Please choose your new password"
|
||||||
@@ -2277,7 +2289,7 @@ msgstr "Please contact support if you would like to revert this action."
|
|||||||
msgid "Please enter a meaningful name for your token. This will help you identify it later."
|
msgid "Please enter a meaningful name for your token. This will help you identify it later."
|
||||||
msgstr "Please enter a meaningful name for your token. This will help you identify it later."
|
msgstr "Please enter a meaningful name for your token. This will help you identify it later."
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:127
|
#: apps/web/src/app/(signing)/sign/[token]/form.tsx:134
|
||||||
msgid "Please mark as viewed to complete"
|
msgid "Please mark as viewed to complete"
|
||||||
msgstr "Please mark as viewed to complete"
|
msgstr "Please mark as viewed to complete"
|
||||||
|
|
||||||
@@ -2387,7 +2399,7 @@ msgstr "Public Profile"
|
|||||||
msgid "Public profile URL"
|
msgid "Public profile URL"
|
||||||
msgstr "Public profile URL"
|
msgstr "Public profile URL"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:438
|
#: apps/web/src/components/forms/v2/signup.tsx:450
|
||||||
msgid "Public profile username"
|
msgid "Public profile username"
|
||||||
msgstr "Public profile username"
|
msgstr "Public profile username"
|
||||||
|
|
||||||
@@ -2608,7 +2620,7 @@ msgstr "Security"
|
|||||||
msgid "Security activity"
|
msgid "Security activity"
|
||||||
msgstr "Security activity"
|
msgstr "Security activity"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:192
|
#: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:194
|
||||||
msgid "Select"
|
msgid "Select"
|
||||||
msgstr "Select"
|
msgstr "Select"
|
||||||
|
|
||||||
@@ -2712,7 +2724,7 @@ msgstr "Show templates in your team public profile for your audience to sign and
|
|||||||
#: apps/web/src/app/(profile)/p/[url]/page.tsx:192
|
#: apps/web/src/app/(profile)/p/[url]/page.tsx:192
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx:182
|
#: 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:224
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:121
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:124
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:259
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:259
|
||||||
#: apps/web/src/components/ui/user-profile-skeleton.tsx:75
|
#: apps/web/src/components/ui/user-profile-skeleton.tsx:75
|
||||||
#: apps/web/src/components/ui/user-profile-timur.tsx:81
|
#: apps/web/src/components/ui/user-profile-timur.tsx:81
|
||||||
@@ -2732,7 +2744,7 @@ msgid "Sign as<0>{0} <1>({1})</1></0>"
|
|||||||
msgstr "Sign as<0>{0} <1>({1})</1></0>"
|
msgstr "Sign as<0>{0} <1>({1})</1></0>"
|
||||||
|
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:329
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:329
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:207
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:209
|
||||||
msgid "Sign document"
|
msgid "Sign document"
|
||||||
msgstr "Sign document"
|
msgstr "Sign document"
|
||||||
|
|
||||||
@@ -2741,17 +2753,17 @@ msgid "Sign field"
|
|||||||
msgstr "Sign field"
|
msgstr "Sign field"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/signup.tsx:212
|
#: apps/web/src/components/forms/signup.tsx:212
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:350
|
#: apps/web/src/components/forms/v2/signup.tsx:362
|
||||||
msgid "Sign Here"
|
msgid "Sign Here"
|
||||||
msgstr "Sign Here"
|
msgstr "Sign Here"
|
||||||
|
|
||||||
#: apps/web/src/app/not-found.tsx:29
|
#: apps/web/src/app/not-found.tsx:29
|
||||||
#: apps/web/src/components/forms/signin.tsx:371
|
#: apps/web/src/components/forms/signin.tsx:383
|
||||||
#: apps/web/src/components/forms/signin.tsx:498
|
#: apps/web/src/components/forms/signin.tsx:510
|
||||||
msgid "Sign In"
|
msgid "Sign In"
|
||||||
msgstr "Sign In"
|
msgstr "Sign In"
|
||||||
|
|
||||||
#: apps/web/src/app/(unauthenticated)/signin/page.tsx:44
|
#: apps/web/src/app/(unauthenticated)/signin/page.tsx:29
|
||||||
msgid "Sign in to your account"
|
msgid "Sign in to your account"
|
||||||
msgstr "Sign in to your account"
|
msgstr "Sign in to your account"
|
||||||
|
|
||||||
@@ -2761,11 +2773,11 @@ msgid "Sign Out"
|
|||||||
msgstr "Sign Out"
|
msgstr "Sign Out"
|
||||||
|
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:350
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:350
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:228
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:230
|
||||||
msgid "Sign the document to complete the process."
|
msgid "Sign the document to complete the process."
|
||||||
msgstr "Sign the document to complete the process."
|
msgstr "Sign the document to complete the process."
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:72
|
#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:67
|
||||||
msgid "Sign up"
|
msgid "Sign up"
|
||||||
msgstr "Sign up"
|
msgstr "Sign up"
|
||||||
|
|
||||||
@@ -2774,12 +2786,12 @@ msgid "Sign Up"
|
|||||||
msgstr "Sign Up"
|
msgstr "Sign Up"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/signup.tsx:257
|
#: apps/web/src/components/forms/signup.tsx:257
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:389
|
#: apps/web/src/components/forms/v2/signup.tsx:401
|
||||||
msgid "Sign Up with Google"
|
msgid "Sign Up with Google"
|
||||||
msgstr "Sign Up with Google"
|
msgstr "Sign Up with Google"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/signup.tsx:281
|
#: apps/web/src/components/forms/signup.tsx:281
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:405
|
#: apps/web/src/components/forms/v2/signup.tsx:417
|
||||||
msgid "Sign Up with OIDC"
|
msgid "Sign Up with OIDC"
|
||||||
msgstr "Sign Up with OIDC"
|
msgstr "Sign Up with OIDC"
|
||||||
|
|
||||||
@@ -2788,7 +2800,7 @@ msgstr "Sign Up with OIDC"
|
|||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:197
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:197
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:227
|
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:227
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:391
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:391
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:268
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:270
|
||||||
#: apps/web/src/components/forms/profile.tsx:132
|
#: apps/web/src/components/forms/profile.tsx:132
|
||||||
msgid "Signature"
|
msgid "Signature"
|
||||||
msgstr "Signature"
|
msgstr "Signature"
|
||||||
@@ -2805,8 +2817,8 @@ msgstr "Signatures will appear once the document has been completed"
|
|||||||
msgid "Signed"
|
msgid "Signed"
|
||||||
msgstr "Signed"
|
msgstr "Signed"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/signin.tsx:371
|
#: apps/web/src/components/forms/signin.tsx:383
|
||||||
#: apps/web/src/components/forms/signin.tsx:498
|
#: apps/web/src/components/forms/signin.tsx:510
|
||||||
msgid "Signing in..."
|
msgid "Signing in..."
|
||||||
msgstr "Signing in..."
|
msgstr "Signing in..."
|
||||||
|
|
||||||
@@ -2851,12 +2863,12 @@ msgstr "Site Settings"
|
|||||||
#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:151
|
#: apps/web/src/app/(dashboard)/templates/template-direct-link-dialog.tsx:151
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:117
|
#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:117
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:27
|
#: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:27
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:43
|
#: 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]/layout-billing-banner.tsx:53
|
||||||
#: apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx:39
|
#: 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/(unauthenticated)/verify-email/[token]/page.tsx:61
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:243
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:243
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:123
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:125
|
||||||
#: apps/web/src/components/(teams)/dialogs/create-team-checkout-dialog.tsx:50
|
#: 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/create-team-checkout-dialog.tsx:99
|
||||||
#: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:210
|
#: apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx:210
|
||||||
@@ -3112,7 +3124,7 @@ msgstr "Template has been updated."
|
|||||||
msgid "Template moved"
|
msgid "Template moved"
|
||||||
msgstr "Template moved"
|
msgstr "Template moved"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:198
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:219
|
||||||
msgid "Template saved"
|
msgid "Template saved"
|
||||||
msgstr "Template saved"
|
msgstr "Template saved"
|
||||||
|
|
||||||
@@ -3128,6 +3140,11 @@ msgstr "Templates"
|
|||||||
msgid "Templates allow you to quickly generate documents with pre-filled recipients and fields."
|
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."
|
msgstr "Templates allow you to quickly generate documents with pre-filled recipients and fields."
|
||||||
|
|
||||||
|
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:256
|
||||||
|
#: apps/web/src/app/(signing)/sign/[token]/text-field.tsx:272
|
||||||
|
msgid "Text"
|
||||||
|
msgstr "Text"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:166
|
#: apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx:166
|
||||||
msgid "Text Color"
|
msgid "Text Color"
|
||||||
msgstr "Text Color"
|
msgstr "Text Color"
|
||||||
@@ -3305,11 +3322,11 @@ msgstr "This document has been cancelled by the owner and is no longer available
|
|||||||
msgid "This document has been cancelled by the owner."
|
msgid "This document has been cancelled by the owner."
|
||||||
msgstr "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:193
|
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:219
|
||||||
msgid "This document has been signed by all recipients"
|
msgid "This document has been signed by all recipients"
|
||||||
msgstr "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:196
|
#: apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx:222
|
||||||
msgid "This document is currently a draft and has not been sent"
|
msgid "This document is currently a draft and has not been sent"
|
||||||
msgstr "This document is currently a draft and has not been sent"
|
msgstr "This document is currently a draft and has not been sent"
|
||||||
|
|
||||||
@@ -3412,7 +3429,7 @@ msgstr "To enable two-factor authentication, scan the following QR code using yo
|
|||||||
msgid "To gain access to your account, please confirm your email address by clicking on the confirmation link from your inbox."
|
msgid "To gain access to your account, please confirm your email address by clicking on the confirmation link from your inbox."
|
||||||
msgstr "To gain access to your account, please confirm your email address by clicking on the confirmation link from your inbox."
|
msgstr "To gain access to your account, please confirm your email address by clicking on the confirmation link from your inbox."
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx:57
|
#: 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}</0>"
|
msgid "To mark this document as viewed, you need to be logged in as <0>{0}</0>"
|
||||||
msgstr "To mark this document as viewed, you need to be logged in as <0>{0}</0>"
|
msgstr "To mark this document as viewed, you need to be logged in as <0>{0}</0>"
|
||||||
|
|
||||||
@@ -3501,7 +3518,7 @@ msgstr "Two factor authentication"
|
|||||||
msgid "Two factor authentication recovery codes are used to access your account in the event that you lose access to your authenticator app."
|
msgid "Two factor authentication recovery codes are used to access your account in the event that you lose access to your authenticator app."
|
||||||
msgstr "Two factor authentication recovery codes are used to access your account in the event that you lose access to your authenticator app."
|
msgstr "Two factor authentication recovery codes are used to access your account in the event that you lose access to your authenticator app."
|
||||||
|
|
||||||
#: apps/web/src/components/forms/signin.tsx:436
|
#: apps/web/src/components/forms/signin.tsx:448
|
||||||
msgid "Two-Factor Authentication"
|
msgid "Two-Factor Authentication"
|
||||||
msgstr "Two-Factor Authentication"
|
msgstr "Two-Factor Authentication"
|
||||||
|
|
||||||
@@ -3711,12 +3728,12 @@ msgid "Uploaded file not an allowed file type"
|
|||||||
msgstr "Uploaded file not an allowed file type"
|
msgstr "Uploaded file not an allowed file type"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx:187
|
#: apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx:187
|
||||||
#: apps/web/src/components/forms/signin.tsx:493
|
#: apps/web/src/components/forms/signin.tsx:505
|
||||||
msgid "Use Authenticator"
|
msgid "Use Authenticator"
|
||||||
msgstr "Use Authenticator"
|
msgstr "Use Authenticator"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx:185
|
#: apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx:185
|
||||||
#: apps/web/src/components/forms/signin.tsx:491
|
#: apps/web/src/components/forms/signin.tsx:503
|
||||||
msgid "Use Backup Code"
|
msgid "Use Backup Code"
|
||||||
msgstr "Use Backup Code"
|
msgstr "Use Backup Code"
|
||||||
|
|
||||||
@@ -3732,7 +3749,7 @@ msgstr "User"
|
|||||||
msgid "User ID"
|
msgid "User ID"
|
||||||
msgstr "User ID"
|
msgstr "User ID"
|
||||||
|
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:222
|
#: apps/web/src/components/forms/v2/signup.tsx:234
|
||||||
msgid "User profiles are here!"
|
msgid "User profiles are here!"
|
||||||
msgstr "User profiles are here!"
|
msgstr "User profiles are here!"
|
||||||
|
|
||||||
@@ -3834,6 +3851,10 @@ msgstr "Waiting"
|
|||||||
msgid "Waiting for others to sign"
|
msgid "Waiting for others to sign"
|
||||||
msgstr "Waiting for others to sign"
|
msgstr "Waiting for others to sign"
|
||||||
|
|
||||||
|
#: apps/web/src/app/(signing)/sign/[token]/waiting/page.tsx:70
|
||||||
|
msgid "Waiting for Your Turn"
|
||||||
|
msgstr "Waiting for Your Turn"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/no-longer-available.tsx:61
|
#: 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.</0>"
|
msgid "Want to send slick signing links like this one? <0>Check out Documenso.</0>"
|
||||||
msgstr "Want to send slick signing links like this one? <0>Check out Documenso.</0>"
|
msgstr "Want to send slick signing links like this one? <0>Check out Documenso.</0>"
|
||||||
@@ -4007,7 +4028,7 @@ msgid "We were unable to disable two-factor authentication for your account. Ple
|
|||||||
msgstr "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 "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."
|
||||||
|
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:28
|
#: apps/web/src/app/(recipient)/d/[token]/signing-auth-page.tsx:28
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:44
|
#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:39
|
||||||
msgid "We were unable to log you out at this time."
|
msgid "We were unable to log you out at this time."
|
||||||
msgstr "We were unable to log you out at this time."
|
msgstr "We were unable to log you out at this time."
|
||||||
|
|
||||||
@@ -4022,7 +4043,7 @@ msgstr "We were unable to setup two-factor authentication for your account. Plea
|
|||||||
|
|
||||||
#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:119
|
#: apps/web/src/app/(recipient)/d/[token]/direct-template.tsx:119
|
||||||
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:245
|
#: apps/web/src/app/embed/direct/[[...url]]/client.tsx:245
|
||||||
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:125
|
#: apps/web/src/app/embed/sign/[[...url]]/client.tsx:127
|
||||||
msgid "We were unable to submit this document at this time. Please try again later."
|
msgid "We were unable to submit this document at this time. Please try again later."
|
||||||
msgstr "We were unable to submit this document at this time. Please try again later."
|
msgstr "We were unable to submit this document at this time. Please try again later."
|
||||||
|
|
||||||
@@ -4074,10 +4095,14 @@ msgstr "Webhooks"
|
|||||||
msgid "Weekly"
|
msgid "Weekly"
|
||||||
msgstr "Weekly"
|
msgstr "Weekly"
|
||||||
|
|
||||||
#: apps/web/src/app/(unauthenticated)/signin/page.tsx:48
|
#: apps/web/src/app/(unauthenticated)/signin/page.tsx:33
|
||||||
msgid "Welcome back, we are lucky to have you."
|
msgid "Welcome back, we are lucky to have you."
|
||||||
msgstr "Welcome back, we are lucky to have you."
|
msgstr "Welcome back, we are lucky to have you."
|
||||||
|
|
||||||
|
#: apps/web/src/app/(signing)/sign/[token]/waiting/page.tsx:88
|
||||||
|
msgid "Were you trying to edit this document instead?"
|
||||||
|
msgstr "Were you trying to edit this document instead?"
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx:189
|
#: 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."
|
msgid "When you click continue, you will be prompted to add the first available authenticator on your system."
|
||||||
msgstr "When you click continue, you will be prompted to add the first available authenticator on your system."
|
msgstr "When you click continue, you will be prompted to add the first available authenticator on your system."
|
||||||
@@ -4106,15 +4131,15 @@ msgstr "Yearly"
|
|||||||
msgid "You"
|
msgid "You"
|
||||||
msgstr "You"
|
msgstr "You"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:90
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:93
|
||||||
msgid "You are about to complete approving \"{truncatedTitle}\".<0/> Are you sure?"
|
msgid "You are about to complete approving \"{truncatedTitle}\".<0/> Are you sure?"
|
||||||
msgstr "You are about to complete approving \"{truncatedTitle}\".<0/> Are you sure?"
|
msgstr "You are about to complete approving \"{truncatedTitle}\".<0/> Are you sure?"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:82
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:85
|
||||||
msgid "You are about to complete signing \"{truncatedTitle}\".<0/> Are you sure?"
|
msgid "You are about to complete signing \"{truncatedTitle}\".<0/> Are you sure?"
|
||||||
msgstr "You are about to complete signing \"{truncatedTitle}\".<0/> Are you sure?"
|
msgstr "You are about to complete signing \"{truncatedTitle}\".<0/> Are you sure?"
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:74
|
#: apps/web/src/app/(signing)/sign/[token]/sign-dialog.tsx:77
|
||||||
msgid "You are about to complete viewing \"{truncatedTitle}\".<0/> Are you sure?"
|
msgid "You are about to complete viewing \"{truncatedTitle}\".<0/> Are you sure?"
|
||||||
msgstr "You are about to complete viewing \"{truncatedTitle}\".<0/> Are you sure?"
|
msgstr "You are about to complete viewing \"{truncatedTitle}\".<0/> Are you sure?"
|
||||||
|
|
||||||
@@ -4296,7 +4321,7 @@ msgstr "You must have at least one other team member to transfer ownership."
|
|||||||
msgid "You must set a profile URL before enabling your public profile."
|
msgid "You must set a profile URL before enabling your public profile."
|
||||||
msgstr "You must set a profile URL before enabling your public profile."
|
msgstr "You must set a profile URL before enabling your public profile."
|
||||||
|
|
||||||
#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:61
|
#: apps/web/src/app/(signing)/sign/[token]/signing-auth-page.tsx:56
|
||||||
msgid "You need to be logged in as <0>{email}</0> to view this page."
|
msgid "You need to be logged in as <0>{email}</0> to view this page."
|
||||||
msgstr "You need to be logged in as <0>{email}</0> to view this page."
|
msgstr "You need to be logged in as <0>{email}</0> to view this page."
|
||||||
|
|
||||||
@@ -4308,7 +4333,7 @@ msgstr "You need to be logged in to view this page."
|
|||||||
msgid "You need to setup 2FA to mark this document as viewed."
|
msgid "You need to setup 2FA to mark this document as viewed."
|
||||||
msgstr "You need to setup 2FA to mark this document as viewed."
|
msgstr "You need to setup 2FA to mark this document as viewed."
|
||||||
|
|
||||||
#: apps/web/src/components/forms/v2/signup.tsx:271
|
#: apps/web/src/components/forms/v2/signup.tsx:283
|
||||||
msgid "You will get notified & be able to set up your documenso public profile when we launch the feature."
|
msgid "You will get notified & be able to set up your documenso public profile when we launch the feature."
|
||||||
msgstr "You will get notified & be able to set up your documenso public profile when we launch the feature."
|
msgstr "You will get notified & be able to set up your documenso public profile when we launch the feature."
|
||||||
|
|
||||||
@@ -4352,7 +4377,7 @@ msgstr "Your document has been created from the template successfully."
|
|||||||
msgid "Your document has been re-sent successfully."
|
msgid "Your document has been re-sent successfully."
|
||||||
msgstr "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:277
|
#: apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx:299
|
||||||
msgid "Your document has been sent successfully."
|
msgid "Your document has been sent successfully."
|
||||||
msgstr "Your document has been sent successfully."
|
msgstr "Your document has been sent successfully."
|
||||||
|
|
||||||
@@ -4443,7 +4468,7 @@ msgstr "Your template has been successfully deleted."
|
|||||||
msgid "Your template will be duplicated."
|
msgid "Your template will be duplicated."
|
||||||
msgstr "Your template will be duplicated."
|
msgstr "Your template will be duplicated."
|
||||||
|
|
||||||
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:199
|
#: apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx:220
|
||||||
msgid "Your templates has been saved successfully."
|
msgid "Your templates has been saved successfully."
|
||||||
msgstr "Your templates has been saved successfully."
|
msgstr "Your templates has been saved successfully."
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ export const ZDocumentAuditLogTypeSchema = z.enum([
|
|||||||
'DOCUMENT_DELETED', // When the document is soft deleted.
|
'DOCUMENT_DELETED', // When the document is soft deleted.
|
||||||
'DOCUMENT_FIELD_INSERTED', // When a field is inserted (signed/approved/etc) by a recipient.
|
'DOCUMENT_FIELD_INSERTED', // When a field is inserted (signed/approved/etc) by a recipient.
|
||||||
'DOCUMENT_FIELD_UNINSERTED', // When a field is uninserted by a recipient.
|
'DOCUMENT_FIELD_UNINSERTED', // When a field is uninserted by a recipient.
|
||||||
|
'DOCUMENT_VISIBILITY_UPDATED', // When the document visibility scope is updated
|
||||||
'DOCUMENT_GLOBAL_AUTH_ACCESS_UPDATED', // When the global access authentication is updated.
|
'DOCUMENT_GLOBAL_AUTH_ACCESS_UPDATED', // When the global access authentication is updated.
|
||||||
'DOCUMENT_GLOBAL_AUTH_ACTION_UPDATED', // When the global action authentication is updated.
|
'DOCUMENT_GLOBAL_AUTH_ACTION_UPDATED', // When the global action authentication is updated.
|
||||||
'DOCUMENT_META_UPDATED', // When the document meta data is updated.
|
'DOCUMENT_META_UPDATED', // When the document meta data is updated.
|
||||||
@@ -311,6 +312,11 @@ export const ZDocumentAuditLogEventDocumentFieldUninsertedSchema = z.object({
|
|||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const ZDocumentAuditLogEventDocumentVisibilitySchema = z.object({
|
||||||
|
type: z.literal(DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_VISIBILITY_UPDATED),
|
||||||
|
data: ZGenericFromToSchema,
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Event: Document global authentication access updated.
|
* Event: Document global authentication access updated.
|
||||||
*/
|
*/
|
||||||
@@ -475,6 +481,7 @@ export const ZDocumentAuditLogSchema = ZDocumentAuditLogBaseSchema.and(
|
|||||||
ZDocumentAuditLogEventDocumentMovedToTeamSchema,
|
ZDocumentAuditLogEventDocumentMovedToTeamSchema,
|
||||||
ZDocumentAuditLogEventDocumentFieldInsertedSchema,
|
ZDocumentAuditLogEventDocumentFieldInsertedSchema,
|
||||||
ZDocumentAuditLogEventDocumentFieldUninsertedSchema,
|
ZDocumentAuditLogEventDocumentFieldUninsertedSchema,
|
||||||
|
ZDocumentAuditLogEventDocumentVisibilitySchema,
|
||||||
ZDocumentAuditLogEventDocumentGlobalAuthAccessUpdatedSchema,
|
ZDocumentAuditLogEventDocumentGlobalAuthAccessUpdatedSchema,
|
||||||
ZDocumentAuditLogEventDocumentGlobalAuthActionUpdatedSchema,
|
ZDocumentAuditLogEventDocumentGlobalAuthActionUpdatedSchema,
|
||||||
ZDocumentAuditLogEventDocumentMetaUpdatedSchema,
|
ZDocumentAuditLogEventDocumentMetaUpdatedSchema,
|
||||||
|
|||||||
7
packages/lib/types/document-visibility.ts
Normal file
7
packages/lib/types/document-visibility.ts
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
import { z } from 'zod';
|
||||||
|
|
||||||
|
import { DocumentVisibility as DocumentVisibilityEnum } from '@documenso/prisma/client';
|
||||||
|
|
||||||
|
export const ZDocumentVisibilitySchema = z.nativeEnum(DocumentVisibilityEnum);
|
||||||
|
export const DocumentVisibility = ZDocumentVisibilitySchema.enum;
|
||||||
|
export type TDocumentVisibility = z.infer<typeof ZDocumentVisibilitySchema>;
|
||||||
@@ -313,6 +313,10 @@ export const formatDocumentAuditLogAction = (auditLog: TDocumentAuditLog, userId
|
|||||||
anonymous: 'Field unsigned',
|
anonymous: 'Field unsigned',
|
||||||
identified: 'unsigned a field',
|
identified: 'unsigned a field',
|
||||||
}))
|
}))
|
||||||
|
.with({ type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_VISIBILITY_UPDATED }, () => ({
|
||||||
|
anonymous: 'Document visibility updated',
|
||||||
|
identified: 'updated the document visibility',
|
||||||
|
}))
|
||||||
.with({ type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_GLOBAL_AUTH_ACCESS_UPDATED }, () => ({
|
.with({ type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_GLOBAL_AUTH_ACCESS_UPDATED }, () => ({
|
||||||
anonymous: 'Document access auth updated',
|
anonymous: 'Document access auth updated',
|
||||||
identified: 'updated the document access auth requirements',
|
identified: 'updated the document access auth requirements',
|
||||||
|
|||||||
@@ -90,8 +90,18 @@ export const extractLocaleData = ({
|
|||||||
lang = 'en';
|
lang = 'en';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Filter out locales that are not valid.
|
||||||
|
const locales = (langHeader?.locales ?? []).filter((locale) => {
|
||||||
|
try {
|
||||||
|
new Intl.Locale(locale);
|
||||||
|
return true;
|
||||||
|
} catch {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
lang: lang || APP_I18N_OPTIONS.sourceLang,
|
lang: lang || APP_I18N_OPTIONS.sourceLang,
|
||||||
locales: langHeader.locales,
|
locales,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "Document" ADD COLUMN "visibility" TEXT;
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
-- CreateEnum
|
||||||
|
CREATE TYPE "DocumentSigningOrder" AS ENUM ('PARALLEL', 'SEQUENTIAL');
|
||||||
|
|
||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "DocumentMeta" ADD COLUMN "signingOrder" "DocumentSigningOrder" NOT NULL DEFAULT 'PARALLEL';
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "Recipient" ADD COLUMN "signingOrder" INTEGER;
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
/*
|
||||||
|
Warnings:
|
||||||
|
|
||||||
|
- The `visibility` column on the `Document` table would be dropped and recreated. This will lead to data loss if there is data in the column.
|
||||||
|
|
||||||
|
*/
|
||||||
|
-- CreateEnum
|
||||||
|
CREATE TYPE "DocumentVisibility" AS ENUM ('EVERYONE', 'MANAGER_AND_ABOVE', 'ADMIN');
|
||||||
|
|
||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "Document" DROP COLUMN "visibility",
|
||||||
|
ADD COLUMN "visibility" "DocumentVisibility" NOT NULL DEFAULT 'EVERYONE';
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "TemplateMeta" ADD COLUMN "signingOrder" "DocumentSigningOrder" DEFAULT 'PARALLEL';
|
||||||
@@ -282,6 +282,12 @@ enum DocumentSource {
|
|||||||
TEMPLATE_DIRECT_LINK
|
TEMPLATE_DIRECT_LINK
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum DocumentVisibility {
|
||||||
|
EVERYONE
|
||||||
|
MANAGER_AND_ABOVE
|
||||||
|
ADMIN
|
||||||
|
}
|
||||||
|
|
||||||
model Document {
|
model Document {
|
||||||
id Int @id @default(autoincrement())
|
id Int @id @default(autoincrement())
|
||||||
externalId String?
|
externalId String?
|
||||||
@@ -289,6 +295,7 @@ model Document {
|
|||||||
User User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
User User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||||
authOptions Json?
|
authOptions Json?
|
||||||
formValues Json?
|
formValues Json?
|
||||||
|
visibility DocumentVisibility @default(EVERYONE)
|
||||||
title String
|
title String
|
||||||
status DocumentStatus @default(DRAFT)
|
status DocumentStatus @default(DRAFT)
|
||||||
Recipient Recipient[]
|
Recipient Recipient[]
|
||||||
@@ -337,6 +344,11 @@ enum DocumentDataType {
|
|||||||
BYTES_64
|
BYTES_64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum DocumentSigningOrder {
|
||||||
|
PARALLEL
|
||||||
|
SEQUENTIAL
|
||||||
|
}
|
||||||
|
|
||||||
model DocumentData {
|
model DocumentData {
|
||||||
id String @id @default(cuid())
|
id String @id @default(cuid())
|
||||||
type DocumentDataType
|
type DocumentDataType
|
||||||
@@ -356,6 +368,7 @@ model DocumentMeta {
|
|||||||
documentId Int @unique
|
documentId Int @unique
|
||||||
document Document @relation(fields: [documentId], references: [id], onDelete: Cascade)
|
document Document @relation(fields: [documentId], references: [id], onDelete: Cascade)
|
||||||
redirectUrl String?
|
redirectUrl String?
|
||||||
|
signingOrder DocumentSigningOrder @default(PARALLEL)
|
||||||
}
|
}
|
||||||
|
|
||||||
enum ReadStatus {
|
enum ReadStatus {
|
||||||
@@ -391,6 +404,7 @@ model Recipient {
|
|||||||
expired DateTime?
|
expired DateTime?
|
||||||
signedAt DateTime?
|
signedAt DateTime?
|
||||||
authOptions Json?
|
authOptions Json?
|
||||||
|
signingOrder Int?
|
||||||
role RecipientRole @default(SIGNER)
|
role RecipientRole @default(SIGNER)
|
||||||
readStatus ReadStatus @default(NOT_OPENED)
|
readStatus ReadStatus @default(NOT_OPENED)
|
||||||
signingStatus SigningStatus @default(NOT_SIGNED)
|
signingStatus SigningStatus @default(NOT_SIGNED)
|
||||||
@@ -593,6 +607,7 @@ model TemplateMeta {
|
|||||||
timezone String? @default("Etc/UTC") @db.Text
|
timezone String? @default("Etc/UTC") @db.Text
|
||||||
password String?
|
password String?
|
||||||
dateFormat String? @default("yyyy-MM-dd hh:mm a") @db.Text
|
dateFormat String? @default("yyyy-MM-dd hh:mm a") @db.Text
|
||||||
|
signingOrder DocumentSigningOrder? @default(PARALLEL)
|
||||||
templateId Int @unique
|
templateId Int @unique
|
||||||
template Template @relation(fields: [templateId], references: [id], onDelete: Cascade)
|
template Template @relation(fields: [templateId], references: [id], onDelete: Cascade)
|
||||||
redirectUrl String?
|
redirectUrl String?
|
||||||
|
|||||||
@@ -102,6 +102,44 @@ export const unseedTeam = async (teamUrl: string) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type SeedTeamMemberOptions = {
|
||||||
|
teamId: number;
|
||||||
|
role?: TeamMemberRole;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const seedTeamMember = async ({
|
||||||
|
teamId,
|
||||||
|
role = TeamMemberRole.ADMIN,
|
||||||
|
}: SeedTeamMemberOptions) => {
|
||||||
|
const user = await seedUser();
|
||||||
|
|
||||||
|
await prisma.teamMember.create({
|
||||||
|
data: {
|
||||||
|
teamId,
|
||||||
|
role,
|
||||||
|
userId: user.id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return user;
|
||||||
|
};
|
||||||
|
|
||||||
|
type UnseedTeamMemberOptions = {
|
||||||
|
teamId: number;
|
||||||
|
userId: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const unseedTeamMember = async ({ teamId, userId }: UnseedTeamMemberOptions) => {
|
||||||
|
await prisma.teamMember.delete({
|
||||||
|
where: {
|
||||||
|
userId_teamId: {
|
||||||
|
userId,
|
||||||
|
teamId,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
export const seedTeamTransfer = async (options: { newOwnerUserId: number; teamId: number }) => {
|
export const seedTeamTransfer = async (options: { newOwnerUserId: number; teamId: number }) => {
|
||||||
return await prisma.teamTransferVerification.create({
|
return await prisma.teamTransferVerification.create({
|
||||||
data: {
|
data: {
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
widget: {
|
widget: {
|
||||||
DEFAULT: 'hsl(var(--widget))',
|
DEFAULT: 'hsl(var(--widget))',
|
||||||
// foreground: 'hsl(var(--widget-foreground))',
|
foreground: 'hsl(var(--widget-foreground))',
|
||||||
},
|
},
|
||||||
documenso: {
|
documenso: {
|
||||||
DEFAULT: '#A2E771',
|
DEFAULT: '#A2E771',
|
||||||
|
|||||||
@@ -1,17 +1,8 @@
|
|||||||
import { encryptSecondaryData } from '@documenso/lib/server-only/crypto/encrypt';
|
|
||||||
|
|
||||||
import { procedure, router } from '../trpc';
|
import { procedure, router } from '../trpc';
|
||||||
import { ZEncryptSecondaryDataMutationSchema } from './schema';
|
import { ZEncryptSecondaryDataMutationSchema } from './schema';
|
||||||
|
|
||||||
export const cryptoRouter = router({
|
export const cryptoRouter = router({
|
||||||
encryptSecondaryData: procedure
|
encryptSecondaryData: procedure.input(ZEncryptSecondaryDataMutationSchema).mutation(() => {
|
||||||
.input(ZEncryptSecondaryDataMutationSchema)
|
throw new Error('Public usage of encryptSecondaryData is no longer permitted');
|
||||||
.mutation(({ input }) => {
|
|
||||||
try {
|
|
||||||
return encryptSecondaryData(input);
|
|
||||||
} catch {
|
|
||||||
// Never leak errors for crypto.
|
|
||||||
throw new Error('Failed to encrypt data');
|
|
||||||
}
|
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ import {
|
|||||||
ZSendDocumentMutationSchema,
|
ZSendDocumentMutationSchema,
|
||||||
ZSetPasswordForDocumentMutationSchema,
|
ZSetPasswordForDocumentMutationSchema,
|
||||||
ZSetSettingsForDocumentMutationSchema,
|
ZSetSettingsForDocumentMutationSchema,
|
||||||
|
ZSetSigningOrderForDocumentMutationSchema,
|
||||||
ZSetTitleForDocumentMutationSchema,
|
ZSetTitleForDocumentMutationSchema,
|
||||||
} from './schema';
|
} from './schema';
|
||||||
|
|
||||||
@@ -308,6 +309,29 @@ export const documentRouter = router({
|
|||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
setSigningOrderForDocument: authenticatedProcedure
|
||||||
|
.input(ZSetSigningOrderForDocumentMutationSchema)
|
||||||
|
.mutation(async ({ input, ctx }) => {
|
||||||
|
try {
|
||||||
|
const { documentId, signingOrder } = input;
|
||||||
|
|
||||||
|
return await upsertDocumentMeta({
|
||||||
|
documentId,
|
||||||
|
signingOrder,
|
||||||
|
userId: ctx.user.id,
|
||||||
|
requestMetadata: extractNextApiRequestMetadata(ctx.req),
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
|
||||||
|
throw new TRPCError({
|
||||||
|
code: 'BAD_REQUEST',
|
||||||
|
message:
|
||||||
|
'We were unable to update the settings for this document. Please try again later.',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
|
||||||
sendDocument: authenticatedProcedure
|
sendDocument: authenticatedProcedure
|
||||||
.input(ZSendDocumentMutationSchema)
|
.input(ZSendDocumentMutationSchema)
|
||||||
.mutation(async ({ input, ctx }) => {
|
.mutation(async ({ input, ctx }) => {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import {
|
|||||||
} from '@documenso/lib/types/document-auth';
|
} from '@documenso/lib/types/document-auth';
|
||||||
import { ZBaseTableSearchParamsSchema } from '@documenso/lib/types/search-params';
|
import { ZBaseTableSearchParamsSchema } from '@documenso/lib/types/search-params';
|
||||||
import { isValidRedirectUrl } from '@documenso/lib/utils/is-valid-redirect-url';
|
import { isValidRedirectUrl } from '@documenso/lib/utils/is-valid-redirect-url';
|
||||||
import { FieldType, RecipientRole } from '@documenso/prisma/client';
|
import { DocumentSigningOrder, FieldType, RecipientRole } from '@documenso/prisma/client';
|
||||||
|
|
||||||
export const ZFindDocumentAuditLogsQuerySchema = ZBaseTableSearchParamsSchema.extend({
|
export const ZFindDocumentAuditLogsQuerySchema = ZBaseTableSearchParamsSchema.extend({
|
||||||
documentId: z.number().min(1),
|
documentId: z.number().min(1),
|
||||||
@@ -56,6 +56,7 @@ export const ZSetSettingsForDocumentMutationSchema = z.object({
|
|||||||
data: z.object({
|
data: z.object({
|
||||||
title: z.string().min(1).optional(),
|
title: z.string().min(1).optional(),
|
||||||
externalId: z.string().nullish(),
|
externalId: z.string().nullish(),
|
||||||
|
visibility: z.string().optional(),
|
||||||
globalAccessAuth: ZDocumentAccessAuthTypesSchema.nullable().optional(),
|
globalAccessAuth: ZDocumentAccessAuthTypesSchema.nullable().optional(),
|
||||||
globalActionAuth: ZDocumentActionAuthTypesSchema.nullable().optional(),
|
globalActionAuth: ZDocumentActionAuthTypesSchema.nullable().optional(),
|
||||||
}),
|
}),
|
||||||
@@ -148,6 +149,15 @@ export type TSetPasswordForDocumentMutationSchema = z.infer<
|
|||||||
typeof ZSetPasswordForDocumentMutationSchema
|
typeof ZSetPasswordForDocumentMutationSchema
|
||||||
>;
|
>;
|
||||||
|
|
||||||
|
export const ZSetSigningOrderForDocumentMutationSchema = z.object({
|
||||||
|
documentId: z.number(),
|
||||||
|
signingOrder: z.nativeEnum(DocumentSigningOrder),
|
||||||
|
});
|
||||||
|
|
||||||
|
export type TSetSigningOrderForDocumentMutationSchema = z.infer<
|
||||||
|
typeof ZSetSigningOrderForDocumentMutationSchema
|
||||||
|
>;
|
||||||
|
|
||||||
export const ZResendDocumentMutationSchema = z.object({
|
export const ZResendDocumentMutationSchema = z.object({
|
||||||
documentId: z.number(),
|
documentId: z.number(),
|
||||||
recipients: z.array(z.number()).min(1),
|
recipients: z.array(z.number()).min(1),
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ export const recipientRouter = router({
|
|||||||
email: signer.email,
|
email: signer.email,
|
||||||
name: signer.name,
|
name: signer.name,
|
||||||
role: signer.role,
|
role: signer.role,
|
||||||
|
signingOrder: signer.signingOrder,
|
||||||
actionAuth: signer.actionAuth,
|
actionAuth: signer.actionAuth,
|
||||||
})),
|
})),
|
||||||
requestMetadata: extractNextApiRequestMetadata(ctx.req),
|
requestMetadata: extractNextApiRequestMetadata(ctx.req),
|
||||||
@@ -57,6 +58,7 @@ export const recipientRouter = router({
|
|||||||
email: signer.email,
|
email: signer.email,
|
||||||
name: signer.name,
|
name: signer.name,
|
||||||
role: signer.role,
|
role: signer.role,
|
||||||
|
signingOrder: signer.signingOrder,
|
||||||
actionAuth: signer.actionAuth,
|
actionAuth: signer.actionAuth,
|
||||||
})),
|
})),
|
||||||
});
|
});
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user