diff --git a/.env.example b/.env.example index 34aeb1c96..2fb7c3845 100644 --- a/.env.example +++ b/.env.example @@ -55,6 +55,9 @@ NEXT_PRIVATE_SIGNING_LOCAL_FILE_PATH= NEXT_PUBLIC_UPLOAD_TRANSPORT="database" # 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" +# 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 .domain.com/ to fully qualified paths domain.com// +NEXT_PRIVATE_UPLOAD_FORCE_PATH_STYLE="false" # OPTIONAL: Defines the region to use for the S3 storage transport. Defaults to us-east-1. NEXT_PRIVATE_UPLOAD_REGION="unknown" # REQUIRED: Defines the bucket to use for the S3 storage transport. diff --git a/apps/marketing/src/app/(marketing)/singleplayer/client.tsx b/apps/marketing/src/app/(marketing)/singleplayer/client.tsx index 3295e8ab9..3f1c11259 100644 --- a/apps/marketing/src/app/(marketing)/singleplayer/client.tsx +++ b/apps/marketing/src/app/(marketing)/singleplayer/client.tsx @@ -247,6 +247,7 @@ export const SinglePlayerClient = () => { recipients={uploadedFile ? [placeholderRecipient] : []} fields={fields} onSubmit={onFieldsSubmit} + isDocumentPdfLoaded={true} /> diff --git a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx index 3c9e20211..2e2f0c889 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx @@ -50,6 +50,8 @@ export const EditDocumentForm = ({ const searchParams = useSearchParams(); const team = useOptionalCurrentTeam(); + const [isDocumentPdfLoaded, setIsDocumentPdfLoaded] = useState(false); + const utils = trpc.useUtils(); const { data: document, refetch: refetchDocument } = @@ -306,6 +308,7 @@ export const EditDocumentForm = ({ document={document} password={document.documentMeta?.password} onPasswordSubmit={onPasswordSubmit} + onDocumentLoad={() => setIsDocumentPdfLoaded(true)} /> @@ -326,9 +329,9 @@ export const EditDocumentForm = ({ recipients={recipients} fields={fields} isDocumentEnterprise={isDocumentEnterprise} + isDocumentPdfLoaded={isDocumentPdfLoaded} onSubmit={onAddSettingsFormSubmit} /> - diff --git a/docker/README.md b/docker/README.md index bda1638a2..2b0ce9953 100644 --- a/docker/README.md +++ b/docker/README.md @@ -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_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_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_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. | diff --git a/docker/production/compose.yml b/docker/production/compose.yml index 02acc655d..bcbd9b857 100644 --- a/docker/production/compose.yml +++ b/docker/production/compose.yml @@ -34,6 +34,7 @@ services: - NEXT_PRIVATE_DIRECT_DATABASE_URL=${NEXT_PRIVATE_DIRECT_DATABASE_URL:-${NEXT_PRIVATE_DATABASE_URL}} - NEXT_PUBLIC_UPLOAD_TRANSPORT=${NEXT_PUBLIC_UPLOAD_TRANSPORT:-database} - 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_BUCKET=${NEXT_PRIVATE_UPLOAD_BUCKET} - NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID=${NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID} diff --git a/packages/lib/universal/upload/server-actions.ts b/packages/lib/universal/upload/server-actions.ts index fd4bfc57a..034385196 100644 --- a/packages/lib/universal/upload/server-actions.ts +++ b/packages/lib/universal/upload/server-actions.ts @@ -132,6 +132,7 @@ const getS3Client = () => { return new S3Client({ 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', credentials: hasCredentials ? { diff --git a/packages/tsconfig/process-env.d.ts b/packages/tsconfig/process-env.d.ts index 1b9c577cf..761defd54 100644 --- a/packages/tsconfig/process-env.d.ts +++ b/packages/tsconfig/process-env.d.ts @@ -17,6 +17,7 @@ declare namespace NodeJS { NEXT_PUBLIC_UPLOAD_TRANSPORT?: 'database' | 's3'; NEXT_PRIVATE_UPLOAD_ENDPOINT?: string; + NEXT_PRIVATE_UPLOAD_FORCE_PATH_STYLE?: string; NEXT_PRIVATE_UPLOAD_REGION?: string; NEXT_PRIVATE_UPLOAD_BUCKET?: string; NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID?: string; diff --git a/packages/ui/primitives/document-flow/add-fields.tsx b/packages/ui/primitives/document-flow/add-fields.tsx index c4f58b83c..3031d6479 100644 --- a/packages/ui/primitives/document-flow/add-fields.tsx +++ b/packages/ui/primitives/document-flow/add-fields.tsx @@ -53,6 +53,7 @@ export type AddFieldsFormProps = { recipients: Recipient[]; fields: Field[]; onSubmit: (_data: TAddFieldsFormSchema) => void; + isDocumentPdfLoaded: boolean; }; export const AddFieldsFormPartial = ({ @@ -61,6 +62,7 @@ export const AddFieldsFormPartial = ({ recipients, fields, onSubmit, + isDocumentPdfLoaded, }: AddFieldsFormProps) => { const { isWithinPageBounds, getFieldPosition, getPage } = useDocumentElement(); const { currentStep, totalSteps, previousStep } = useStep(); @@ -342,19 +344,20 @@ export const AddFieldsFormPartial = ({ )} - {localFields.map((field, index) => ( - onFieldResize(options, index)} - onMove={(options) => onFieldMove(options, index)} - onRemove={() => remove(index)} - /> - ))} + {isDocumentPdfLoaded && + localFields.map((field, index) => ( + onFieldResize(options, index)} + onMove={(options) => onFieldMove(options, index)} + onRemove={() => remove(index)} + /> + ))} {!hideRecipients && ( diff --git a/packages/ui/primitives/document-flow/add-settings.tsx b/packages/ui/primitives/document-flow/add-settings.tsx index f26216ccf..e56640f06 100644 --- a/packages/ui/primitives/document-flow/add-settings.tsx +++ b/packages/ui/primitives/document-flow/add-settings.tsx @@ -50,6 +50,7 @@ export type AddSettingsFormProps = { recipients: Recipient[]; fields: Field[]; isDocumentEnterprise: boolean; + isDocumentPdfLoaded: boolean; document: DocumentWithData; onSubmit: (_data: TAddSettingsFormSchema) => void; }; @@ -59,6 +60,7 @@ export const AddSettingsFormPartial = ({ recipients, fields, isDocumentEnterprise, + isDocumentPdfLoaded, document, onSubmit, }: AddSettingsFormProps) => { @@ -102,9 +104,10 @@ export const AddSettingsFormPartial = ({ /> - {fields.map((field, index) => ( - - ))} + {isDocumentPdfLoaded && + fields.map((field, index) => ( + + ))}
void; + isDocumentPdfLoaded: boolean; }; export const AddSignersFormPartial = ({ @@ -55,6 +56,7 @@ export const AddSignersFormPartial = ({ fields, isDocumentEnterprise, onSubmit, + isDocumentPdfLoaded, }: AddSignersFormProps) => { const { toast } = useToast(); const { remaining } = useLimits(); @@ -172,9 +174,10 @@ export const AddSignersFormPartial = ({ description={documentFlow.description} /> - {fields.map((field, index) => ( - - ))} + {isDocumentPdfLoaded && + fields.map((field, index) => ( + + ))} diff --git a/packages/ui/primitives/document-flow/add-subject.tsx b/packages/ui/primitives/document-flow/add-subject.tsx index 79893d224..1b0608af8 100644 --- a/packages/ui/primitives/document-flow/add-subject.tsx +++ b/packages/ui/primitives/document-flow/add-subject.tsx @@ -29,6 +29,7 @@ export type AddSubjectFormProps = { fields: Field[]; document: DocumentWithData; onSubmit: (_data: TAddSubjectFormSchema) => void; + isDocumentPdfLoaded: boolean; }; export const AddSubjectFormPartial = ({ @@ -37,6 +38,7 @@ export const AddSubjectFormPartial = ({ fields: fields, document, onSubmit, + isDocumentPdfLoaded, }: AddSubjectFormProps) => { const { register, @@ -63,9 +65,10 @@ export const AddSubjectFormPartial = ({ />
- {fields.map((field, index) => ( - - ))} + {isDocumentPdfLoaded && + fields.map((field, index) => ( + + ))}
diff --git a/render.yaml b/render.yaml index c53b34602..e3675f526 100644 --- a/render.yaml +++ b/render.yaml @@ -87,6 +87,8 @@ services: value: 'database' - key: NEXT_PRIVATE_UPLOAD_ENDPOINT sync: false + - key: NEXT_PRIVATE_UPLOAD_FORCE_PATH_STYLE + sync: false - key: NEXT_PRIVATE_UPLOAD_REGION sync: false - key: NEXT_PRIVATE_UPLOAD_BUCKET diff --git a/turbo.json b/turbo.json index 8d6142ced..6579441be 100644 --- a/turbo.json +++ b/turbo.json @@ -61,6 +61,7 @@ "NEXT_PRIVATE_GOOGLE_CLIENT_SECRET", "NEXT_PUBLIC_UPLOAD_TRANSPORT", "NEXT_PRIVATE_UPLOAD_ENDPOINT", + "NEXT_PRIVATE_UPLOAD_FORCE_PATH_STYLE", "NEXT_PRIVATE_UPLOAD_REGION", "NEXT_PRIVATE_UPLOAD_BUCKET", "NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID",