feat: allow empty placeholder emails on templates (#1930)

Allow users to create template placeholders without the placeholder
emails.
This commit is contained in:
Catalin Pit
2025-08-12 13:41:23 +03:00
committed by GitHub
parent cc05af2062
commit deb3a63fb8
8 changed files with 108 additions and 83 deletions

View File

@ -1,6 +1,7 @@
import { RecipientRole } from '@prisma/client';
import { z } from 'zod';
import { isTemplateRecipientEmailPlaceholder } from '@documenso/lib/constants/template';
import {
ZRecipientAccessAuthTypesSchema,
ZRecipientActionAuthSchema,
@ -186,7 +187,18 @@ export const ZSetTemplateRecipientsRequestSchema = z
recipients: z.array(
z.object({
nativeId: z.number().optional(),
email: z.string().toLowerCase().email().min(1),
email: z
.string()
.toLowerCase()
.refine(
(email) => {
return (
isTemplateRecipientEmailPlaceholder(email) ||
z.string().email().safeParse(email).success
);
},
{ message: 'Please enter a valid email address' },
),
name: z.string(),
role: z.nativeEnum(RecipientRole),
signingOrder: z.number().optional(),
@ -196,9 +208,12 @@ export const ZSetTemplateRecipientsRequestSchema = z
})
.refine(
(schema) => {
const emails = schema.recipients.map((recipient) => recipient.email);
// Filter out placeholder emails and only check uniqueness for actual emails
const nonPlaceholderEmails = schema.recipients
.map((recipient) => recipient.email)
.filter((email) => !isTemplateRecipientEmailPlaceholder(email));
return new Set(emails).size === emails.length;
return new Set(nonPlaceholderEmails).size === nonPlaceholderEmails.length;
},
// Dirty hack to handle errors when .root is populated for an array type
{ message: 'Recipients must have unique emails', path: ['recipients__root'] },