Compare commits

...

12 Commits

Author SHA1 Message Date
Mythie
5adc198bcd Merge branch 'main' into feat/automated-fields-signature 2024-11-18 10:56:16 +11:00
github-actions
78bad608cc chore: extract translations 2024-09-05 07:29:51 +00:00
Catalin Pit
0c8df9a948 Merge branch 'main' into feat/automated-fields-signature 2024-09-05 10:29:08 +03:00
Catalin Pit
4a7bab912f chore: merge main 2024-08-29 12:46:06 +03:00
Catalin Pit
3783452031 fix: variable name 2024-08-19 14:46:56 +03:00
Catalin Pit
29bc770332 fix: auto-sign after value change 2024-08-19 14:19:15 +03:00
Catalin Pit
75c05bf82b feat: some refactoring 2024-08-19 13:19:16 +03:00
Catalin Pit
a0788656f5 Merge branch 'main' into feat/automated-fields-signature 2024-08-19 13:18:50 +03:00
Catalin Pit
f74a239474 feat: rework the initials field 2024-08-14 10:03:46 +03:00
Catalin Pit
6505a40067 feat: rework the name field 2024-08-13 16:03:35 +03:00
Catalin Pit
d6e51ce5e6 feat: disable remove button for date field 2024-08-13 14:39:26 +03:00
Catalin Pit
b15d9019e3 feat: auto-sign fields 2024-08-13 10:33:30 +03:00
13 changed files with 98 additions and 104 deletions

View File

@@ -2,8 +2,8 @@ declare namespace NodeJS {
export interface ProcessEnv { export interface ProcessEnv {
NEXT_PUBLIC_WEBAPP_URL?: string; NEXT_PUBLIC_WEBAPP_URL?: string;
NEXT_PUBLIC_MARKETING_URL?: string; NEXT_PUBLIC_MARKETING_URL?: string;
NEXT_PRIVATE_INTERNAL_WEBAPP_URL?:string; NEXT_PRIVATE_INTERNAL_WEBAPP_URL?: string;
NEXT_PRIVATE_DATABASE_URL: string; NEXT_PRIVATE_DATABASE_URL: string;
NEXT_PUBLIC_STRIPE_COMMUNITY_PLAN_MONTHLY_PRICE_ID: string; NEXT_PUBLIC_STRIPE_COMMUNITY_PLAN_MONTHLY_PRICE_ID: string;

View File

@@ -2,7 +2,7 @@ declare namespace NodeJS {
export interface ProcessEnv { export interface ProcessEnv {
NEXT_PUBLIC_WEBAPP_URL?: string; NEXT_PUBLIC_WEBAPP_URL?: string;
NEXT_PUBLIC_MARKETING_URL?: string; NEXT_PUBLIC_MARKETING_URL?: string;
NEXT_PRIVATE_INTERNAL_WEBAPP_URL?:string; NEXT_PRIVATE_INTERNAL_WEBAPP_URL?: string;
NEXT_PRIVATE_DATABASE_URL: string; NEXT_PRIVATE_DATABASE_URL: string;

View File

@@ -99,7 +99,9 @@ export const DocumentLogsDataTable = ({ documentId }: DocumentLogsDataTableProps
{ {
header: _(msg`Action`), header: _(msg`Action`),
accessorKey: 'type', accessorKey: 'type',
cell: ({ row }) => <span>{formatDocumentAuditLogAction(_, row.original).description}</span>, cell: ({ row }) => (
<span>{uppercaseFistLetter(formatDocumentAuditLogAction(row.original).description)}</span>
),
}, },
{ {
header: 'IP Address', header: 'IP Address',

View File

@@ -193,7 +193,6 @@ export const SignDirectTemplateForm = ({
field={field} field={field}
recipient={directRecipient} recipient={directRecipient}
onSignField={onSignField} onSignField={onSignField}
onUnsignField={onUnsignField}
/> />
)) ))
.with(FieldType.NAME, () => ( .with(FieldType.NAME, () => (
@@ -202,7 +201,6 @@ export const SignDirectTemplateForm = ({
field={field} field={field}
recipient={directRecipient} recipient={directRecipient}
onSignField={onSignField} onSignField={onSignField}
onUnsignField={onUnsignField}
/> />
)) ))
.with(FieldType.DATE, () => ( .with(FieldType.DATE, () => (
@@ -213,7 +211,6 @@ export const SignDirectTemplateForm = ({
dateFormat={template.templateMeta?.dateFormat ?? DEFAULT_DOCUMENT_DATE_FORMAT} dateFormat={template.templateMeta?.dateFormat ?? DEFAULT_DOCUMENT_DATE_FORMAT}
timezone={template.templateMeta?.timezone ?? DEFAULT_DOCUMENT_TIME_ZONE} timezone={template.templateMeta?.timezone ?? DEFAULT_DOCUMENT_TIME_ZONE}
onSignField={onSignField} onSignField={onSignField}
onUnsignField={onUnsignField}
/> />
)) ))
.with(FieldType.EMAIL, () => ( .with(FieldType.EMAIL, () => (
@@ -222,7 +219,6 @@ export const SignDirectTemplateForm = ({
field={field} field={field}
recipient={directRecipient} recipient={directRecipient}
onSignField={onSignField} onSignField={onSignField}
onUnsignField={onUnsignField}
/> />
)) ))
.with(FieldType.TEXT, () => { .with(FieldType.TEXT, () => {

View File

@@ -1,6 +1,6 @@
'use client'; 'use client';
import { useTransition } from 'react'; import { useEffect, useTransition } from 'react';
import { useRouter } from 'next/navigation'; import { useRouter } from 'next/navigation';
@@ -25,6 +25,7 @@ import type {
} from '@documenso/trpc/server/field-router/schema'; } from '@documenso/trpc/server/field-router/schema';
import { useToast } from '@documenso/ui/primitives/use-toast'; import { useToast } from '@documenso/ui/primitives/use-toast';
import { useRequiredDocumentAuthContext } from './document-auth-provider';
import { SigningFieldContainer } from './signing-field-container'; import { SigningFieldContainer } from './signing-field-container';
export type DateFieldProps = { export type DateFieldProps = {
@@ -42,7 +43,6 @@ export const DateField = ({
dateFormat = DEFAULT_DOCUMENT_DATE_FORMAT, dateFormat = DEFAULT_DOCUMENT_DATE_FORMAT,
timezone = DEFAULT_DOCUMENT_TIME_ZONE, timezone = DEFAULT_DOCUMENT_TIME_ZONE,
onSignField, onSignField,
onUnsignField,
}: DateFieldProps) => { }: DateFieldProps) => {
const router = useRouter(); const router = useRouter();
@@ -54,13 +54,13 @@ export const DateField = ({
const { mutateAsync: signFieldWithToken, isLoading: isSignFieldWithTokenLoading } = const { mutateAsync: signFieldWithToken, isLoading: isSignFieldWithTokenLoading } =
trpc.field.signFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); trpc.field.signFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION);
const { const { isLoading: isRemoveSignedFieldWithTokenLoading } =
mutateAsync: removeSignedFieldWithToken, trpc.field.removeSignedFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION);
isLoading: isRemoveSignedFieldWithTokenLoading,
} = trpc.field.removeSignedFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION);
const isLoading = isSignFieldWithTokenLoading || isRemoveSignedFieldWithTokenLoading || isPending; const isLoading = isSignFieldWithTokenLoading || isRemoveSignedFieldWithTokenLoading || isPending;
const { executeActionAuthProcedure } = useRequiredDocumentAuthContext();
const localDateString = convertToLocalSystemFormat(field.customText, dateFormat, timezone); const localDateString = convertToLocalSystemFormat(field.customText, dateFormat, timezone);
const isDifferentTime = field.inserted && localDateString !== field.customText; const isDifferentTime = field.inserted && localDateString !== field.customText;
@@ -103,37 +103,18 @@ export const DateField = ({
} }
}; };
const onRemove = async () => { useEffect(() => {
try { if (!field.inserted) {
const payload: TRemovedSignedFieldWithTokenMutationSchema = { void executeActionAuthProcedure({
token: recipient.token, onReauthFormSubmit: async (authOptions) => await onSign(authOptions),
fieldId: field.id, actionTarget: field.type,
};
if (onUnsignField) {
await onUnsignField(payload);
return;
}
await removeSignedFieldWithToken(payload);
startTransition(() => router.refresh());
} catch (err) {
console.error(err);
toast({
title: _(msg`Error`),
description: _(msg`An error occurred while removing the signature.`),
variant: 'destructive',
}); });
} }
}; }, [field]);
return ( return (
<SigningFieldContainer <SigningFieldContainer
field={field} field={field}
onSign={onSign}
onRemove={onRemove}
type="Date" type="Date"
tooltipText={isDifferentTime ? tooltipText : undefined} tooltipText={isDifferentTime ? tooltipText : undefined}
> >

View File

@@ -1,6 +1,6 @@
'use client'; 'use client';
import { useTransition } from 'react'; import { useEffect, useTransition } from 'react';
import { useRouter } from 'next/navigation'; import { useRouter } from 'next/navigation';
@@ -14,12 +14,10 @@ import type { TRecipientActionAuth } from '@documenso/lib/types/document-auth';
import type { Recipient } from '@documenso/prisma/client'; import type { Recipient } from '@documenso/prisma/client';
import type { FieldWithSignature } from '@documenso/prisma/types/field-with-signature'; import type { FieldWithSignature } from '@documenso/prisma/types/field-with-signature';
import { trpc } from '@documenso/trpc/react'; import { trpc } from '@documenso/trpc/react';
import type { import type { TSignFieldWithTokenMutationSchema } from '@documenso/trpc/server/field-router/schema';
TRemovedSignedFieldWithTokenMutationSchema,
TSignFieldWithTokenMutationSchema,
} from '@documenso/trpc/server/field-router/schema';
import { useToast } from '@documenso/ui/primitives/use-toast'; import { useToast } from '@documenso/ui/primitives/use-toast';
import { useRequiredDocumentAuthContext } from './document-auth-provider';
import { useRequiredSigningContext } from './provider'; import { useRequiredSigningContext } from './provider';
import { SigningFieldContainer } from './signing-field-container'; import { SigningFieldContainer } from './signing-field-container';
@@ -27,10 +25,9 @@ export type EmailFieldProps = {
field: FieldWithSignature; field: FieldWithSignature;
recipient: Recipient; recipient: Recipient;
onSignField?: (value: TSignFieldWithTokenMutationSchema) => Promise<void> | void; onSignField?: (value: TSignFieldWithTokenMutationSchema) => Promise<void> | void;
onUnsignField?: (value: TRemovedSignedFieldWithTokenMutationSchema) => Promise<void> | void;
}; };
export const EmailField = ({ field, recipient, onSignField, onUnsignField }: EmailFieldProps) => { export const EmailField = ({ field, recipient, onSignField }: EmailFieldProps) => {
const router = useRouter(); const router = useRouter();
const { _ } = useLingui(); const { _ } = useLingui();
@@ -43,13 +40,13 @@ export const EmailField = ({ field, recipient, onSignField, onUnsignField }: Ema
const { mutateAsync: signFieldWithToken, isLoading: isSignFieldWithTokenLoading } = const { mutateAsync: signFieldWithToken, isLoading: isSignFieldWithTokenLoading } =
trpc.field.signFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); trpc.field.signFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION);
const { const { isLoading: isRemoveSignedFieldWithTokenLoading } =
mutateAsync: removeSignedFieldWithToken, trpc.field.removeSignedFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION);
isLoading: isRemoveSignedFieldWithTokenLoading,
} = trpc.field.removeSignedFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION);
const isLoading = isSignFieldWithTokenLoading || isRemoveSignedFieldWithTokenLoading || isPending; const isLoading = isSignFieldWithTokenLoading || isRemoveSignedFieldWithTokenLoading || isPending;
const { executeActionAuthProcedure } = useRequiredDocumentAuthContext();
const onSign = async (authOptions?: TRecipientActionAuth) => { const onSign = async (authOptions?: TRecipientActionAuth) => {
try { try {
const value = providedEmail ?? ''; const value = providedEmail ?? '';
@@ -87,34 +84,17 @@ export const EmailField = ({ field, recipient, onSignField, onUnsignField }: Ema
} }
}; };
const onRemove = async () => { useEffect(() => {
try { if (!field.inserted) {
const payload: TRemovedSignedFieldWithTokenMutationSchema = { void executeActionAuthProcedure({
token: recipient.token, onReauthFormSubmit: async (authOptions) => await onSign(authOptions),
fieldId: field.id, actionTarget: field.type,
};
if (onUnsignField) {
await onUnsignField(payload);
return;
}
await removeSignedFieldWithToken(payload);
startTransition(() => router.refresh());
} catch (err) {
console.error(err);
toast({
title: _(msg`Error`),
description: _(msg`An error occurred while removing the signature.`),
variant: 'destructive',
}); });
} }
}; }, [field]);
return ( return (
<SigningFieldContainer field={field} onSign={onSign} onRemove={onRemove} type="Email"> <SigningFieldContainer field={field} type="Email">
{isLoading && ( {isLoading && (
<div className="bg-background absolute inset-0 flex items-center justify-center rounded-md"> <div className="bg-background absolute inset-0 flex items-center justify-center rounded-md">
<Loader className="text-primary h-5 w-5 animate-spin md:h-8 md:w-8" /> <Loader className="text-primary h-5 w-5 animate-spin md:h-8 md:w-8" />

View File

@@ -1,6 +1,6 @@
'use client'; 'use client';
import { useTransition } from 'react'; import { useEffect, useTransition } from 'react';
import { useRouter } from 'next/navigation'; import { useRouter } from 'next/navigation';
@@ -8,6 +8,7 @@ import { Trans, msg } from '@lingui/macro';
import { useLingui } from '@lingui/react'; import { useLingui } from '@lingui/react';
import { Loader } from 'lucide-react'; import { Loader } from 'lucide-react';
import { useDebouncedValue } from '@documenso/lib/client-only/hooks/use-debounced-value';
import { DO_NOT_INVALIDATE_QUERY_ON_MUTATION } from '@documenso/lib/constants/trpc'; import { DO_NOT_INVALIDATE_QUERY_ON_MUTATION } from '@documenso/lib/constants/trpc';
import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error';
import type { TRecipientActionAuth } from '@documenso/lib/types/document-auth'; import type { TRecipientActionAuth } from '@documenso/lib/types/document-auth';
@@ -21,6 +22,7 @@ import type {
} from '@documenso/trpc/server/field-router/schema'; } from '@documenso/trpc/server/field-router/schema';
import { useToast } from '@documenso/ui/primitives/use-toast'; import { useToast } from '@documenso/ui/primitives/use-toast';
import { useRequiredDocumentAuthContext } from './document-auth-provider';
import { useRequiredSigningContext } from './provider'; import { useRequiredSigningContext } from './provider';
import { SigningFieldContainer } from './signing-field-container'; import { SigningFieldContainer } from './signing-field-container';
@@ -44,8 +46,12 @@ export const InitialsField = ({
const { fullName } = useRequiredSigningContext(); const { fullName } = useRequiredSigningContext();
const initials = extractInitials(fullName); const initials = extractInitials(fullName);
const debouncedInitials = useDebouncedValue(initials, 2000);
const [isPending, startTransition] = useTransition(); const [isPending, startTransition] = useTransition();
const { executeActionAuthProcedure } = useRequiredDocumentAuthContext();
const { mutateAsync: signFieldWithToken, isLoading: isSignFieldWithTokenLoading } = const { mutateAsync: signFieldWithToken, isLoading: isSignFieldWithTokenLoading } =
trpc.field.signFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION); trpc.field.signFieldWithToken.useMutation(DO_NOT_INVALIDATE_QUERY_ON_MUTATION);
@@ -58,7 +64,7 @@ export const InitialsField = ({
const onSign = async (authOptions?: TRecipientActionAuth) => { const onSign = async (authOptions?: TRecipientActionAuth) => {
try { try {
const value = initials ?? ''; const value = debouncedInitials ?? '';
const payload: TSignFieldWithTokenMutationSchema = { const payload: TSignFieldWithTokenMutationSchema = {
token: recipient.token, token: recipient.token,
@@ -119,6 +125,15 @@ export const InitialsField = ({
} }
}; };
useEffect(() => {
if (!field.inserted && debouncedInitials) {
void executeActionAuthProcedure({
onReauthFormSubmit: async (authOptions) => await onSign(authOptions),
actionTarget: field.type,
});
}
}, [field, debouncedInitials, field.inserted]);
return ( return (
<SigningFieldContainer field={field} onSign={onSign} onRemove={onRemove} type="Initials"> <SigningFieldContainer field={field} onSign={onSign} onRemove={onRemove} type="Initials">
{isLoading && ( {isLoading && (

View File

@@ -1,6 +1,6 @@
'use client'; 'use client';
import { useState, useTransition } from 'react'; import { useEffect, useState, useTransition } from 'react';
import { useRouter } from 'next/navigation'; import { useRouter } from 'next/navigation';
@@ -8,6 +8,7 @@ import { Trans, msg } from '@lingui/macro';
import { useLingui } from '@lingui/react'; import { useLingui } from '@lingui/react';
import { Loader } from 'lucide-react'; import { Loader } from 'lucide-react';
import { useDebouncedValue } from '@documenso/lib/client-only/hooks/use-debounced-value';
import { DO_NOT_INVALIDATE_QUERY_ON_MUTATION } from '@documenso/lib/constants/trpc'; import { DO_NOT_INVALIDATE_QUERY_ON_MUTATION } from '@documenso/lib/constants/trpc';
import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error';
import type { TRecipientActionAuth } from '@documenso/lib/types/document-auth'; import type { TRecipientActionAuth } from '@documenso/lib/types/document-auth';
@@ -44,6 +45,8 @@ export const NameField = ({ field, recipient, onSignField, onUnsignField }: Name
const { fullName: providedFullName, setFullName: setProvidedFullName } = const { fullName: providedFullName, setFullName: setProvidedFullName } =
useRequiredSigningContext(); useRequiredSigningContext();
const debouncedProvidedFullName = useDebouncedValue(providedFullName, 2000);
const { executeActionAuthProcedure } = useRequiredDocumentAuthContext(); const { executeActionAuthProcedure } = useRequiredDocumentAuthContext();
const [isPending, startTransition] = useTransition(); const [isPending, startTransition] = useTransition();
@@ -151,6 +154,15 @@ export const NameField = ({ field, recipient, onSignField, onUnsignField }: Name
} }
}; };
useEffect(() => {
if (!field.inserted && providedFullName) {
void executeActionAuthProcedure({
onReauthFormSubmit: async (authOptions) => await onSign(authOptions),
actionTarget: field.type,
});
}
}, [field, debouncedProvidedFullName]);
return ( return (
<SigningFieldContainer <SigningFieldContainer
field={field} field={field}

View File

@@ -68,6 +68,8 @@ export const SigningFieldContainer = ({
const parsedFieldMeta = field.fieldMeta ? ZFieldMetaSchema.parse(field.fieldMeta) : undefined; const parsedFieldMeta = field.fieldMeta ? ZFieldMetaSchema.parse(field.fieldMeta) : undefined;
const readOnlyField = parsedFieldMeta?.readOnly || false; const readOnlyField = parsedFieldMeta?.readOnly || false;
const automatedFields = ['Email', 'Date'].includes(type ?? '');
const handleInsertField = async () => { const handleInsertField = async () => {
if (field.inserted || !onSign) { if (field.inserted || !onSign) {
return; return;
@@ -146,7 +148,7 @@ export const SigningFieldContainer = ({
</button> </button>
)} )}
{type === 'Date' && field.inserted && !loading && !readOnlyField && ( {field.inserted && !automatedFields && !loading && !readOnlyField && (
<Tooltip delayDuration={0}> <Tooltip delayDuration={0}>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<button <button
@@ -172,14 +174,18 @@ export const SigningFieldContainer = ({
</button> </button>
)} )}
{type !== 'Date' && type !== 'Checkbox' && field.inserted && !loading && !readOnlyField && ( {type !== 'Checkbox' &&
<button !automatedFields &&
className="text-destructive bg-background/50 absolute inset-0 z-10 flex h-full w-full items-center justify-center rounded-md text-sm opacity-0 duration-200 group-hover:opacity-100" field.inserted &&
onClick={onRemoveSignedFieldClick} !loading &&
> !readOnlyField && (
<Trans>Remove</Trans> <button
</button> className="text-destructive bg-background/50 absolute inset-0 z-10 flex h-full w-full items-center justify-center rounded-md text-sm opacity-0 duration-200 group-hover:opacity-100"
)} onClick={onRemoveSignedFieldClick}
>
Remove
</button>
)}
{children} {children}
</FieldRootContainer> </FieldRootContainer>

View File

@@ -5,7 +5,11 @@ import { getToken } from 'next-auth/jwt';
import { LOCAL_FEATURE_FLAGS } from '@documenso/lib/constants/feature-flags'; import { LOCAL_FEATURE_FLAGS } from '@documenso/lib/constants/feature-flags';
import PostHogServerClient from '@documenso/lib/server-only/feature-flags/get-post-hog-server-client'; import PostHogServerClient from '@documenso/lib/server-only/feature-flags/get-post-hog-server-client';
import { NEXT_PUBLIC_MARKETING_URL, NEXT_PUBLIC_WEBAPP_URL, NEXT_PRIVATE_INTERNAL_WEBAPP_URL } from '../../constants/app'; import {
NEXT_PRIVATE_INTERNAL_WEBAPP_URL,
NEXT_PUBLIC_MARKETING_URL,
NEXT_PUBLIC_WEBAPP_URL,
} from '../../constants/app';
import { extractDistinctUserId, mapJwtToFlagProperties } from './get'; import { extractDistinctUserId, mapJwtToFlagProperties } from './get';
/** /**

View File

@@ -7,7 +7,11 @@ import { getToken } from 'next-auth/jwt';
import { LOCAL_FEATURE_FLAGS, extractPostHogConfig } from '@documenso/lib/constants/feature-flags'; import { LOCAL_FEATURE_FLAGS, extractPostHogConfig } from '@documenso/lib/constants/feature-flags';
import PostHogServerClient from '@documenso/lib/server-only/feature-flags/get-post-hog-server-client'; import PostHogServerClient from '@documenso/lib/server-only/feature-flags/get-post-hog-server-client';
import { NEXT_PUBLIC_MARKETING_URL, NEXT_PUBLIC_WEBAPP_URL, NEXT_PRIVATE_INTERNAL_WEBAPP_URL } from '../../constants/app'; import {
NEXT_PRIVATE_INTERNAL_WEBAPP_URL,
NEXT_PUBLIC_MARKETING_URL,
NEXT_PUBLIC_WEBAPP_URL,
} from '../../constants/app';
/** /**
* Evaluate a single feature flag based on the current user if possible. * Evaluate a single feature flag based on the current user if possible.
@@ -67,7 +71,7 @@ export default async function handleFeatureFlagGet(req: Request) {
if (origin.startsWith(NEXT_PUBLIC_MARKETING_URL() ?? 'http://localhost:3001')) { if (origin.startsWith(NEXT_PUBLIC_MARKETING_URL() ?? 'http://localhost:3001')) {
res.headers.set('Access-Control-Allow-Origin', origin); res.headers.set('Access-Control-Allow-Origin', origin);
} }
if (origin.startsWith(NEXT_PRIVATE_INTERNAL_WEBAPP_URL ?? 'http://localhost:3000')) { if (origin.startsWith(NEXT_PRIVATE_INTERNAL_WEBAPP_URL ?? 'http://localhost:3000')) {
res.headers.set('Access-Control-Allow-Origin', origin); res.headers.set('Access-Control-Allow-Origin', origin);
} }

View File

@@ -518,10 +518,8 @@ msgid "An error occurred while removing the field."
msgstr "Ein Fehler ist beim Entfernen des Feldes aufgetreten." msgstr "Ein Fehler ist beim Entfernen des Feldes aufgetreten."
#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:152 #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:152
#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:126
#: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:137 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:137
#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:110 #: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:151
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:148
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:195 #: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:195
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:129 #: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:129
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:173 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:173
@@ -717,7 +715,7 @@ msgstr "Avatar aktualisiert"
msgid "Awaiting email confirmation" msgid "Awaiting email confirmation"
msgstr "Warte auf E-Mail-Bestätigung" 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:365
#: 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:509 #: apps/web/src/components/forms/v2/signup.tsx:509
msgid "Back" msgid "Back"
@@ -1803,7 +1801,6 @@ msgstr "Geben Sie hier Ihren Text ein"
#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:151 #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:151
#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:212 #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:212
#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:99 #: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:99
#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:125
#: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:105 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:105
#: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:136 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:136
#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:83 #: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:83
@@ -2361,7 +2358,7 @@ msgstr "Meine Vorlagen"
#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:287 #: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:287
#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:294 #: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:294
#: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:119 #: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:119
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:170 #: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:182
#: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:153 #: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:153
#: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:141 #: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:141
#: apps/web/src/components/forms/signup.tsx:164 #: apps/web/src/components/forms/signup.tsx:164
@@ -2809,7 +2806,7 @@ msgstr "Öffentlicher Profil-Benutzername"
msgid "Public templates are connected to your public profile. Any modifications to public templates will also appear in your public profile." msgid "Public templates are connected to your public profile. Any modifications to public templates will also appear in your public profile."
msgstr "Öffentliche Vorlagen sind mit Ihrem öffentlichen Profil verbunden. Änderungen an öffentlichen Vorlagen erscheinen auch in Ihrem öffentlichen Profil." msgstr "Öffentliche Vorlagen sind mit Ihrem öffentlichen Profil verbunden. Änderungen an öffentlichen Vorlagen erscheinen auch in Ihrem öffentlichen Profil."
#: apps/web/src/app/(signing)/sign/[token]/signing-field-container.tsx:144 #: apps/web/src/app/(signing)/sign/[token]/signing-field-container.tsx:146
msgid "Read only field" msgid "Read only field"
msgstr "Nur-Lese-Feld" msgstr "Nur-Lese-Feld"
@@ -3188,7 +3185,7 @@ msgstr "Unterzeichnen"
msgid "Sign as {0} <0>({1})</0>" msgid "Sign as {0} <0>({1})</0>"
msgstr "Unterzeichnen als {0} <0>({1})</0>" msgstr "Unterzeichnen als {0} <0>({1})</0>"
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:183 #: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:195
msgid "Sign as<0>{0} <1>({1})</1></0>" 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>"

View File

@@ -513,10 +513,8 @@ msgid "An error occurred while removing the field."
msgstr "An error occurred while removing the field." msgstr "An error occurred while removing the field."
#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:152 #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:152
#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:126
#: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:137 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:137
#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:110 #: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:151
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:148
#: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:195 #: apps/web/src/app/(signing)/sign/[token]/number-field.tsx:195
#: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:129 #: apps/web/src/app/(signing)/sign/[token]/radio-field.tsx:129
#: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:173 #: apps/web/src/app/(signing)/sign/[token]/signature-field.tsx:173
@@ -712,7 +710,7 @@ msgstr "Avatar Updated"
msgid "Awaiting email confirmation" msgid "Awaiting email confirmation"
msgstr "Awaiting email confirmation" 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:365
#: 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:509 #: apps/web/src/components/forms/v2/signup.tsx:509
msgid "Back" msgid "Back"
@@ -1798,7 +1796,6 @@ msgstr "Enter your text here"
#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:151 #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:151
#: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:212 #: apps/web/src/app/(signing)/sign/[token]/checkbox-field.tsx:212
#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:99 #: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:99
#: apps/web/src/app/(signing)/sign/[token]/date-field.tsx:125
#: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:105 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:105
#: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:136 #: apps/web/src/app/(signing)/sign/[token]/dropdown-field.tsx:136
#: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:83 #: apps/web/src/app/(signing)/sign/[token]/email-field.tsx:83
@@ -2356,7 +2353,7 @@ msgstr "My templates"
#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:287 #: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:287
#: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:294 #: apps/web/src/app/(dashboard)/templates/use-template-dialog.tsx:294
#: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:119 #: apps/web/src/app/(signing)/sign/[token]/complete/claim-account.tsx:119
#: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:170 #: apps/web/src/app/(signing)/sign/[token]/name-field.tsx:182
#: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:153 #: apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx:153
#: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:141 #: apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx:141
#: apps/web/src/components/forms/signup.tsx:164 #: apps/web/src/components/forms/signup.tsx:164
@@ -2804,7 +2801,7 @@ msgstr "Public profile username"
msgid "Public templates are connected to your public profile. Any modifications to public templates will also appear in your public profile." msgid "Public templates are connected to your public profile. Any modifications to public templates will also appear in your public profile."
msgstr "Public templates are connected to your public profile. Any modifications to public templates will also appear in your public profile." msgstr "Public templates are connected to your public profile. Any modifications to public templates will also appear in your public profile."
#: apps/web/src/app/(signing)/sign/[token]/signing-field-container.tsx:144 #: apps/web/src/app/(signing)/sign/[token]/signing-field-container.tsx:146
msgid "Read only field" msgid "Read only field"
msgstr "Read only field" msgstr "Read only field"