chore: show signing order when creating a document from template (#1410)

### Templates without signing order
![CleanShot 2024-10-18 at 01 27
24@2x](https://github.com/user-attachments/assets/222181e4-25a8-409b-aa8b-8452ddd32f6b)


### Template with signing order
![CleanShot 2024-10-18 at 01 26
12@2x](https://github.com/user-attachments/assets/bcee6213-20b5-44d8-90ed-881825f49756)
This commit is contained in:
Ephraim Duncan
2024-10-22 23:20:27 +00:00
committed by GitHub
parent 6fa5f63b69
commit 4a6238dc52
3 changed files with 54 additions and 13 deletions

View File

@ -144,6 +144,7 @@ export const TemplatesDataTable = ({
<div className="flex items-center gap-x-4"> <div className="flex items-center gap-x-4">
<UseTemplateDialog <UseTemplateDialog
templateId={row.original.id} templateId={row.original.id}
templateSigningOrder={row.original.templateMeta?.signingOrder}
recipients={row.original.Recipient} recipients={row.original.Recipient}
documentRootPath={documentRootPath} documentRootPath={documentRootPath}
/> />

View File

@ -15,7 +15,9 @@ import {
} from '@documenso/lib/constants/template'; } from '@documenso/lib/constants/template';
import { AppError } from '@documenso/lib/errors/app-error'; import { AppError } from '@documenso/lib/errors/app-error';
import type { Recipient } from '@documenso/prisma/client'; import type { Recipient } from '@documenso/prisma/client';
import { DocumentSigningOrder } from '@documenso/prisma/client';
import { trpc } from '@documenso/trpc/react'; import { trpc } from '@documenso/trpc/react';
import { cn } from '@documenso/ui/lib/utils';
import { Button } from '@documenso/ui/primitives/button'; import { Button } from '@documenso/ui/primitives/button';
import { Checkbox } from '@documenso/ui/primitives/checkbox'; import { Checkbox } from '@documenso/ui/primitives/checkbox';
import { import {
@ -51,6 +53,7 @@ const ZAddRecipientsForNewDocumentSchema = z
id: z.number(), id: z.number(),
email: z.string().email(), email: z.string().email(),
name: z.string(), name: z.string(),
signingOrder: z.number().optional(),
}), }),
), ),
}) })
@ -86,6 +89,7 @@ type TAddRecipientsForNewDocumentSchema = z.infer<typeof ZAddRecipientsForNewDoc
export type UseTemplateDialogProps = { export type UseTemplateDialogProps = {
templateId: number; templateId: number;
templateSigningOrder?: DocumentSigningOrder | null;
recipients: Recipient[]; recipients: Recipient[];
documentRootPath: string; documentRootPath: string;
}; };
@ -94,6 +98,7 @@ export function UseTemplateDialog({
recipients, recipients,
documentRootPath, documentRootPath,
templateId, templateId,
templateSigningOrder,
}: UseTemplateDialogProps) { }: UseTemplateDialogProps) {
const router = useRouter(); const router = useRouter();
@ -108,7 +113,9 @@ export function UseTemplateDialog({
resolver: zodResolver(ZAddRecipientsForNewDocumentSchema), resolver: zodResolver(ZAddRecipientsForNewDocumentSchema),
defaultValues: { defaultValues: {
sendDocument: false, sendDocument: false,
recipients: recipients.map((recipient) => { recipients: recipients
.sort((a, b) => (a.signingOrder || 0) - (b.signingOrder || 0))
.map((recipient) => {
const isRecipientEmailPlaceholder = recipient.email.match( const isRecipientEmailPlaceholder = recipient.email.match(
TEMPLATE_RECIPIENT_EMAIL_PLACEHOLDER_REGEX, TEMPLATE_RECIPIENT_EMAIL_PLACEHOLDER_REGEX,
); );
@ -121,6 +128,7 @@ export function UseTemplateDialog({
id: recipient.id, id: recipient.id,
name: !isRecipientNamePlaceholder ? recipient.name : '', name: !isRecipientNamePlaceholder ? recipient.name : '',
email: !isRecipientEmailPlaceholder ? recipient.email : '', email: !isRecipientEmailPlaceholder ? recipient.email : '',
signingOrder: recipient.signingOrder ?? undefined,
}; };
}), }),
}, },
@ -203,6 +211,33 @@ export function UseTemplateDialog({
<div className="custom-scrollbar -m-1 max-h-[60vh] space-y-4 overflow-y-auto p-1"> <div className="custom-scrollbar -m-1 max-h-[60vh] space-y-4 overflow-y-auto p-1">
{formRecipients.map((recipient, index) => ( {formRecipients.map((recipient, index) => (
<div className="flex w-full flex-row space-x-4" key={recipient.id}> <div className="flex w-full flex-row space-x-4" key={recipient.id}>
{templateSigningOrder === DocumentSigningOrder.SEQUENTIAL && (
<FormField
control={form.control}
name={`recipients.${index}.signingOrder`}
render={({ field }) => (
<FormItem
className={cn('w-20', {
'mt-8': index === 0,
})}
>
<FormControl>
<Input
{...field}
disabled
className="items-center justify-center"
value={
field.value?.toString() ||
recipients[index]?.signingOrder?.toString()
}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
)}
<FormField <FormField
control={form.control} control={form.control}
name={`recipients.${index}.email`} name={`recipients.${index}.email`}

View File

@ -51,6 +51,11 @@ export const findTemplates = async ({
}, },
Field: true, Field: true,
Recipient: true, Recipient: true,
templateMeta: {
select: {
signingOrder: true,
},
},
directLink: { directLink: {
select: { select: {
token: true, token: true,