From b94645a45172069eb15f04853ae995c268813628 Mon Sep 17 00:00:00 2001 From: Catalin Pit Date: Mon, 21 Apr 2025 09:34:29 +0300 Subject: [PATCH] fix: optional fields being required in direct links (#1752) --- .../general/direct-template/direct-template-page.tsx | 11 +++++++++-- .../direct-template/direct-template-signing-form.tsx | 11 ++++++++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/apps/remix/app/components/general/direct-template/direct-template-page.tsx b/apps/remix/app/components/general/direct-template/direct-template-page.tsx index 63ccb67e7..686074a27 100644 --- a/apps/remix/app/components/general/direct-template/direct-template-page.tsx +++ b/apps/remix/app/components/general/direct-template/direct-template-page.tsx @@ -8,6 +8,7 @@ import { useNavigate, useSearchParams } from 'react-router'; import { RECIPIENT_ROLES_DESCRIPTION } from '@documenso/lib/constants/recipient-roles'; import type { TTemplate } from '@documenso/lib/types/template'; +import { isRequiredField } from '@documenso/lib/utils/advanced-fields-helpers'; import { trpc } from '@documenso/trpc/react'; import { Card, CardContent } from '@documenso/ui/primitives/card'; import { DocumentFlowFormContainer } from '@documenso/ui/primitives/document-flow/document-flow-root'; @@ -103,11 +104,17 @@ export const DirectTemplatePageView = ({ directRecipientEmail: recipient.email, templateUpdatedAt: template.updatedAt, signedFieldValues: fields.map((field) => { - if (!field.signedValue) { + if (isRequiredField(field) && !field.signedValue) { throw new Error('Invalid configuration'); } - return field.signedValue; + return { + token: field.signedValue?.token ?? '', + fieldId: field.signedValue?.fieldId ?? 0, + value: field.signedValue?.value, + isBase64: field.signedValue?.isBase64, + authOptions: field.signedValue?.authOptions, + }; }), }); diff --git a/apps/remix/app/components/general/direct-template/direct-template-signing-form.tsx b/apps/remix/app/components/general/direct-template/direct-template-signing-form.tsx index 943932c27..da38f51c4 100644 --- a/apps/remix/app/components/general/direct-template/direct-template-signing-form.tsx +++ b/apps/remix/app/components/general/direct-template/direct-template-signing-form.tsx @@ -17,6 +17,7 @@ import { ZTextFieldMeta, } from '@documenso/lib/types/field-meta'; import type { TTemplate } from '@documenso/lib/types/template'; +import { isFieldUnsignedAndRequired } from '@documenso/lib/utils/advanced-fields-helpers'; import { sortFieldsByPosition, validateFieldsInserted } from '@documenso/lib/utils/fields'; import type { TRemovedSignedFieldWithTokenMutationSchema, @@ -78,6 +79,10 @@ export const DirectTemplateSigningForm = ({ const [validateUninsertedFields, setValidateUninsertedFields] = useState(false); const [isSubmitting, setIsSubmitting] = useState(false); + const fieldsRequiringValidation = useMemo(() => { + return localFields.filter((field) => isFieldUnsignedAndRequired(field)); + }, [localFields]); + const { currentStep, totalSteps, previousStep } = useStep(); const onSignField = (value: TSignFieldWithTokenMutationSchema) => { @@ -134,18 +139,18 @@ export const DirectTemplateSigningForm = ({ }; const uninsertedFields = useMemo(() => { - return sortFieldsByPosition(localFields.filter((field) => !field.inserted)); + return sortFieldsByPosition(fieldsRequiringValidation); }, [localFields]); const fieldsValidated = () => { setValidateUninsertedFields(true); - validateFieldsInserted(localFields); + validateFieldsInserted(fieldsRequiringValidation); }; const handleSubmit = async () => { setValidateUninsertedFields(true); - const isFieldsValid = validateFieldsInserted(localFields); + const isFieldsValid = validateFieldsInserted(fieldsRequiringValidation); if (!isFieldsValid) { return;