mirror of
https://github.com/documenso/documenso.git
synced 2025-11-12 15:53:02 +10:00
## Description Support setting a document language that will control the language used for sending emails to recipients. Additional work has been done to convert all emails to using our i18n implementation so we can later add controls for sending other kinds of emails in a users target language. ## Related Issue N/A ## Changes Made - Added `<Trans>` and `msg` macros to emails - Introduced a new `renderEmailWithI18N` utility in the lib package - Updated all emails to use the `<Tailwind>` component at the top level due to rendering constraints - Updated the `i18n.server.tsx` file to not use a top level await ## Testing Performed - Configured document language and verified emails were sent in the expected language - Created a document from a template and verified that the templates language was transferred to the document
206 lines
6.0 KiB
TypeScript
206 lines
6.0 KiB
TypeScript
import { z } from 'zod';
|
|
|
|
import { SUPPORTED_LANGUAGE_CODES } from '@documenso/lib/constants/i18n';
|
|
import {
|
|
ZDocumentAccessAuthTypesSchema,
|
|
ZDocumentActionAuthTypesSchema,
|
|
} from '@documenso/lib/types/document-auth';
|
|
import { ZBaseTableSearchParamsSchema } from '@documenso/lib/types/search-params';
|
|
import { isValidRedirectUrl } from '@documenso/lib/utils/is-valid-redirect-url';
|
|
import { DocumentSigningOrder, FieldType, RecipientRole } from '@documenso/prisma/client';
|
|
|
|
export const ZFindDocumentAuditLogsQuerySchema = ZBaseTableSearchParamsSchema.extend({
|
|
documentId: z.number().min(1),
|
|
cursor: z.string().optional(),
|
|
filterForRecentActivity: z.boolean().optional(),
|
|
orderBy: z
|
|
.object({
|
|
column: z.enum(['createdAt', 'type']),
|
|
direction: z.enum(['asc', 'desc']),
|
|
})
|
|
.optional(),
|
|
});
|
|
|
|
export const ZGetDocumentByIdQuerySchema = z.object({
|
|
id: z.number().min(1),
|
|
teamId: z.number().min(1).optional(),
|
|
});
|
|
|
|
export type TGetDocumentByIdQuerySchema = z.infer<typeof ZGetDocumentByIdQuerySchema>;
|
|
|
|
export const ZGetDocumentByTokenQuerySchema = z.object({
|
|
token: z.string().min(1),
|
|
});
|
|
|
|
export type TGetDocumentByTokenQuerySchema = z.infer<typeof ZGetDocumentByTokenQuerySchema>;
|
|
|
|
export const ZGetDocumentWithDetailsByIdQuerySchema = z.object({
|
|
id: z.number().min(1),
|
|
teamId: z.number().min(1).optional(),
|
|
});
|
|
|
|
export type TGetDocumentWithDetailsByIdQuerySchema = z.infer<
|
|
typeof ZGetDocumentWithDetailsByIdQuerySchema
|
|
>;
|
|
|
|
export const ZCreateDocumentMutationSchema = z.object({
|
|
title: z.string().min(1),
|
|
documentDataId: z.string().min(1),
|
|
teamId: z.number().optional(),
|
|
});
|
|
|
|
export type TCreateDocumentMutationSchema = z.infer<typeof ZCreateDocumentMutationSchema>;
|
|
|
|
export const ZSetSettingsForDocumentMutationSchema = z.object({
|
|
documentId: z.number(),
|
|
teamId: z.number().min(1).optional(),
|
|
data: z.object({
|
|
title: z.string().min(1).optional(),
|
|
externalId: z.string().nullish(),
|
|
visibility: z.string().optional(),
|
|
globalAccessAuth: ZDocumentAccessAuthTypesSchema.nullable().optional(),
|
|
globalActionAuth: ZDocumentActionAuthTypesSchema.nullable().optional(),
|
|
}),
|
|
meta: z.object({
|
|
timezone: z.string(),
|
|
dateFormat: z.string(),
|
|
redirectUrl: z
|
|
.string()
|
|
.optional()
|
|
.refine((value) => value === undefined || value === '' || isValidRedirectUrl(value), {
|
|
message:
|
|
'Please enter a valid URL, make sure you include http:// or https:// part of the url.',
|
|
}),
|
|
language: z.enum(SUPPORTED_LANGUAGE_CODES).optional(),
|
|
}),
|
|
});
|
|
|
|
export type TSetGeneralSettingsForDocumentMutationSchema = z.infer<
|
|
typeof ZSetSettingsForDocumentMutationSchema
|
|
>;
|
|
|
|
export const ZSetTitleForDocumentMutationSchema = z.object({
|
|
documentId: z.number(),
|
|
teamId: z.number().min(1).optional(),
|
|
title: z.string().min(1),
|
|
});
|
|
|
|
export type TSetTitleForDocumentMutationSchema = z.infer<typeof ZSetTitleForDocumentMutationSchema>;
|
|
|
|
export const ZSetRecipientsForDocumentMutationSchema = z.object({
|
|
documentId: z.number(),
|
|
teamId: z.number().min(1).optional(),
|
|
recipients: z.array(
|
|
z.object({
|
|
id: z.number().nullish(),
|
|
email: z.string().min(1).email(),
|
|
name: z.string(),
|
|
role: z.nativeEnum(RecipientRole),
|
|
}),
|
|
),
|
|
});
|
|
|
|
export type TSetRecipientsForDocumentMutationSchema = z.infer<
|
|
typeof ZSetRecipientsForDocumentMutationSchema
|
|
>;
|
|
|
|
export const ZSetFieldsForDocumentMutationSchema = z.object({
|
|
documentId: z.number(),
|
|
fields: z.array(
|
|
z.object({
|
|
id: z.number().nullish(),
|
|
type: z.nativeEnum(FieldType),
|
|
signerEmail: z.string().min(1),
|
|
pageNumber: z.number().min(1),
|
|
pageX: z.number().min(0),
|
|
pageY: z.number().min(0),
|
|
pageWidth: z.number().min(0),
|
|
pageHeight: z.number().min(0),
|
|
}),
|
|
),
|
|
});
|
|
|
|
export type TSetFieldsForDocumentMutationSchema = z.infer<
|
|
typeof ZSetFieldsForDocumentMutationSchema
|
|
>;
|
|
|
|
export const ZSendDocumentMutationSchema = z.object({
|
|
documentId: z.number(),
|
|
teamId: z.number().optional(),
|
|
meta: z.object({
|
|
subject: z.string(),
|
|
message: z.string(),
|
|
timezone: z.string().optional(),
|
|
dateFormat: z.string().optional(),
|
|
redirectUrl: z
|
|
.string()
|
|
.optional()
|
|
.refine((value) => value === undefined || value === '' || isValidRedirectUrl(value), {
|
|
message:
|
|
'Please enter a valid URL, make sure you include http:// or https:// part of the url.',
|
|
}),
|
|
}),
|
|
});
|
|
|
|
export const ZSetPasswordForDocumentMutationSchema = z.object({
|
|
documentId: z.number(),
|
|
password: z.string(),
|
|
});
|
|
|
|
export type TSetPasswordForDocumentMutationSchema = z.infer<
|
|
typeof ZSetPasswordForDocumentMutationSchema
|
|
>;
|
|
|
|
export const ZSetSigningOrderForDocumentMutationSchema = z.object({
|
|
documentId: z.number(),
|
|
signingOrder: z.nativeEnum(DocumentSigningOrder),
|
|
});
|
|
|
|
export type TSetSigningOrderForDocumentMutationSchema = z.infer<
|
|
typeof ZSetSigningOrderForDocumentMutationSchema
|
|
>;
|
|
|
|
export const ZUpdateTypedSignatureSettingsMutationSchema = z.object({
|
|
documentId: z.number(),
|
|
teamId: z.number().optional(),
|
|
typedSignatureEnabled: z.boolean(),
|
|
});
|
|
|
|
export type TUpdateTypedSignatureSettingsMutationSchema = z.infer<
|
|
typeof ZUpdateTypedSignatureSettingsMutationSchema
|
|
>;
|
|
|
|
export const ZResendDocumentMutationSchema = z.object({
|
|
documentId: z.number(),
|
|
recipients: z.array(z.number()).min(1),
|
|
teamId: z.number().min(1).optional(),
|
|
});
|
|
|
|
export type TSendDocumentMutationSchema = z.infer<typeof ZSendDocumentMutationSchema>;
|
|
|
|
export const ZDeleteDraftDocumentMutationSchema = z.object({
|
|
id: z.number().min(1),
|
|
teamId: z.number().min(1).optional(),
|
|
});
|
|
|
|
export type TDeleteDraftDocumentMutationSchema = z.infer<typeof ZDeleteDraftDocumentMutationSchema>;
|
|
|
|
export const ZSearchDocumentsMutationSchema = z.object({
|
|
query: z.string(),
|
|
});
|
|
|
|
export const ZDownloadAuditLogsMutationSchema = z.object({
|
|
documentId: z.number(),
|
|
teamId: z.number().optional(),
|
|
});
|
|
|
|
export const ZDownloadCertificateMutationSchema = z.object({
|
|
documentId: z.number(),
|
|
teamId: z.number().optional(),
|
|
});
|
|
|
|
export const ZMoveDocumentsToTeamSchema = z.object({
|
|
documentId: z.number(),
|
|
teamId: z.number(),
|
|
});
|