Merge branch 'main' into feat/document-auth

This commit is contained in:
David Nguyen
2024-03-27 15:19:24 +08:00
13 changed files with 52 additions and 23 deletions

View File

@ -55,6 +55,9 @@ NEXT_PRIVATE_SIGNING_LOCAL_FILE_PATH=
NEXT_PUBLIC_UPLOAD_TRANSPORT="database" NEXT_PUBLIC_UPLOAD_TRANSPORT="database"
# OPTIONAL: Defines the endpoint to use for the S3 storage transport. Relevant when using third-party S3-compatible providers. # OPTIONAL: Defines the endpoint to use for the S3 storage transport. Relevant when using third-party S3-compatible providers.
NEXT_PRIVATE_UPLOAD_ENDPOINT="http://127.0.0.1:9002" NEXT_PRIVATE_UPLOAD_ENDPOINT="http://127.0.0.1:9002"
# OPTIONAL: Defines the force path style to use for the S3 storage transport. Relevant when using third-party S3-compatible providers.
# This will change it from using virtual hosts <bucket>.domain.com/<path> to fully qualified paths domain.com/<bucket>/<path>
NEXT_PRIVATE_UPLOAD_FORCE_PATH_STYLE="false"
# OPTIONAL: Defines the region to use for the S3 storage transport. Defaults to us-east-1. # OPTIONAL: Defines the region to use for the S3 storage transport. Defaults to us-east-1.
NEXT_PRIVATE_UPLOAD_REGION="unknown" NEXT_PRIVATE_UPLOAD_REGION="unknown"
# REQUIRED: Defines the bucket to use for the S3 storage transport. # REQUIRED: Defines the bucket to use for the S3 storage transport.

View File

@ -247,6 +247,7 @@ export const SinglePlayerClient = () => {
recipients={uploadedFile ? [placeholderRecipient] : []} recipients={uploadedFile ? [placeholderRecipient] : []}
fields={fields} fields={fields}
onSubmit={onFieldsSubmit} onSubmit={onFieldsSubmit}
isDocumentPdfLoaded={true}
/> />
</fieldset> </fieldset>

View File

@ -50,6 +50,8 @@ export const EditDocumentForm = ({
const searchParams = useSearchParams(); const searchParams = useSearchParams();
const team = useOptionalCurrentTeam(); const team = useOptionalCurrentTeam();
const [isDocumentPdfLoaded, setIsDocumentPdfLoaded] = useState(false);
const utils = trpc.useUtils(); const utils = trpc.useUtils();
const { data: document, refetch: refetchDocument } = const { data: document, refetch: refetchDocument } =
@ -306,6 +308,7 @@ export const EditDocumentForm = ({
document={document} document={document}
password={document.documentMeta?.password} password={document.documentMeta?.password}
onPasswordSubmit={onPasswordSubmit} onPasswordSubmit={onPasswordSubmit}
onDocumentLoad={() => setIsDocumentPdfLoaded(true)}
/> />
</CardContent> </CardContent>
</Card> </Card>
@ -326,9 +329,9 @@ export const EditDocumentForm = ({
recipients={recipients} recipients={recipients}
fields={fields} fields={fields}
isDocumentEnterprise={isDocumentEnterprise} isDocumentEnterprise={isDocumentEnterprise}
isDocumentPdfLoaded={isDocumentPdfLoaded}
onSubmit={onAddSettingsFormSubmit} onSubmit={onAddSettingsFormSubmit}
/> />
<AddSignersFormPartial <AddSignersFormPartial
key={recipients.length} key={recipients.length}
documentFlow={documentFlow.signers} documentFlow={documentFlow.signers}
@ -336,6 +339,7 @@ export const EditDocumentForm = ({
fields={fields} fields={fields}
isDocumentEnterprise={isDocumentEnterprise} isDocumentEnterprise={isDocumentEnterprise}
onSubmit={onAddSignersFormSubmit} onSubmit={onAddSignersFormSubmit}
isDocumentPdfLoaded={isDocumentPdfLoaded}
/> />
<AddFieldsFormPartial <AddFieldsFormPartial
@ -344,6 +348,7 @@ export const EditDocumentForm = ({
recipients={recipients} recipients={recipients}
fields={fields} fields={fields}
onSubmit={onAddFieldsFormSubmit} onSubmit={onAddFieldsFormSubmit}
isDocumentPdfLoaded={isDocumentPdfLoaded}
/> />
<AddSubjectFormPartial <AddSubjectFormPartial
@ -353,6 +358,7 @@ export const EditDocumentForm = ({
recipients={recipients} recipients={recipients}
fields={fields} fields={fields}
onSubmit={onAddSubjectFormSubmit} onSubmit={onAddSubjectFormSubmit}
isDocumentPdfLoaded={isDocumentPdfLoaded}
/> />
</Stepper> </Stepper>
</DocumentFlowFormContainer> </DocumentFlowFormContainer>

View File

@ -115,6 +115,7 @@ Here's a markdown table documenting all the provided environment variables:
| `NEXT_PRIVATE_SIGNING_LOCAL_FILE_PATH` | The path to the key file, default `/opt/documenso/cert.p12`. | | `NEXT_PRIVATE_SIGNING_LOCAL_FILE_PATH` | The path to the key file, default `/opt/documenso/cert.p12`. |
| `NEXT_PUBLIC_UPLOAD_TRANSPORT` | The transport to use for file uploads (database or s3). | | `NEXT_PUBLIC_UPLOAD_TRANSPORT` | The transport to use for file uploads (database or s3). |
| `NEXT_PRIVATE_UPLOAD_ENDPOINT` | The endpoint for the S3 storage transport (for third-party S3-compatible providers). | | `NEXT_PRIVATE_UPLOAD_ENDPOINT` | The endpoint for the S3 storage transport (for third-party S3-compatible providers). |
| `NEXT_PRIVATE_UPLOAD_FORCE_PATH_STYLE` | Whether to force path-style URLs for the S3 storage transport. |
| `NEXT_PRIVATE_UPLOAD_REGION` | The region for the S3 storage transport (defaults to us-east-1). | | `NEXT_PRIVATE_UPLOAD_REGION` | The region for the S3 storage transport (defaults to us-east-1). |
| `NEXT_PRIVATE_UPLOAD_BUCKET` | The bucket to use for the S3 storage transport. | | `NEXT_PRIVATE_UPLOAD_BUCKET` | The bucket to use for the S3 storage transport. |
| `NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID` | The access key ID for the S3 storage transport. | | `NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID` | The access key ID for the S3 storage transport. |

View File

@ -34,6 +34,7 @@ services:
- NEXT_PRIVATE_DIRECT_DATABASE_URL=${NEXT_PRIVATE_DIRECT_DATABASE_URL:-${NEXT_PRIVATE_DATABASE_URL}} - NEXT_PRIVATE_DIRECT_DATABASE_URL=${NEXT_PRIVATE_DIRECT_DATABASE_URL:-${NEXT_PRIVATE_DATABASE_URL}}
- NEXT_PUBLIC_UPLOAD_TRANSPORT=${NEXT_PUBLIC_UPLOAD_TRANSPORT:-database} - NEXT_PUBLIC_UPLOAD_TRANSPORT=${NEXT_PUBLIC_UPLOAD_TRANSPORT:-database}
- NEXT_PRIVATE_UPLOAD_ENDPOINT=${NEXT_PRIVATE_UPLOAD_ENDPOINT} - NEXT_PRIVATE_UPLOAD_ENDPOINT=${NEXT_PRIVATE_UPLOAD_ENDPOINT}
- NEXT_PRIVATE_UPLOAD_FORCE_PATH_STYLE=${NEXT_PRIVATE_UPLOAD_FORCE_PATH_STYLE}
- NEXT_PRIVATE_UPLOAD_REGION=${NEXT_PRIVATE_UPLOAD_REGION} - NEXT_PRIVATE_UPLOAD_REGION=${NEXT_PRIVATE_UPLOAD_REGION}
- NEXT_PRIVATE_UPLOAD_BUCKET=${NEXT_PRIVATE_UPLOAD_BUCKET} - NEXT_PRIVATE_UPLOAD_BUCKET=${NEXT_PRIVATE_UPLOAD_BUCKET}
- NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID=${NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID} - NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID=${NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID}

View File

@ -132,6 +132,7 @@ const getS3Client = () => {
return new S3Client({ return new S3Client({
endpoint: process.env.NEXT_PRIVATE_UPLOAD_ENDPOINT || undefined, endpoint: process.env.NEXT_PRIVATE_UPLOAD_ENDPOINT || undefined,
forcePathStyle: process.env.NEXT_PRIVATE_UPLOAD_FORCE_PATH_STYLE === 'true',
region: process.env.NEXT_PRIVATE_UPLOAD_REGION || 'us-east-1', region: process.env.NEXT_PRIVATE_UPLOAD_REGION || 'us-east-1',
credentials: hasCredentials credentials: hasCredentials
? { ? {

View File

@ -17,6 +17,7 @@ declare namespace NodeJS {
NEXT_PUBLIC_UPLOAD_TRANSPORT?: 'database' | 's3'; NEXT_PUBLIC_UPLOAD_TRANSPORT?: 'database' | 's3';
NEXT_PRIVATE_UPLOAD_ENDPOINT?: string; NEXT_PRIVATE_UPLOAD_ENDPOINT?: string;
NEXT_PRIVATE_UPLOAD_FORCE_PATH_STYLE?: string;
NEXT_PRIVATE_UPLOAD_REGION?: string; NEXT_PRIVATE_UPLOAD_REGION?: string;
NEXT_PRIVATE_UPLOAD_BUCKET?: string; NEXT_PRIVATE_UPLOAD_BUCKET?: string;
NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID?: string; NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID?: string;

View File

@ -53,6 +53,7 @@ export type AddFieldsFormProps = {
recipients: Recipient[]; recipients: Recipient[];
fields: Field[]; fields: Field[];
onSubmit: (_data: TAddFieldsFormSchema) => void; onSubmit: (_data: TAddFieldsFormSchema) => void;
isDocumentPdfLoaded: boolean;
}; };
export const AddFieldsFormPartial = ({ export const AddFieldsFormPartial = ({
@ -61,6 +62,7 @@ export const AddFieldsFormPartial = ({
recipients, recipients,
fields, fields,
onSubmit, onSubmit,
isDocumentPdfLoaded,
}: AddFieldsFormProps) => { }: AddFieldsFormProps) => {
const { isWithinPageBounds, getFieldPosition, getPage } = useDocumentElement(); const { isWithinPageBounds, getFieldPosition, getPage } = useDocumentElement();
const { currentStep, totalSteps, previousStep } = useStep(); const { currentStep, totalSteps, previousStep } = useStep();
@ -342,19 +344,20 @@ export const AddFieldsFormPartial = ({
</Card> </Card>
)} )}
{localFields.map((field, index) => ( {isDocumentPdfLoaded &&
<FieldItem localFields.map((field, index) => (
key={index} <FieldItem
field={field} key={index}
disabled={selectedSigner?.email !== field.signerEmail || hasSelectedSignerBeenSent} field={field}
minHeight={fieldBounds.current.height} disabled={selectedSigner?.email !== field.signerEmail || hasSelectedSignerBeenSent}
minWidth={fieldBounds.current.width} minHeight={fieldBounds.current.height}
passive={isFieldWithinBounds && !!selectedField} minWidth={fieldBounds.current.width}
onResize={(options) => onFieldResize(options, index)} passive={isFieldWithinBounds && !!selectedField}
onMove={(options) => onFieldMove(options, index)} onResize={(options) => onFieldResize(options, index)}
onRemove={() => remove(index)} onMove={(options) => onFieldMove(options, index)}
/> onRemove={() => remove(index)}
))} />
))}
{!hideRecipients && ( {!hideRecipients && (
<Popover open={showRecipientsSelector} onOpenChange={setShowRecipientsSelector}> <Popover open={showRecipientsSelector} onOpenChange={setShowRecipientsSelector}>

View File

@ -50,6 +50,7 @@ export type AddSettingsFormProps = {
recipients: Recipient[]; recipients: Recipient[];
fields: Field[]; fields: Field[];
isDocumentEnterprise: boolean; isDocumentEnterprise: boolean;
isDocumentPdfLoaded: boolean;
document: DocumentWithData; document: DocumentWithData;
onSubmit: (_data: TAddSettingsFormSchema) => void; onSubmit: (_data: TAddSettingsFormSchema) => void;
}; };
@ -59,6 +60,7 @@ export const AddSettingsFormPartial = ({
recipients, recipients,
fields, fields,
isDocumentEnterprise, isDocumentEnterprise,
isDocumentPdfLoaded,
document, document,
onSubmit, onSubmit,
}: AddSettingsFormProps) => { }: AddSettingsFormProps) => {
@ -102,9 +104,10 @@ export const AddSettingsFormPartial = ({
/> />
<DocumentFlowFormContainerContent> <DocumentFlowFormContainerContent>
{fields.map((field, index) => ( {isDocumentPdfLoaded &&
<ShowFieldItem key={index} field={field} recipients={recipients} /> fields.map((field, index) => (
))} <ShowFieldItem key={index} field={field} recipients={recipients} />
))}
<Form {...form}> <Form {...form}>
<fieldset <fieldset

View File

@ -47,6 +47,7 @@ export type AddSignersFormProps = {
fields: Field[]; fields: Field[];
isDocumentEnterprise: boolean; isDocumentEnterprise: boolean;
onSubmit: (_data: TAddSignersFormSchema) => void; onSubmit: (_data: TAddSignersFormSchema) => void;
isDocumentPdfLoaded: boolean;
}; };
export const AddSignersFormPartial = ({ export const AddSignersFormPartial = ({
@ -55,6 +56,7 @@ export const AddSignersFormPartial = ({
fields, fields,
isDocumentEnterprise, isDocumentEnterprise,
onSubmit, onSubmit,
isDocumentPdfLoaded,
}: AddSignersFormProps) => { }: AddSignersFormProps) => {
const { toast } = useToast(); const { toast } = useToast();
const { remaining } = useLimits(); const { remaining } = useLimits();
@ -172,9 +174,10 @@ export const AddSignersFormPartial = ({
description={documentFlow.description} description={documentFlow.description}
/> />
<DocumentFlowFormContainerContent> <DocumentFlowFormContainerContent>
{fields.map((field, index) => ( {isDocumentPdfLoaded &&
<ShowFieldItem key={index} field={field} recipients={recipients} /> fields.map((field, index) => (
))} <ShowFieldItem key={index} field={field} recipients={recipients} />
))}
<AnimateGenericFadeInOut motionKey={showAdvancedSettings ? 'Show' : 'Hide'}> <AnimateGenericFadeInOut motionKey={showAdvancedSettings ? 'Show' : 'Hide'}>
<Form {...form}> <Form {...form}>

View File

@ -29,6 +29,7 @@ export type AddSubjectFormProps = {
fields: Field[]; fields: Field[];
document: DocumentWithData; document: DocumentWithData;
onSubmit: (_data: TAddSubjectFormSchema) => void; onSubmit: (_data: TAddSubjectFormSchema) => void;
isDocumentPdfLoaded: boolean;
}; };
export const AddSubjectFormPartial = ({ export const AddSubjectFormPartial = ({
@ -37,6 +38,7 @@ export const AddSubjectFormPartial = ({
fields: fields, fields: fields,
document, document,
onSubmit, onSubmit,
isDocumentPdfLoaded,
}: AddSubjectFormProps) => { }: AddSubjectFormProps) => {
const { const {
register, register,
@ -63,9 +65,10 @@ export const AddSubjectFormPartial = ({
/> />
<DocumentFlowFormContainerContent> <DocumentFlowFormContainerContent>
<div className="flex flex-col"> <div className="flex flex-col">
{fields.map((field, index) => ( {isDocumentPdfLoaded &&
<ShowFieldItem key={index} field={field} recipients={recipients} /> fields.map((field, index) => (
))} <ShowFieldItem key={index} field={field} recipients={recipients} />
))}
<div className="flex flex-col gap-y-4"> <div className="flex flex-col gap-y-4">
<div> <div>

View File

@ -87,6 +87,8 @@ services:
value: 'database' value: 'database'
- key: NEXT_PRIVATE_UPLOAD_ENDPOINT - key: NEXT_PRIVATE_UPLOAD_ENDPOINT
sync: false sync: false
- key: NEXT_PRIVATE_UPLOAD_FORCE_PATH_STYLE
sync: false
- key: NEXT_PRIVATE_UPLOAD_REGION - key: NEXT_PRIVATE_UPLOAD_REGION
sync: false sync: false
- key: NEXT_PRIVATE_UPLOAD_BUCKET - key: NEXT_PRIVATE_UPLOAD_BUCKET

View File

@ -61,6 +61,7 @@
"NEXT_PRIVATE_GOOGLE_CLIENT_SECRET", "NEXT_PRIVATE_GOOGLE_CLIENT_SECRET",
"NEXT_PUBLIC_UPLOAD_TRANSPORT", "NEXT_PUBLIC_UPLOAD_TRANSPORT",
"NEXT_PRIVATE_UPLOAD_ENDPOINT", "NEXT_PRIVATE_UPLOAD_ENDPOINT",
"NEXT_PRIVATE_UPLOAD_FORCE_PATH_STYLE",
"NEXT_PRIVATE_UPLOAD_REGION", "NEXT_PRIVATE_UPLOAD_REGION",
"NEXT_PRIVATE_UPLOAD_BUCKET", "NEXT_PRIVATE_UPLOAD_BUCKET",
"NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID", "NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID",