mirror of
https://github.com/documenso/documenso.git
synced 2026-07-03 01:30:47 +10:00
Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5e1d85bc33 | |||
| 1102e833cc | |||
| 337f85f021 | |||
| 2332b0316b | |||
| 393b51d484 | |||
| 5a8335e0eb | |||
| 814eb51b26 | |||
| a16dd73ec1 | |||
| 5da2a2020e | |||
| d79b1d4612 | |||
| 3685acc0ab | |||
| eeea3651ee | |||
| 50997d7e92 | |||
| bc97af14d3 | |||
| 278dfa3d77 | |||
| 5b64137237 | |||
| b9b29e5a76 | |||
| 5b63b5deb9 |
@@ -0,0 +1,284 @@
|
||||
import { useEffect, useRef, useState } from 'react';
|
||||
|
||||
import { plural } from '@lingui/core/macro';
|
||||
import { Plural, Trans, useLingui } from '@lingui/react/macro';
|
||||
import { DocumentStatus } from '@prisma/client';
|
||||
import type * as DialogPrimitive from '@radix-ui/react-dialog';
|
||||
import { match } from 'ts-pattern';
|
||||
|
||||
import { downloadPDF } from '@documenso/lib/client-only/download-pdf';
|
||||
import { trpc } from '@documenso/trpc/react';
|
||||
import { Button } from '@documenso/ui/primitives/button';
|
||||
import {
|
||||
Dialog,
|
||||
DialogContent,
|
||||
DialogDescription,
|
||||
DialogFooter,
|
||||
DialogHeader,
|
||||
DialogTitle,
|
||||
} from '@documenso/ui/primitives/dialog';
|
||||
import {
|
||||
Select,
|
||||
SelectContent,
|
||||
SelectItem,
|
||||
SelectTrigger,
|
||||
SelectValue,
|
||||
} from '@documenso/ui/primitives/select';
|
||||
import { useToast } from '@documenso/ui/primitives/use-toast';
|
||||
|
||||
export type EnvelopeBulkDownloadItem = {
|
||||
id: string;
|
||||
title: string;
|
||||
status: DocumentStatus;
|
||||
};
|
||||
|
||||
export type EnvelopesBulkDownloadDialogProps = {
|
||||
envelopes: EnvelopeBulkDownloadItem[];
|
||||
open: boolean;
|
||||
onOpenChange: (open: boolean) => void;
|
||||
onSuccess?: (successfulEnvelopeIds: string[]) => void;
|
||||
} & Omit<DialogPrimitive.DialogProps, 'children'>;
|
||||
|
||||
export const EnvelopesBulkDownloadDialog = ({
|
||||
envelopes,
|
||||
open,
|
||||
onOpenChange,
|
||||
onSuccess,
|
||||
...props
|
||||
}: EnvelopesBulkDownloadDialogProps) => {
|
||||
const { t } = useLingui();
|
||||
const { toast } = useToast();
|
||||
|
||||
const [versionMap, setVersionMap] = useState<Record<string, 'signed' | 'original'>>({});
|
||||
const [progress, setProgress] = useState(0);
|
||||
const [isDownloading, setIsDownloading] = useState(false);
|
||||
|
||||
const abortRef = useRef(false);
|
||||
|
||||
const trpcUtils = trpc.useUtils();
|
||||
|
||||
useEffect(() => {
|
||||
if (!open) {
|
||||
return;
|
||||
}
|
||||
|
||||
setVersionMap(
|
||||
Object.fromEntries(
|
||||
envelopes.map((envelope) => [
|
||||
envelope.id,
|
||||
envelope.status === DocumentStatus.COMPLETED ? 'signed' : 'original',
|
||||
]),
|
||||
),
|
||||
);
|
||||
setProgress(0);
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, [open]);
|
||||
|
||||
const getStatusLabel = (status: DocumentStatus) =>
|
||||
match(status)
|
||||
.with(DocumentStatus.COMPLETED, () => t`Completed`)
|
||||
.with(DocumentStatus.PENDING, () => t`Pending`)
|
||||
.with(DocumentStatus.DRAFT, () => t`Draft`)
|
||||
.with(DocumentStatus.REJECTED, () => t`Rejected`)
|
||||
.with(DocumentStatus.CANCELLED, () => t`Cancelled`)
|
||||
.exhaustive();
|
||||
|
||||
const onDownload = async () => {
|
||||
if (envelopes.length === 0 || isDownloading) {
|
||||
return;
|
||||
}
|
||||
|
||||
abortRef.current = false;
|
||||
setIsDownloading(true);
|
||||
setProgress(0);
|
||||
|
||||
const successfulEnvelopeIds: string[] = [];
|
||||
let failedDownloads = 0;
|
||||
|
||||
try {
|
||||
for (const envelope of envelopes) {
|
||||
if (abortRef.current) {
|
||||
break;
|
||||
}
|
||||
|
||||
try {
|
||||
const downloadVersion = versionMap[envelope.id] ?? 'original';
|
||||
|
||||
const { data: envelopeItems } = await trpcUtils.envelope.item.getManyByToken.fetch({
|
||||
envelopeId: envelope.id,
|
||||
access: {
|
||||
type: 'user',
|
||||
},
|
||||
});
|
||||
|
||||
for (const envelopeItem of envelopeItems) {
|
||||
await downloadPDF({
|
||||
envelopeItem,
|
||||
token: undefined,
|
||||
fileName: envelopeItem.title,
|
||||
version: downloadVersion,
|
||||
});
|
||||
}
|
||||
|
||||
successfulEnvelopeIds.push(envelope.id);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
failedDownloads++;
|
||||
}
|
||||
|
||||
setProgress((p) => p + 1);
|
||||
}
|
||||
|
||||
if (successfulEnvelopeIds.length === 0) {
|
||||
toast({
|
||||
title: t`Error`,
|
||||
description: t`An error occurred while downloading the documents.`,
|
||||
variant: 'destructive',
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
if (failedDownloads > 0) {
|
||||
toast({
|
||||
title: t`Documents partially downloaded`,
|
||||
description: t`${plural(successfulEnvelopeIds.length, {
|
||||
one: '# document downloaded.',
|
||||
other: '# documents downloaded.',
|
||||
})} ${plural(failedDownloads, {
|
||||
one: '# document could not be downloaded.',
|
||||
other: '# documents could not be downloaded.',
|
||||
})}`,
|
||||
variant: 'destructive',
|
||||
});
|
||||
onSuccess?.(successfulEnvelopeIds);
|
||||
return;
|
||||
}
|
||||
|
||||
toast({
|
||||
title: t`Documents downloaded`,
|
||||
description: plural(successfulEnvelopeIds.length, {
|
||||
one: '# document has been downloaded.',
|
||||
other: '# documents have been downloaded.',
|
||||
}),
|
||||
});
|
||||
|
||||
onSuccess?.(successfulEnvelopeIds);
|
||||
onOpenChange(false);
|
||||
} finally {
|
||||
setIsDownloading(false);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<Dialog
|
||||
{...props}
|
||||
open={open}
|
||||
onOpenChange={(value) => {
|
||||
if (!isDownloading) {
|
||||
onOpenChange(value);
|
||||
}
|
||||
}}
|
||||
>
|
||||
<DialogContent>
|
||||
<DialogHeader>
|
||||
<DialogTitle>
|
||||
<Trans>Download Documents</Trans>
|
||||
</DialogTitle>
|
||||
|
||||
<DialogDescription>
|
||||
<Plural
|
||||
value={envelopes.length}
|
||||
one="Select the version to download for the selected document."
|
||||
other="Select the version to download for each of the # selected documents."
|
||||
/>
|
||||
</DialogDescription>
|
||||
</DialogHeader>
|
||||
|
||||
<fieldset disabled={isDownloading} className="space-y-4">
|
||||
<div className="max-h-96 space-y-2 overflow-y-auto">
|
||||
{envelopes.map((envelope) => {
|
||||
const isCompleted = envelope.status === DocumentStatus.COMPLETED;
|
||||
|
||||
return (
|
||||
<div
|
||||
key={envelope.id}
|
||||
className="flex items-center gap-3 rounded-lg border border-border bg-card p-3"
|
||||
>
|
||||
<div className="min-w-0 flex-1">
|
||||
<p
|
||||
className="truncate text-sm font-medium text-foreground"
|
||||
title={envelope.title}
|
||||
>
|
||||
{envelope.title}
|
||||
</p>
|
||||
<p className="text-xs text-muted-foreground">
|
||||
{getStatusLabel(envelope.status)}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{isCompleted && (
|
||||
<Select
|
||||
value={versionMap[envelope.id] ?? 'signed'}
|
||||
onValueChange={(value) =>
|
||||
setVersionMap((prev) => ({
|
||||
...prev,
|
||||
[envelope.id]: value as 'signed' | 'original',
|
||||
}))
|
||||
}
|
||||
>
|
||||
<SelectTrigger className="w-[120px] flex-shrink-0">
|
||||
<SelectValue />
|
||||
</SelectTrigger>
|
||||
|
||||
<SelectContent>
|
||||
<SelectItem value="signed">
|
||||
<Trans context="Signed document (adjective)">Signed</Trans>
|
||||
</SelectItem>
|
||||
<SelectItem value="original">
|
||||
<Trans context="Original document (adjective)">Original</Trans>
|
||||
</SelectItem>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
|
||||
{isDownloading && (
|
||||
<p className="text-sm text-muted-foreground">
|
||||
<Trans>
|
||||
Downloading {progress} / {envelopes.length}...
|
||||
</Trans>
|
||||
</p>
|
||||
)}
|
||||
|
||||
<DialogFooter>
|
||||
<Button
|
||||
type="button"
|
||||
variant="secondary"
|
||||
onClick={() => {
|
||||
if (isDownloading) {
|
||||
abortRef.current = true;
|
||||
} else {
|
||||
onOpenChange(false);
|
||||
}
|
||||
}}
|
||||
>
|
||||
{isDownloading ? <Trans>Stop</Trans> : <Trans>Cancel</Trans>}
|
||||
</Button>
|
||||
|
||||
<Button
|
||||
type="button"
|
||||
onClick={() => void onDownload()}
|
||||
loading={isDownloading}
|
||||
disabled={envelopes.length === 0}
|
||||
>
|
||||
<Trans>Download</Trans>
|
||||
</Button>
|
||||
</DialogFooter>
|
||||
</fieldset>
|
||||
</DialogContent>
|
||||
</Dialog>
|
||||
);
|
||||
};
|
||||
@@ -21,6 +21,8 @@ import { z } from 'zod';
|
||||
import { useOptionalCurrentTeam } from '~/providers/team';
|
||||
import { useCspNonce } from '~/utils/nonce';
|
||||
|
||||
import { FormStickySaveBar } from './form-sticky-save-bar';
|
||||
|
||||
const MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB
|
||||
const ACCEPTED_FILE_TYPES = ['image/jpeg', 'image/png', 'image/webp'];
|
||||
|
||||
@@ -71,38 +73,82 @@ export function BrandingPreferencesForm({
|
||||
const parsedColors = ZCssVarsSchema.safeParse(settings.brandingColors);
|
||||
const initialColors = parsedColors.success ? parsedColors.data : {};
|
||||
|
||||
// The saved state the form maps to. Used both as the reactive `values` source and as
|
||||
// the explicit target for a Reset (see handleReset).
|
||||
const savedValues: TBrandingPreferencesFormSchema = {
|
||||
brandingEnabled: settings.brandingEnabled ?? null,
|
||||
brandingUrl: settings.brandingUrl ?? '',
|
||||
brandingLogo: undefined,
|
||||
brandingCompanyDetails: settings.brandingCompanyDetails ?? '',
|
||||
brandingColors: initialColors,
|
||||
brandingCss: settings.brandingCss ?? '',
|
||||
};
|
||||
|
||||
const form = useForm<TBrandingPreferencesFormSchema>({
|
||||
values: {
|
||||
brandingEnabled: settings.brandingEnabled ?? null,
|
||||
brandingUrl: settings.brandingUrl ?? '',
|
||||
brandingLogo: undefined,
|
||||
brandingCompanyDetails: settings.brandingCompanyDetails ?? '',
|
||||
brandingColors: initialColors,
|
||||
brandingCss: settings.brandingCss ?? '',
|
||||
},
|
||||
values: savedValues,
|
||||
resolver: zodResolver(ZBrandingPreferencesFormSchema),
|
||||
});
|
||||
|
||||
const isBrandingEnabled = form.watch('brandingEnabled');
|
||||
|
||||
const getSavedLogoPreviewUrl = () => {
|
||||
if (!settings.brandingLogo) {
|
||||
return '';
|
||||
}
|
||||
|
||||
const file = JSON.parse(settings.brandingLogo);
|
||||
|
||||
if (!('type' in file) || !('data' in file)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
const logoUrl =
|
||||
context === 'Team'
|
||||
? `${NEXT_PUBLIC_WEBAPP_URL()}/api/branding/logo/team/${team?.id}`
|
||||
: `${NEXT_PUBLIC_WEBAPP_URL()}/api/branding/logo/organisation/${organisation?.id}`;
|
||||
|
||||
return `${logoUrl}?v=${Date.now()}`;
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
if (settings.brandingLogo) {
|
||||
const file = JSON.parse(settings.brandingLogo);
|
||||
const savedLogoPreviewUrl = getSavedLogoPreviewUrl();
|
||||
|
||||
if ('type' in file && 'data' in file) {
|
||||
const logoUrl =
|
||||
context === 'Team'
|
||||
? `${NEXT_PUBLIC_WEBAPP_URL()}/api/branding/logo/team/${team?.id}`
|
||||
: `${NEXT_PUBLIC_WEBAPP_URL()}/api/branding/logo/organisation/${organisation?.id}`;
|
||||
|
||||
setPreviewUrl(logoUrl + '?v=' + Date.now());
|
||||
setHasLoadedPreview(true);
|
||||
}
|
||||
if (savedLogoPreviewUrl) {
|
||||
setPreviewUrl(savedLogoPreviewUrl);
|
||||
}
|
||||
|
||||
setHasLoadedPreview(true);
|
||||
}, [settings.brandingLogo]);
|
||||
|
||||
// Reset the form to the saved values. The form is driven by the `values` prop (no
|
||||
// `defaultValues`), so `reset()` with no argument doesn't re-baseline the dirty check;
|
||||
// passing the saved values clears the per-field dirty tracking (dirtyFields).
|
||||
const handleReset = () => {
|
||||
setPreviewUrl(getSavedLogoPreviewUrl());
|
||||
form.reset(savedValues);
|
||||
};
|
||||
|
||||
// `formState.isDirty` is unreliable for a `values`-driven form: after a reset (or a
|
||||
// save + refetch) it can stay true even though every field already matches its saved
|
||||
// value and `dirtyFields` is empty. Derive the flag from `dirtyFields` instead so the
|
||||
// sticky save bar reliably disappears.
|
||||
const hasUnsavedChanges = Object.keys(form.formState.dirtyFields).length > 0;
|
||||
|
||||
// Re-baseline the form to the just-saved state after a successful submit. The `values`
|
||||
// prop re-syncs most fields once the route refetches, but write-only fields (the logo
|
||||
// is a File that isn't reflected back into `values`) would otherwise stay dirty and
|
||||
// keep the save bar visible. Relies on the page handler rethrowing on error so we only
|
||||
// re-baseline on success.
|
||||
const handleFormSubmit = form.handleSubmit(async (data) => {
|
||||
try {
|
||||
await onFormSubmit(data);
|
||||
} catch {
|
||||
return;
|
||||
}
|
||||
|
||||
form.reset(form.getValues());
|
||||
});
|
||||
|
||||
// Cleanup ObjectURL on unmount or when previewUrl changes
|
||||
useEffect(() => {
|
||||
return () => {
|
||||
@@ -114,7 +160,7 @@ export function BrandingPreferencesForm({
|
||||
|
||||
return (
|
||||
<Form {...form}>
|
||||
<form onSubmit={form.handleSubmit(onFormSubmit)}>
|
||||
<form onSubmit={handleFormSubmit}>
|
||||
<fieldset className="flex h-full flex-col gap-y-4" disabled={form.formState.isSubmitting}>
|
||||
<FormField
|
||||
control={form.control}
|
||||
@@ -167,7 +213,7 @@ export function BrandingPreferencesForm({
|
||||
/>
|
||||
|
||||
<div className="relative flex w-full flex-col gap-y-4">
|
||||
{!isBrandingEnabled && <div className="absolute inset-0 z-[9998] bg-background/60" />}
|
||||
{!isBrandingEnabled && <div className="absolute inset-0 z-30 bg-background/60" />}
|
||||
|
||||
<FormField
|
||||
control={form.control}
|
||||
@@ -321,7 +367,7 @@ export function BrandingPreferencesForm({
|
||||
|
||||
{hasAdvancedBranding && (
|
||||
<div className="relative flex w-full flex-col gap-y-6">
|
||||
{!isBrandingEnabled && <div className="absolute inset-0 z-[9998] bg-background/60" />}
|
||||
{!isBrandingEnabled && <div className="absolute inset-0 z-30 bg-background/60" />}
|
||||
|
||||
<div>
|
||||
<FormLabel>
|
||||
@@ -538,11 +584,11 @@ export function BrandingPreferencesForm({
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className="flex flex-row justify-end space-x-4">
|
||||
<Button type="submit" loading={form.formState.isSubmitting}>
|
||||
<Trans>Update</Trans>
|
||||
</Button>
|
||||
</div>
|
||||
<FormStickySaveBar
|
||||
isDirty={hasUnsavedChanges}
|
||||
isSubmitting={form.formState.isSubmitting}
|
||||
onReset={handleReset}
|
||||
/>
|
||||
</fieldset>
|
||||
</form>
|
||||
</Form>
|
||||
|
||||
@@ -21,7 +21,6 @@ import { ReminderSettingsPicker } from '@documenso/ui/components/document/remind
|
||||
import { RecipientRoleSelect } from '@documenso/ui/components/recipient/recipient-role-select';
|
||||
import { Alert } from '@documenso/ui/primitives/alert';
|
||||
import { AvatarWithText } from '@documenso/ui/primitives/avatar';
|
||||
import { Button } from '@documenso/ui/primitives/button';
|
||||
import { Combobox } from '@documenso/ui/primitives/combobox';
|
||||
import {
|
||||
Form,
|
||||
@@ -46,6 +45,7 @@ import { z } from 'zod';
|
||||
import { useOptionalCurrentTeam } from '~/providers/team';
|
||||
|
||||
import { DefaultRecipientsMultiSelectCombobox } from '../general/default-recipients-multiselect-combobox';
|
||||
import { FormStickySaveBar } from './form-sticky-save-bar';
|
||||
|
||||
/**
|
||||
* Can't infer this from the schema since we need to keep the schema inside the component to allow
|
||||
@@ -147,9 +147,21 @@ export const DocumentPreferencesForm = ({
|
||||
resolver: zodResolver(ZDocumentPreferencesFormSchema),
|
||||
});
|
||||
|
||||
const handleFormSubmit = form.handleSubmit(async (data) => {
|
||||
try {
|
||||
await onFormSubmit(data);
|
||||
} catch {
|
||||
// The page handler surfaces its own error toast. Keep the form dirty so
|
||||
// the save bar stays visible and the user can retry.
|
||||
return;
|
||||
}
|
||||
|
||||
form.reset(data);
|
||||
});
|
||||
|
||||
return (
|
||||
<Form {...form}>
|
||||
<form onSubmit={form.handleSubmit(onFormSubmit)}>
|
||||
<form onSubmit={handleFormSubmit}>
|
||||
<fieldset className="flex h-full max-w-2xl flex-col gap-y-6" disabled={form.formState.isSubmitting}>
|
||||
{!isPersonalLayoutMode && (
|
||||
<FormField
|
||||
@@ -756,11 +768,11 @@ export const DocumentPreferencesForm = ({
|
||||
/>
|
||||
)}
|
||||
|
||||
<div className="flex flex-row justify-end space-x-4">
|
||||
<Button type="submit" loading={form.formState.isSubmitting}>
|
||||
<Trans>Update</Trans>
|
||||
</Button>
|
||||
</div>
|
||||
<FormStickySaveBar
|
||||
isDirty={form.formState.isDirty}
|
||||
isSubmitting={form.formState.isSubmitting}
|
||||
onReset={() => form.reset()}
|
||||
/>
|
||||
</fieldset>
|
||||
</form>
|
||||
</Form>
|
||||
|
||||
@@ -4,7 +4,6 @@ import { DEFAULT_DOCUMENT_EMAIL_SETTINGS, ZDocumentEmailSettingsSchema } from '@
|
||||
import { zEmail } from '@documenso/lib/utils/zod';
|
||||
import { trpc } from '@documenso/trpc/react';
|
||||
import { DocumentEmailCheckboxes } from '@documenso/ui/components/document/document-email-checkboxes';
|
||||
import { Button } from '@documenso/ui/primitives/button';
|
||||
import {
|
||||
Form,
|
||||
FormControl,
|
||||
@@ -22,6 +21,8 @@ import type { TeamGlobalSettings } from '@prisma/client';
|
||||
import { useForm } from 'react-hook-form';
|
||||
import { z } from 'zod';
|
||||
|
||||
import { FormStickySaveBar } from './form-sticky-save-bar';
|
||||
|
||||
const ZEmailPreferencesFormSchema = z.object({
|
||||
emailId: z.string().nullable(),
|
||||
emailReplyTo: zEmail().nullable(),
|
||||
@@ -59,9 +60,21 @@ export const EmailPreferencesForm = ({ settings, onFormSubmit, canInherit }: Ema
|
||||
|
||||
const emails = emailData?.data || [];
|
||||
|
||||
const handleFormSubmit = form.handleSubmit(async (data) => {
|
||||
try {
|
||||
await onFormSubmit(data);
|
||||
} catch {
|
||||
// The page handler surfaces its own error toast. Keep the form dirty so
|
||||
// the save bar stays visible and the user can retry.
|
||||
return;
|
||||
}
|
||||
|
||||
form.reset(data);
|
||||
});
|
||||
|
||||
return (
|
||||
<Form {...form}>
|
||||
<form onSubmit={form.handleSubmit(onFormSubmit)}>
|
||||
<form onSubmit={handleFormSubmit}>
|
||||
<fieldset className="flex h-full max-w-2xl flex-col gap-y-6" disabled={form.formState.isSubmitting}>
|
||||
{organisation.organisationClaim.flags.emailDomains && (
|
||||
<FormField
|
||||
@@ -203,11 +216,11 @@ export const EmailPreferencesForm = ({ settings, onFormSubmit, canInherit }: Ema
|
||||
)}
|
||||
/>
|
||||
|
||||
<div className="flex flex-row justify-end space-x-4">
|
||||
<Button type="submit" loading={form.formState.isSubmitting}>
|
||||
<Trans>Update</Trans>
|
||||
</Button>
|
||||
</div>
|
||||
<FormStickySaveBar
|
||||
isDirty={form.formState.isDirty}
|
||||
isSubmitting={form.formState.isSubmitting}
|
||||
onReset={() => form.reset()}
|
||||
/>
|
||||
</fieldset>
|
||||
</form>
|
||||
</Form>
|
||||
|
||||
@@ -0,0 +1,119 @@
|
||||
import { cn } from '@documenso/ui/lib/utils';
|
||||
import { Button } from '@documenso/ui/primitives/button';
|
||||
import { Trans, useLingui } from '@lingui/react/macro';
|
||||
import { AnimatePresence, motion } from 'framer-motion';
|
||||
import { AlertTriangleIcon } from 'lucide-react';
|
||||
import { useEffect, useRef, useState } from 'react';
|
||||
|
||||
export type FormStickySaveBarProps = {
|
||||
isDirty: boolean;
|
||||
isSubmitting: boolean;
|
||||
onReset: () => void;
|
||||
};
|
||||
|
||||
/**
|
||||
* A single `position: sticky` bar rendered at the bottom of the form.
|
||||
*
|
||||
* - When the form's end is on screen it settles into place as a plain footer (just the
|
||||
* Reset / Save buttons).
|
||||
* - When the form's end is scrolled off, it sticks to the bottom of the viewport and
|
||||
* shows the "unsaved changes" pill chrome.
|
||||
*
|
||||
* Because it's the same element in the form's flow, it auto-aligns to the form and the
|
||||
* float <-> dock hand-off is a native, scroll-linked transition (no measurement, no
|
||||
* shared-layout morph). A 1px sentinel below it detects the stuck state so we can toggle
|
||||
* the pill chrome.
|
||||
*/
|
||||
export const FormStickySaveBar = ({ isDirty, isSubmitting, onReset }: FormStickySaveBarProps) => {
|
||||
const { t } = useLingui();
|
||||
|
||||
const sentinelRef = useRef<HTMLDivElement>(null);
|
||||
const [isStuck, setIsStuck] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
const sentinel = sentinelRef.current;
|
||||
|
||||
if (!sentinel) {
|
||||
return;
|
||||
}
|
||||
|
||||
// The sentinel sits at the bar's resting position (the end of the form). While the
|
||||
// bar is stuck to the bottom of the viewport the sentinel is scrolled past (out of
|
||||
// view); once you reach the form's end it comes into view and the bar settles.
|
||||
const observer = new IntersectionObserver(
|
||||
([entry]) => {
|
||||
setIsStuck(!entry.isIntersecting);
|
||||
},
|
||||
{
|
||||
root: null,
|
||||
rootMargin: '0px 0px -24px 0px',
|
||||
threshold: 0,
|
||||
},
|
||||
);
|
||||
|
||||
observer.observe(sentinel);
|
||||
|
||||
return () => {
|
||||
observer.disconnect();
|
||||
};
|
||||
}, []);
|
||||
|
||||
// Show the floating pill chrome only when there are unsaved changes AND the form's
|
||||
// end is off screen.
|
||||
const isFloating = isDirty && isStuck;
|
||||
|
||||
return (
|
||||
<>
|
||||
<div
|
||||
data-testid="form-sticky-save-bar"
|
||||
className={cn(
|
||||
'z-40 flex min-h-9 min-w-0 items-center gap-x-2 rounded-lg py-4 transition-[margin,padding,background-color,border-color,box-shadow] duration-200 md:gap-x-4',
|
||||
isDirty ? 'sticky bottom-6' : '',
|
||||
// On mobile the docked and floating states are geometrically identical (only
|
||||
// paint changes): a horizontal bleed there overflows the narrow viewport and
|
||||
// fights the IntersectionObserver (oscillation + partial hiding). From `sm` up
|
||||
// there's room, so we restore the original chrome — the island bleeds 8px past
|
||||
// the form when floating, and the buttons sit flush with the fields when docked.
|
||||
isFloating
|
||||
? 'border border-border bg-background px-4 shadow-2xl sm:-mx-2'
|
||||
: 'border border-transparent bg-transparent px-4 shadow-none sm:px-0',
|
||||
)}
|
||||
>
|
||||
<AnimatePresence initial={false}>
|
||||
{isFloating && (
|
||||
<motion.div
|
||||
key="notice"
|
||||
role="region"
|
||||
aria-label={t`Unsaved changes`}
|
||||
initial={{ opacity: 0 }}
|
||||
animate={{ opacity: 1 }}
|
||||
exit={{ opacity: 0 }}
|
||||
transition={{ duration: 0.15 }}
|
||||
className="flex min-h-9 min-w-0 items-center gap-x-2 text-sm"
|
||||
>
|
||||
<AlertTriangleIcon className="h-5 w-5 flex-shrink-0 text-destructive" />
|
||||
<span className="font-medium text-xs md:text-sm">
|
||||
<Trans>You have unsaved changes</Trans>
|
||||
</span>
|
||||
</motion.div>
|
||||
)}
|
||||
</AnimatePresence>
|
||||
|
||||
<div className="ml-auto flex flex-shrink-0 items-center gap-x-2">
|
||||
{isDirty && (
|
||||
<Button type="button" variant="secondary" size="sm" onClick={onReset} disabled={isSubmitting}>
|
||||
<Trans>Undo</Trans>
|
||||
</Button>
|
||||
)}
|
||||
|
||||
<Button type="submit" className="shrink-0" size="sm" loading={isSubmitting} disabled={!isDirty}>
|
||||
<Trans>Save changes</Trans>
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Sentinel: detects when the sticky bar is floating (stuck) vs settled (docked). */}
|
||||
<div ref={sentinelRef} aria-hidden className="pointer-events-none h-px w-full" />
|
||||
</>
|
||||
);
|
||||
};
|
||||
@@ -4,7 +4,6 @@ import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app';
|
||||
import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error';
|
||||
import { trpc } from '@documenso/trpc/react';
|
||||
import { ZUpdateOrganisationRequestSchema } from '@documenso/trpc/server/organisation-router/update-organisation.types';
|
||||
import { Button } from '@documenso/ui/primitives/button';
|
||||
import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@documenso/ui/primitives/form/form';
|
||||
import { Input } from '@documenso/ui/primitives/input';
|
||||
import { useToast } from '@documenso/ui/primitives/use-toast';
|
||||
@@ -12,11 +11,12 @@ import { zodResolver } from '@hookform/resolvers/zod';
|
||||
import { msg } from '@lingui/core/macro';
|
||||
import { useLingui } from '@lingui/react';
|
||||
import { Trans } from '@lingui/react/macro';
|
||||
import { AnimatePresence, motion } from 'framer-motion';
|
||||
import { useForm } from 'react-hook-form';
|
||||
import { useNavigate } from 'react-router';
|
||||
import type { z } from 'zod';
|
||||
|
||||
import { FormStickySaveBar } from './form-sticky-save-bar';
|
||||
|
||||
const ZOrganisationUpdateFormSchema = ZUpdateOrganisationRequestSchema.shape.data.pick({
|
||||
name: true,
|
||||
url: true,
|
||||
@@ -137,36 +137,11 @@ export const OrganisationUpdateForm = () => {
|
||||
)}
|
||||
/>
|
||||
|
||||
<div className="flex flex-row justify-end space-x-4">
|
||||
<AnimatePresence>
|
||||
{form.formState.isDirty && (
|
||||
<motion.div
|
||||
initial={{
|
||||
opacity: 0,
|
||||
}}
|
||||
animate={{
|
||||
opacity: 1,
|
||||
}}
|
||||
exit={{
|
||||
opacity: 0,
|
||||
}}
|
||||
>
|
||||
<Button type="button" variant="secondary" onClick={() => form.reset()}>
|
||||
<Trans>Reset</Trans>
|
||||
</Button>
|
||||
</motion.div>
|
||||
)}
|
||||
</AnimatePresence>
|
||||
|
||||
<Button
|
||||
type="submit"
|
||||
className="transition-opacity"
|
||||
disabled={!form.formState.isDirty}
|
||||
loading={form.formState.isSubmitting}
|
||||
>
|
||||
<Trans>Update organisation</Trans>
|
||||
</Button>
|
||||
</div>
|
||||
<FormStickySaveBar
|
||||
isDirty={form.formState.isDirty}
|
||||
isSubmitting={form.formState.isSubmitting}
|
||||
onReset={() => form.reset()}
|
||||
/>
|
||||
</fieldset>
|
||||
</form>
|
||||
</Form>
|
||||
|
||||
@@ -2,7 +2,6 @@ import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app';
|
||||
import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error';
|
||||
import { trpc } from '@documenso/trpc/react';
|
||||
import { ZUpdateTeamRequestSchema } from '@documenso/trpc/server/team-router/update-team.types';
|
||||
import { Button } from '@documenso/ui/primitives/button';
|
||||
import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@documenso/ui/primitives/form/form';
|
||||
import { Input } from '@documenso/ui/primitives/input';
|
||||
import { useToast } from '@documenso/ui/primitives/use-toast';
|
||||
@@ -10,11 +9,12 @@ import { zodResolver } from '@hookform/resolvers/zod';
|
||||
import { msg } from '@lingui/core/macro';
|
||||
import { useLingui } from '@lingui/react';
|
||||
import { Trans } from '@lingui/react/macro';
|
||||
import { AnimatePresence, motion } from 'framer-motion';
|
||||
import { useForm } from 'react-hook-form';
|
||||
import { useNavigate } from 'react-router';
|
||||
import type { z } from 'zod';
|
||||
|
||||
import { FormStickySaveBar } from './form-sticky-save-bar';
|
||||
|
||||
export type UpdateTeamDialogProps = {
|
||||
teamId: number;
|
||||
teamName: string;
|
||||
@@ -135,36 +135,11 @@ export const TeamUpdateForm = ({ teamId, teamName, teamUrl }: UpdateTeamDialogPr
|
||||
)}
|
||||
/>
|
||||
|
||||
<div className="flex flex-row justify-end space-x-4">
|
||||
<AnimatePresence>
|
||||
{form.formState.isDirty && (
|
||||
<motion.div
|
||||
initial={{
|
||||
opacity: 0,
|
||||
}}
|
||||
animate={{
|
||||
opacity: 1,
|
||||
}}
|
||||
exit={{
|
||||
opacity: 0,
|
||||
}}
|
||||
>
|
||||
<Button type="button" variant="secondary" onClick={() => form.reset()}>
|
||||
<Trans>Reset</Trans>
|
||||
</Button>
|
||||
</motion.div>
|
||||
)}
|
||||
</AnimatePresence>
|
||||
|
||||
<Button
|
||||
type="submit"
|
||||
className="transition-opacity"
|
||||
disabled={!form.formState.isDirty}
|
||||
loading={form.formState.isSubmitting}
|
||||
>
|
||||
<Trans>Update team</Trans>
|
||||
</Button>
|
||||
</div>
|
||||
<FormStickySaveBar
|
||||
isDirty={form.formState.isDirty}
|
||||
isSubmitting={form.formState.isSubmitting}
|
||||
onReset={() => form.reset()}
|
||||
/>
|
||||
</fieldset>
|
||||
</form>
|
||||
</Form>
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
import { Button } from '@documenso/ui/primitives/button';
|
||||
import { Trans, useLingui } from '@lingui/react/macro';
|
||||
import { FolderInputIcon, Trash2Icon, XCircleIcon, XIcon } from 'lucide-react';
|
||||
import { DownloadIcon, FolderInputIcon, Trash2Icon, XCircleIcon, XIcon } from 'lucide-react';
|
||||
import { useEffect } from 'react';
|
||||
|
||||
export type EnvelopesTableBulkActionBarProps = {
|
||||
selectedCount: number;
|
||||
onDownloadClick?: () => void;
|
||||
onMoveClick: () => void;
|
||||
onDeleteClick: () => void;
|
||||
onCancelClick?: () => void;
|
||||
@@ -12,6 +14,7 @@ export type EnvelopesTableBulkActionBarProps = {
|
||||
|
||||
export const EnvelopesTableBulkActionBar = ({
|
||||
selectedCount,
|
||||
onDownloadClick,
|
||||
onMoveClick,
|
||||
onDeleteClick,
|
||||
onCancelClick,
|
||||
@@ -19,37 +22,103 @@ export const EnvelopesTableBulkActionBar = ({
|
||||
}: EnvelopesTableBulkActionBarProps) => {
|
||||
const { t } = useLingui();
|
||||
|
||||
useEffect(() => {
|
||||
if (selectedCount === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
const onKeyDown = (event: KeyboardEvent) => {
|
||||
if (event.key === 'Escape') {
|
||||
onClearSelection();
|
||||
}
|
||||
};
|
||||
|
||||
window.addEventListener('keydown', onKeyDown);
|
||||
return () => window.removeEventListener('keydown', onKeyDown);
|
||||
}, [selectedCount, onClearSelection]);
|
||||
|
||||
if (selectedCount === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="fixed bottom-4 left-1/2 z-50 flex -translate-x-1/2 items-center gap-x-4 rounded-lg border border-border bg-background px-4 py-3 shadow-lg">
|
||||
<span className="font-medium text-sm">
|
||||
<Trans>{selectedCount} selected</Trans>
|
||||
</span>
|
||||
<div className="fixed bottom-6 left-1/2 z-50 flex -translate-x-1/2 items-center gap-x-1 rounded-xl bg-popover p-1.5 text-popover-foreground shadow-lg ring-1 ring-black/10 dark:ring-white/10">
|
||||
<div className="flex items-center gap-x-2 px-2">
|
||||
<span className="sr-only" aria-live="polite">
|
||||
<Trans>{selectedCount} selected</Trans>
|
||||
</span>
|
||||
<span
|
||||
aria-hidden="true"
|
||||
className="flex h-5 min-w-5 items-center justify-center rounded-md bg-primary px-1 font-semibold text-primary-foreground text-xs tabular-nums"
|
||||
>
|
||||
{selectedCount}
|
||||
</span>
|
||||
<span aria-hidden="true" className="font-medium text-foreground text-sm max-[420px]:hidden">
|
||||
<Trans>selected</Trans>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div className="h-6 w-px bg-border" />
|
||||
<div className="mx-1 h-5 w-px bg-border" />
|
||||
|
||||
<Button type="button" variant="outline" size="sm" onClick={onMoveClick}>
|
||||
<FolderInputIcon className="mr-2 h-4 w-4" />
|
||||
<Trans>Move to Folder</Trans>
|
||||
<Button
|
||||
type="button"
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
onClick={onMoveClick}
|
||||
className="h-8 gap-x-1.5 py-1.5 pr-2.5 pl-2"
|
||||
>
|
||||
<FolderInputIcon className="size-4 shrink-0" />
|
||||
<Trans>Move</Trans>
|
||||
</Button>
|
||||
|
||||
{onDownloadClick && (
|
||||
<Button
|
||||
type="button"
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
onClick={onDownloadClick}
|
||||
className="h-8 gap-x-1.5 py-1.5 pr-2.5 pl-2"
|
||||
>
|
||||
<DownloadIcon className="size-4 shrink-0" />
|
||||
<Trans>Download</Trans>
|
||||
</Button>
|
||||
)}
|
||||
|
||||
{onCancelClick && (
|
||||
<Button type="button" variant="outline" size="sm" onClick={onCancelClick}>
|
||||
<XCircleIcon className="mr-2 h-4 w-4" />
|
||||
<Button
|
||||
type="button"
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
onClick={onCancelClick}
|
||||
className="h-8 gap-x-1.5 py-1.5 pr-2.5 pl-2"
|
||||
>
|
||||
<XCircleIcon className="size-4 shrink-0" />
|
||||
<Trans>Cancel</Trans>
|
||||
</Button>
|
||||
)}
|
||||
|
||||
<Button type="button" variant="destructive" size="sm" onClick={onDeleteClick}>
|
||||
<Trash2Icon className="mr-2 h-4 w-4" />
|
||||
<Button
|
||||
type="button"
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
onClick={onDeleteClick}
|
||||
className="h-8 gap-x-1.5 py-1.5 pr-2.5 pl-2 text-destructive hover:bg-destructive/10 hover:text-destructive"
|
||||
>
|
||||
<Trash2Icon className="size-4 shrink-0" />
|
||||
<Trans>Delete</Trans>
|
||||
</Button>
|
||||
|
||||
<Button variant="ghost" size="sm" onClick={onClearSelection} aria-label={t`Clear selection`}>
|
||||
<XIcon className="h-4 w-4" />
|
||||
<div className="mx-1 h-5 w-px bg-border" />
|
||||
|
||||
<Button
|
||||
type="button"
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
onClick={onClearSelection}
|
||||
aria-label={t`Clear selection`}
|
||||
className="h-8 w-8 p-0"
|
||||
>
|
||||
<XIcon className="size-4 shrink-0" />
|
||||
</Button>
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -104,6 +104,9 @@ export default function OrganisationSettingsBrandingPage() {
|
||||
description: t`We were unable to update your branding preferences at this time, please try again later`,
|
||||
variant: 'destructive',
|
||||
});
|
||||
|
||||
// Rethrow so the form knows the save failed and keeps the unsaved changes.
|
||||
throw err;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -105,6 +105,8 @@ export default function OrganisationSettingsDocumentPage() {
|
||||
description: t`We were unable to update your document preferences at this time, please try again later`,
|
||||
variant: 'destructive',
|
||||
});
|
||||
|
||||
throw err;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -49,6 +49,8 @@ export default function OrganisationSettingsGeneral() {
|
||||
description: t`We were unable to update your email preferences at this time, please try again later`,
|
||||
variant: 'destructive',
|
||||
});
|
||||
|
||||
throw err;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -14,13 +14,19 @@ import type { RowSelectionState } from '@documenso/ui/primitives/data-table';
|
||||
import { Tabs, TabsList, TabsTrigger } from '@documenso/ui/primitives/tabs';
|
||||
import { msg } from '@lingui/core/macro';
|
||||
import { Trans } from '@lingui/react/macro';
|
||||
import { EnvelopeType, FolderType, OrganisationType } from '@prisma/client';
|
||||
import {
|
||||
EnvelopeType,
|
||||
FolderType,
|
||||
OrganisationType,
|
||||
type DocumentStatus as PrismaDocumentStatus,
|
||||
} from '@prisma/client';
|
||||
import { useEffect, useMemo, useState } from 'react';
|
||||
import { Link, useNavigate, useParams, useSearchParams } from 'react-router';
|
||||
import { z } from 'zod';
|
||||
|
||||
import { EnvelopesBulkCancelDialog } from '~/components/dialogs/envelopes-bulk-cancel-dialog';
|
||||
import { EnvelopesBulkDeleteDialog } from '~/components/dialogs/envelopes-bulk-delete-dialog';
|
||||
import { EnvelopesBulkDownloadDialog } from '~/components/dialogs/envelopes-bulk-download-dialog';
|
||||
import { EnvelopesBulkMoveDialog } from '~/components/dialogs/envelopes-bulk-move-dialog';
|
||||
import { DocumentSearch } from '~/components/general/document/document-search';
|
||||
import { DocumentStatus } from '~/components/general/document/document-status';
|
||||
@@ -62,8 +68,12 @@ export default function DocumentsPage() {
|
||||
const [documentToMove, setDocumentToMove] = useState<string | null>(null);
|
||||
|
||||
const [rowSelection, setRowSelection] = useSessionStorage<RowSelectionState>('documents-bulk-selection', {});
|
||||
const [envelopeMetaCache, setEnvelopeMetaCache] = useSessionStorage<
|
||||
Record<string, { title: string; status: PrismaDocumentStatus }>
|
||||
>('documents-bulk-selection-meta', {});
|
||||
const [isBulkMoveDialogOpen, setIsBulkMoveDialogOpen] = useState(false);
|
||||
const [isBulkDeleteDialogOpen, setIsBulkDeleteDialogOpen] = useState(false);
|
||||
const [isBulkDownloadDialogOpen, setIsBulkDownloadDialogOpen] = useState(false);
|
||||
const [isBulkCancelDialogOpen, setIsBulkCancelDialogOpen] = useState(false);
|
||||
|
||||
const selectedEnvelopeIds = useMemo(() => {
|
||||
@@ -95,6 +105,38 @@ export default function DocumentsPage() {
|
||||
},
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
setEnvelopeMetaCache((prev) => {
|
||||
const next: Record<string, { title: string; status: PrismaDocumentStatus }> = {};
|
||||
|
||||
for (const id of Object.keys(prev)) {
|
||||
if (rowSelection[id]) {
|
||||
next[id] = prev[id];
|
||||
}
|
||||
}
|
||||
|
||||
for (const document of data?.data ?? []) {
|
||||
if (rowSelection[document.envelopeId]) {
|
||||
next[document.envelopeId] = {
|
||||
title: document.title,
|
||||
status: document.status,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
return next;
|
||||
});
|
||||
}, [data?.data, rowSelection, setEnvelopeMetaCache]);
|
||||
|
||||
const selectedEnvelopesForDownload = useMemo(() => {
|
||||
return selectedEnvelopeIds
|
||||
.map((id) => {
|
||||
const meta = envelopeMetaCache[id];
|
||||
return meta ? { id, title: meta.title, status: meta.status } : null;
|
||||
})
|
||||
.filter((item): item is { id: string; title: string; status: PrismaDocumentStatus } => item !== null);
|
||||
}, [selectedEnvelopeIds, envelopeMetaCache]);
|
||||
|
||||
const getTabHref = (value: keyof typeof ExtendedDocumentStatus) => {
|
||||
const params = new URLSearchParams(searchParams);
|
||||
|
||||
@@ -235,12 +277,28 @@ export default function DocumentsPage() {
|
||||
|
||||
<EnvelopesTableBulkActionBar
|
||||
selectedCount={selectedEnvelopeIds.length}
|
||||
onDownloadClick={() => setIsBulkDownloadDialogOpen(true)}
|
||||
onMoveClick={() => setIsBulkMoveDialogOpen(true)}
|
||||
onDeleteClick={() => setIsBulkDeleteDialogOpen(true)}
|
||||
onCancelClick={() => setIsBulkCancelDialogOpen(true)}
|
||||
onClearSelection={() => setRowSelection({})}
|
||||
/>
|
||||
|
||||
<EnvelopesBulkDownloadDialog
|
||||
envelopes={selectedEnvelopesForDownload}
|
||||
open={isBulkDownloadDialogOpen}
|
||||
onOpenChange={setIsBulkDownloadDialogOpen}
|
||||
onSuccess={(successfulEnvelopeIds) => {
|
||||
setRowSelection((prev) => {
|
||||
const next = { ...prev };
|
||||
for (const id of successfulEnvelopeIds) {
|
||||
delete next[id];
|
||||
}
|
||||
return next;
|
||||
});
|
||||
}}
|
||||
/>
|
||||
|
||||
<EnvelopesBulkMoveDialog
|
||||
envelopeIds={selectedEnvelopeIds}
|
||||
envelopeType={EnvelopeType.DOCUMENT}
|
||||
|
||||
@@ -99,6 +99,9 @@ export default function TeamsSettingsPage() {
|
||||
description: t`We were unable to update your branding preferences at this time, please try again later`,
|
||||
variant: 'destructive',
|
||||
});
|
||||
|
||||
// Rethrow so the form knows the save failed and keeps the unsaved changes.
|
||||
throw err;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -96,6 +96,8 @@ export default function TeamsSettingsPage() {
|
||||
description: t`We were unable to update your document preferences at this time, please try again later`,
|
||||
variant: 'destructive',
|
||||
});
|
||||
|
||||
throw err;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -49,6 +49,8 @@ export default function TeamEmailSettingsGeneral() {
|
||||
description: t`We were unable to update your email preferences at this time, please try again later`,
|
||||
variant: 'destructive',
|
||||
});
|
||||
|
||||
throw err;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Generated
+4
-4
@@ -15,7 +15,7 @@
|
||||
"dependencies": {
|
||||
"@ai-sdk/google-vertex": "3.0.81",
|
||||
"@documenso/prisma": "*",
|
||||
"@libpdf/core": "^0.4.0",
|
||||
"@libpdf/core": "^0.4.1",
|
||||
"@lingui/conf": "^5.6.0",
|
||||
"@lingui/core": "^5.6.0",
|
||||
"@marsidev/react-turnstile": "^1.5.0",
|
||||
@@ -4661,9 +4661,9 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@libpdf/core": {
|
||||
"version": "0.4.0",
|
||||
"resolved": "https://registry.npmjs.org/@libpdf/core/-/core-0.4.0.tgz",
|
||||
"integrity": "sha512-G9nZRjf9DGDJaS/C23YWogk8akPM7O/6HfMslxVsKTKRbbbb+0szpQIetcGGUGRu7KtmBDmGDWCgz//DXSmq8A==",
|
||||
"version": "0.4.1",
|
||||
"resolved": "https://registry.npmjs.org/@libpdf/core/-/core-0.4.1.tgz",
|
||||
"integrity": "sha512-DWGxWw1na8oFPixz+b6kOgu4tMD8xJLDgyPGVUNqIswO5POHAxsqmTvUvDW0IrwHP7kFRHBV3I3T/KhTABf9rA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@noble/ciphers": "^2.2.0",
|
||||
|
||||
+1
-1
@@ -87,7 +87,7 @@
|
||||
"dependencies": {
|
||||
"@ai-sdk/google-vertex": "3.0.81",
|
||||
"@documenso/prisma": "*",
|
||||
"@libpdf/core": "^0.4.0",
|
||||
"@libpdf/core": "^0.4.1",
|
||||
"@lingui/conf": "^5.6.0",
|
||||
"@lingui/core": "^5.6.0",
|
||||
"@prisma/extension-read-replicas": "^0.4.1",
|
||||
|
||||
@@ -526,7 +526,7 @@ test('[ADMIN]: verify organisation access after ownership change', async ({ page
|
||||
// Should be able to access organisation settings
|
||||
await expect(page.getByText('Organisation Settings')).toBeVisible();
|
||||
await expect(page.getByLabel('Organisation Name*')).toBeVisible();
|
||||
await expect(page.getByRole('button', { name: 'Update organisation' })).toBeVisible();
|
||||
await expect(page.getByLabel('Organisation Name*')).toBeEnabled();
|
||||
|
||||
// Should have delete permissions
|
||||
await expect(page.getByRole('button', { name: 'Delete' })).toBeVisible();
|
||||
|
||||
@@ -3,7 +3,7 @@ import { seedCompletedDocument, seedDraftDocument, seedPendingDocument } from '@
|
||||
import { seedBlankFolder } from '@documenso/prisma/seed/folders';
|
||||
import { seedTeam, seedTeamMember } from '@documenso/prisma/seed/teams';
|
||||
import { seedUser } from '@documenso/prisma/seed/users';
|
||||
import { expect, test } from '@playwright/test';
|
||||
import { type Download, expect, test } from '@playwright/test';
|
||||
import { DocumentStatus, TeamMemberRole } from '@prisma/client';
|
||||
|
||||
import { apiSignin, apiSignout } from '../fixtures/authentication';
|
||||
@@ -50,10 +50,10 @@ test('[BULK_ACTIONS]: can select multiple documents with checkboxes', async ({ p
|
||||
});
|
||||
|
||||
await page.locator('tr', { hasText: 'Bulk Test Doc 1' }).getByRole('checkbox').click();
|
||||
await expect(page.getByText('1 selected')).toBeVisible();
|
||||
await expect(page.getByText(/1\s*selected/)).toBeVisible();
|
||||
|
||||
await page.locator('tr', { hasText: 'Bulk Test Doc 2' }).getByRole('checkbox').click();
|
||||
await expect(page.getByText('2 selected')).toBeVisible();
|
||||
await expect(page.getByText(/2\s*selected/)).toBeVisible();
|
||||
});
|
||||
|
||||
test('[BULK_ACTIONS]: header checkbox selects all documents on page', async ({ page }) => {
|
||||
@@ -67,7 +67,7 @@ test('[BULK_ACTIONS]: header checkbox selects all documents on page', async ({ p
|
||||
|
||||
await page.locator('thead').getByRole('checkbox').click();
|
||||
|
||||
await expect(page.getByText(`${documents.length} selected`)).toBeVisible();
|
||||
await expect(page.getByText(new RegExp(`${documents.length}\\s*selected`))).toBeVisible();
|
||||
});
|
||||
|
||||
test('[BULK_ACTIONS]: can clear selection with X button', async ({ page }) => {
|
||||
@@ -80,11 +80,11 @@ test('[BULK_ACTIONS]: can clear selection with X button', async ({ page }) => {
|
||||
});
|
||||
|
||||
await page.locator('thead').getByRole('checkbox').click();
|
||||
await expect(page.getByText(/\d+ selected/)).toBeVisible();
|
||||
await expect(page.getByText(/\d+\s*selected/)).toBeVisible();
|
||||
|
||||
await page.getByLabel('Clear selection').click();
|
||||
|
||||
await expect(page.getByText(/\d+ selected/)).not.toBeVisible();
|
||||
await expect(page.getByText(/\d+\s*selected/)).not.toBeVisible();
|
||||
});
|
||||
|
||||
test('[BULK_ACTIONS]: can move multiple documents to a folder', async ({ page }) => {
|
||||
@@ -98,13 +98,13 @@ test('[BULK_ACTIONS]: can move multiple documents to a folder', async ({ page })
|
||||
|
||||
await page.locator('tr', { hasText: 'Bulk Test Doc 1' }).getByRole('checkbox').click();
|
||||
await page.locator('tr', { hasText: 'Bulk Test Doc 2' }).getByRole('checkbox').click();
|
||||
await page.getByRole('button', { name: 'Move to Folder' }).click();
|
||||
await page.getByRole('button', { name: 'Move', exact: true }).click();
|
||||
|
||||
await expect(page.getByRole('dialog')).toBeVisible();
|
||||
await expect(page.getByText('Move Documents to Folder')).toBeVisible();
|
||||
|
||||
await page.getByRole('button', { name: folder.name }).click();
|
||||
await page.getByRole('button', { name: 'Move' }).click();
|
||||
await page.getByRole('dialog').getByRole('button', { name: 'Move' }).click();
|
||||
|
||||
await expectToastTextToBeVisible(page, 'Selected items have been moved.');
|
||||
|
||||
@@ -113,6 +113,43 @@ test('[BULK_ACTIONS]: can move multiple documents to a folder', async ({ page })
|
||||
await expect(page.getByRole('link', { name: 'Bulk Test Doc 2' })).toBeVisible();
|
||||
});
|
||||
|
||||
test('[BULK_ACTIONS]: can bulk download multiple documents', async ({ page }) => {
|
||||
const { sender } = await seedBulkActionsTestRequirements();
|
||||
|
||||
await apiSignin({
|
||||
page,
|
||||
email: sender.user.email,
|
||||
redirectPath: `/t/${sender.team.url}/documents`,
|
||||
});
|
||||
|
||||
await page.locator('tr', { hasText: 'Bulk Test Doc 1' }).getByRole('checkbox').click();
|
||||
await page.locator('tr', { hasText: 'Bulk Test Doc 2' }).getByRole('checkbox').click();
|
||||
|
||||
await page.getByRole('button', { name: 'Download', exact: true }).click();
|
||||
|
||||
const dialog = page.getByRole('dialog');
|
||||
|
||||
await expect(dialog).toBeVisible();
|
||||
await expect(dialog.getByText('Download Documents')).toBeVisible();
|
||||
await expect(dialog.getByText('Bulk Test Doc 1')).toBeVisible();
|
||||
await expect(dialog.getByText('Bulk Test Doc 2')).toBeVisible();
|
||||
await expect(dialog.getByText('Draft').first()).toBeVisible();
|
||||
|
||||
const downloads: Download[] = [];
|
||||
page.on('download', (d) => downloads.push(d));
|
||||
|
||||
await dialog.getByRole('button', { name: 'Download' }).click();
|
||||
|
||||
await expect.poll(() => downloads.length, { timeout: 10_000 }).toBe(2);
|
||||
|
||||
expect(downloads.map((d) => d.suggestedFilename())).toEqual(
|
||||
expect.arrayContaining(['Bulk Test Doc 1.pdf', 'Bulk Test Doc 2.pdf']),
|
||||
);
|
||||
|
||||
await expectToastTextToBeVisible(page, 'Documents downloaded');
|
||||
await expect(page.getByText(/\d+\s*selected/)).not.toBeVisible();
|
||||
});
|
||||
|
||||
test('[BULK_ACTIONS]: can delete multiple draft documents', async ({ page }) => {
|
||||
const { sender } = await seedBulkActionsTestRequirements();
|
||||
|
||||
@@ -152,14 +189,14 @@ test('[BULK_ACTIONS]: selection clears after successful move', async ({ page })
|
||||
});
|
||||
|
||||
await page.locator('tr', { hasText: 'Bulk Test Doc 1' }).getByRole('checkbox').click();
|
||||
await expect(page.getByText('1 selected')).toBeVisible();
|
||||
await expect(page.getByText(/1\s*selected/)).toBeVisible();
|
||||
|
||||
await page.getByRole('button', { name: 'Move to Folder' }).click();
|
||||
await page.getByRole('button', { name: 'Move', exact: true }).click();
|
||||
await page.getByRole('button', { name: folder.name }).click();
|
||||
await page.getByRole('button', { name: 'Move' }).click();
|
||||
await page.getByRole('dialog').getByRole('button', { name: 'Move' }).click();
|
||||
|
||||
await expectToastTextToBeVisible(page, 'Selected items have been moved.');
|
||||
await expect(page.getByText(/\d+ selected/)).not.toBeVisible();
|
||||
await expect(page.getByText(/\d+\s*selected/)).not.toBeVisible();
|
||||
});
|
||||
|
||||
test('[BULK_ACTIONS]: selection clears after successful delete', async ({ page }) => {
|
||||
@@ -172,13 +209,13 @@ test('[BULK_ACTIONS]: selection clears after successful delete', async ({ page }
|
||||
});
|
||||
|
||||
await page.locator('tr', { hasText: 'Bulk Test Doc 1' }).getByRole('checkbox').click();
|
||||
await expect(page.getByText('1 selected')).toBeVisible();
|
||||
await expect(page.getByText(/1\s*selected/)).toBeVisible();
|
||||
|
||||
await page.getByRole('button', { name: 'Delete' }).click();
|
||||
await page.getByRole('dialog').getByRole('button', { name: 'Delete' }).click();
|
||||
|
||||
await expectToastTextToBeVisible(page, 'Documents deleted');
|
||||
await expect(page.getByText(/\d+ selected/)).not.toBeVisible();
|
||||
await expect(page.getByText(/\d+\s*selected/)).not.toBeVisible();
|
||||
});
|
||||
|
||||
test('[BULK_ACTIONS]: can search for folders in move dialog', async ({ page }) => {
|
||||
@@ -199,7 +236,7 @@ test('[BULK_ACTIONS]: can search for folders in move dialog', async ({ page }) =
|
||||
|
||||
await page.locator('tr', { hasText: 'Bulk Test Doc 1' }).getByRole('checkbox').click();
|
||||
|
||||
await page.getByRole('button', { name: 'Move to Folder' }).click();
|
||||
await page.getByRole('button', { name: 'Move', exact: true }).click();
|
||||
await expect(page.getByRole('dialog')).toBeVisible();
|
||||
|
||||
await expect(page.getByRole('button', { name: folder.name })).toBeVisible();
|
||||
@@ -236,14 +273,14 @@ test('[BULK_ACTIONS]: can move documents from folder to home (root)', async ({ p
|
||||
await expect(page.getByRole('link', { name: 'Bulk Test Doc 1' })).toBeVisible();
|
||||
|
||||
await page.locator('tr', { hasText: 'Bulk Test Doc 1' }).getByRole('checkbox').click();
|
||||
await expect(page.getByText('1 selected')).toBeVisible();
|
||||
await expect(page.getByText(/1\s*selected/)).toBeVisible();
|
||||
|
||||
await page.getByRole('button', { name: 'Move to Folder' }).click();
|
||||
await page.getByRole('button', { name: 'Move', exact: true }).click();
|
||||
await expect(page.getByRole('dialog')).toBeVisible();
|
||||
|
||||
await page.getByRole('button', { name: 'Home (No Folder)' }).click();
|
||||
|
||||
await page.getByRole('button', { name: 'Move' }).click();
|
||||
await page.getByRole('dialog').getByRole('button', { name: 'Move' }).click();
|
||||
|
||||
await expectToastTextToBeVisible(page, 'Selected items have been moved.');
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ test('[ENVELOPE_EXPIRATION]: set custom expiration period at organisation level'
|
||||
});
|
||||
|
||||
// Wait for the form to load.
|
||||
await expect(page.getByRole('button', { name: 'Update' }).first()).toBeVisible();
|
||||
await expect(page.getByTestId('document-language-trigger')).toBeVisible();
|
||||
|
||||
// Change the amount to 2.
|
||||
const amountInput = page.getByTestId('envelope-expiration-amount');
|
||||
@@ -35,7 +35,7 @@ test('[ENVELOPE_EXPIRATION]: set custom expiration period at organisation level'
|
||||
await unitTrigger.click();
|
||||
await page.getByRole('option', { name: 'Weeks' }).click();
|
||||
|
||||
await page.getByRole('button', { name: 'Update' }).first().click();
|
||||
await page.getByRole('button', { name: 'Save changes' }).first().click();
|
||||
await expect(page.getByText('Your document preferences have been updated').first()).toBeVisible();
|
||||
|
||||
// Verify via database.
|
||||
@@ -57,14 +57,14 @@ test('[ENVELOPE_EXPIRATION]: disable expiration at organisation level', async ({
|
||||
redirectPath: `/o/${organisation.url}/settings/document`,
|
||||
});
|
||||
|
||||
await expect(page.getByRole('button', { name: 'Update' }).first()).toBeVisible();
|
||||
await expect(page.getByTestId('document-language-trigger')).toBeVisible();
|
||||
|
||||
// Find the mode select (shows "Custom duration") and change to "Never expires".
|
||||
const modeTrigger = page.getByTestId('envelope-expiration-mode');
|
||||
await modeTrigger.click();
|
||||
await page.getByRole('option', { name: 'Never expires' }).click();
|
||||
|
||||
await page.getByRole('button', { name: 'Update' }).first().click();
|
||||
await page.getByRole('button', { name: 'Save changes' }).first().click();
|
||||
await expect(page.getByText('Your document preferences have been updated').first()).toBeVisible();
|
||||
|
||||
// Verify via database.
|
||||
@@ -109,7 +109,7 @@ test('[ENVELOPE_EXPIRATION]: team overrides organisation expiration', async ({ p
|
||||
redirectPath: `/t/${team.url}/settings/document`,
|
||||
});
|
||||
|
||||
await expect(page.getByRole('button', { name: 'Update' }).first()).toBeVisible();
|
||||
await expect(page.getByTestId('document-language-trigger')).toBeVisible();
|
||||
|
||||
// The expiration picker mode select should show "Inherit from organisation" by default.
|
||||
const modeTrigger = page.getByTestId('envelope-expiration-mode');
|
||||
@@ -128,7 +128,7 @@ test('[ENVELOPE_EXPIRATION]: team overrides organisation expiration', async ({ p
|
||||
await unitTrigger.click();
|
||||
await page.getByRole('option', { name: 'Days' }).click();
|
||||
|
||||
await page.getByRole('button', { name: 'Update' }).first().click();
|
||||
await page.getByRole('button', { name: 'Save changes' }).first().click();
|
||||
await expect(page.getByText('Your document preferences have been updated').first()).toBeVisible();
|
||||
|
||||
// Verify team setting is overridden.
|
||||
|
||||
@@ -324,10 +324,7 @@ test.describe('Signing Certificate Tests', () => {
|
||||
.click();
|
||||
await page.getByRole('option', { name: 'No' }).click();
|
||||
|
||||
await page
|
||||
.getByRole('button', { name: /Update/ })
|
||||
.first()
|
||||
.click();
|
||||
await page.getByRole('button', { name: 'Save changes' }).first().click();
|
||||
|
||||
await page.waitForTimeout(1000);
|
||||
|
||||
@@ -347,10 +344,7 @@ test.describe('Signing Certificate Tests', () => {
|
||||
.getByRole('combobox')
|
||||
.click();
|
||||
await page.getByRole('option', { name: 'Yes' }).click();
|
||||
await page
|
||||
.getByRole('button', { name: /Update/ })
|
||||
.first()
|
||||
.click();
|
||||
await page.getByRole('button', { name: 'Save changes' }).first().click();
|
||||
|
||||
await page.waitForTimeout(1000);
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@ test('[ORGANISATIONS]: manage general settings', async ({ page }) => {
|
||||
await page.getByLabel('Organisation URL*').clear();
|
||||
await page.getByLabel('Organisation URL*').fill(updatedOrganisationId);
|
||||
|
||||
await page.getByRole('button', { name: 'Update organisation' }).click();
|
||||
await page.getByRole('button', { name: 'Save changes' }).click();
|
||||
|
||||
// Check we have been redirected to the new organisation URL and the name is updated.
|
||||
await page.waitForURL(`/o/${updatedOrganisationId}/settings/general`);
|
||||
|
||||
@@ -39,7 +39,7 @@ test('[ORGANISATIONS]: manage document preferences', async ({ page }) => {
|
||||
await page.getByRole('option', { name: 'No' }).click();
|
||||
await page.getByTestId('include-signing-certificate-trigger').click();
|
||||
await page.getByRole('option', { name: 'No' }).click();
|
||||
await page.getByRole('button', { name: 'Update' }).first().click();
|
||||
await page.getByRole('button', { name: 'Save changes' }).first().click();
|
||||
await expect(page.getByText('Your document preferences have been updated').first()).toBeVisible();
|
||||
|
||||
const teamSettings = await getTeamSettings({
|
||||
@@ -73,7 +73,7 @@ test('[ORGANISATIONS]: manage document preferences', async ({ page }) => {
|
||||
await page.getByTestId('document-date-format-trigger').click();
|
||||
await page.getByRole('option', { name: 'MM/DD/YYYY', exact: true }).click();
|
||||
|
||||
await page.getByRole('button', { name: 'Update' }).first().click();
|
||||
await page.getByRole('button', { name: 'Save changes' }).first().click();
|
||||
await expect(page.getByText('Your document preferences have been updated').first()).toBeVisible();
|
||||
|
||||
const updatedTeamSettings = await getTeamSettings({
|
||||
@@ -128,7 +128,7 @@ test('[ORGANISATIONS]: manage branding preferences', async ({ page }) => {
|
||||
await page.getByRole('textbox', { name: 'Brand Website' }).fill('https://documenso.com');
|
||||
await page.getByRole('textbox', { name: 'Brand Details' }).click();
|
||||
await page.getByRole('textbox', { name: 'Brand Details' }).fill('BrandDetails');
|
||||
await page.getByRole('button', { name: 'Update' }).first().click();
|
||||
await page.getByRole('button', { name: 'Save changes' }).first().click();
|
||||
await expect(page.getByText('Your branding preferences have been updated').first()).toBeVisible();
|
||||
|
||||
const teamSettings = await getTeamSettings({
|
||||
@@ -150,7 +150,7 @@ test('[ORGANISATIONS]: manage branding preferences', async ({ page }) => {
|
||||
await page.getByRole('textbox', { name: 'Brand Website' }).fill('https://example.com');
|
||||
await page.getByRole('textbox', { name: 'Brand Details' }).click();
|
||||
await page.getByRole('textbox', { name: 'Brand Details' }).fill('UpdatedBrandDetails');
|
||||
await page.getByRole('button', { name: 'Update' }).first().click();
|
||||
await page.getByRole('button', { name: 'Save changes' }).first().click();
|
||||
await expect(page.getByText('Your branding preferences have been updated').first()).toBeVisible();
|
||||
|
||||
const updatedTeamSettings = await getTeamSettings({
|
||||
@@ -165,7 +165,7 @@ test('[ORGANISATIONS]: manage branding preferences', async ({ page }) => {
|
||||
// Test inheritance by setting team back to inherit from organisation
|
||||
await page.getByTestId('enable-branding').click();
|
||||
await page.getByRole('option', { name: 'Inherit from organisation' }).click();
|
||||
await page.getByRole('button', { name: 'Update' }).first().click();
|
||||
await page.getByRole('button', { name: 'Save changes' }).first().click();
|
||||
await expect(page.getByText('Your branding preferences have been updated').first()).toBeVisible();
|
||||
|
||||
await page.waitForTimeout(2000);
|
||||
@@ -208,7 +208,7 @@ test('[ORGANISATIONS]: manage email preferences', async ({ page }) => {
|
||||
await page.getByRole('checkbox', { name: 'Email the signer if the document is still pending' }).uncheck();
|
||||
await page.getByRole('checkbox', { name: 'Email recipients when a pending document is deleted' }).uncheck();
|
||||
|
||||
await page.getByRole('button', { name: 'Update' }).first().click();
|
||||
await page.getByRole('button', { name: 'Save changes' }).first().click();
|
||||
await expect(page.getByText('Your email preferences have been updated').first()).toBeVisible();
|
||||
|
||||
const teamSettings = await getTeamSettings({
|
||||
@@ -245,7 +245,7 @@ test('[ORGANISATIONS]: manage email preferences', async ({ page }) => {
|
||||
await page.getByRole('checkbox', { name: 'Email recipients when the document is completed', exact: true }).uncheck();
|
||||
await page.getByRole('checkbox', { name: 'Email the owner when the document is completed' }).uncheck();
|
||||
|
||||
await page.getByRole('button', { name: 'Update' }).first().click();
|
||||
await page.getByRole('button', { name: 'Save changes' }).first().click();
|
||||
await expect(page.getByText('Your email preferences have been updated').first()).toBeVisible();
|
||||
|
||||
const updatedTeamSettings = await getTeamSettings({
|
||||
@@ -292,7 +292,7 @@ test('[ORGANISATIONS]: manage email preferences', async ({ page }) => {
|
||||
await page.getByRole('textbox', { name: 'Reply to email' }).fill('');
|
||||
await page.getByRole('combobox').filter({ hasText: 'Override organisation settings' }).click();
|
||||
await page.getByRole('option', { name: 'Inherit from organisation' }).click();
|
||||
await page.getByRole('button', { name: 'Update' }).first().click();
|
||||
await page.getByRole('button', { name: 'Save changes' }).first().click();
|
||||
await expect(page.getByText('Your email preferences have been updated').first()).toBeVisible();
|
||||
|
||||
await page.waitForTimeout(1000);
|
||||
|
||||
@@ -66,7 +66,7 @@ test('[TEAMS]: update team', async ({ page }) => {
|
||||
await page.getByLabel('Team URL*').clear();
|
||||
await page.getByLabel('Team URL*').fill(updatedTeamId);
|
||||
|
||||
await page.getByRole('button', { name: 'Update team' }).click();
|
||||
await page.getByRole('button', { name: 'Save changes' }).click();
|
||||
|
||||
// Check we have been redirected to the new team URL and the name is updated.
|
||||
await page.waitForURL(`${NEXT_PUBLIC_WEBAPP_URL()}/t/${updatedTeamId}/settings`);
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
import { seedUser } from '@documenso/prisma/seed/users';
|
||||
import { expect, test } from '@playwright/test';
|
||||
|
||||
import { apiSignin } from '../fixtures/authentication';
|
||||
|
||||
test('[TEAMS]: settings save bar docks at the bottom of the form', async ({ page }) => {
|
||||
const { user, team } = await seedUser();
|
||||
|
||||
await apiSignin({
|
||||
page,
|
||||
email: user.email,
|
||||
redirectPath: `/t/${team.url}/settings`,
|
||||
});
|
||||
|
||||
await expect(page.getByLabel('Team Name*')).toBeVisible();
|
||||
|
||||
const saveButton = page.getByRole('button', { name: 'Save changes' });
|
||||
|
||||
// Pristine: the docked Save button is present but disabled; no Undo, no floating notice.
|
||||
await expect(saveButton).toBeVisible();
|
||||
await expect(saveButton).toBeDisabled();
|
||||
await expect(page.getByRole('button', { name: 'Undo' })).toHaveCount(0);
|
||||
await expect(page.getByText('You have unsaved changes')).not.toBeVisible();
|
||||
|
||||
// Make a change → Save enables and Undo appears.
|
||||
const updatedName = `team-${Date.now()}`;
|
||||
await page.getByLabel('Team Name*').clear();
|
||||
await page.getByLabel('Team Name*').fill(updatedName);
|
||||
|
||||
await expect(saveButton).toBeEnabled();
|
||||
await expect(page.getByRole('button', { name: 'Undo' })).toBeVisible();
|
||||
|
||||
// Undo → value restored, Save disabled again, Undo gone.
|
||||
await page.getByRole('button', { name: 'Undo' }).click();
|
||||
await expect(page.getByLabel('Team Name*')).toHaveValue(team.name);
|
||||
await expect(saveButton).toBeDisabled();
|
||||
await expect(page.getByRole('button', { name: 'Undo' })).toHaveCount(0);
|
||||
|
||||
// Change again → Save → success toast, returns to a pristine (disabled) state.
|
||||
await page.getByLabel('Team Name*').clear();
|
||||
await page.getByLabel('Team Name*').fill(updatedName);
|
||||
await expect(saveButton).toBeEnabled();
|
||||
await saveButton.click();
|
||||
|
||||
await expect(page.getByText('Your team has been successfully updated.').first()).toBeVisible();
|
||||
await expect(saveButton).toBeDisabled();
|
||||
});
|
||||
|
||||
test('[ORGANISATIONS]: settings save bar floats when the form footer is off-screen', async ({ page }) => {
|
||||
const { user, organisation } = await seedUser({
|
||||
isPersonalOrganisation: false,
|
||||
});
|
||||
|
||||
await apiSignin({
|
||||
page,
|
||||
email: user.email,
|
||||
redirectPath: `/o/${organisation.url}/settings/document`,
|
||||
});
|
||||
|
||||
// Wait for the long document-preferences form to load.
|
||||
await expect(page.getByTestId('document-language-trigger')).toBeVisible();
|
||||
|
||||
// Pristine: no floating notice even though the footer is below the fold.
|
||||
await expect(page.getByText('You have unsaved changes')).not.toBeVisible();
|
||||
|
||||
// Edit a field near the top → the footer is off-screen, so the floating pill appears.
|
||||
await page.getByTestId('document-language-trigger').click();
|
||||
await page.getByRole('option', { name: 'German' }).click();
|
||||
|
||||
await expect(page.getByText('You have unsaved changes')).toBeVisible();
|
||||
await expect(page.getByRole('button', { name: 'Save changes' })).toBeVisible();
|
||||
|
||||
// Scroll to the footer → the floating pill merges into the docked buttons and the
|
||||
// notice disappears.
|
||||
await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight));
|
||||
|
||||
await expect(page.getByText('You have unsaved changes')).not.toBeVisible();
|
||||
await expect(page.getByRole('button', { name: 'Save changes' })).toBeVisible();
|
||||
});
|
||||
@@ -75,7 +75,7 @@ test('[TEAMS]: check signature modes can be disabled', async ({ page }) => {
|
||||
await item.click();
|
||||
}
|
||||
|
||||
await page.getByRole('button', { name: 'Update' }).first().click();
|
||||
await page.getByRole('button', { name: 'Save changes' }).first().click();
|
||||
|
||||
// Wait for the update to complete
|
||||
await expect(page.getByText('Document preferences updated', { exact: true })).toBeVisible();
|
||||
@@ -140,7 +140,7 @@ test('[TEAMS]: check signature modes work for templates', async ({ page }) => {
|
||||
await item.click();
|
||||
}
|
||||
|
||||
await page.getByRole('button', { name: 'Update' }).first().click();
|
||||
await page.getByRole('button', { name: 'Save changes' }).first().click();
|
||||
|
||||
// Wait for finish
|
||||
await expect(page.getByText('Document preferences updated', { exact: true })).toBeVisible();
|
||||
|
||||
@@ -49,10 +49,10 @@ test('[BULK_ACTIONS]: can select multiple templates with checkboxes', async ({ p
|
||||
});
|
||||
|
||||
await page.locator('tr', { hasText: 'Bulk Test Template 1' }).getByRole('checkbox').click();
|
||||
await expect(page.getByText('1 selected')).toBeVisible();
|
||||
await expect(page.getByText(/1\s*selected/)).toBeVisible();
|
||||
|
||||
await page.locator('tr', { hasText: 'Bulk Test Template 2' }).getByRole('checkbox').click();
|
||||
await expect(page.getByText('2 selected')).toBeVisible();
|
||||
await expect(page.getByText(/2\s*selected/)).toBeVisible();
|
||||
});
|
||||
|
||||
test('[BULK_ACTIONS]: header checkbox selects all templates on page', async ({ page }) => {
|
||||
@@ -66,7 +66,7 @@ test('[BULK_ACTIONS]: header checkbox selects all templates on page', async ({ p
|
||||
|
||||
await page.locator('thead').getByRole('checkbox').click();
|
||||
|
||||
await expect(page.getByText(`${templates.length} selected`)).toBeVisible();
|
||||
await expect(page.getByText(new RegExp(`${templates.length}\\s*selected`))).toBeVisible();
|
||||
});
|
||||
|
||||
test('[BULK_ACTIONS]: can clear selection with X button', async ({ page }) => {
|
||||
@@ -79,11 +79,11 @@ test('[BULK_ACTIONS]: can clear selection with X button', async ({ page }) => {
|
||||
});
|
||||
|
||||
await page.locator('thead').getByRole('checkbox').click();
|
||||
await expect(page.getByText(/\d+ selected/)).toBeVisible();
|
||||
await expect(page.getByText(/\d+\s*selected/)).toBeVisible();
|
||||
|
||||
await page.getByLabel('Clear selection').click();
|
||||
|
||||
await expect(page.getByText(/\d+ selected/)).not.toBeVisible();
|
||||
await expect(page.getByText(/\d+\s*selected/)).not.toBeVisible();
|
||||
});
|
||||
|
||||
test('[BULK_ACTIONS]: can move multiple templates to a folder', async ({ page }) => {
|
||||
@@ -97,13 +97,13 @@ test('[BULK_ACTIONS]: can move multiple templates to a folder', async ({ page })
|
||||
|
||||
await page.locator('tr', { hasText: 'Bulk Test Template 1' }).getByRole('checkbox').click();
|
||||
await page.locator('tr', { hasText: 'Bulk Test Template 2' }).getByRole('checkbox').click();
|
||||
await page.getByRole('button', { name: 'Move to Folder' }).click();
|
||||
await page.getByRole('button', { name: 'Move', exact: true }).click();
|
||||
|
||||
await expect(page.getByRole('dialog')).toBeVisible();
|
||||
await expect(page.getByText('Move Templates to Folder')).toBeVisible();
|
||||
|
||||
await page.getByRole('button', { name: folder.name }).click();
|
||||
await page.getByRole('button', { name: 'Move' }).click();
|
||||
await page.getByRole('dialog').getByRole('button', { name: 'Move' }).click();
|
||||
|
||||
await expectToastTextToBeVisible(page, 'Selected items have been moved.');
|
||||
|
||||
@@ -151,14 +151,14 @@ test('[BULK_ACTIONS]: selection clears after successful move', async ({ page })
|
||||
});
|
||||
|
||||
await page.locator('tr', { hasText: 'Bulk Test Template 1' }).getByRole('checkbox').click();
|
||||
await expect(page.getByText('1 selected')).toBeVisible();
|
||||
await expect(page.getByText(/1\s*selected/)).toBeVisible();
|
||||
|
||||
await page.getByRole('button', { name: 'Move to Folder' }).click();
|
||||
await page.getByRole('button', { name: 'Move', exact: true }).click();
|
||||
await page.getByRole('button', { name: folder.name }).click();
|
||||
await page.getByRole('button', { name: 'Move' }).click();
|
||||
await page.getByRole('dialog').getByRole('button', { name: 'Move' }).click();
|
||||
|
||||
await expectToastTextToBeVisible(page, 'Selected items have been moved.');
|
||||
await expect(page.getByText(/\d+ selected/)).not.toBeVisible();
|
||||
await expect(page.getByText(/\d+\s*selected/)).not.toBeVisible();
|
||||
});
|
||||
|
||||
test('[BULK_ACTIONS]: selection clears after successful delete', async ({ page }) => {
|
||||
@@ -171,13 +171,13 @@ test('[BULK_ACTIONS]: selection clears after successful delete', async ({ page }
|
||||
});
|
||||
|
||||
await page.locator('tr', { hasText: 'Bulk Test Template 1' }).getByRole('checkbox').click();
|
||||
await expect(page.getByText('1 selected')).toBeVisible();
|
||||
await expect(page.getByText(/1\s*selected/)).toBeVisible();
|
||||
|
||||
await page.getByRole('button', { name: 'Delete' }).click();
|
||||
await page.getByRole('dialog').getByRole('button', { name: 'Delete' }).click();
|
||||
|
||||
await expectToastTextToBeVisible(page, 'Templates deleted');
|
||||
await expect(page.getByText(/\d+ selected/)).not.toBeVisible();
|
||||
await expect(page.getByText(/\d+\s*selected/)).not.toBeVisible();
|
||||
});
|
||||
|
||||
test('[BULK_ACTIONS]: can search for folders in move dialog', async ({ page }) => {
|
||||
@@ -199,7 +199,7 @@ test('[BULK_ACTIONS]: can search for folders in move dialog', async ({ page }) =
|
||||
|
||||
await page.locator('tr', { hasText: 'Bulk Test Template 1' }).getByRole('checkbox').click();
|
||||
|
||||
await page.getByRole('button', { name: 'Move to Folder' }).click();
|
||||
await page.getByRole('button', { name: 'Move', exact: true }).click();
|
||||
await expect(page.getByRole('dialog')).toBeVisible();
|
||||
|
||||
await expect(page.getByRole('button', { name: folder.name })).toBeVisible();
|
||||
@@ -236,14 +236,14 @@ test('[BULK_ACTIONS]: can move templates from folder to home (root)', async ({ p
|
||||
await expect(page.getByRole('link', { name: 'Bulk Test Template 1' })).toBeVisible();
|
||||
|
||||
await page.locator('tr', { hasText: 'Bulk Test Template 1' }).getByRole('checkbox').click();
|
||||
await expect(page.getByText('1 selected')).toBeVisible();
|
||||
await expect(page.getByText(/1\s*selected/)).toBeVisible();
|
||||
|
||||
await page.getByRole('button', { name: 'Move to Folder' }).click();
|
||||
await page.getByRole('button', { name: 'Move', exact: true }).click();
|
||||
await expect(page.getByRole('dialog')).toBeVisible();
|
||||
|
||||
await page.getByRole('button', { name: 'Home (No Folder)' }).click();
|
||||
|
||||
await page.getByRole('button', { name: 'Move' }).click();
|
||||
await page.getByRole('dialog').getByRole('button', { name: 'Move' }).click();
|
||||
|
||||
await expectToastTextToBeVisible(page, 'Selected items have been moved.');
|
||||
|
||||
|
||||
@@ -83,15 +83,17 @@ export const deleteDocument = async ({ id, userId, teamId, requestMetadata }: De
|
||||
|
||||
// Handle hard or soft deleting the actual document if user has permission.
|
||||
if (hasDeleteAccess) {
|
||||
await handleDocumentOwnerDelete({
|
||||
const updatedEnvelope = await handleDocumentOwnerDelete({
|
||||
envelope,
|
||||
user,
|
||||
requestMetadata,
|
||||
});
|
||||
|
||||
const envelopeForWebhook = { ...envelope, ...(updatedEnvelope ?? {}) };
|
||||
|
||||
await triggerWebhook({
|
||||
event: WebhookTriggerEvents.DOCUMENT_CANCELLED,
|
||||
data: ZWebhookDocumentSchema.parse(mapEnvelopeToWebhookDocumentPayload(envelope)),
|
||||
data: ZWebhookDocumentSchema.parse(mapEnvelopeToWebhookDocumentPayload(envelopeForWebhook)),
|
||||
userId,
|
||||
teamId,
|
||||
});
|
||||
|
||||
@@ -37,9 +37,9 @@ import { extractDerivedDocumentMeta } from '../../utils/document';
|
||||
import { createDocumentAuthOptions, createRecipientAuthOptions } from '../../utils/document-auth';
|
||||
import { buildTeamWhereQuery } from '../../utils/teams';
|
||||
import { incrementDocumentId, incrementTemplateId } from '../envelope/increment-id';
|
||||
import { assertOrganisationRatesAndLimits } from '../rate-limit/assert-organisation-rates-and-limits';
|
||||
import { assertCompatibleRecipientRole } from '../signature-level/assert-compatible-recipient-role';
|
||||
import { resolveSignatureLevel } from '../signature-level/resolve-signature-level';
|
||||
import { assertOrganisationRatesAndLimits } from '../rate-limit/assert-organisation-rates-and-limits';
|
||||
import { getTeamSettings } from '../team/get-team-settings';
|
||||
import { assertUserNotDisabledById } from '../user/assert-user-not-disabled';
|
||||
import { triggerWebhook } from '../webhooks/trigger/trigger-webhook';
|
||||
|
||||
@@ -10,8 +10,8 @@ import { nanoid, prefixedId } from '../../universal/id';
|
||||
import type { EnvelopeIdOptions } from '../../utils/envelope';
|
||||
import { getEnvelopeWhereInput } from '../envelope/get-envelope-by-id';
|
||||
import { incrementDocumentId, incrementTemplateId } from '../envelope/increment-id';
|
||||
import { resolveSignatureLevel } from '../signature-level/resolve-signature-level';
|
||||
import { assertOrganisationRatesAndLimits } from '../rate-limit/assert-organisation-rates-and-limits';
|
||||
import { resolveSignatureLevel } from '../signature-level/resolve-signature-level';
|
||||
import { triggerWebhook } from '../webhooks/trigger/trigger-webhook';
|
||||
|
||||
export interface DuplicateEnvelopeOptions {
|
||||
|
||||
@@ -51,8 +51,8 @@ import { buildTeamWhereQuery } from '../../utils/teams';
|
||||
import { getEnvelopeWhereInput } from '../envelope/get-envelope-by-id';
|
||||
import { incrementDocumentId } from '../envelope/increment-id';
|
||||
import { insertFormValuesInPdf } from '../pdf/insert-form-values-in-pdf';
|
||||
import { resolveSignatureLevel } from '../signature-level/resolve-signature-level';
|
||||
import { assertOrganisationRatesAndLimits } from '../rate-limit/assert-organisation-rates-and-limits';
|
||||
import { resolveSignatureLevel } from '../signature-level/resolve-signature-level';
|
||||
import { getTeamSettings } from '../team/get-team-settings';
|
||||
import { triggerWebhook } from '../webhooks/trigger/trigger-webhook';
|
||||
import { getOrganisationTemplateWhereInput } from './get-organisation-template-by-id';
|
||||
|
||||
@@ -2441,6 +2441,7 @@ msgstr "Branding-Logo"
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Branding Preferences"
|
||||
msgstr "Markenpräferenzen"
|
||||
|
||||
@@ -3572,6 +3573,7 @@ msgid "Currently all organisation members can access this team"
|
||||
msgstr "Derzeit können alle Organisationsmitglieder auf dieses Team zugreifen"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Currently branding can only be configured for Teams and above plans."
|
||||
msgstr "Zurzeit kann das Branding nur für Teams und darüber konfiguriert werden."
|
||||
|
||||
@@ -4214,8 +4216,8 @@ msgstr "Dokument storniert"
|
||||
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
|
||||
#: packages/lib/jobs/definitions/emails/send-document-deleted-emails.handler.ts
|
||||
#: packages/lib/server-only/admin/admin-super-delete-document.ts
|
||||
#: packages/lib/server-only/document/delete-document.ts
|
||||
msgid "Document Cancelled"
|
||||
msgstr "Dokument storniert"
|
||||
|
||||
@@ -7942,6 +7944,11 @@ msgstr "Original"
|
||||
msgid "Otherwise, the document will be created as a draft."
|
||||
msgstr "Andernfalls wird das Dokument als Entwurf erstellt."
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-fields-page.tsx
|
||||
msgid "Overlapping fields detected"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/document-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/email-preferences-form.tsx
|
||||
msgid "Override organisation settings"
|
||||
@@ -9197,9 +9204,7 @@ msgstr "Umschlag erneut senden"
|
||||
msgid "Resend verification"
|
||||
msgstr "Bestätigung erneut senden"
|
||||
|
||||
#: apps/remix/app/components/forms/organisation-update-form.tsx
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
#: apps/remix/app/components/forms/team-update-form.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-reset-button.tsx
|
||||
msgid "Reset"
|
||||
msgstr "Zurücksetzen"
|
||||
@@ -9384,6 +9389,7 @@ msgid "Save as Template"
|
||||
msgstr "Als Vorlage speichern"
|
||||
|
||||
#: apps/remix/app/components/dialogs/email-transport-update-dialog.tsx
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "Save changes"
|
||||
msgstr "Änderungen speichern"
|
||||
|
||||
@@ -10224,6 +10230,11 @@ msgstr "Website Einstellungen"
|
||||
msgid "Skip"
|
||||
msgstr "Überspringen"
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-fields-page.tsx
|
||||
msgid "Some fields are placed on top of each other. This may complicate the signing process or cause fields to not work as expected."
|
||||
msgstr ""
|
||||
|
||||
#: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx
|
||||
msgid "Some signers have not been assigned a signature field. Please assign at least 1 signature field to each signer before proceeding."
|
||||
msgstr "Einige Unterzeichner haben noch kein Unterschriftsfeld zugewiesen bekommen. Bitte weisen Sie jedem Unterzeichner mindestens ein Unterschriftsfeld zu, bevor Sie fortfahren."
|
||||
@@ -12254,6 +12265,7 @@ msgstr "Nicht autorisiert"
|
||||
msgid "Uncompleted"
|
||||
msgstr "Unvollendet"
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
#: packages/ui/primitives/signature-pad/signature-pad-draw.tsx
|
||||
msgid "Undo"
|
||||
msgstr "Rückgängig"
|
||||
@@ -12303,6 +12315,10 @@ msgstr "Verknüpfung aufheben"
|
||||
msgid "Unpin"
|
||||
msgstr "Lösen"
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "Unsaved changes"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/unsealed-documents._index.tsx
|
||||
msgid "Unsealed Documents"
|
||||
@@ -12322,9 +12338,6 @@ msgstr "Unbetitelte Gruppe"
|
||||
#: apps/remix/app/components/dialogs/team-group-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/webhook-edit-dialog.tsx
|
||||
#: apps/remix/app/components/forms/branding-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/document-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/email-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-settings-dialog.tsx
|
||||
#: apps/remix/app/components/tables/admin-claims-table.tsx
|
||||
@@ -12347,6 +12360,7 @@ msgstr "Banner aktualisieren"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains._index.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Update Billing"
|
||||
msgstr "Rechnungsdaten aktualisieren"
|
||||
|
||||
@@ -12374,10 +12388,6 @@ msgstr "E-Mail aktualisieren"
|
||||
msgid "Update Fields"
|
||||
msgstr "Felder aktualisieren"
|
||||
|
||||
#: apps/remix/app/components/forms/organisation-update-form.tsx
|
||||
msgid "Update organisation"
|
||||
msgstr "Organisation aktualisieren"
|
||||
|
||||
#: apps/remix/app/components/dialogs/admin-organisation-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
@@ -12413,10 +12423,6 @@ msgstr "Rolle aktualisieren"
|
||||
msgid "Update Subscription Claim"
|
||||
msgstr "Abonnementsanspruch aktualisieren"
|
||||
|
||||
#: apps/remix/app/components/forms/team-update-form.tsx
|
||||
msgid "Update team"
|
||||
msgstr "Team aktualisieren"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
|
||||
msgid "Update team email"
|
||||
@@ -12947,7 +12953,7 @@ msgstr "Warten"
|
||||
msgid "Waiting for others"
|
||||
msgstr "Warten auf andere"
|
||||
|
||||
#: packages/lib/server-only/document/send-pending-email.ts
|
||||
#: packages/lib/jobs/definitions/emails/send-document-pending-email.handler.ts
|
||||
msgid "Waiting for others to complete signing."
|
||||
msgstr "Warten auf andere, um die Unterzeichnung abzuschließen."
|
||||
|
||||
@@ -13921,8 +13927,7 @@ msgstr "Du wurdest eingeladen, {0} auf Documenso beizutreten"
|
||||
msgid "You have been invited to join the following organisation"
|
||||
msgstr "Sie wurden eingeladen, der folgenden Organisation beizutreten"
|
||||
|
||||
#: packages/lib/server-only/recipient/delete-envelope-recipient.ts
|
||||
#: packages/lib/server-only/recipient/set-document-recipients.ts
|
||||
#: packages/lib/jobs/definitions/emails/send-recipient-removed-email.handler.ts
|
||||
msgid "You have been removed from a document"
|
||||
msgstr "Du wurdest von einem Dokument entfernt"
|
||||
|
||||
@@ -14042,6 +14047,10 @@ msgstr "Sie haben den Zugriff erfolgreich widerrufen."
|
||||
msgid "You have the right to withdraw your consent to use electronic signatures at any time before completing the signing process. To withdraw your consent, please contact the sender of the document. In failing to contact the sender you may reach out to <0>{SUPPORT_EMAIL}</0> for assistance. Be aware that withdrawing consent may delay or halt the completion of the related transaction or service."
|
||||
msgstr "Sie haben das Recht, Ihre Zustimmung zur Verwendung elektronischer Unterschriften jederzeit vor Abschluss des Unterzeichnungsprozesses zu widerrufen. Um Ihre Zustimmung zu widerrufen, kontaktieren Sie bitte den Absender des Dokuments. Sollten Sie den Absender nicht erreichen, können Sie sich für Unterstützung an <0>{SUPPORT_EMAIL}</0> wenden. Seien Sie sich bewusst, dass der Widerruf der Zustimmung den Abschluss der zugehörigen Transaktion oder Dienstleistung verzögern oder stoppen kann."
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "You have unsaved changes"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
|
||||
msgid "You have updated {memberName}."
|
||||
msgstr "Sie haben {memberName} aktualisiert."
|
||||
@@ -14721,4 +14730,3 @@ msgstr "Ihr Verifizierungscode:"
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
|
||||
msgid "your-domain.com another-domain.com"
|
||||
msgstr "your-domain.com another-domain.com"
|
||||
|
||||
|
||||
@@ -2436,6 +2436,7 @@ msgstr "Branding Logo"
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Branding Preferences"
|
||||
msgstr "Branding Preferences"
|
||||
|
||||
@@ -3567,6 +3568,7 @@ msgid "Currently all organisation members can access this team"
|
||||
msgstr "Currently all organisation members can access this team"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Currently branding can only be configured for Teams and above plans."
|
||||
msgstr "Currently branding can only be configured for Teams and above plans."
|
||||
|
||||
@@ -4209,8 +4211,8 @@ msgstr "Document cancelled"
|
||||
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
|
||||
#: packages/lib/jobs/definitions/emails/send-document-deleted-emails.handler.ts
|
||||
#: packages/lib/server-only/admin/admin-super-delete-document.ts
|
||||
#: packages/lib/server-only/document/delete-document.ts
|
||||
msgid "Document Cancelled"
|
||||
msgstr "Document Cancelled"
|
||||
|
||||
@@ -7937,6 +7939,11 @@ msgstr "Original"
|
||||
msgid "Otherwise, the document will be created as a draft."
|
||||
msgstr "Otherwise, the document will be created as a draft."
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-fields-page.tsx
|
||||
msgid "Overlapping fields detected"
|
||||
msgstr "Overlapping fields detected"
|
||||
|
||||
#: apps/remix/app/components/forms/document-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/email-preferences-form.tsx
|
||||
msgid "Override organisation settings"
|
||||
@@ -8772,6 +8779,10 @@ msgstr "Recipient ID:"
|
||||
msgid "Recipient rejected the document"
|
||||
msgstr "Recipient rejected the document"
|
||||
|
||||
#: packages/lib/utils/document-audit-logs.ts
|
||||
msgid "Recipient rejected the document externally"
|
||||
msgstr "Recipient rejected the document externally"
|
||||
|
||||
#: apps/remix/app/components/general/admin-global-settings-section.tsx
|
||||
msgid "Recipient removed"
|
||||
msgstr "Recipient removed"
|
||||
@@ -9188,9 +9199,7 @@ msgstr "Resend Envelope"
|
||||
msgid "Resend verification"
|
||||
msgstr "Resend verification"
|
||||
|
||||
#: apps/remix/app/components/forms/organisation-update-form.tsx
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
#: apps/remix/app/components/forms/team-update-form.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-reset-button.tsx
|
||||
msgid "Reset"
|
||||
msgstr "Reset"
|
||||
@@ -9375,6 +9384,7 @@ msgid "Save as Template"
|
||||
msgstr "Save as Template"
|
||||
|
||||
#: apps/remix/app/components/dialogs/email-transport-update-dialog.tsx
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "Save changes"
|
||||
msgstr "Save changes"
|
||||
|
||||
@@ -10215,6 +10225,11 @@ msgstr "Site Settings"
|
||||
msgid "Skip"
|
||||
msgstr "Skip"
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-fields-page.tsx
|
||||
msgid "Some fields are placed on top of each other. This may complicate the signing process or cause fields to not work as expected."
|
||||
msgstr "Some fields are placed on top of each other. This may complicate the signing process or cause fields to not work as expected."
|
||||
|
||||
#: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx
|
||||
msgid "Some signers have not been assigned a signature field. Please assign at least 1 signature field to each signer before proceeding."
|
||||
msgstr "Some signers have not been assigned a signature field. Please assign at least 1 signature field to each signer before proceeding."
|
||||
@@ -11093,6 +11108,23 @@ msgstr "The document signing process will be stopped"
|
||||
msgid "The document was created but could not be sent to recipients."
|
||||
msgstr "The document was created but could not be sent to recipients."
|
||||
|
||||
#: packages/lib/utils/document-audit-logs.ts
|
||||
msgid "The document was rejected externally by {onBehalfOf} on behalf of {user}"
|
||||
msgstr "The document was rejected externally by {onBehalfOf} on behalf of {user}"
|
||||
|
||||
#: packages/lib/utils/document-audit-logs.ts
|
||||
#: packages/lib/utils/document-audit-logs.ts
|
||||
msgid "The document was rejected externally by {onBehalfOf} on behalf of the recipient"
|
||||
msgstr "The document was rejected externally by {onBehalfOf} on behalf of the recipient"
|
||||
|
||||
#: packages/lib/utils/document-audit-logs.ts
|
||||
msgid "The document was rejected externally on behalf of {user}"
|
||||
msgstr "The document was rejected externally on behalf of {user}"
|
||||
|
||||
#: packages/lib/utils/document-audit-logs.ts
|
||||
msgid "The document was rejected externally on behalf of the recipient"
|
||||
msgstr "The document was rejected externally on behalf of the recipient"
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelope-delete-dialog.tsx
|
||||
msgid "The document will be hidden from your account"
|
||||
msgstr "The document will be hidden from your account"
|
||||
@@ -12228,6 +12260,7 @@ msgstr "Unauthorized"
|
||||
msgid "Uncompleted"
|
||||
msgstr "Uncompleted"
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
#: packages/ui/primitives/signature-pad/signature-pad-draw.tsx
|
||||
msgid "Undo"
|
||||
msgstr "Undo"
|
||||
@@ -12277,6 +12310,10 @@ msgstr "Unlink"
|
||||
msgid "Unpin"
|
||||
msgstr "Unpin"
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "Unsaved changes"
|
||||
msgstr "Unsaved changes"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/unsealed-documents._index.tsx
|
||||
msgid "Unsealed Documents"
|
||||
@@ -12296,9 +12333,6 @@ msgstr "Untitled Group"
|
||||
#: apps/remix/app/components/dialogs/team-group-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/webhook-edit-dialog.tsx
|
||||
#: apps/remix/app/components/forms/branding-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/document-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/email-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-settings-dialog.tsx
|
||||
#: apps/remix/app/components/tables/admin-claims-table.tsx
|
||||
@@ -12321,6 +12355,7 @@ msgstr "Update Banner"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains._index.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Update Billing"
|
||||
msgstr "Update Billing"
|
||||
|
||||
@@ -12348,10 +12383,6 @@ msgstr "Update email"
|
||||
msgid "Update Fields"
|
||||
msgstr "Update Fields"
|
||||
|
||||
#: apps/remix/app/components/forms/organisation-update-form.tsx
|
||||
msgid "Update organisation"
|
||||
msgstr "Update organisation"
|
||||
|
||||
#: apps/remix/app/components/dialogs/admin-organisation-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
@@ -12387,10 +12418,6 @@ msgstr "Update role"
|
||||
msgid "Update Subscription Claim"
|
||||
msgstr "Update Subscription Claim"
|
||||
|
||||
#: apps/remix/app/components/forms/team-update-form.tsx
|
||||
msgid "Update team"
|
||||
msgstr "Update team"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
|
||||
msgid "Update team email"
|
||||
@@ -12921,7 +12948,7 @@ msgstr "Waiting"
|
||||
msgid "Waiting for others"
|
||||
msgstr "Waiting for others"
|
||||
|
||||
#: packages/lib/server-only/document/send-pending-email.ts
|
||||
#: packages/lib/jobs/definitions/emails/send-document-pending-email.handler.ts
|
||||
msgid "Waiting for others to complete signing."
|
||||
msgstr "Waiting for others to complete signing."
|
||||
|
||||
@@ -13895,8 +13922,7 @@ msgstr "You have been invited to join {0} on Documenso"
|
||||
msgid "You have been invited to join the following organisation"
|
||||
msgstr "You have been invited to join the following organisation"
|
||||
|
||||
#: packages/lib/server-only/recipient/delete-envelope-recipient.ts
|
||||
#: packages/lib/server-only/recipient/set-document-recipients.ts
|
||||
#: packages/lib/jobs/definitions/emails/send-recipient-removed-email.handler.ts
|
||||
msgid "You have been removed from a document"
|
||||
msgstr "You have been removed from a document"
|
||||
|
||||
@@ -14016,6 +14042,10 @@ msgstr "You have successfully revoked access."
|
||||
msgid "You have the right to withdraw your consent to use electronic signatures at any time before completing the signing process. To withdraw your consent, please contact the sender of the document. In failing to contact the sender you may reach out to <0>{SUPPORT_EMAIL}</0> for assistance. Be aware that withdrawing consent may delay or halt the completion of the related transaction or service."
|
||||
msgstr "You have the right to withdraw your consent to use electronic signatures at any time before completing the signing process. To withdraw your consent, please contact the sender of the document. In failing to contact the sender you may reach out to <0>{SUPPORT_EMAIL}</0> for assistance. Be aware that withdrawing consent may delay or halt the completion of the related transaction or service."
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "You have unsaved changes"
|
||||
msgstr "You have unsaved changes"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
|
||||
msgid "You have updated {memberName}."
|
||||
msgstr "You have updated {memberName}."
|
||||
|
||||
@@ -2441,6 +2441,7 @@ msgstr "Logotipo de Marca"
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Branding Preferences"
|
||||
msgstr "Preferencias de marca"
|
||||
|
||||
@@ -3572,6 +3573,7 @@ msgid "Currently all organisation members can access this team"
|
||||
msgstr "Actualmente, todos los miembros de la organización pueden acceder a este equipo"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Currently branding can only be configured for Teams and above plans."
|
||||
msgstr "Actualmente la marca solo se puede configurar para Equipos y planes superiores."
|
||||
|
||||
@@ -4214,8 +4216,8 @@ msgstr "Documento cancelado"
|
||||
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
|
||||
#: packages/lib/jobs/definitions/emails/send-document-deleted-emails.handler.ts
|
||||
#: packages/lib/server-only/admin/admin-super-delete-document.ts
|
||||
#: packages/lib/server-only/document/delete-document.ts
|
||||
msgid "Document Cancelled"
|
||||
msgstr "Documento cancelado"
|
||||
|
||||
@@ -7942,6 +7944,11 @@ msgstr "Original"
|
||||
msgid "Otherwise, the document will be created as a draft."
|
||||
msgstr "De lo contrario, el documento se creará como un borrador."
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-fields-page.tsx
|
||||
msgid "Overlapping fields detected"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/document-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/email-preferences-form.tsx
|
||||
msgid "Override organisation settings"
|
||||
@@ -9197,9 +9204,7 @@ msgstr "Reenviar sobre (envelope)"
|
||||
msgid "Resend verification"
|
||||
msgstr "Reenviar verificación"
|
||||
|
||||
#: apps/remix/app/components/forms/organisation-update-form.tsx
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
#: apps/remix/app/components/forms/team-update-form.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-reset-button.tsx
|
||||
msgid "Reset"
|
||||
msgstr "Restablecer"
|
||||
@@ -9384,6 +9389,7 @@ msgid "Save as Template"
|
||||
msgstr "Guardar como plantilla"
|
||||
|
||||
#: apps/remix/app/components/dialogs/email-transport-update-dialog.tsx
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "Save changes"
|
||||
msgstr "Guardar cambios"
|
||||
|
||||
@@ -10224,6 +10230,11 @@ msgstr "Configuraciones del sitio"
|
||||
msgid "Skip"
|
||||
msgstr "Omitir"
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-fields-page.tsx
|
||||
msgid "Some fields are placed on top of each other. This may complicate the signing process or cause fields to not work as expected."
|
||||
msgstr ""
|
||||
|
||||
#: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx
|
||||
msgid "Some signers have not been assigned a signature field. Please assign at least 1 signature field to each signer before proceeding."
|
||||
msgstr "Algunos firmantes no han sido asignados a un campo de firma. Asigne al menos 1 campo de firma a cada firmante antes de continuar."
|
||||
@@ -12254,6 +12265,7 @@ msgstr "No autorizado"
|
||||
msgid "Uncompleted"
|
||||
msgstr "Incompleto"
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
#: packages/ui/primitives/signature-pad/signature-pad-draw.tsx
|
||||
msgid "Undo"
|
||||
msgstr "Deshacer"
|
||||
@@ -12303,6 +12315,10 @@ msgstr "Desvincular"
|
||||
msgid "Unpin"
|
||||
msgstr "Desanclar"
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "Unsaved changes"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/unsealed-documents._index.tsx
|
||||
msgid "Unsealed Documents"
|
||||
@@ -12322,9 +12338,6 @@ msgstr "Grupo sin título"
|
||||
#: apps/remix/app/components/dialogs/team-group-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/webhook-edit-dialog.tsx
|
||||
#: apps/remix/app/components/forms/branding-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/document-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/email-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-settings-dialog.tsx
|
||||
#: apps/remix/app/components/tables/admin-claims-table.tsx
|
||||
@@ -12347,6 +12360,7 @@ msgstr "Actualizar banner"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains._index.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Update Billing"
|
||||
msgstr "Actualizar facturación"
|
||||
|
||||
@@ -12374,10 +12388,6 @@ msgstr "Actualizar correo electrónico"
|
||||
msgid "Update Fields"
|
||||
msgstr "Actualizar Campos"
|
||||
|
||||
#: apps/remix/app/components/forms/organisation-update-form.tsx
|
||||
msgid "Update organisation"
|
||||
msgstr "Actualizar organización"
|
||||
|
||||
#: apps/remix/app/components/dialogs/admin-organisation-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
@@ -12413,10 +12423,6 @@ msgstr "Actualizar rol"
|
||||
msgid "Update Subscription Claim"
|
||||
msgstr "Actualizar reclamo de suscripción"
|
||||
|
||||
#: apps/remix/app/components/forms/team-update-form.tsx
|
||||
msgid "Update team"
|
||||
msgstr "Actualizar equipo"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
|
||||
msgid "Update team email"
|
||||
@@ -12947,7 +12953,7 @@ msgstr "Esperando"
|
||||
msgid "Waiting for others"
|
||||
msgstr "Esperando a otros"
|
||||
|
||||
#: packages/lib/server-only/document/send-pending-email.ts
|
||||
#: packages/lib/jobs/definitions/emails/send-document-pending-email.handler.ts
|
||||
msgid "Waiting for others to complete signing."
|
||||
msgstr "Esperando a que otros completen la firma."
|
||||
|
||||
@@ -13921,8 +13927,7 @@ msgstr "Te han invitado a unirte a {0} en Documenso"
|
||||
msgid "You have been invited to join the following organisation"
|
||||
msgstr "Has sido invitado a unirte a la siguiente organización"
|
||||
|
||||
#: packages/lib/server-only/recipient/delete-envelope-recipient.ts
|
||||
#: packages/lib/server-only/recipient/set-document-recipients.ts
|
||||
#: packages/lib/jobs/definitions/emails/send-recipient-removed-email.handler.ts
|
||||
msgid "You have been removed from a document"
|
||||
msgstr "Te han eliminado de un documento"
|
||||
|
||||
@@ -14042,6 +14047,10 @@ msgstr "Has revocado el acceso con éxito."
|
||||
msgid "You have the right to withdraw your consent to use electronic signatures at any time before completing the signing process. To withdraw your consent, please contact the sender of the document. In failing to contact the sender you may reach out to <0>{SUPPORT_EMAIL}</0> for assistance. Be aware that withdrawing consent may delay or halt the completion of the related transaction or service."
|
||||
msgstr "Usted tiene el derecho de retirar su consentimiento para usar firmas electrónicas en cualquier momento antes de completar el proceso de firma. Para retirar su consentimiento, comuníquese con el remitente del documento. Si no se comunica con el remitente, puede comunicarse con <0>{SUPPORT_EMAIL}</0> para obtener asistencia. Tenga en cuenta que retirar el consentimiento puede retrasar o detener la finalización de la transacción o servicio relacionado."
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "You have unsaved changes"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
|
||||
msgid "You have updated {memberName}."
|
||||
msgstr "Has actualizado a {memberName}."
|
||||
@@ -14721,4 +14730,3 @@ msgstr "Su código de verificación:"
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
|
||||
msgid "your-domain.com another-domain.com"
|
||||
msgstr "su-dominio.com otro-dominio.com"
|
||||
|
||||
|
||||
@@ -2441,6 +2441,7 @@ msgstr "Logo de la marque"
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Branding Preferences"
|
||||
msgstr "Préférences de branding"
|
||||
|
||||
@@ -3572,6 +3573,7 @@ msgid "Currently all organisation members can access this team"
|
||||
msgstr "Actuellement, tous les membres de l'organisation peuvent accéder à cette équipe"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Currently branding can only be configured for Teams and above plans."
|
||||
msgstr "Actuellement, la personnalisation de la marque ne peut être configurée que pour les plans Équipe et plus."
|
||||
|
||||
@@ -4214,8 +4216,8 @@ msgstr "Document annulé"
|
||||
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
|
||||
#: packages/lib/jobs/definitions/emails/send-document-deleted-emails.handler.ts
|
||||
#: packages/lib/server-only/admin/admin-super-delete-document.ts
|
||||
#: packages/lib/server-only/document/delete-document.ts
|
||||
msgid "Document Cancelled"
|
||||
msgstr "Document Annulé"
|
||||
|
||||
@@ -7942,6 +7944,11 @@ msgstr "Original"
|
||||
msgid "Otherwise, the document will be created as a draft."
|
||||
msgstr "Sinon, le document sera créé sous forme de brouillon."
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-fields-page.tsx
|
||||
msgid "Overlapping fields detected"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/document-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/email-preferences-form.tsx
|
||||
msgid "Override organisation settings"
|
||||
@@ -9197,9 +9204,7 @@ msgstr "Renvoyer l’enveloppe"
|
||||
msgid "Resend verification"
|
||||
msgstr "Renvoyer la vérification"
|
||||
|
||||
#: apps/remix/app/components/forms/organisation-update-form.tsx
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
#: apps/remix/app/components/forms/team-update-form.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-reset-button.tsx
|
||||
msgid "Reset"
|
||||
msgstr "Réinitialiser"
|
||||
@@ -9384,6 +9389,7 @@ msgid "Save as Template"
|
||||
msgstr "Enregistrer comme modèle"
|
||||
|
||||
#: apps/remix/app/components/dialogs/email-transport-update-dialog.tsx
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "Save changes"
|
||||
msgstr "Enregistrer les modifications"
|
||||
|
||||
@@ -10224,6 +10230,11 @@ msgstr "Paramètres du site"
|
||||
msgid "Skip"
|
||||
msgstr "Ignorer"
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-fields-page.tsx
|
||||
msgid "Some fields are placed on top of each other. This may complicate the signing process or cause fields to not work as expected."
|
||||
msgstr ""
|
||||
|
||||
#: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx
|
||||
msgid "Some signers have not been assigned a signature field. Please assign at least 1 signature field to each signer before proceeding."
|
||||
msgstr "Certains signataires n'ont pas été assignés à un champ de signature. Veuillez assigner au moins 1 champ de signature à chaque signataire avant de continuer."
|
||||
@@ -12254,6 +12265,7 @@ msgstr "Non autorisé"
|
||||
msgid "Uncompleted"
|
||||
msgstr "Non complet"
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
#: packages/ui/primitives/signature-pad/signature-pad-draw.tsx
|
||||
msgid "Undo"
|
||||
msgstr "Annuler"
|
||||
@@ -12303,6 +12315,10 @@ msgstr "Délier"
|
||||
msgid "Unpin"
|
||||
msgstr "Détacher"
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "Unsaved changes"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/unsealed-documents._index.tsx
|
||||
msgid "Unsealed Documents"
|
||||
@@ -12322,9 +12338,6 @@ msgstr "Groupe sans titre"
|
||||
#: apps/remix/app/components/dialogs/team-group-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/webhook-edit-dialog.tsx
|
||||
#: apps/remix/app/components/forms/branding-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/document-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/email-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-settings-dialog.tsx
|
||||
#: apps/remix/app/components/tables/admin-claims-table.tsx
|
||||
@@ -12347,6 +12360,7 @@ msgstr "Mettre à jour la bannière"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains._index.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Update Billing"
|
||||
msgstr "Mettre à jour la facturation"
|
||||
|
||||
@@ -12374,10 +12388,6 @@ msgstr "Mettre à jour l'e-mail"
|
||||
msgid "Update Fields"
|
||||
msgstr "Mettre à jour les champs"
|
||||
|
||||
#: apps/remix/app/components/forms/organisation-update-form.tsx
|
||||
msgid "Update organisation"
|
||||
msgstr "Mettre à jour l'organisation"
|
||||
|
||||
#: apps/remix/app/components/dialogs/admin-organisation-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
@@ -12413,10 +12423,6 @@ msgstr "Mettre à jour le rôle"
|
||||
msgid "Update Subscription Claim"
|
||||
msgstr "Mettre à jour la réclamation d'abonnement"
|
||||
|
||||
#: apps/remix/app/components/forms/team-update-form.tsx
|
||||
msgid "Update team"
|
||||
msgstr "Mettre à jour l'équipe"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
|
||||
msgid "Update team email"
|
||||
@@ -12947,7 +12953,7 @@ msgstr "En attente"
|
||||
msgid "Waiting for others"
|
||||
msgstr "En attente des autres"
|
||||
|
||||
#: packages/lib/server-only/document/send-pending-email.ts
|
||||
#: packages/lib/jobs/definitions/emails/send-document-pending-email.handler.ts
|
||||
msgid "Waiting for others to complete signing."
|
||||
msgstr "En attente que d'autres terminent la signature."
|
||||
|
||||
@@ -13921,8 +13927,7 @@ msgstr "Vous avez été invité à rejoindre {0} sur Documenso"
|
||||
msgid "You have been invited to join the following organisation"
|
||||
msgstr "Vous avez été invité à rejoindre l'organisation suivante"
|
||||
|
||||
#: packages/lib/server-only/recipient/delete-envelope-recipient.ts
|
||||
#: packages/lib/server-only/recipient/set-document-recipients.ts
|
||||
#: packages/lib/jobs/definitions/emails/send-recipient-removed-email.handler.ts
|
||||
msgid "You have been removed from a document"
|
||||
msgstr "Vous avez été supprimé d'un document"
|
||||
|
||||
@@ -14042,6 +14047,10 @@ msgstr "Vous avez révoqué l'accès avec succès."
|
||||
msgid "You have the right to withdraw your consent to use electronic signatures at any time before completing the signing process. To withdraw your consent, please contact the sender of the document. In failing to contact the sender you may reach out to <0>{SUPPORT_EMAIL}</0> for assistance. Be aware that withdrawing consent may delay or halt the completion of the related transaction or service."
|
||||
msgstr "Vous avez le droit de retirer votre consentement à l'utilisation des signatures électroniques à tout moment avant de terminer le processus de signature. Pour retirer votre consentement, veuillez contacter l'expéditeur du document. Si vous ne contactez pas l'expéditeur, vous pouvez contacter <0>{SUPPORT_EMAIL}</0> pour obtenir de l'aide. Sachez que le retrait de consentement peut retarder ou arrêter l'achèvement de la transaction ou du service associé."
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "You have unsaved changes"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
|
||||
msgid "You have updated {memberName}."
|
||||
msgstr "Vous avez mis à jour {memberName}."
|
||||
@@ -14721,4 +14730,3 @@ msgstr "Votre code de vérification :"
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
|
||||
msgid "your-domain.com another-domain.com"
|
||||
msgstr "your-domain.com another-domain.com"
|
||||
|
||||
|
||||
@@ -2441,6 +2441,7 @@ msgstr "Logo del Marchio"
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Branding Preferences"
|
||||
msgstr "Preferenze per il branding"
|
||||
|
||||
@@ -3572,6 +3573,7 @@ msgid "Currently all organisation members can access this team"
|
||||
msgstr "Attualmente tutti i membri dell'organizzazione possono accedere a questo team"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Currently branding can only be configured for Teams and above plans."
|
||||
msgstr "Attualmente il marchio può essere configurato solo per i piani Team e superiori."
|
||||
|
||||
@@ -4214,8 +4216,8 @@ msgstr "Documento annullato"
|
||||
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
|
||||
#: packages/lib/jobs/definitions/emails/send-document-deleted-emails.handler.ts
|
||||
#: packages/lib/server-only/admin/admin-super-delete-document.ts
|
||||
#: packages/lib/server-only/document/delete-document.ts
|
||||
msgid "Document Cancelled"
|
||||
msgstr "Documento Annullato"
|
||||
|
||||
@@ -7942,6 +7944,11 @@ msgstr "Originale"
|
||||
msgid "Otherwise, the document will be created as a draft."
|
||||
msgstr "Altrimenti, il documento sarà creato come bozza."
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-fields-page.tsx
|
||||
msgid "Overlapping fields detected"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/document-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/email-preferences-form.tsx
|
||||
msgid "Override organisation settings"
|
||||
@@ -9197,9 +9204,7 @@ msgstr "Invia nuovamente busta"
|
||||
msgid "Resend verification"
|
||||
msgstr "Reinvia verifica"
|
||||
|
||||
#: apps/remix/app/components/forms/organisation-update-form.tsx
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
#: apps/remix/app/components/forms/team-update-form.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-reset-button.tsx
|
||||
msgid "Reset"
|
||||
msgstr "Ripristina"
|
||||
@@ -9384,6 +9389,7 @@ msgid "Save as Template"
|
||||
msgstr "Salva come modello"
|
||||
|
||||
#: apps/remix/app/components/dialogs/email-transport-update-dialog.tsx
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "Save changes"
|
||||
msgstr "Salva le modifiche"
|
||||
|
||||
@@ -10224,6 +10230,11 @@ msgstr "Impostazioni del sito"
|
||||
msgid "Skip"
|
||||
msgstr "Salta"
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-fields-page.tsx
|
||||
msgid "Some fields are placed on top of each other. This may complicate the signing process or cause fields to not work as expected."
|
||||
msgstr ""
|
||||
|
||||
#: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx
|
||||
msgid "Some signers have not been assigned a signature field. Please assign at least 1 signature field to each signer before proceeding."
|
||||
msgstr "Alcuni firmatari non hanno un campo firma assegnato. Assegna almeno 1 campo di firma a ciascun firmatario prima di procedere."
|
||||
@@ -12254,6 +12265,7 @@ msgstr "Non autorizzato"
|
||||
msgid "Uncompleted"
|
||||
msgstr "Incompleto"
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
#: packages/ui/primitives/signature-pad/signature-pad-draw.tsx
|
||||
msgid "Undo"
|
||||
msgstr "Annulla"
|
||||
@@ -12303,6 +12315,10 @@ msgstr "Scollega"
|
||||
msgid "Unpin"
|
||||
msgstr "Rimuovi"
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "Unsaved changes"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/unsealed-documents._index.tsx
|
||||
msgid "Unsealed Documents"
|
||||
@@ -12322,9 +12338,6 @@ msgstr "Gruppo senza nome"
|
||||
#: apps/remix/app/components/dialogs/team-group-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/webhook-edit-dialog.tsx
|
||||
#: apps/remix/app/components/forms/branding-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/document-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/email-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-settings-dialog.tsx
|
||||
#: apps/remix/app/components/tables/admin-claims-table.tsx
|
||||
@@ -12347,6 +12360,7 @@ msgstr "Aggiorna banner"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains._index.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Update Billing"
|
||||
msgstr "Aggiorna fatturazione"
|
||||
|
||||
@@ -12374,10 +12388,6 @@ msgstr "Aggiorna email"
|
||||
msgid "Update Fields"
|
||||
msgstr "Aggiorna campi"
|
||||
|
||||
#: apps/remix/app/components/forms/organisation-update-form.tsx
|
||||
msgid "Update organisation"
|
||||
msgstr "Aggiorna organizzazione"
|
||||
|
||||
#: apps/remix/app/components/dialogs/admin-organisation-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
@@ -12413,10 +12423,6 @@ msgstr "Aggiorna ruolo"
|
||||
msgid "Update Subscription Claim"
|
||||
msgstr "Aggiorna reclamo di sottoscrizione"
|
||||
|
||||
#: apps/remix/app/components/forms/team-update-form.tsx
|
||||
msgid "Update team"
|
||||
msgstr "Aggiorna team"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
|
||||
msgid "Update team email"
|
||||
@@ -12947,7 +12953,7 @@ msgstr "In attesa"
|
||||
msgid "Waiting for others"
|
||||
msgstr "In attesa di altri"
|
||||
|
||||
#: packages/lib/server-only/document/send-pending-email.ts
|
||||
#: packages/lib/jobs/definitions/emails/send-document-pending-email.handler.ts
|
||||
msgid "Waiting for others to complete signing."
|
||||
msgstr "In attesa che altri completino la firma."
|
||||
|
||||
@@ -13921,8 +13927,7 @@ msgstr "Sei stato invitato a unirti a {0} su Documenso"
|
||||
msgid "You have been invited to join the following organisation"
|
||||
msgstr "Sei stato invitato a unirti alla seguente organizzazione"
|
||||
|
||||
#: packages/lib/server-only/recipient/delete-envelope-recipient.ts
|
||||
#: packages/lib/server-only/recipient/set-document-recipients.ts
|
||||
#: packages/lib/jobs/definitions/emails/send-recipient-removed-email.handler.ts
|
||||
msgid "You have been removed from a document"
|
||||
msgstr "Sei stato rimosso da un documento"
|
||||
|
||||
@@ -14042,6 +14047,10 @@ msgstr "Hai revocato con successo l'accesso."
|
||||
msgid "You have the right to withdraw your consent to use electronic signatures at any time before completing the signing process. To withdraw your consent, please contact the sender of the document. In failing to contact the sender you may reach out to <0>{SUPPORT_EMAIL}</0> for assistance. Be aware that withdrawing consent may delay or halt the completion of the related transaction or service."
|
||||
msgstr "Hai il diritto di ritirare il tuo consenso all'uso delle firme elettroniche in qualsiasi momento prima di completare il processo di firma. Per ritirare il tuo consenso, contatta il mittente del documento. Nel caso in cui non riesci a contattare il mittente, puoi contattare <0>{SUPPORT_EMAIL}</0> per assistenza. Sii consapevole che il ritiro del consenso potrebbe ritardare o fermare il completamento della transazione o del servizio correlato."
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "You have unsaved changes"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
|
||||
msgid "You have updated {memberName}."
|
||||
msgstr "Hai aggiornato {memberName}."
|
||||
@@ -14721,4 +14730,3 @@ msgstr "Il tuo codice di verifica:"
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
|
||||
msgid "your-domain.com another-domain.com"
|
||||
msgstr "tuo-dominio.com altro-dominio.com"
|
||||
|
||||
|
||||
@@ -2441,6 +2441,7 @@ msgstr "ブランディングロゴ"
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Branding Preferences"
|
||||
msgstr "ブランディング設定"
|
||||
|
||||
@@ -3572,6 +3573,7 @@ msgid "Currently all organisation members can access this team"
|
||||
msgstr "現在、すべての組織メンバーがこのチームにアクセスできます"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Currently branding can only be configured for Teams and above plans."
|
||||
msgstr "現在、ブランディングは Teams プラン以上のみ設定できます。"
|
||||
|
||||
@@ -4214,8 +4216,8 @@ msgstr "文書は取り消されました"
|
||||
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
|
||||
#: packages/lib/jobs/definitions/emails/send-document-deleted-emails.handler.ts
|
||||
#: packages/lib/server-only/admin/admin-super-delete-document.ts
|
||||
#: packages/lib/server-only/document/delete-document.ts
|
||||
msgid "Document Cancelled"
|
||||
msgstr "文書はキャンセルされました"
|
||||
|
||||
@@ -7942,6 +7944,11 @@ msgstr "オリジナル"
|
||||
msgid "Otherwise, the document will be created as a draft."
|
||||
msgstr "チェックを入れない場合、文書は下書きとして作成されます。"
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-fields-page.tsx
|
||||
msgid "Overlapping fields detected"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/document-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/email-preferences-form.tsx
|
||||
msgid "Override organisation settings"
|
||||
@@ -9197,9 +9204,7 @@ msgstr "封筒を再送信"
|
||||
msgid "Resend verification"
|
||||
msgstr "認証を再送"
|
||||
|
||||
#: apps/remix/app/components/forms/organisation-update-form.tsx
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
#: apps/remix/app/components/forms/team-update-form.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-reset-button.tsx
|
||||
msgid "Reset"
|
||||
msgstr "リセット"
|
||||
@@ -9384,6 +9389,7 @@ msgid "Save as Template"
|
||||
msgstr "テンプレートとして保存"
|
||||
|
||||
#: apps/remix/app/components/dialogs/email-transport-update-dialog.tsx
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "Save changes"
|
||||
msgstr "変更を保存"
|
||||
|
||||
@@ -10224,6 +10230,11 @@ msgstr "サイト設定"
|
||||
msgid "Skip"
|
||||
msgstr "スキップ"
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-fields-page.tsx
|
||||
msgid "Some fields are placed on top of each other. This may complicate the signing process or cause fields to not work as expected."
|
||||
msgstr ""
|
||||
|
||||
#: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx
|
||||
msgid "Some signers have not been assigned a signature field. Please assign at least 1 signature field to each signer before proceeding."
|
||||
msgstr "一部の署名者に署名フィールドが割り当てられていません。続行する前に、各署名者に少なくとも 1 つの署名フィールドを割り当ててください。"
|
||||
@@ -12254,6 +12265,7 @@ msgstr "権限がありません"
|
||||
msgid "Uncompleted"
|
||||
msgstr "未完了"
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
#: packages/ui/primitives/signature-pad/signature-pad-draw.tsx
|
||||
msgid "Undo"
|
||||
msgstr "元に戻す"
|
||||
@@ -12303,6 +12315,10 @@ msgstr "リンク解除"
|
||||
msgid "Unpin"
|
||||
msgstr "ピン留めを解除"
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "Unsaved changes"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/unsealed-documents._index.tsx
|
||||
msgid "Unsealed Documents"
|
||||
@@ -12322,9 +12338,6 @@ msgstr "無題のグループ"
|
||||
#: apps/remix/app/components/dialogs/team-group-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/webhook-edit-dialog.tsx
|
||||
#: apps/remix/app/components/forms/branding-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/document-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/email-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-settings-dialog.tsx
|
||||
#: apps/remix/app/components/tables/admin-claims-table.tsx
|
||||
@@ -12347,6 +12360,7 @@ msgstr "バナーを更新"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains._index.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Update Billing"
|
||||
msgstr "請求情報を更新"
|
||||
|
||||
@@ -12374,10 +12388,6 @@ msgstr "メールを更新"
|
||||
msgid "Update Fields"
|
||||
msgstr "フィールドを更新"
|
||||
|
||||
#: apps/remix/app/components/forms/organisation-update-form.tsx
|
||||
msgid "Update organisation"
|
||||
msgstr "組織を更新"
|
||||
|
||||
#: apps/remix/app/components/dialogs/admin-organisation-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
@@ -12413,10 +12423,6 @@ msgstr "役割を更新"
|
||||
msgid "Update Subscription Claim"
|
||||
msgstr "サブスクリプションクレームを更新"
|
||||
|
||||
#: apps/remix/app/components/forms/team-update-form.tsx
|
||||
msgid "Update team"
|
||||
msgstr "チームを更新"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
|
||||
msgid "Update team email"
|
||||
@@ -12947,7 +12953,7 @@ msgstr "保留中"
|
||||
msgid "Waiting for others"
|
||||
msgstr "他の人の完了待ち"
|
||||
|
||||
#: packages/lib/server-only/document/send-pending-email.ts
|
||||
#: packages/lib/jobs/definitions/emails/send-document-pending-email.handler.ts
|
||||
msgid "Waiting for others to complete signing."
|
||||
msgstr "他の署名者による署名完了を待っています。"
|
||||
|
||||
@@ -13921,8 +13927,7 @@ msgstr "Documenso で {0} に参加するよう招待されています"
|
||||
msgid "You have been invited to join the following organisation"
|
||||
msgstr "次の組織に参加するよう招待されています。"
|
||||
|
||||
#: packages/lib/server-only/recipient/delete-envelope-recipient.ts
|
||||
#: packages/lib/server-only/recipient/set-document-recipients.ts
|
||||
#: packages/lib/jobs/definitions/emails/send-recipient-removed-email.handler.ts
|
||||
msgid "You have been removed from a document"
|
||||
msgstr "ドキュメントから削除されました"
|
||||
|
||||
@@ -14042,6 +14047,10 @@ msgstr "アクセスを正常に取り消しました。"
|
||||
msgid "You have the right to withdraw your consent to use electronic signatures at any time before completing the signing process. To withdraw your consent, please contact the sender of the document. In failing to contact the sender you may reach out to <0>{SUPPORT_EMAIL}</0> for assistance. Be aware that withdrawing consent may delay or halt the completion of the related transaction or service."
|
||||
msgstr "署名プロセスを完了する前であれば、電子署名の利用に対する同意をいつでも撤回する権利があります。同意を撤回するには、文書の送信者に連絡してください。送信者に連絡できない場合は、<0>{SUPPORT_EMAIL}</0> までお問い合わせください。同意を撤回すると、関連する取引やサービスの完了が遅延または中止される可能性がある点にご注意ください。"
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "You have unsaved changes"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
|
||||
msgid "You have updated {memberName}."
|
||||
msgstr "{memberName} を更新しました。"
|
||||
@@ -14721,4 +14730,3 @@ msgstr "認証コード:"
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
|
||||
msgid "your-domain.com another-domain.com"
|
||||
msgstr "your-domain.com another-domain.com"
|
||||
|
||||
|
||||
@@ -2441,6 +2441,7 @@ msgstr "브랜딩 로고"
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Branding Preferences"
|
||||
msgstr "브랜딩 환경설정"
|
||||
|
||||
@@ -3572,6 +3573,7 @@ msgid "Currently all organisation members can access this team"
|
||||
msgstr "현재 모든 조직 구성원이 이 팀에 접근할 수 있습니다."
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Currently branding can only be configured for Teams and above plans."
|
||||
msgstr "브랜딩은 현재 Teams 요금제 이상에서만 구성할 수 있습니다."
|
||||
|
||||
@@ -4214,8 +4216,8 @@ msgstr "문서가 취소되었습니다"
|
||||
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
|
||||
#: packages/lib/jobs/definitions/emails/send-document-deleted-emails.handler.ts
|
||||
#: packages/lib/server-only/admin/admin-super-delete-document.ts
|
||||
#: packages/lib/server-only/document/delete-document.ts
|
||||
msgid "Document Cancelled"
|
||||
msgstr "문서가 취소됨"
|
||||
|
||||
@@ -7942,6 +7944,11 @@ msgstr "원본"
|
||||
msgid "Otherwise, the document will be created as a draft."
|
||||
msgstr "그렇지 않으면 문서는 초안으로 생성됩니다."
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-fields-page.tsx
|
||||
msgid "Overlapping fields detected"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/document-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/email-preferences-form.tsx
|
||||
msgid "Override organisation settings"
|
||||
@@ -9197,9 +9204,7 @@ msgstr "봉투 다시 보내기"
|
||||
msgid "Resend verification"
|
||||
msgstr "인증 다시 보내기"
|
||||
|
||||
#: apps/remix/app/components/forms/organisation-update-form.tsx
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
#: apps/remix/app/components/forms/team-update-form.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-reset-button.tsx
|
||||
msgid "Reset"
|
||||
msgstr "초기화"
|
||||
@@ -9384,6 +9389,7 @@ msgid "Save as Template"
|
||||
msgstr "템플릿으로 저장"
|
||||
|
||||
#: apps/remix/app/components/dialogs/email-transport-update-dialog.tsx
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "Save changes"
|
||||
msgstr "변경 사항 저장"
|
||||
|
||||
@@ -10224,6 +10230,11 @@ msgstr "사이트 설정"
|
||||
msgid "Skip"
|
||||
msgstr "건너뛰기"
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-fields-page.tsx
|
||||
msgid "Some fields are placed on top of each other. This may complicate the signing process or cause fields to not work as expected."
|
||||
msgstr ""
|
||||
|
||||
#: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx
|
||||
msgid "Some signers have not been assigned a signature field. Please assign at least 1 signature field to each signer before proceeding."
|
||||
msgstr "일부 서명자에게 서명 필드가 할당되지 않았습니다. 진행하기 전에 각 서명자에게 최소 1개 이상의 서명 필드를 할당해 주세요."
|
||||
@@ -12254,6 +12265,7 @@ msgstr "권한이 없습니다"
|
||||
msgid "Uncompleted"
|
||||
msgstr "미완료"
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
#: packages/ui/primitives/signature-pad/signature-pad-draw.tsx
|
||||
msgid "Undo"
|
||||
msgstr "실행 취소"
|
||||
@@ -12303,6 +12315,10 @@ msgstr "연결 해제"
|
||||
msgid "Unpin"
|
||||
msgstr "고정 해제"
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "Unsaved changes"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/unsealed-documents._index.tsx
|
||||
msgid "Unsealed Documents"
|
||||
@@ -12322,9 +12338,6 @@ msgstr "제목 없는 그룹"
|
||||
#: apps/remix/app/components/dialogs/team-group-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/webhook-edit-dialog.tsx
|
||||
#: apps/remix/app/components/forms/branding-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/document-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/email-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-settings-dialog.tsx
|
||||
#: apps/remix/app/components/tables/admin-claims-table.tsx
|
||||
@@ -12347,6 +12360,7 @@ msgstr "배너 업데이트"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains._index.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Update Billing"
|
||||
msgstr "결제 정보 업데이트"
|
||||
|
||||
@@ -12374,10 +12388,6 @@ msgstr "이메일 업데이트"
|
||||
msgid "Update Fields"
|
||||
msgstr "필드 업데이트"
|
||||
|
||||
#: apps/remix/app/components/forms/organisation-update-form.tsx
|
||||
msgid "Update organisation"
|
||||
msgstr "조직 업데이트"
|
||||
|
||||
#: apps/remix/app/components/dialogs/admin-organisation-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
@@ -12413,10 +12423,6 @@ msgstr "역할 업데이트"
|
||||
msgid "Update Subscription Claim"
|
||||
msgstr "구독 클레임 업데이트"
|
||||
|
||||
#: apps/remix/app/components/forms/team-update-form.tsx
|
||||
msgid "Update team"
|
||||
msgstr "팀 업데이트"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
|
||||
msgid "Update team email"
|
||||
@@ -12947,7 +12953,7 @@ msgstr "대기 중"
|
||||
msgid "Waiting for others"
|
||||
msgstr "다른 사람을 기다리는 중"
|
||||
|
||||
#: packages/lib/server-only/document/send-pending-email.ts
|
||||
#: packages/lib/jobs/definitions/emails/send-document-pending-email.handler.ts
|
||||
msgid "Waiting for others to complete signing."
|
||||
msgstr "다른 서명자들이 이 문서에 서명 완료하기를 기다리는 중입니다."
|
||||
|
||||
@@ -13921,8 +13927,7 @@ msgstr "Documenso에서 {0} 조직에 초대되었습니다."
|
||||
msgid "You have been invited to join the following organisation"
|
||||
msgstr "다음 조직에 참여하라는 초대를 받았습니다."
|
||||
|
||||
#: packages/lib/server-only/recipient/delete-envelope-recipient.ts
|
||||
#: packages/lib/server-only/recipient/set-document-recipients.ts
|
||||
#: packages/lib/jobs/definitions/emails/send-recipient-removed-email.handler.ts
|
||||
msgid "You have been removed from a document"
|
||||
msgstr "문서에서 제거되었습니다."
|
||||
|
||||
@@ -14042,6 +14047,10 @@ msgstr "접근 권한을 성공적으로 철회했습니다."
|
||||
msgid "You have the right to withdraw your consent to use electronic signatures at any time before completing the signing process. To withdraw your consent, please contact the sender of the document. In failing to contact the sender you may reach out to <0>{SUPPORT_EMAIL}</0> for assistance. Be aware that withdrawing consent may delay or halt the completion of the related transaction or service."
|
||||
msgstr "전자 서명을 완료하기 전 언제든지 전자 서명 사용에 대한 동의를 철회할 권리가 있습니다. 동의를 철회하려면 문서 발송자에게 문의해 주세요. 발송자에게 연락할 수 없는 경우 <0>{SUPPORT_EMAIL}</0>로 도움을 요청해 주세요. 동의를 철회하면 관련 거래나 서비스가 지연되거나 중단될 수 있습니다."
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "You have unsaved changes"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
|
||||
msgid "You have updated {memberName}."
|
||||
msgstr "{memberName}을(를) 업데이트했습니다."
|
||||
@@ -14721,4 +14730,3 @@ msgstr "인증 코드:"
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
|
||||
msgid "your-domain.com another-domain.com"
|
||||
msgstr "your-domain.com another-domain.com"
|
||||
|
||||
|
||||
@@ -2441,6 +2441,7 @@ msgstr "Branding-logo"
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Branding Preferences"
|
||||
msgstr "Brandingvoorkeuren"
|
||||
|
||||
@@ -3572,6 +3573,7 @@ msgid "Currently all organisation members can access this team"
|
||||
msgstr "Momenteel hebben alle organisatieleden toegang tot dit team"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Currently branding can only be configured for Teams and above plans."
|
||||
msgstr "Branding kan momenteel alleen worden geconfigureerd voor Teams- en hogere abonnementen."
|
||||
|
||||
@@ -4214,8 +4216,8 @@ msgstr "Document geannuleerd"
|
||||
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
|
||||
#: packages/lib/jobs/definitions/emails/send-document-deleted-emails.handler.ts
|
||||
#: packages/lib/server-only/admin/admin-super-delete-document.ts
|
||||
#: packages/lib/server-only/document/delete-document.ts
|
||||
msgid "Document Cancelled"
|
||||
msgstr "Document geannuleerd"
|
||||
|
||||
@@ -7942,6 +7944,11 @@ msgstr "Origineel"
|
||||
msgid "Otherwise, the document will be created as a draft."
|
||||
msgstr "Anders wordt het document als concept aangemaakt."
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-fields-page.tsx
|
||||
msgid "Overlapping fields detected"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/document-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/email-preferences-form.tsx
|
||||
msgid "Override organisation settings"
|
||||
@@ -9197,9 +9204,7 @@ msgstr "Envelope opnieuw verzenden"
|
||||
msgid "Resend verification"
|
||||
msgstr "Verificatie opnieuw verzenden"
|
||||
|
||||
#: apps/remix/app/components/forms/organisation-update-form.tsx
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
#: apps/remix/app/components/forms/team-update-form.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-reset-button.tsx
|
||||
msgid "Reset"
|
||||
msgstr "Resetten"
|
||||
@@ -9384,6 +9389,7 @@ msgid "Save as Template"
|
||||
msgstr "Opslaan als sjabloon"
|
||||
|
||||
#: apps/remix/app/components/dialogs/email-transport-update-dialog.tsx
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "Save changes"
|
||||
msgstr "Wijzigingen opslaan"
|
||||
|
||||
@@ -10224,6 +10230,11 @@ msgstr "Site‑instellingen"
|
||||
msgid "Skip"
|
||||
msgstr "Overslaan"
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-fields-page.tsx
|
||||
msgid "Some fields are placed on top of each other. This may complicate the signing process or cause fields to not work as expected."
|
||||
msgstr ""
|
||||
|
||||
#: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx
|
||||
msgid "Some signers have not been assigned a signature field. Please assign at least 1 signature field to each signer before proceeding."
|
||||
msgstr "Sommige ondertekenaars hebben geen handtekeningveld toegewezen gekregen. Wijs ten minste 1 handtekeningveld toe aan elke ondertekenaar voordat je doorgaat."
|
||||
@@ -12254,6 +12265,7 @@ msgstr "Niet gemachtigd"
|
||||
msgid "Uncompleted"
|
||||
msgstr "Onvoltooid"
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
#: packages/ui/primitives/signature-pad/signature-pad-draw.tsx
|
||||
msgid "Undo"
|
||||
msgstr "Ongedaan maken"
|
||||
@@ -12303,6 +12315,10 @@ msgstr "Ontkoppelen"
|
||||
msgid "Unpin"
|
||||
msgstr "Losmaken"
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "Unsaved changes"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/unsealed-documents._index.tsx
|
||||
msgid "Unsealed Documents"
|
||||
@@ -12322,9 +12338,6 @@ msgstr "Naamloze groep"
|
||||
#: apps/remix/app/components/dialogs/team-group-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/webhook-edit-dialog.tsx
|
||||
#: apps/remix/app/components/forms/branding-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/document-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/email-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-settings-dialog.tsx
|
||||
#: apps/remix/app/components/tables/admin-claims-table.tsx
|
||||
@@ -12347,6 +12360,7 @@ msgstr "Banner bijwerken"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains._index.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Update Billing"
|
||||
msgstr "Facturering bijwerken"
|
||||
|
||||
@@ -12374,10 +12388,6 @@ msgstr "E-mail bijwerken"
|
||||
msgid "Update Fields"
|
||||
msgstr "Velden bijwerken"
|
||||
|
||||
#: apps/remix/app/components/forms/organisation-update-form.tsx
|
||||
msgid "Update organisation"
|
||||
msgstr "Organisatie bijwerken"
|
||||
|
||||
#: apps/remix/app/components/dialogs/admin-organisation-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
@@ -12413,10 +12423,6 @@ msgstr "Rol bijwerken"
|
||||
msgid "Update Subscription Claim"
|
||||
msgstr "Abonnementsclaim bijwerken"
|
||||
|
||||
#: apps/remix/app/components/forms/team-update-form.tsx
|
||||
msgid "Update team"
|
||||
msgstr "Team bijwerken"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
|
||||
msgid "Update team email"
|
||||
@@ -12947,7 +12953,7 @@ msgstr "Wachten"
|
||||
msgid "Waiting for others"
|
||||
msgstr "Wachten op anderen"
|
||||
|
||||
#: packages/lib/server-only/document/send-pending-email.ts
|
||||
#: packages/lib/jobs/definitions/emails/send-document-pending-email.handler.ts
|
||||
msgid "Waiting for others to complete signing."
|
||||
msgstr "Wachten tot anderen het ondertekenen hebben voltooid."
|
||||
|
||||
@@ -13921,8 +13927,7 @@ msgstr "Je bent uitgenodigd om {0} op Documenso te joinen"
|
||||
msgid "You have been invited to join the following organisation"
|
||||
msgstr "Je bent uitgenodigd om lid te worden van de volgende organisatie"
|
||||
|
||||
#: packages/lib/server-only/recipient/delete-envelope-recipient.ts
|
||||
#: packages/lib/server-only/recipient/set-document-recipients.ts
|
||||
#: packages/lib/jobs/definitions/emails/send-recipient-removed-email.handler.ts
|
||||
msgid "You have been removed from a document"
|
||||
msgstr "Je bent verwijderd uit een document"
|
||||
|
||||
@@ -14042,6 +14047,10 @@ msgstr "Je hebt de toegang succesvol ingetrokken."
|
||||
msgid "You have the right to withdraw your consent to use electronic signatures at any time before completing the signing process. To withdraw your consent, please contact the sender of the document. In failing to contact the sender you may reach out to <0>{SUPPORT_EMAIL}</0> for assistance. Be aware that withdrawing consent may delay or halt the completion of the related transaction or service."
|
||||
msgstr "Je hebt het recht je toestemming voor het gebruik van elektronische handtekeningen op elk moment vóór voltooiing van het ondertekeningsproces in te trekken. Neem hiervoor contact op met de verzender van het document. Als dat niet lukt, kun je contact opnemen met <0>{SUPPORT_EMAIL}</0> voor hulp. Houd er rekening mee dat het intrekken van toestemming de voltooiing van de betreffende transactie of dienst kan vertragen of stopzetten."
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "You have unsaved changes"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
|
||||
msgid "You have updated {memberName}."
|
||||
msgstr "Je hebt {memberName} bijgewerkt."
|
||||
@@ -14721,4 +14730,3 @@ msgstr "Uw verificatiecode:"
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
|
||||
msgid "your-domain.com another-domain.com"
|
||||
msgstr "your-domain.com another-domain.com"
|
||||
|
||||
|
||||
@@ -2441,6 +2441,7 @@ msgstr "Logo marki"
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Branding Preferences"
|
||||
msgstr "Ustawienia brandingu"
|
||||
|
||||
@@ -2501,7 +2502,6 @@ msgstr "Akceptując prośbę, przyznasz zespołowi {0} następujące uprawnienia
|
||||
|
||||
#: packages/email/templates/confirm-team-email.tsx
|
||||
msgid "By accepting this request, you will be granting <0>{teamName}</0> access to:"
|
||||
msgstr "Akceptując prośbę, umożliwisz zespołowi <0>{teamName}</0> na:"
|
||||
msgstr "Akceptując prośbę, umożliwisz zespołowi <0>{teamName}</0>:"
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelope-delete-dialog.tsx
|
||||
@@ -3573,6 +3573,7 @@ msgid "Currently all organisation members can access this team"
|
||||
msgstr "Obecnie wszyscy użytkownicy organizacji mogą uzyskać dostęp tego zespołu"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Currently branding can only be configured for Teams and above plans."
|
||||
msgstr "Branding możesz skonfigurować tylko w planie Teams i wyższym."
|
||||
|
||||
@@ -4215,8 +4216,8 @@ msgstr "Anulowano dokument"
|
||||
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
|
||||
#: packages/lib/jobs/definitions/emails/send-document-deleted-emails.handler.ts
|
||||
#: packages/lib/server-only/admin/admin-super-delete-document.ts
|
||||
#: packages/lib/server-only/document/delete-document.ts
|
||||
msgid "Document Cancelled"
|
||||
msgstr "Dokument został anulowany"
|
||||
|
||||
@@ -7943,6 +7944,11 @@ msgstr "Oryginalny"
|
||||
msgid "Otherwise, the document will be created as a draft."
|
||||
msgstr "W przeciwnym razie dokument zostanie utworzony jako wersja robocza."
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-fields-page.tsx
|
||||
msgid "Overlapping fields detected"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/document-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/email-preferences-form.tsx
|
||||
msgid "Override organisation settings"
|
||||
@@ -9198,9 +9204,7 @@ msgstr "Wyślij ponownie kopertę"
|
||||
msgid "Resend verification"
|
||||
msgstr "Wyślij ponownie wiadomość weryfikacyjną"
|
||||
|
||||
#: apps/remix/app/components/forms/organisation-update-form.tsx
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
#: apps/remix/app/components/forms/team-update-form.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-reset-button.tsx
|
||||
msgid "Reset"
|
||||
msgstr "Resetuj"
|
||||
@@ -9385,6 +9389,7 @@ msgid "Save as Template"
|
||||
msgstr "Zapisz jako szablon"
|
||||
|
||||
#: apps/remix/app/components/dialogs/email-transport-update-dialog.tsx
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "Save changes"
|
||||
msgstr "Zapisz zmiany"
|
||||
|
||||
@@ -10225,6 +10230,11 @@ msgstr "Ustawienia strony"
|
||||
msgid "Skip"
|
||||
msgstr "Pomiń"
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-fields-page.tsx
|
||||
msgid "Some fields are placed on top of each other. This may complicate the signing process or cause fields to not work as expected."
|
||||
msgstr ""
|
||||
|
||||
#: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx
|
||||
msgid "Some signers have not been assigned a signature field. Please assign at least 1 signature field to each signer before proceeding."
|
||||
msgstr "Niektórym podpisującym nie przypisano pola podpisu. Przypisz co najmniej jedno pole podpisu do każdego podpisującego."
|
||||
@@ -12255,6 +12265,7 @@ msgstr "Nieautoryzowany"
|
||||
msgid "Uncompleted"
|
||||
msgstr "Niezakończono"
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
#: packages/ui/primitives/signature-pad/signature-pad-draw.tsx
|
||||
msgid "Undo"
|
||||
msgstr "Cofnij"
|
||||
@@ -12304,6 +12315,10 @@ msgstr "Rozłącz"
|
||||
msgid "Unpin"
|
||||
msgstr "Odepnij"
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "Unsaved changes"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/unsealed-documents._index.tsx
|
||||
msgid "Unsealed Documents"
|
||||
@@ -12323,9 +12338,6 @@ msgstr "Grupa bez nazwy"
|
||||
#: apps/remix/app/components/dialogs/team-group-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/webhook-edit-dialog.tsx
|
||||
#: apps/remix/app/components/forms/branding-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/document-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/email-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-settings-dialog.tsx
|
||||
#: apps/remix/app/components/tables/admin-claims-table.tsx
|
||||
@@ -12348,6 +12360,7 @@ msgstr "Zaktualizuj baner"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains._index.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Update Billing"
|
||||
msgstr "Zaktualizuj płatności"
|
||||
|
||||
@@ -12375,10 +12388,6 @@ msgstr "Zaktualizuj adres e-mail"
|
||||
msgid "Update Fields"
|
||||
msgstr "Zaktualizuj pola"
|
||||
|
||||
#: apps/remix/app/components/forms/organisation-update-form.tsx
|
||||
msgid "Update organisation"
|
||||
msgstr "Zaktualizuj organizację"
|
||||
|
||||
#: apps/remix/app/components/dialogs/admin-organisation-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
@@ -12414,10 +12423,6 @@ msgstr "Zaktualizuj rolę"
|
||||
msgid "Update Subscription Claim"
|
||||
msgstr "Zaktualizuj subskrypcję"
|
||||
|
||||
#: apps/remix/app/components/forms/team-update-form.tsx
|
||||
msgid "Update team"
|
||||
msgstr "Zaktualizuj zespół"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
|
||||
msgid "Update team email"
|
||||
@@ -12948,7 +12953,7 @@ msgstr "Oczekiwanie"
|
||||
msgid "Waiting for others"
|
||||
msgstr "Oczekiwanie na innych"
|
||||
|
||||
#: packages/lib/server-only/document/send-pending-email.ts
|
||||
#: packages/lib/jobs/definitions/emails/send-document-pending-email.handler.ts
|
||||
msgid "Waiting for others to complete signing."
|
||||
msgstr "Oczekiwanie na zakończenie podpisywania przez innych."
|
||||
|
||||
@@ -13922,8 +13927,7 @@ msgstr "Dołącz do organizacji {0} w Documenso"
|
||||
msgid "You have been invited to join the following organisation"
|
||||
msgstr "Masz zaproszenie do dołączenia do następującej organizacji"
|
||||
|
||||
#: packages/lib/server-only/recipient/delete-envelope-recipient.ts
|
||||
#: packages/lib/server-only/recipient/set-document-recipients.ts
|
||||
#: packages/lib/jobs/definitions/emails/send-recipient-removed-email.handler.ts
|
||||
msgid "You have been removed from a document"
|
||||
msgstr "Usunięto Cię z dokumentu"
|
||||
|
||||
@@ -14043,6 +14047,10 @@ msgstr "Dostęp został unieważniony."
|
||||
msgid "You have the right to withdraw your consent to use electronic signatures at any time before completing the signing process. To withdraw your consent, please contact the sender of the document. In failing to contact the sender you may reach out to <0>{SUPPORT_EMAIL}</0> for assistance. Be aware that withdrawing consent may delay or halt the completion of the related transaction or service."
|
||||
msgstr "Masz prawo wycofać swoją zgodę na używanie podpisów elektronicznych w dowolnym momencie przed zakończeniem procesu podpisywania. Aby wycofać zgodę, skontaktuj się z nadawcą dokumentu. Jeśli nie możesz skontaktować się z nadawcą, napisz do nas na adres <0>{SUPPORT_EMAIL}</0>. Pamiętaj, że wycofanie zgody może opóźnić lub wstrzymać realizację danej transakcji lub usługi."
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "You have unsaved changes"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
|
||||
msgid "You have updated {memberName}."
|
||||
msgstr "Użytkownik {memberName} został zaktualizowany."
|
||||
@@ -14722,4 +14730,3 @@ msgstr "Twój kod weryfikacyjny:"
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
|
||||
msgid "your-domain.com another-domain.com"
|
||||
msgstr "twoja-domena.pl inna-domena.pl"
|
||||
|
||||
|
||||
@@ -2436,6 +2436,7 @@ msgstr "Logo da Marca"
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Branding Preferences"
|
||||
msgstr "Preferências da Marca"
|
||||
|
||||
@@ -3567,6 +3568,7 @@ msgid "Currently all organisation members can access this team"
|
||||
msgstr "Atualmente, todos os membros da organização podem acessar esta equipe"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Currently branding can only be configured for Teams and above plans."
|
||||
msgstr "Atualmente, a marca só pode ser configurada para planos Teams e superiores."
|
||||
|
||||
@@ -4209,8 +4211,8 @@ msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
|
||||
#: packages/lib/jobs/definitions/emails/send-document-deleted-emails.handler.ts
|
||||
#: packages/lib/server-only/admin/admin-super-delete-document.ts
|
||||
#: packages/lib/server-only/document/delete-document.ts
|
||||
msgid "Document Cancelled"
|
||||
msgstr "Documento Cancelado"
|
||||
|
||||
@@ -7937,6 +7939,11 @@ msgstr "Original"
|
||||
msgid "Otherwise, the document will be created as a draft."
|
||||
msgstr "Caso contrário, o documento será criado como um rascunho."
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-fields-page.tsx
|
||||
msgid "Overlapping fields detected"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/document-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/email-preferences-form.tsx
|
||||
msgid "Override organisation settings"
|
||||
@@ -8772,6 +8779,10 @@ msgstr ""
|
||||
msgid "Recipient rejected the document"
|
||||
msgstr ""
|
||||
|
||||
#: packages/lib/utils/document-audit-logs.ts
|
||||
msgid "Recipient rejected the document externally"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/general/admin-global-settings-section.tsx
|
||||
msgid "Recipient removed"
|
||||
msgstr ""
|
||||
@@ -9188,9 +9199,7 @@ msgstr ""
|
||||
msgid "Resend verification"
|
||||
msgstr "Reenviar verificação"
|
||||
|
||||
#: apps/remix/app/components/forms/organisation-update-form.tsx
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
#: apps/remix/app/components/forms/team-update-form.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-reset-button.tsx
|
||||
msgid "Reset"
|
||||
msgstr "Redefinir"
|
||||
@@ -9375,6 +9384,7 @@ msgid "Save as Template"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/email-transport-update-dialog.tsx
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "Save changes"
|
||||
msgstr ""
|
||||
|
||||
@@ -10215,6 +10225,11 @@ msgstr "Configurações do Site"
|
||||
msgid "Skip"
|
||||
msgstr "Pular"
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-fields-page.tsx
|
||||
msgid "Some fields are placed on top of each other. This may complicate the signing process or cause fields to not work as expected."
|
||||
msgstr ""
|
||||
|
||||
#: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx
|
||||
msgid "Some signers have not been assigned a signature field. Please assign at least 1 signature field to each signer before proceeding."
|
||||
msgstr "Alguns signatários não receberam um campo de assinatura. Por favor, atribua pelo menos 1 campo de assinatura a cada signatário antes de prosseguir."
|
||||
@@ -11093,6 +11108,23 @@ msgstr ""
|
||||
msgid "The document was created but could not be sent to recipients."
|
||||
msgstr "O documento foi criado, mas não pôde ser enviado aos destinatários."
|
||||
|
||||
#: packages/lib/utils/document-audit-logs.ts
|
||||
msgid "The document was rejected externally by {onBehalfOf} on behalf of {user}"
|
||||
msgstr ""
|
||||
|
||||
#: packages/lib/utils/document-audit-logs.ts
|
||||
#: packages/lib/utils/document-audit-logs.ts
|
||||
msgid "The document was rejected externally by {onBehalfOf} on behalf of the recipient"
|
||||
msgstr ""
|
||||
|
||||
#: packages/lib/utils/document-audit-logs.ts
|
||||
msgid "The document was rejected externally on behalf of {user}"
|
||||
msgstr ""
|
||||
|
||||
#: packages/lib/utils/document-audit-logs.ts
|
||||
msgid "The document was rejected externally on behalf of the recipient"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelope-delete-dialog.tsx
|
||||
msgid "The document will be hidden from your account"
|
||||
msgstr "O documento será ocultado da sua conta"
|
||||
@@ -12228,6 +12260,7 @@ msgstr "Não autorizado"
|
||||
msgid "Uncompleted"
|
||||
msgstr "Não concluído"
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
#: packages/ui/primitives/signature-pad/signature-pad-draw.tsx
|
||||
msgid "Undo"
|
||||
msgstr ""
|
||||
@@ -12277,6 +12310,10 @@ msgstr "Desvincular"
|
||||
msgid "Unpin"
|
||||
msgstr "Desafixar"
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "Unsaved changes"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/unsealed-documents._index.tsx
|
||||
msgid "Unsealed Documents"
|
||||
@@ -12296,9 +12333,6 @@ msgstr "Grupo sem título"
|
||||
#: apps/remix/app/components/dialogs/team-group-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/webhook-edit-dialog.tsx
|
||||
#: apps/remix/app/components/forms/branding-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/document-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/email-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-settings-dialog.tsx
|
||||
#: apps/remix/app/components/tables/admin-claims-table.tsx
|
||||
@@ -12321,6 +12355,7 @@ msgstr "Atualizar Banner"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains._index.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Update Billing"
|
||||
msgstr "Atualizar Faturamento"
|
||||
|
||||
@@ -12348,10 +12383,6 @@ msgstr "Atualizar e-mail"
|
||||
msgid "Update Fields"
|
||||
msgstr "Atualizar Campos"
|
||||
|
||||
#: apps/remix/app/components/forms/organisation-update-form.tsx
|
||||
msgid "Update organisation"
|
||||
msgstr "Atualizar organização"
|
||||
|
||||
#: apps/remix/app/components/dialogs/admin-organisation-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
@@ -12387,10 +12418,6 @@ msgstr "Atualizar função"
|
||||
msgid "Update Subscription Claim"
|
||||
msgstr "Atualizar Reivindicação de Assinatura"
|
||||
|
||||
#: apps/remix/app/components/forms/team-update-form.tsx
|
||||
msgid "Update team"
|
||||
msgstr "Atualizar equipe"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
|
||||
msgid "Update team email"
|
||||
@@ -12921,7 +12948,7 @@ msgstr "Aguardando"
|
||||
msgid "Waiting for others"
|
||||
msgstr "Aguardando outros"
|
||||
|
||||
#: packages/lib/server-only/document/send-pending-email.ts
|
||||
#: packages/lib/jobs/definitions/emails/send-document-pending-email.handler.ts
|
||||
msgid "Waiting for others to complete signing."
|
||||
msgstr "Aguardando outros completarem a assinatura."
|
||||
|
||||
@@ -13895,8 +13922,7 @@ msgstr "Você foi convidado para participar de {0} no Documenso"
|
||||
msgid "You have been invited to join the following organisation"
|
||||
msgstr "Você foi convidado para participar da seguinte organização"
|
||||
|
||||
#: packages/lib/server-only/recipient/delete-envelope-recipient.ts
|
||||
#: packages/lib/server-only/recipient/set-document-recipients.ts
|
||||
#: packages/lib/jobs/definitions/emails/send-recipient-removed-email.handler.ts
|
||||
msgid "You have been removed from a document"
|
||||
msgstr "Você foi removido de um documento"
|
||||
|
||||
@@ -14016,6 +14042,10 @@ msgstr "Você revogou o acesso com sucesso."
|
||||
msgid "You have the right to withdraw your consent to use electronic signatures at any time before completing the signing process. To withdraw your consent, please contact the sender of the document. In failing to contact the sender you may reach out to <0>{SUPPORT_EMAIL}</0> for assistance. Be aware that withdrawing consent may delay or halt the completion of the related transaction or service."
|
||||
msgstr "Você tem o direito de retirar seu consentimento para usar assinaturas eletrônicas a qualquer momento antes de concluir o processo de assinatura. Para retirar seu consentimento, entre em contato com o remetente do documento. Se não conseguir entrar em contato com o remetente, você pode entrar em contato com <0>{SUPPORT_EMAIL}</0> para obter assistência. Esteja ciente de que a retirada do consentimento pode atrasar ou interromper a conclusão da transação ou serviço relacionado."
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "You have unsaved changes"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
|
||||
msgid "You have updated {memberName}."
|
||||
msgstr "Você atualizou {memberName}."
|
||||
|
||||
@@ -2441,6 +2441,7 @@ msgstr "品牌 Logo"
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Branding Preferences"
|
||||
msgstr "品牌偏好设置"
|
||||
|
||||
@@ -3572,6 +3573,7 @@ msgid "Currently all organisation members can access this team"
|
||||
msgstr "目前所有组织成员都可以访问此团队"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Currently branding can only be configured for Teams and above plans."
|
||||
msgstr "目前仅 Teams 及以上套餐可以配置品牌。"
|
||||
|
||||
@@ -4214,8 +4216,8 @@ msgstr "文档已被取消"
|
||||
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
|
||||
#: apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
|
||||
#: packages/lib/jobs/definitions/emails/send-document-deleted-emails.handler.ts
|
||||
#: packages/lib/server-only/admin/admin-super-delete-document.ts
|
||||
#: packages/lib/server-only/document/delete-document.ts
|
||||
msgid "Document Cancelled"
|
||||
msgstr "文档已取消"
|
||||
|
||||
@@ -7942,6 +7944,11 @@ msgstr "原始"
|
||||
msgid "Otherwise, the document will be created as a draft."
|
||||
msgstr "否则将把文档创建为草稿。"
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-fields-page.tsx
|
||||
msgid "Overlapping fields detected"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/forms/document-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/email-preferences-form.tsx
|
||||
msgid "Override organisation settings"
|
||||
@@ -9197,9 +9204,7 @@ msgstr "重新发送信封"
|
||||
msgid "Resend verification"
|
||||
msgstr "重新发送验证"
|
||||
|
||||
#: apps/remix/app/components/forms/organisation-update-form.tsx
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
#: apps/remix/app/components/forms/team-update-form.tsx
|
||||
#: apps/remix/app/components/general/organisation-usage-reset-button.tsx
|
||||
msgid "Reset"
|
||||
msgstr "重置"
|
||||
@@ -9384,6 +9389,7 @@ msgid "Save as Template"
|
||||
msgstr "另存为模板"
|
||||
|
||||
#: apps/remix/app/components/dialogs/email-transport-update-dialog.tsx
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "Save changes"
|
||||
msgstr "保存更改"
|
||||
|
||||
@@ -10224,6 +10230,11 @@ msgstr "站点设置"
|
||||
msgid "Skip"
|
||||
msgstr "跳过"
|
||||
|
||||
#: apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-fields-page.tsx
|
||||
msgid "Some fields are placed on top of each other. This may complicate the signing process or cause fields to not work as expected."
|
||||
msgstr ""
|
||||
|
||||
#: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx
|
||||
msgid "Some signers have not been assigned a signature field. Please assign at least 1 signature field to each signer before proceeding."
|
||||
msgstr "部分签署人尚未被分配签名字段。请在继续前为每位签署人至少分配 1 个签名字段。"
|
||||
@@ -12254,6 +12265,7 @@ msgstr "未授权"
|
||||
msgid "Uncompleted"
|
||||
msgstr "未完成"
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
#: packages/ui/primitives/signature-pad/signature-pad-draw.tsx
|
||||
msgid "Undo"
|
||||
msgstr "撤销"
|
||||
@@ -12303,6 +12315,10 @@ msgstr "取消关联"
|
||||
msgid "Unpin"
|
||||
msgstr "取消固定"
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "Unsaved changes"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/admin+/unsealed-documents._index.tsx
|
||||
msgid "Unsealed Documents"
|
||||
@@ -12322,9 +12338,6 @@ msgstr "未命名组"
|
||||
#: apps/remix/app/components/dialogs/team-group-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/webhook-edit-dialog.tsx
|
||||
#: apps/remix/app/components/forms/branding-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/document-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/email-preferences-form.tsx
|
||||
#: apps/remix/app/components/forms/public-profile-form.tsx
|
||||
#: apps/remix/app/components/general/envelope-editor/envelope-editor-settings-dialog.tsx
|
||||
#: apps/remix/app/components/tables/admin-claims-table.tsx
|
||||
@@ -12347,6 +12360,7 @@ msgstr "更新横幅"
|
||||
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.branding.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.email-domains._index.tsx
|
||||
#: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx
|
||||
msgid "Update Billing"
|
||||
msgstr "更新计费"
|
||||
|
||||
@@ -12374,10 +12388,6 @@ msgstr "更新邮箱"
|
||||
msgid "Update Fields"
|
||||
msgstr "更新字段"
|
||||
|
||||
#: apps/remix/app/components/forms/organisation-update-form.tsx
|
||||
msgid "Update organisation"
|
||||
msgstr "更新组织"
|
||||
|
||||
#: apps/remix/app/components/dialogs/admin-organisation-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/organisation-member-update-dialog.tsx
|
||||
@@ -12413,10 +12423,6 @@ msgstr "更新角色"
|
||||
msgid "Update Subscription Claim"
|
||||
msgstr "更新订阅声明"
|
||||
|
||||
#: apps/remix/app/components/forms/team-update-form.tsx
|
||||
msgid "Update team"
|
||||
msgstr "更新团队"
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
|
||||
#: apps/remix/app/components/dialogs/team-email-update-dialog.tsx
|
||||
msgid "Update team email"
|
||||
@@ -12947,7 +12953,7 @@ msgstr "等待中"
|
||||
msgid "Waiting for others"
|
||||
msgstr "等待其他人"
|
||||
|
||||
#: packages/lib/server-only/document/send-pending-email.ts
|
||||
#: packages/lib/jobs/definitions/emails/send-document-pending-email.handler.ts
|
||||
msgid "Waiting for others to complete signing."
|
||||
msgstr "正在等待其他人完成签署。"
|
||||
|
||||
@@ -13921,8 +13927,7 @@ msgstr "您已被邀请加入 Documenso 上的 {0}"
|
||||
msgid "You have been invited to join the following organisation"
|
||||
msgstr "您已被邀请加入以下组织"
|
||||
|
||||
#: packages/lib/server-only/recipient/delete-envelope-recipient.ts
|
||||
#: packages/lib/server-only/recipient/set-document-recipients.ts
|
||||
#: packages/lib/jobs/definitions/emails/send-recipient-removed-email.handler.ts
|
||||
msgid "You have been removed from a document"
|
||||
msgstr "您已被从某个文档中移除"
|
||||
|
||||
@@ -14042,6 +14047,10 @@ msgstr "你已成功撤销访问权限。"
|
||||
msgid "You have the right to withdraw your consent to use electronic signatures at any time before completing the signing process. To withdraw your consent, please contact the sender of the document. In failing to contact the sender you may reach out to <0>{SUPPORT_EMAIL}</0> for assistance. Be aware that withdrawing consent may delay or halt the completion of the related transaction or service."
|
||||
msgstr "在完成签署流程之前,你有权随时撤回对使用电子签名的同意。要撤回同意,请联系文档的发送方。如果无法联系发送方,你可以通过 <0>{SUPPORT_EMAIL}</0> 与我们联系以获得协助。请注意,撤回同意可能会延迟或中止相关交易或服务的完成。"
|
||||
|
||||
#: apps/remix/app/components/forms/form-sticky-save-bar.tsx
|
||||
msgid "You have unsaved changes"
|
||||
msgstr ""
|
||||
|
||||
#: apps/remix/app/components/dialogs/team-member-update-dialog.tsx
|
||||
msgid "You have updated {memberName}."
|
||||
msgstr "您已更新 {memberName}。"
|
||||
@@ -14721,4 +14730,3 @@ msgstr "您的验证码:"
|
||||
#: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx
|
||||
msgid "your-domain.com another-domain.com"
|
||||
msgstr "your-domain.com another-domain.com"
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ export const ZClaimFlagsSchema = z.object({
|
||||
signingReminders: z.boolean().optional(),
|
||||
|
||||
cscQesSigning: z.boolean().optional(),
|
||||
|
||||
|
||||
/**
|
||||
* Controls whether an organisation is prevented from sending emails.
|
||||
*
|
||||
|
||||
@@ -310,6 +310,9 @@ export const seedDraftDocument = async (
|
||||
|
||||
const documentId = await incrementDocumentId();
|
||||
|
||||
const envelopeTitle =
|
||||
typeof createDocumentOptions.title === 'string' ? createDocumentOptions.title : `[TEST] Document ${key} - Draft`;
|
||||
|
||||
const document = await prisma.envelope.create({
|
||||
data: {
|
||||
id: prefixedId('envelope'),
|
||||
@@ -320,12 +323,12 @@ export const seedDraftDocument = async (
|
||||
documentMetaId: documentMeta.id,
|
||||
source: DocumentSource.DOCUMENT,
|
||||
teamId,
|
||||
title: `[TEST] Document ${key} - Draft`,
|
||||
title: envelopeTitle,
|
||||
status: DocumentStatus.DRAFT,
|
||||
envelopeItems: {
|
||||
create: {
|
||||
id: prefixedId('envelope_item'),
|
||||
title: `[TEST] Document ${key} - Draft`,
|
||||
title: envelopeTitle,
|
||||
documentDataId: documentData.id,
|
||||
order: 1,
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user