diff --git a/apps/remix/app/components/dialogs/template-bulk-send-dialog.tsx b/apps/remix/app/components/dialogs/template-bulk-send-dialog.tsx index 086e7bd39..0f5925741 100644 --- a/apps/remix/app/components/dialogs/template-bulk-send-dialog.tsx +++ b/apps/remix/app/components/dialogs/template-bulk-send-dialog.tsx @@ -137,12 +137,12 @@ export const TemplateBulkSendDialog = ({
+
For each recipient, provide their email (required) and name (optional) in separate columns. Download the template CSV below for the correct format. @@ -153,7 +153,7 @@ export const TemplateBulkSendDialog = ({ Current recipients:
Pre-formatted CSV template with example data.
{error.message}
Maximum file size: 4MB. Maximum 100 rows per upload. Blank values will use template defaults. @@ -247,7 +247,7 @@ export const TemplateBulkSendDialog = ({ Send documents to recipients immediately diff --git a/apps/remix/app/components/forms/document-preferences-form.tsx b/apps/remix/app/components/forms/document-preferences-form.tsx index 0ffb4c839..c3d615f10 100644 --- a/apps/remix/app/components/forms/document-preferences-form.tsx +++ b/apps/remix/app/components/forms/document-preferences-form.tsx @@ -58,6 +58,7 @@ export type TDocumentPreferencesFormSchema = { includeSigningCertificate: boolean | null; includeAuditLog: boolean | null; signatureTypes: DocumentSignatureType[]; + delegateDocumentOwnership: boolean | null; aiFeaturesEnabled: boolean | null; }; @@ -73,6 +74,7 @@ type SettingsSubset = Pick< | 'typedSignatureEnabled' | 'uploadSignatureEnabled' | 'drawSignatureEnabled' + | 'delegateDocumentOwnership' | 'aiFeaturesEnabled' >; @@ -109,6 +111,7 @@ export const DocumentPreferencesForm = ({ signatureTypes: z.array(z.nativeEnum(DocumentSignatureType)).min(canInherit ? 0 : 1, { message: msg`At least one signature type must be enabled`.id, }), + delegateDocumentOwnership: z.boolean().nullable(), aiFeaturesEnabled: z.boolean().nullable(), }); @@ -125,6 +128,7 @@ export const DocumentPreferencesForm = ({ includeSigningCertificate: settings.includeSigningCertificate, includeAuditLog: settings.includeAuditLog, signatureTypes: extractTeamSignatureSettings({ ...settings }), + delegateDocumentOwnership: settings.delegateDocumentOwnership, aiFeaturesEnabled: settings.aiFeaturesEnabled, }, resolver: zodResolver(ZDocumentPreferencesFormSchema), @@ -515,6 +519,52 @@ export const DocumentPreferencesForm = ({ )} /> + ( + + + Delegate Document Ownership + + + + field.onChange(value === 'true' ? true : value === 'false' ? false : null) + } + > + + + + + + + Yes + + + + No + + + {canInherit && ( + + Inherit from organisation + + )} + + + + + + Enable team API tokens to delegate document ownership to another team member. + + + + )} + /> + {isAiFeaturesConfigured && ( Forgot your password? @@ -390,11 +390,11 @@ export const SignInForm = ({ <> {hasSocialAuthEnabled && ( - - + + Or continue with - + )} @@ -403,7 +403,7 @@ export const SignInForm = ({ type="button" size="lg" variant="outline" - className="bg-background text-muted-foreground border" + className="border bg-background text-muted-foreground" disabled={isSubmitting} onClick={onSignInWithGoogleClick} > @@ -417,7 +417,7 @@ export const SignInForm = ({ type="button" size="lg" variant="outline" - className="bg-background text-muted-foreground border" + className="border bg-background text-muted-foreground" disabled={isSubmitting} onClick={onSignInWithMicrosoftClick} > @@ -435,7 +435,7 @@ export const SignInForm = ({ type="button" size="lg" variant="outline" - className="bg-background text-muted-foreground border" + className="border bg-background text-muted-foreground" disabled={isSubmitting} onClick={onSignInWithOIDCClick} > @@ -452,7 +452,7 @@ export const SignInForm = ({ variant="outline" disabled={isSubmitting} loading={isPasskeyLoading} - className="bg-background text-muted-foreground border" + className="border bg-background text-muted-foreground" onClick={onSignInWithPasskey} > {!isPasskeyLoading && } diff --git a/apps/remix/app/components/tables/document-logs-table.tsx b/apps/remix/app/components/tables/document-logs-table.tsx index 38f45cbb9..fb1402091 100644 --- a/apps/remix/app/components/tables/document-logs-table.tsx +++ b/apps/remix/app/components/tables/document-logs-table.tsx @@ -19,6 +19,7 @@ import { TableCell } from '@documenso/ui/primitives/table'; export type DocumentLogsTableProps = { documentId: number; + userId?: number; }; const dateFormat: DateTimeFormatOptions = { @@ -26,7 +27,7 @@ const dateFormat: DateTimeFormatOptions = { hourCycle: 'h12', }; -export const DocumentLogsTable = ({ documentId }: DocumentLogsTableProps) => { +export const DocumentLogsTable = ({ documentId, userId }: DocumentLogsTableProps) => { const { _, i18n } = useLingui(); const [searchParams] = useSearchParams(); @@ -93,7 +94,9 @@ export const DocumentLogsTable = ({ documentId }: DocumentLogsTableProps) => { { header: _(msg`Action`), accessorKey: 'type', - cell: ({ row }) => {formatDocumentAuditLogAction(_, row.original).description}, + cell: ({ row }) => ( + {formatDocumentAuditLogAction(_, row.original, userId).description} + ), }, { header: _(msg`IP Address`), diff --git a/apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.document.tsx b/apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.document.tsx index 54c7c93de..684c83bd5 100644 --- a/apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.document.tsx +++ b/apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.document.tsx @@ -57,6 +57,7 @@ export default function OrganisationSettingsDocumentPage() { includeSigningCertificate, includeAuditLog, signatureTypes, + delegateDocumentOwnership, aiFeaturesEnabled, } = data; @@ -85,6 +86,7 @@ export default function OrganisationSettingsDocumentPage() { typedSignatureEnabled: signatureTypes.includes(DocumentSignatureType.TYPE), uploadSignatureEnabled: signatureTypes.includes(DocumentSignatureType.UPLOAD), drawSignatureEnabled: signatureTypes.includes(DocumentSignatureType.DRAW), + delegateDocumentOwnership: delegateDocumentOwnership, aiFeaturesEnabled, }, }); diff --git a/apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.logs.tsx b/apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.logs.tsx index 7cf5cf731..f6ddbfb6d 100644 --- a/apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.logs.tsx +++ b/apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.logs.tsx @@ -75,11 +75,12 @@ export async function loader({ params, request }: Route.LoaderArgs) { }, recipients: envelope.recipients, documentRootPath, + userId: user.id, }; } export default function DocumentsLogsPage({ loaderData }: Route.ComponentProps) { - const { document, recipients, documentRootPath } = loaderData; + const { document, recipients, documentRootPath, userId } = loaderData; const { _, i18n } = useLingui(); @@ -171,15 +172,15 @@ export default function DocumentsLogsPage({ loaderData }: Route.ComponentProps) {documentInformation.map((info, i) => ( - + {_(info.description)} - {info.value} + {info.value} ))} - + Recipients - + {recipients.map((recipient) => ( {formatRecipientText(recipient)} @@ -191,7 +192,7 @@ export default function DocumentsLogsPage({ loaderData }: Route.ComponentProps) - + ); diff --git a/apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.document.tsx b/apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.document.tsx index 3f3b2a20f..34025b592 100644 --- a/apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.document.tsx +++ b/apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.document.tsx @@ -50,6 +50,7 @@ export default function TeamsSettingsPage() { includeSigningCertificate, includeAuditLog, signatureTypes, + delegateDocumentOwnership, aiFeaturesEnabled, } = data; @@ -75,6 +76,7 @@ export default function TeamsSettingsPage() { uploadSignatureEnabled: signatureTypes.includes(DocumentSignatureType.UPLOAD), drawSignatureEnabled: signatureTypes.includes(DocumentSignatureType.DRAW), }), + delegateDocumentOwnership: delegateDocumentOwnership, }, }); diff --git a/apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx b/apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx index 4139c383d..f012db6bc 100644 --- a/apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx +++ b/apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx @@ -193,11 +193,11 @@ export default function OrganisationSsoConfirmationTokenPage({ loaderData }: Rou {/* Current User Section */} - + Your Account - + - + Requesting Organisation - + - + Important: What This Means @@ -253,7 +253,7 @@ export default function OrganisationSsoConfirmationTokenPage({ loaderData }: Rou - + Full account access: {' '} View all your profile information, settings, and activity @@ -264,7 +264,7 @@ export default function OrganisationSsoConfirmationTokenPage({ loaderData }: Rou - + Account management: {' '} Modify your account settings, permissions, and preferences @@ -275,7 +275,7 @@ export default function OrganisationSsoConfirmationTokenPage({ loaderData }: Rou - Data access:{' '} + Data access:{' '} Access all data associated with your account @@ -304,7 +304,7 @@ export default function OrganisationSsoConfirmationTokenPage({ loaderData }: Rou /> I agree to link my account with this organization diff --git a/package-lock.json b/package-lock.json index f052e676e..7d6e3d340 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3276,12 +3276,60 @@ "node": ">=6" } }, + "node_modules/@hapi/address": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-5.1.1.tgz", + "integrity": "sha512-A+po2d/dVoY7cYajycYI43ZbYMXukuopIsqCjh5QzsBCipDtdofHntljDlpccMjIfTy6UOkg+5KPriwYch2bXA==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^11.0.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@hapi/bourne": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-3.0.0.tgz", "integrity": "sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==", "license": "BSD-3-Clause" }, + "node_modules/@hapi/formula": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-3.0.2.tgz", + "integrity": "sha512-hY5YPNXzw1He7s0iqkRQi+uMGh383CGdyyIGYtB+W5N3KHPXoqychklvHhKCC9M3Xtv0OCs/IHw+r4dcHtBYWw==", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/hoek": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.7.tgz", + "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/pinpoint": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.1.tgz", + "integrity": "sha512-EKQmr16tM8s16vTT3cA5L0kZZcTMU5DUOZTuvpnY738m+jyP3JIUj+Mm1xc1rsLkGBQ/gVnfKYPwOmPg1tUR4Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/tlds": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@hapi/tlds/-/tlds-1.1.4.tgz", + "integrity": "sha512-Fq+20dxsxLaUn5jSSWrdtSRcIUba2JquuorF9UW1wIJS5cSUwxIsO2GIhaWynPRflvxSzFN+gxKte2HEW1OuoA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@hapi/topo": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-6.0.2.tgz", + "integrity": "sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^11.0.2" + } + }, "node_modules/@headlessui/react": { "version": "2.2.9", "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.2.9.tgz", @@ -16598,6 +16646,17 @@ "@types/node": "*" } }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, "node_modules/@types/connect": { "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", @@ -16895,6 +16954,13 @@ "@types/ms": "*" } }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -17707,6 +17773,145 @@ "node": ">= 20" } }, + "node_modules/@vitest/expect": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.2.4", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.2.4", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/snapshot": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/spy": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/@vvo/tzdb": { "version": "6.196.0", "resolved": "https://registry.npmjs.org/@vvo/tzdb/-/tzdb-6.196.0.tgz", @@ -18883,6 +19088,23 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/chalk": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", @@ -23286,6 +23508,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/express": { "version": "4.21.2", "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", @@ -26171,6 +26403,24 @@ "jiti": "lib/jiti-cli.mjs" } }, + "node_modules/joi": { + "version": "18.0.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-18.0.2.tgz", + "integrity": "sha512-RuCOQMIt78LWnktPoeBL0GErkNaJPTBGcYuyaBvUOQSpcpcLfWrHPPihYdOGbV5pam9VTWbeoF7TsGiHugcjGA==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/address": "^5.1.1", + "@hapi/formula": "^3.0.2", + "@hapi/hoek": "^11.0.7", + "@hapi/pinpoint": "^2.0.1", + "@hapi/tlds": "^1.1.1", + "@hapi/topo": "^6.0.2", + "@standard-schema/spec": "^1.0.0" + }, + "engines": { + "node": ">= 20" + } + }, "node_modules/jose": { "version": "6.1.2", "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.2.tgz", @@ -27108,6 +27358,13 @@ "loose-envify": "cli.js" } }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -30368,6 +30625,16 @@ "dev": true, "license": "MIT" }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, "node_modules/pause-stream": { "version": "0.0.11", "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", @@ -33844,6 +34111,47 @@ "dev": true, "license": "MIT" }, + "node_modules/start-server-and-test": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-2.1.3.tgz", + "integrity": "sha512-k4EcbNjeg0odaDkAMlIeDVDByqX9PIgL4tivgP2tES6Zd8o+4pTq/HgbWCyA3VHIoZopB+wGnNPKYGGSByNriQ==", + "license": "MIT", + "dependencies": { + "arg": "^5.0.2", + "bluebird": "3.7.2", + "check-more-types": "2.24.0", + "debug": "4.4.3", + "execa": "5.1.1", + "lazy-ass": "1.6.0", + "ps-tree": "1.2.0", + "wait-on": "9.0.3" + }, + "bin": { + "server-test": "src/bin/start.js", + "start-server-and-test": "src/bin/start.js", + "start-test": "src/bin/start.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/start-server-and-test/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -33853,6 +34161,13 @@ "node": ">= 0.8" } }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, "node_modules/stdin-discarder": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", @@ -34192,6 +34507,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, "node_modules/stripe": { "version": "12.18.0", "resolved": "https://registry.npmjs.org/stripe/-/stripe-12.18.0.tgz", @@ -34866,6 +35201,16 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, "node_modules/tinyrainbow": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", @@ -34876,6 +35221,16 @@ "node": ">=14.0.0" } }, + "node_modules/tinyspy": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", + "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/title": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/title/-/title-4.0.1.tgz", @@ -36171,6 +36526,93 @@ } } }, + "node_modules/vitest": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/pretty-format": "^3.2.4", + "@vitest/runner": "3.2.4", + "@vitest/snapshot": "3.2.4", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.2.4", + "@vitest/ui": "3.2.4", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/vitest/node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, "node_modules/vscode-jsonrpc": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", @@ -36220,6 +36662,25 @@ "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", "license": "MIT" }, + "node_modules/wait-on": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-9.0.3.tgz", + "integrity": "sha512-13zBnyYvFDW1rBvWiJ6Av3ymAaq8EDQuvxZnPIw3g04UqGi4TyoIJABmfJ6zrvKo9yeFQExNkOk7idQbDJcuKA==", + "license": "MIT", + "dependencies": { + "axios": "^1.13.2", + "joi": "^18.0.1", + "lodash": "^4.17.21", + "minimist": "^1.2.8", + "rxjs": "^7.8.2" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/warning": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", @@ -36806,82 +37267,6 @@ "node": ">=18" } }, - "packages/app-tests/node_modules/start-server-and-test": { - "version": "2.0.12", - "license": "MIT", - "dependencies": { - "arg": "^5.0.2", - "bluebird": "3.7.2", - "check-more-types": "2.24.0", - "debug": "4.4.1", - "execa": "5.1.1", - "lazy-ass": "1.6.0", - "ps-tree": "1.2.0", - "wait-on": "8.0.3" - }, - "bin": { - "server-test": "src/bin/start.js", - "start-server-and-test": "src/bin/start.js", - "start-test": "src/bin/start.js" - }, - "engines": { - "node": ">=16" - } - }, - "packages/app-tests/node_modules/start-server-and-test/node_modules/wait-on": { - "version": "8.0.3", - "license": "MIT", - "dependencies": { - "axios": "^1.8.2", - "joi": "^17.13.3", - "lodash": "^4.17.21", - "minimist": "^1.2.8", - "rxjs": "^7.8.2" - }, - "bin": { - "wait-on": "bin/wait-on" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "packages/app-tests/node_modules/start-server-and-test/node_modules/wait-on/node_modules/joi": { - "version": "17.13.3", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.3.0", - "@hapi/topo": "^5.1.0", - "@sideway/address": "^4.1.5", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "packages/app-tests/node_modules/start-server-and-test/node_modules/wait-on/node_modules/joi/node_modules/@hapi/hoek": { - "version": "9.3.0", - "license": "BSD-3-Clause" - }, - "packages/app-tests/node_modules/start-server-and-test/node_modules/wait-on/node_modules/joi/node_modules/@hapi/topo": { - "version": "5.1.0", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "packages/app-tests/node_modules/start-server-and-test/node_modules/wait-on/node_modules/joi/node_modules/@sideway/address": { - "version": "4.1.5", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "packages/app-tests/node_modules/start-server-and-test/node_modules/wait-on/node_modules/joi/node_modules/@sideway/formula": { - "version": "3.0.1", - "license": "BSD-3-Clause" - }, - "packages/app-tests/node_modules/start-server-and-test/node_modules/wait-on/node_modules/joi/node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "license": "BSD-3-Clause" - }, "packages/assets": { "name": "@documenso/assets", "version": "0.1.0" @@ -37331,348 +37716,6 @@ "vitest": "^3.2.4" } }, - "packages/signing/node_modules/estree-walker": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "packages/signing/node_modules/pathe": { - "version": "2.0.3", - "dev": true, - "license": "MIT" - }, - "packages/signing/node_modules/tinyexec": { - "version": "0.3.2", - "dev": true, - "license": "MIT" - }, - "packages/signing/node_modules/vite": { - "version": "6.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "packages/signing/node_modules/vite-node": { - "version": "3.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.0", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/signing/node_modules/vitest": { - "version": "3.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "3.1.4", - "@vitest/mocker": "3.1.4", - "@vitest/pretty-format": "^3.1.4", - "@vitest/runner": "3.1.4", - "@vitest/snapshot": "3.1.4", - "@vitest/spy": "3.1.4", - "@vitest/utils": "3.1.4", - "chai": "^5.2.0", - "debug": "^4.4.0", - "expect-type": "^1.2.1", - "magic-string": "^0.30.17", - "pathe": "^2.0.3", - "std-env": "^3.9.0", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.13", - "tinypool": "^1.0.2", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0", - "vite-node": "3.1.4", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.1.4", - "@vitest/ui": "3.1.4", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/debug": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "packages/signing/node_modules/vitest/node_modules/@vitest/expect": { - "version": "3.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.1.4", - "@vitest/utils": "3.1.4", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/signing/node_modules/vitest/node_modules/@vitest/mocker": { - "version": "3.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.1.4", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "packages/signing/node_modules/vitest/node_modules/@vitest/pretty-format": { - "version": "3.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/signing/node_modules/vitest/node_modules/@vitest/runner": { - "version": "3.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "3.1.4", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/signing/node_modules/vitest/node_modules/@vitest/snapshot": { - "version": "3.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.1.4", - "magic-string": "^0.30.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/signing/node_modules/vitest/node_modules/@vitest/spy": { - "version": "3.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^3.0.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/signing/node_modules/vitest/node_modules/@vitest/spy/node_modules/tinyspy": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "packages/signing/node_modules/vitest/node_modules/@vitest/utils": { - "version": "3.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.1.4", - "loupe": "^3.1.3", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "packages/signing/node_modules/vitest/node_modules/@vitest/utils/node_modules/loupe": { - "version": "3.1.3", - "dev": true, - "license": "MIT" - }, - "packages/signing/node_modules/vitest/node_modules/chai": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/signing/node_modules/vitest/node_modules/chai/node_modules/loupe": { - "version": "3.1.3", - "dev": true, - "license": "MIT" - }, - "packages/signing/node_modules/vitest/node_modules/chai/node_modules/pathval": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, - "packages/signing/node_modules/vitest/node_modules/expect-type": { - "version": "1.2.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "packages/signing/node_modules/vitest/node_modules/std-env": { - "version": "3.9.0", - "dev": true, - "license": "MIT" - }, - "packages/signing/node_modules/vitest/node_modules/tinypool": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, "packages/tailwind-config": { "name": "@documenso/tailwind-config", "version": "0.0.0", diff --git a/packages/lib/server-only/envelope/create-envelope.ts b/packages/lib/server-only/envelope/create-envelope.ts index 210346b4d..76902a596 100644 --- a/packages/lib/server-only/envelope/create-envelope.ts +++ b/packages/lib/server-only/envelope/create-envelope.ts @@ -81,6 +81,7 @@ export type CreateEnvelopeOptions = { globalActionAuth?: TDocumentActionAuthTypes[]; recipients?: CreateEnvelopeRecipientOptions[]; folderId?: string; + delegatedDocumentOwner?: string; }; attachments?: Array<{ label: string; @@ -114,6 +115,7 @@ export const createEnvelope = async ({ publicTitle, publicDescription, visibility: visibilityOverride, + delegatedDocumentOwner, } = data; const team = await prisma.team.findFirst({ @@ -256,6 +258,43 @@ export const createEnvelope = async ({ ? await incrementDocumentId().then((v) => v.formattedDocumentId) : await incrementTemplateId().then((v) => v.formattedTemplateId); + const getValidatedDelegatedOwner = async () => { + if ( + !settings.delegateDocumentOwnership || + !delegatedDocumentOwner || + requestMetadata.source === 'app' + ) { + return null; + } + + const delegatedOwner = await prisma.user.findFirst({ + where: { + email: delegatedDocumentOwner, + }, + }); + + if (!delegatedOwner) { + throw new AppError(AppErrorCode.UNAUTHORIZED, { + message: 'Delegated document owner must be a member of the team', + }); + } + + const isTeamMember = await prisma.team.findFirst({ + where: buildTeamWhereQuery({ teamId, userId: delegatedOwner.id }), + }); + + if (!isTeamMember) { + throw new AppError(AppErrorCode.UNAUTHORIZED, { + message: 'Delegated document owner must be a member of the team', + }); + } + + return delegatedOwner; + }; + + const delegatedOwner = await getValidatedDelegatedOwner(); + const envelopeOwnerId = delegatedOwner?.id ?? userId; + return await prisma.$transaction(async (tx) => { const envelope = await tx.envelope.create({ data: { @@ -285,7 +324,7 @@ export const createEnvelope = async ({ })), }, }, - userId, + userId: envelopeOwnerId, teamId, authOptions, visibility, @@ -393,6 +432,9 @@ export const createEnvelope = async ({ data: createDocumentAuditLogData({ type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_CREATED, envelopeId: envelope.id, + user: { + id: envelopeOwnerId, + }, metadata: requestMetadata, data: { title, @@ -403,6 +445,25 @@ export const createEnvelope = async ({ }), }); + // Create audit log for delegated owner if validation passed + if (delegatedOwner) { + await tx.documentAuditLog.create({ + data: createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_DELEGATED_OWNER_CREATED, + envelopeId: envelope.id, + user: { + id: userId, + }, + metadata: requestMetadata, + data: { + delegatedOwnerName: delegatedOwner.name, + delegatedOwnerEmail: delegatedOwner.email, + teamName: team.name, + }, + }), + }); + } + await triggerWebhook({ event: WebhookTriggerEvents.DOCUMENT_CREATED, data: ZWebhookDocumentSchema.parse(mapEnvelopeToWebhookDocumentPayload(createdEnvelope)), diff --git a/packages/lib/types/document-audit-logs.ts b/packages/lib/types/document-audit-logs.ts index 05be5fc35..08f671633 100644 --- a/packages/lib/types/document-audit-logs.ts +++ b/packages/lib/types/document-audit-logs.ts @@ -44,6 +44,7 @@ export const ZDocumentAuditLogTypeSchema = z.enum([ 'DOCUMENT_TITLE_UPDATED', // When the document title is updated. 'DOCUMENT_EXTERNAL_ID_UPDATED', // When the document external ID is updated. 'DOCUMENT_MOVED_TO_TEAM', // When the document is moved to a team. + 'DOCUMENT_DELEGATED_OWNER_CREATED', // When the document delegated owner is created. // ACCESS AUTH 2FA events. 'DOCUMENT_ACCESS_AUTH_2FA_REQUESTED', // When ACCESS AUTH 2FA is requested. @@ -681,6 +682,18 @@ export const ZDocumentAuditLogEventDocumentMovedToTeamSchema = z.object({ }), }); +/** + * Event: Document delegated owner created. + */ +export const ZDocumentAuditLogEventDocumentDelegatedOwnerCreatedSchema = z.object({ + type: z.literal(DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_DELEGATED_OWNER_CREATED), + data: z.object({ + delegatedOwnerName: z.string().nullable(), + delegatedOwnerEmail: z.string(), + teamName: z.string(), + }), +}); + export const ZDocumentAuditLogBaseSchema = z.object({ id: z.string(), createdAt: z.date(), @@ -701,6 +714,7 @@ export const ZDocumentAuditLogSchema = ZDocumentAuditLogBaseSchema.and( ZDocumentAuditLogEventDocumentCreatedSchema, ZDocumentAuditLogEventDocumentDeletedSchema, ZDocumentAuditLogEventDocumentMovedToTeamSchema, + ZDocumentAuditLogEventDocumentDelegatedOwnerCreatedSchema, ZDocumentAuditLogEventDocumentFieldsAutoInsertedSchema, ZDocumentAuditLogEventDocumentFieldInsertedSchema, ZDocumentAuditLogEventDocumentFieldUninsertedSchema, diff --git a/packages/lib/utils/document-audit-logs.ts b/packages/lib/utils/document-audit-logs.ts index 767de4677..f2d4681a7 100644 --- a/packages/lib/utils/document-audit-logs.ts +++ b/packages/lib/utils/document-audit-logs.ts @@ -530,6 +530,13 @@ export const formatDocumentAuditLogAction = ( anonymous: msg`Envelope item deleted`, identified: msg`${prefix} deleted an envelope item with title ${data.envelopeItemTitle}`, })) + .with({ type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_DELEGATED_OWNER_CREATED }, ({ data }) => ({ + anonymous: msg({ + message: `Document ownership delegated`, + context: `Audit log format`, + }), + identified: msg`The document ownership was delegated to ${data.delegatedOwnerName || data.delegatedOwnerEmail} on behalf of ${data.teamName}`, + })) .exhaustive(); return { diff --git a/packages/lib/utils/organisations.ts b/packages/lib/utils/organisations.ts index 27c2933bc..4d9113785 100644 --- a/packages/lib/utils/organisations.ts +++ b/packages/lib/utils/organisations.ts @@ -117,6 +117,7 @@ export const generateDefaultOrganisationSettings = (): Omit< documentLanguage: 'en', documentTimezone: null, // Null means local timezone. documentDateFormat: DEFAULT_DOCUMENT_DATE_FORMAT, + delegateDocumentOwnership: false, includeSenderDetails: true, includeSigningCertificate: true, diff --git a/packages/lib/utils/teams.ts b/packages/lib/utils/teams.ts index b30d3bad6..c80226eaf 100644 --- a/packages/lib/utils/teams.ts +++ b/packages/lib/utils/teams.ts @@ -184,6 +184,7 @@ export const generateDefaultTeamSettings = (): Omit Signature @@ -752,7 +752,7 @@ export const AddFieldsFormPartial = ({ @@ -777,7 +777,7 @@ export const AddFieldsFormPartial = ({ @@ -802,7 +802,7 @@ export const AddFieldsFormPartial = ({ @@ -827,7 +827,7 @@ export const AddFieldsFormPartial = ({ @@ -852,7 +852,7 @@ export const AddFieldsFormPartial = ({ @@ -877,7 +877,7 @@ export const AddFieldsFormPartial = ({ @@ -902,7 +902,7 @@ export const AddFieldsFormPartial = ({ @@ -927,7 +927,7 @@ export const AddFieldsFormPartial = ({ @@ -953,7 +953,7 @@ export const AddFieldsFormPartial = ({ diff --git a/packages/ui/primitives/template-flow/add-template-fields.tsx b/packages/ui/primitives/template-flow/add-template-fields.tsx index b2a4ee2cf..13dc55bbd 100644 --- a/packages/ui/primitives/template-flow/add-template-fields.tsx +++ b/packages/ui/primitives/template-flow/add-template-fields.tsx @@ -581,7 +581,7 @@ export const AddTemplateFieldsFormPartial = ({ {selectedField && ( @@ -681,7 +681,7 @@ export const AddTemplateFieldsFormPartial = ({ - + No recipient matching this description was found. @@ -689,14 +689,14 @@ export const AddTemplateFieldsFormPartial = ({ {/* Note: This is duplicated in `add-fields.tsx` */} {recipientsByRoleToDisplay.map(([role, roleRecipients], roleIndex) => ( - + {_(RECIPIENT_ROLES_DESCRIPTION[role].roleNamePlural)} {roleRecipients.length === 0 && ( No recipients with this role @@ -720,7 +720,7 @@ export const AddTemplateFieldsFormPartial = ({ }} > @@ -768,7 +768,7 @@ export const AddTemplateFieldsFormPartial = ({ Signature @@ -793,7 +793,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -819,7 +819,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -845,7 +845,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -871,7 +871,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -897,7 +897,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -923,7 +923,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -949,7 +949,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -975,7 +975,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -1002,7 +1002,7 @@ export const AddTemplateFieldsFormPartial = ({
{info.value}
Signature @@ -752,7 +752,7 @@ export const AddFieldsFormPartial = ({ @@ -777,7 +777,7 @@ export const AddFieldsFormPartial = ({ @@ -802,7 +802,7 @@ export const AddFieldsFormPartial = ({ @@ -827,7 +827,7 @@ export const AddFieldsFormPartial = ({ @@ -852,7 +852,7 @@ export const AddFieldsFormPartial = ({ @@ -877,7 +877,7 @@ export const AddFieldsFormPartial = ({ @@ -902,7 +902,7 @@ export const AddFieldsFormPartial = ({ @@ -927,7 +927,7 @@ export const AddFieldsFormPartial = ({ @@ -953,7 +953,7 @@ export const AddFieldsFormPartial = ({ diff --git a/packages/ui/primitives/template-flow/add-template-fields.tsx b/packages/ui/primitives/template-flow/add-template-fields.tsx index b2a4ee2cf..13dc55bbd 100644 --- a/packages/ui/primitives/template-flow/add-template-fields.tsx +++ b/packages/ui/primitives/template-flow/add-template-fields.tsx @@ -581,7 +581,7 @@ export const AddTemplateFieldsFormPartial = ({ {selectedField && ( @@ -681,7 +681,7 @@ export const AddTemplateFieldsFormPartial = ({ - + No recipient matching this description was found. @@ -689,14 +689,14 @@ export const AddTemplateFieldsFormPartial = ({ {/* Note: This is duplicated in `add-fields.tsx` */} {recipientsByRoleToDisplay.map(([role, roleRecipients], roleIndex) => ( - + {_(RECIPIENT_ROLES_DESCRIPTION[role].roleNamePlural)} {roleRecipients.length === 0 && ( No recipients with this role @@ -720,7 +720,7 @@ export const AddTemplateFieldsFormPartial = ({ }} > @@ -768,7 +768,7 @@ export const AddTemplateFieldsFormPartial = ({ Signature @@ -793,7 +793,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -819,7 +819,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -845,7 +845,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -871,7 +871,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -897,7 +897,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -923,7 +923,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -949,7 +949,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -975,7 +975,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -1002,7 +1002,7 @@ export const AddTemplateFieldsFormPartial = ({
@@ -777,7 +777,7 @@ export const AddFieldsFormPartial = ({ @@ -802,7 +802,7 @@ export const AddFieldsFormPartial = ({ @@ -827,7 +827,7 @@ export const AddFieldsFormPartial = ({ @@ -852,7 +852,7 @@ export const AddFieldsFormPartial = ({ @@ -877,7 +877,7 @@ export const AddFieldsFormPartial = ({ @@ -902,7 +902,7 @@ export const AddFieldsFormPartial = ({ @@ -927,7 +927,7 @@ export const AddFieldsFormPartial = ({ @@ -953,7 +953,7 @@ export const AddFieldsFormPartial = ({ diff --git a/packages/ui/primitives/template-flow/add-template-fields.tsx b/packages/ui/primitives/template-flow/add-template-fields.tsx index b2a4ee2cf..13dc55bbd 100644 --- a/packages/ui/primitives/template-flow/add-template-fields.tsx +++ b/packages/ui/primitives/template-flow/add-template-fields.tsx @@ -581,7 +581,7 @@ export const AddTemplateFieldsFormPartial = ({ {selectedField && ( @@ -681,7 +681,7 @@ export const AddTemplateFieldsFormPartial = ({ - + No recipient matching this description was found. @@ -689,14 +689,14 @@ export const AddTemplateFieldsFormPartial = ({ {/* Note: This is duplicated in `add-fields.tsx` */} {recipientsByRoleToDisplay.map(([role, roleRecipients], roleIndex) => ( - + {_(RECIPIENT_ROLES_DESCRIPTION[role].roleNamePlural)} {roleRecipients.length === 0 && ( No recipients with this role @@ -720,7 +720,7 @@ export const AddTemplateFieldsFormPartial = ({ }} > @@ -768,7 +768,7 @@ export const AddTemplateFieldsFormPartial = ({ Signature @@ -793,7 +793,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -819,7 +819,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -845,7 +845,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -871,7 +871,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -897,7 +897,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -923,7 +923,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -949,7 +949,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -975,7 +975,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -1002,7 +1002,7 @@ export const AddTemplateFieldsFormPartial = ({
@@ -802,7 +802,7 @@ export const AddFieldsFormPartial = ({ @@ -827,7 +827,7 @@ export const AddFieldsFormPartial = ({ @@ -852,7 +852,7 @@ export const AddFieldsFormPartial = ({ @@ -877,7 +877,7 @@ export const AddFieldsFormPartial = ({ @@ -902,7 +902,7 @@ export const AddFieldsFormPartial = ({ @@ -927,7 +927,7 @@ export const AddFieldsFormPartial = ({ @@ -953,7 +953,7 @@ export const AddFieldsFormPartial = ({ diff --git a/packages/ui/primitives/template-flow/add-template-fields.tsx b/packages/ui/primitives/template-flow/add-template-fields.tsx index b2a4ee2cf..13dc55bbd 100644 --- a/packages/ui/primitives/template-flow/add-template-fields.tsx +++ b/packages/ui/primitives/template-flow/add-template-fields.tsx @@ -581,7 +581,7 @@ export const AddTemplateFieldsFormPartial = ({ {selectedField && ( @@ -681,7 +681,7 @@ export const AddTemplateFieldsFormPartial = ({ - + No recipient matching this description was found. @@ -689,14 +689,14 @@ export const AddTemplateFieldsFormPartial = ({ {/* Note: This is duplicated in `add-fields.tsx` */} {recipientsByRoleToDisplay.map(([role, roleRecipients], roleIndex) => ( - + {_(RECIPIENT_ROLES_DESCRIPTION[role].roleNamePlural)} {roleRecipients.length === 0 && ( No recipients with this role @@ -720,7 +720,7 @@ export const AddTemplateFieldsFormPartial = ({ }} > @@ -768,7 +768,7 @@ export const AddTemplateFieldsFormPartial = ({ Signature @@ -793,7 +793,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -819,7 +819,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -845,7 +845,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -871,7 +871,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -897,7 +897,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -923,7 +923,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -949,7 +949,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -975,7 +975,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -1002,7 +1002,7 @@ export const AddTemplateFieldsFormPartial = ({
@@ -827,7 +827,7 @@ export const AddFieldsFormPartial = ({ @@ -852,7 +852,7 @@ export const AddFieldsFormPartial = ({ @@ -877,7 +877,7 @@ export const AddFieldsFormPartial = ({ @@ -902,7 +902,7 @@ export const AddFieldsFormPartial = ({ @@ -927,7 +927,7 @@ export const AddFieldsFormPartial = ({ @@ -953,7 +953,7 @@ export const AddFieldsFormPartial = ({ diff --git a/packages/ui/primitives/template-flow/add-template-fields.tsx b/packages/ui/primitives/template-flow/add-template-fields.tsx index b2a4ee2cf..13dc55bbd 100644 --- a/packages/ui/primitives/template-flow/add-template-fields.tsx +++ b/packages/ui/primitives/template-flow/add-template-fields.tsx @@ -581,7 +581,7 @@ export const AddTemplateFieldsFormPartial = ({ {selectedField && ( @@ -681,7 +681,7 @@ export const AddTemplateFieldsFormPartial = ({ - + No recipient matching this description was found. @@ -689,14 +689,14 @@ export const AddTemplateFieldsFormPartial = ({ {/* Note: This is duplicated in `add-fields.tsx` */} {recipientsByRoleToDisplay.map(([role, roleRecipients], roleIndex) => ( - + {_(RECIPIENT_ROLES_DESCRIPTION[role].roleNamePlural)} {roleRecipients.length === 0 && ( No recipients with this role @@ -720,7 +720,7 @@ export const AddTemplateFieldsFormPartial = ({ }} > @@ -768,7 +768,7 @@ export const AddTemplateFieldsFormPartial = ({ Signature @@ -793,7 +793,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -819,7 +819,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -845,7 +845,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -871,7 +871,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -897,7 +897,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -923,7 +923,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -949,7 +949,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -975,7 +975,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -1002,7 +1002,7 @@ export const AddTemplateFieldsFormPartial = ({
@@ -852,7 +852,7 @@ export const AddFieldsFormPartial = ({ @@ -877,7 +877,7 @@ export const AddFieldsFormPartial = ({ @@ -902,7 +902,7 @@ export const AddFieldsFormPartial = ({ @@ -927,7 +927,7 @@ export const AddFieldsFormPartial = ({ @@ -953,7 +953,7 @@ export const AddFieldsFormPartial = ({ diff --git a/packages/ui/primitives/template-flow/add-template-fields.tsx b/packages/ui/primitives/template-flow/add-template-fields.tsx index b2a4ee2cf..13dc55bbd 100644 --- a/packages/ui/primitives/template-flow/add-template-fields.tsx +++ b/packages/ui/primitives/template-flow/add-template-fields.tsx @@ -581,7 +581,7 @@ export const AddTemplateFieldsFormPartial = ({ {selectedField && ( @@ -681,7 +681,7 @@ export const AddTemplateFieldsFormPartial = ({ - + No recipient matching this description was found. @@ -689,14 +689,14 @@ export const AddTemplateFieldsFormPartial = ({ {/* Note: This is duplicated in `add-fields.tsx` */} {recipientsByRoleToDisplay.map(([role, roleRecipients], roleIndex) => ( - + {_(RECIPIENT_ROLES_DESCRIPTION[role].roleNamePlural)} {roleRecipients.length === 0 && ( No recipients with this role @@ -720,7 +720,7 @@ export const AddTemplateFieldsFormPartial = ({ }} > @@ -768,7 +768,7 @@ export const AddTemplateFieldsFormPartial = ({ Signature @@ -793,7 +793,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -819,7 +819,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -845,7 +845,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -871,7 +871,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -897,7 +897,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -923,7 +923,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -949,7 +949,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -975,7 +975,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -1002,7 +1002,7 @@ export const AddTemplateFieldsFormPartial = ({
@@ -877,7 +877,7 @@ export const AddFieldsFormPartial = ({ @@ -902,7 +902,7 @@ export const AddFieldsFormPartial = ({ @@ -927,7 +927,7 @@ export const AddFieldsFormPartial = ({ @@ -953,7 +953,7 @@ export const AddFieldsFormPartial = ({ diff --git a/packages/ui/primitives/template-flow/add-template-fields.tsx b/packages/ui/primitives/template-flow/add-template-fields.tsx index b2a4ee2cf..13dc55bbd 100644 --- a/packages/ui/primitives/template-flow/add-template-fields.tsx +++ b/packages/ui/primitives/template-flow/add-template-fields.tsx @@ -581,7 +581,7 @@ export const AddTemplateFieldsFormPartial = ({ {selectedField && ( @@ -681,7 +681,7 @@ export const AddTemplateFieldsFormPartial = ({ - + No recipient matching this description was found. @@ -689,14 +689,14 @@ export const AddTemplateFieldsFormPartial = ({ {/* Note: This is duplicated in `add-fields.tsx` */} {recipientsByRoleToDisplay.map(([role, roleRecipients], roleIndex) => ( - + {_(RECIPIENT_ROLES_DESCRIPTION[role].roleNamePlural)} {roleRecipients.length === 0 && ( No recipients with this role @@ -720,7 +720,7 @@ export const AddTemplateFieldsFormPartial = ({ }} > @@ -768,7 +768,7 @@ export const AddTemplateFieldsFormPartial = ({ Signature @@ -793,7 +793,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -819,7 +819,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -845,7 +845,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -871,7 +871,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -897,7 +897,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -923,7 +923,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -949,7 +949,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -975,7 +975,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -1002,7 +1002,7 @@ export const AddTemplateFieldsFormPartial = ({
@@ -902,7 +902,7 @@ export const AddFieldsFormPartial = ({ @@ -927,7 +927,7 @@ export const AddFieldsFormPartial = ({ @@ -953,7 +953,7 @@ export const AddFieldsFormPartial = ({ diff --git a/packages/ui/primitives/template-flow/add-template-fields.tsx b/packages/ui/primitives/template-flow/add-template-fields.tsx index b2a4ee2cf..13dc55bbd 100644 --- a/packages/ui/primitives/template-flow/add-template-fields.tsx +++ b/packages/ui/primitives/template-flow/add-template-fields.tsx @@ -581,7 +581,7 @@ export const AddTemplateFieldsFormPartial = ({ {selectedField && ( @@ -681,7 +681,7 @@ export const AddTemplateFieldsFormPartial = ({ - + No recipient matching this description was found. @@ -689,14 +689,14 @@ export const AddTemplateFieldsFormPartial = ({ {/* Note: This is duplicated in `add-fields.tsx` */} {recipientsByRoleToDisplay.map(([role, roleRecipients], roleIndex) => ( - + {_(RECIPIENT_ROLES_DESCRIPTION[role].roleNamePlural)} {roleRecipients.length === 0 && ( No recipients with this role @@ -720,7 +720,7 @@ export const AddTemplateFieldsFormPartial = ({ }} > @@ -768,7 +768,7 @@ export const AddTemplateFieldsFormPartial = ({ Signature @@ -793,7 +793,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -819,7 +819,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -845,7 +845,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -871,7 +871,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -897,7 +897,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -923,7 +923,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -949,7 +949,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -975,7 +975,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -1002,7 +1002,7 @@ export const AddTemplateFieldsFormPartial = ({
@@ -927,7 +927,7 @@ export const AddFieldsFormPartial = ({ @@ -953,7 +953,7 @@ export const AddFieldsFormPartial = ({ diff --git a/packages/ui/primitives/template-flow/add-template-fields.tsx b/packages/ui/primitives/template-flow/add-template-fields.tsx index b2a4ee2cf..13dc55bbd 100644 --- a/packages/ui/primitives/template-flow/add-template-fields.tsx +++ b/packages/ui/primitives/template-flow/add-template-fields.tsx @@ -581,7 +581,7 @@ export const AddTemplateFieldsFormPartial = ({ {selectedField && ( @@ -681,7 +681,7 @@ export const AddTemplateFieldsFormPartial = ({ - + No recipient matching this description was found. @@ -689,14 +689,14 @@ export const AddTemplateFieldsFormPartial = ({ {/* Note: This is duplicated in `add-fields.tsx` */} {recipientsByRoleToDisplay.map(([role, roleRecipients], roleIndex) => ( - + {_(RECIPIENT_ROLES_DESCRIPTION[role].roleNamePlural)} {roleRecipients.length === 0 && ( No recipients with this role @@ -720,7 +720,7 @@ export const AddTemplateFieldsFormPartial = ({ }} > @@ -768,7 +768,7 @@ export const AddTemplateFieldsFormPartial = ({ Signature @@ -793,7 +793,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -819,7 +819,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -845,7 +845,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -871,7 +871,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -897,7 +897,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -923,7 +923,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -949,7 +949,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -975,7 +975,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -1002,7 +1002,7 @@ export const AddTemplateFieldsFormPartial = ({
@@ -953,7 +953,7 @@ export const AddFieldsFormPartial = ({ diff --git a/packages/ui/primitives/template-flow/add-template-fields.tsx b/packages/ui/primitives/template-flow/add-template-fields.tsx index b2a4ee2cf..13dc55bbd 100644 --- a/packages/ui/primitives/template-flow/add-template-fields.tsx +++ b/packages/ui/primitives/template-flow/add-template-fields.tsx @@ -581,7 +581,7 @@ export const AddTemplateFieldsFormPartial = ({ {selectedField && ( @@ -681,7 +681,7 @@ export const AddTemplateFieldsFormPartial = ({ - + No recipient matching this description was found. @@ -689,14 +689,14 @@ export const AddTemplateFieldsFormPartial = ({ {/* Note: This is duplicated in `add-fields.tsx` */} {recipientsByRoleToDisplay.map(([role, roleRecipients], roleIndex) => ( - + {_(RECIPIENT_ROLES_DESCRIPTION[role].roleNamePlural)} {roleRecipients.length === 0 && ( No recipients with this role @@ -720,7 +720,7 @@ export const AddTemplateFieldsFormPartial = ({ }} > @@ -768,7 +768,7 @@ export const AddTemplateFieldsFormPartial = ({ Signature @@ -793,7 +793,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -819,7 +819,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -845,7 +845,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -871,7 +871,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -897,7 +897,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -923,7 +923,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -949,7 +949,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -975,7 +975,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -1002,7 +1002,7 @@ export const AddTemplateFieldsFormPartial = ({
diff --git a/packages/ui/primitives/template-flow/add-template-fields.tsx b/packages/ui/primitives/template-flow/add-template-fields.tsx index b2a4ee2cf..13dc55bbd 100644 --- a/packages/ui/primitives/template-flow/add-template-fields.tsx +++ b/packages/ui/primitives/template-flow/add-template-fields.tsx @@ -581,7 +581,7 @@ export const AddTemplateFieldsFormPartial = ({ {selectedField && (
Signature @@ -793,7 +793,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -819,7 +819,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -845,7 +845,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -871,7 +871,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -897,7 +897,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -923,7 +923,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -949,7 +949,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -975,7 +975,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -1002,7 +1002,7 @@ export const AddTemplateFieldsFormPartial = ({
@@ -819,7 +819,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -845,7 +845,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -871,7 +871,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -897,7 +897,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -923,7 +923,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -949,7 +949,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -975,7 +975,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -1002,7 +1002,7 @@ export const AddTemplateFieldsFormPartial = ({
@@ -845,7 +845,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -871,7 +871,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -897,7 +897,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -923,7 +923,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -949,7 +949,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -975,7 +975,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -1002,7 +1002,7 @@ export const AddTemplateFieldsFormPartial = ({
@@ -871,7 +871,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -897,7 +897,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -923,7 +923,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -949,7 +949,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -975,7 +975,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -1002,7 +1002,7 @@ export const AddTemplateFieldsFormPartial = ({
@@ -897,7 +897,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -923,7 +923,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -949,7 +949,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -975,7 +975,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -1002,7 +1002,7 @@ export const AddTemplateFieldsFormPartial = ({
@@ -923,7 +923,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -949,7 +949,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -975,7 +975,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -1002,7 +1002,7 @@ export const AddTemplateFieldsFormPartial = ({
@@ -949,7 +949,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -975,7 +975,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -1002,7 +1002,7 @@ export const AddTemplateFieldsFormPartial = ({
@@ -975,7 +975,7 @@ export const AddTemplateFieldsFormPartial = ({ @@ -1002,7 +1002,7 @@ export const AddTemplateFieldsFormPartial = ({
@@ -1002,7 +1002,7 @@ export const AddTemplateFieldsFormPartial = ({