feat: signing order (#1290)

Adds the ability to specify an optional signing order for documents.
When specified a document will be considered sequential with recipients
only being allowed to sign in the order that they were specified in.
This commit is contained in:
Ephraim Duncan
2024-09-16 12:36:45 +00:00
committed by GitHub
parent 357bdd374f
commit 3d644db286
66 changed files with 1999 additions and 606 deletions

View File

@@ -10,6 +10,7 @@ export type CreateDocumentFromTemplateLegacyOptions = {
name?: string;
email: string;
role?: RecipientRole;
signingOrder?: number | null;
}[];
};
@@ -73,6 +74,7 @@ export const createDocumentFromTemplateLegacy = async ({
email: recipient.email,
name: recipient.name,
role: recipient.role,
signingOrder: recipient.signingOrder,
token: nanoid(),
})),
},
@@ -129,12 +131,14 @@ export const createDocumentFromTemplateLegacy = async ({
name: recipient.name,
email: recipient.email,
role: recipient.role,
signingOrder: recipient.signingOrder,
},
create: {
documentId: document.id,
email: recipient.email,
name: recipient.name,
role: recipient.role,
signingOrder: recipient.signingOrder,
token: nanoid(),
},
});

View File

@@ -1,6 +1,6 @@
import { nanoid } from '@documenso/lib/universal/id';
import { prisma } from '@documenso/prisma';
import type { Field } from '@documenso/prisma/client';
import type { DocumentSigningOrder, Field } from '@documenso/prisma/client';
import {
DocumentSource,
type Recipient,
@@ -41,6 +41,7 @@ export type CreateDocumentFromTemplateOptions = {
id: number;
name?: string;
email: string;
signingOrder?: number | null;
}[];
/**
@@ -54,6 +55,7 @@ export type CreateDocumentFromTemplateOptions = {
password?: string;
dateFormat?: string;
redirectUrl?: string;
signingOrder?: DocumentSigningOrder;
};
requestMetadata?: RequestMetadata;
};
@@ -134,6 +136,7 @@ export const createDocumentFromTemplate = async ({
name: foundRecipient ? foundRecipient.name ?? '' : templateRecipient.name,
email: foundRecipient ? foundRecipient.email : templateRecipient.email,
role: templateRecipient.role,
signingOrder: foundRecipient?.signingOrder ?? templateRecipient.signingOrder,
authOptions: templateRecipient.authOptions,
};
});
@@ -168,6 +171,8 @@ export const createDocumentFromTemplate = async ({
password: override?.password || template.templateMeta?.password,
dateFormat: override?.dateFormat || template.templateMeta?.dateFormat,
redirectUrl: override?.redirectUrl || template.templateMeta?.redirectUrl,
signingOrder:
override?.signingOrder || template.templateMeta?.signingOrder || undefined,
},
},
Recipient: {

View File

@@ -33,7 +33,7 @@ export const updateTemplateSettings = async ({
meta,
data,
}: UpdateTemplateSettingsOptions) => {
if (Object.values(data).length === 0) {
if (Object.values(data).length === 0 && Object.keys(meta ?? {}).length === 0) {
throw new AppError(AppErrorCode.INVALID_BODY, 'Missing data to update');
}