diff --git a/apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx b/apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx index ba9b806e5..643534a5b 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx @@ -8,7 +8,7 @@ import { DOCUMENSO_ENCRYPTION_KEY } from '@documenso/lib/constants/crypto'; import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; import { getDocumentById } from '@documenso/lib/server-only/document/get-document-by-id'; import { getServerComponentFlag } from '@documenso/lib/server-only/feature-flags/get-server-component-feature-flag'; -import { getCompletedFieldsForDocument } from '@documenso/lib/server-only/field/get-completed-fields-for-document'; +import { getFieldsForDocument } from '@documenso/lib/server-only/field/get-fields-for-document'; import { getRecipientsForDocument } from '@documenso/lib/server-only/recipient/get-recipients-for-document'; import { symmetricDecrypt } from '@documenso/lib/universal/crypto'; import { formatDocumentsPath } from '@documenso/lib/utils/teams'; @@ -86,14 +86,15 @@ export const DocumentPageView = async ({ params, team }: DocumentPageViewProps) documentMeta.password = securePassword; } - const [recipients, completedFields] = await Promise.all([ + const [recipients, fields] = await Promise.all([ getRecipientsForDocument({ documentId, teamId: team?.id, userId: user.id, }), - getCompletedFieldsForDocument({ + getFieldsForDocument({ documentId, + userId: user.id, }), ]); @@ -163,10 +164,7 @@ export const DocumentPageView = async ({ params, team }: DocumentPageViewProps) {document.status === DocumentStatus.PENDING && ( - + )}
diff --git a/apps/web/src/components/document/document-read-only-fields.tsx b/apps/web/src/components/document/document-read-only-fields.tsx index 95a907d8f..d62210b72 100644 --- a/apps/web/src/components/document/document-read-only-fields.tsx +++ b/apps/web/src/components/document/document-read-only-fields.tsx @@ -2,6 +2,7 @@ import { useState } from 'react'; +import { EyeOffIcon } from 'lucide-react'; import { P, match } from 'ts-pattern'; import { @@ -10,19 +11,19 @@ import { } from '@documenso/lib/constants/date-formats'; import { PDF_VIEWER_PAGE_SELECTOR } from '@documenso/lib/constants/pdf-viewer'; import { DEFAULT_DOCUMENT_TIME_ZONE } from '@documenso/lib/constants/time-zones'; -import type { CompletedField } from '@documenso/lib/types/fields'; +import type { DocumentField } from '@documenso/lib/server-only/field/get-fields-for-document'; import { extractInitials } from '@documenso/lib/utils/recipient-formatter'; import type { DocumentMeta } from '@documenso/prisma/client'; -import { FieldType } from '@documenso/prisma/client'; +import { FieldType, SigningStatus } from '@documenso/prisma/client'; import { FieldRootContainer } from '@documenso/ui/components/field/field'; +import { cn } from '@documenso/ui/lib/utils'; import { Avatar, AvatarFallback } from '@documenso/ui/primitives/avatar'; -import { Button } from '@documenso/ui/primitives/button'; import { FRIENDLY_FIELD_TYPE } from '@documenso/ui/primitives/document-flow/types'; import { ElementVisible } from '@documenso/ui/primitives/element-visible'; import { PopoverHover } from '@documenso/ui/primitives/popover'; export type DocumentReadOnlyFieldsProps = { - fields: CompletedField[]; + fields: DocumentField[]; documentMeta?: DocumentMeta; }; @@ -53,56 +54,71 @@ export const DocumentReadOnlyFields = ({ documentMeta, fields }: DocumentReadOnl } contentProps={{ - className: 'flex w-fit flex-col py-2.5 text-sm', + className: 'relative flex w-fit flex-col p-2.5 text-sm', }} > -

- - {field.Recipient.name - ? `${field.Recipient.name} (${field.Recipient.email})` - : field.Recipient.email}{' '} - - inserted a {FRIENDLY_FIELD_TYPE[field.type].toLowerCase()} +

+ {field.Recipient.signingStatus === SigningStatus.SIGNED ? 'Signed' : 'Pending'}{' '} + {FRIENDLY_FIELD_TYPE[field.type].toLowerCase()} field

- + +
- {match(field) - .with({ type: FieldType.SIGNATURE }, (field) => - field.Signature?.signatureImageAsBase64 ? ( - Signature - ) : ( -

- {field.Signature?.typedSignature} -

- ), - ) - .with( - { type: P.union(FieldType.NAME, FieldType.TEXT, FieldType.EMAIL) }, - () => field.customText, - ) - .with({ type: FieldType.DATE }, () => - convertToLocalSystemFormat( - field.customText, - documentMeta?.dateFormat ?? DEFAULT_DOCUMENT_DATE_FORMAT, - documentMeta?.timezone ?? DEFAULT_DOCUMENT_TIME_ZONE, - ), - ) - .with({ type: FieldType.FREE_SIGNATURE }, () => null) - .exhaustive()} + {field.Recipient.signingStatus === SigningStatus.SIGNED && + match(field) + .with({ type: FieldType.SIGNATURE }, (field) => + field.Signature?.signatureImageAsBase64 ? ( + Signature + ) : ( +

+ {field.Signature?.typedSignature} +

+ ), + ) + .with( + { type: P.union(FieldType.NAME, FieldType.TEXT, FieldType.EMAIL) }, + () => field.customText, + ) + .with({ type: FieldType.DATE }, () => + convertToLocalSystemFormat( + field.customText, + documentMeta?.dateFormat ?? DEFAULT_DOCUMENT_DATE_FORMAT, + documentMeta?.timezone ?? DEFAULT_DOCUMENT_TIME_ZONE, + ), + ) + .with({ type: FieldType.FREE_SIGNATURE }, () => null) + .exhaustive()} + + {field.Recipient.signingStatus === SigningStatus.NOT_SIGNED && ( +

+ {FRIENDLY_FIELD_TYPE[field.type]} +

+ )}
), diff --git a/packages/lib/server-only/field/get-completed-fields-for-token.ts b/packages/lib/server-only/field/get-completed-fields-for-token.ts index d84fa1343..10cfb2672 100644 --- a/packages/lib/server-only/field/get-completed-fields-for-token.ts +++ b/packages/lib/server-only/field/get-completed-fields-for-token.ts @@ -26,6 +26,7 @@ export const getCompletedFieldsForToken = async ({ token }: GetCompletedFieldsFo select: { name: true, email: true, + signingStatus: true, }, }, }, diff --git a/packages/lib/server-only/field/get-fields-for-document.ts b/packages/lib/server-only/field/get-fields-for-document.ts index 72a16c3f7..2cd8aa07c 100644 --- a/packages/lib/server-only/field/get-fields-for-document.ts +++ b/packages/lib/server-only/field/get-fields-for-document.ts @@ -5,6 +5,8 @@ export interface GetFieldsForDocumentOptions { userId: number; } +export type DocumentField = Awaited>[number]; + export const getFieldsForDocument = async ({ documentId, userId }: GetFieldsForDocumentOptions) => { const fields = await prisma.field.findMany({ where: { @@ -26,6 +28,16 @@ export const getFieldsForDocument = async ({ documentId, userId }: GetFieldsForD ], }, }, + include: { + Signature: true, + Recipient: { + select: { + name: true, + email: true, + signingStatus: true, + }, + }, + }, orderBy: { id: 'asc', },