diff --git a/.env.example b/.env.example
index dff33d77c..28fead0ed 100644
--- a/.env.example
+++ b/.env.example
@@ -29,15 +29,15 @@ E2E_TEST_AUTHENTICATE_USER_PASSWORD="test_password"
# OPTIONAL: Defines the storage transport to use. Available options: database (default) | s3
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=
+NEXT_PRIVATE_UPLOAD_ENDPOINT="http://127.0.0.1:9002"
# OPTIONAL: Defines the region to use for the S3 storage transport. Defaults to us-east-1.
-NEXT_PRIVATE_UPLOAD_REGION=
+NEXT_PRIVATE_UPLOAD_REGION="unknown"
# REQUIRED: Defines the bucket to use for the S3 storage transport.
-NEXT_PRIVATE_UPLOAD_BUCKET=
+NEXT_PRIVATE_UPLOAD_BUCKET="documenso"
# OPTIONAL: Defines the access key ID to use for the S3 storage transport.
-NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID=
+NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID="documenso"
# OPTIONAL: Defines the secret access key to use for the S3 storage transport.
-NEXT_PRIVATE_UPLOAD_SECRET_ACCESS_KEY=
+NEXT_PRIVATE_UPLOAD_SECRET_ACCESS_KEY="password"
# [[SMTP]]
# OPTIONAL: Defines the transport to use for sending emails. Available options: smtp-auth (default) | smtp-api | mailchannels
diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml
index b835896d0..4fcde0ea3 100644
--- a/.github/ISSUE_TEMPLATE/bug-report.yml
+++ b/.github/ISSUE_TEMPLATE/bug-report.yml
@@ -1,11 +1,10 @@
-name: "Bug Report"
-labels: ["bug"]
+name: 'Bug Report'
+labels: ['bug']
description: Create a bug report to help us improve
body:
- type: markdown
attributes:
- value:
- Thank you for reporting an issue.
+ value: Thank you for reporting an issue.
Please fill in as much of the form below as you're able to.
- type: textarea
attributes:
diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml
index f323f9475..ab21e8828 100644
--- a/.github/ISSUE_TEMPLATE/feature-request.yml
+++ b/.github/ISSUE_TEMPLATE/feature-request.yml
@@ -1,9 +1,9 @@
-name: "Feature Request"
+name: 'Feature Request'
description: Suggest a new idea or enhancement for this project
body:
- type: markdown
attributes:
- value: Please provide a clear and concise title for your feature request
+ value: Please provide a clear and concise title for your feature request
- type: textarea
attributes:
label: Feature Description
@@ -32,4 +32,4 @@ body:
- label: I have provided a detailed description of the requested feature.
- label: I have explained the use case or scenario for this feature.
- label: I have included any relevant technical details or design suggestions.
- - label: I understand that this is a suggestion and that there is no guarantee of implementation.
\ No newline at end of file
+ - label: I understand that this is a suggestion and that there is no guarantee of implementation.
diff --git a/.github/ISSUE_TEMPLATE/improvement.yml b/.github/ISSUE_TEMPLATE/improvement.yml
index bebcb4cb5..058a025e7 100644
--- a/.github/ISSUE_TEMPLATE/improvement.yml
+++ b/.github/ISSUE_TEMPLATE/improvement.yml
@@ -1,4 +1,4 @@
-name: "General Improvement"
+name: 'General Improvement'
description: Suggest a minor enhancement or improvement for this project
body:
- type: markdown
@@ -32,4 +32,4 @@ body:
- label: I have provided a clear description of the improvement being suggested.
- label: I have explained the rationale behind this improvement.
- label: I have included any relevant technical details or design suggestions.
- - label: I understand that this is a suggestion and that there is no guarantee of implementation.
\ No newline at end of file
+ - label: I understand that this is a suggestion and that there is no guarantee of implementation.
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index d9013f408..9a20ae923 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -4,29 +4,29 @@ updates:
- package-ecosystem: 'github-actions'
directory: '/'
schedule:
- interval: "weekly"
- target-branch: "main"
+ interval: 'weekly'
+ target-branch: 'main'
labels:
- - "ci dependencies"
- - "ci"
+ - 'ci dependencies'
+ - 'ci'
open-pull-requests-limit: 0
- - package-ecosystem: "npm"
- directory: "/apps/marketing"
+ - package-ecosystem: 'npm'
+ directory: '/apps/marketing'
schedule:
- interval: "weekly"
- target-branch: "main"
+ interval: 'weekly'
+ target-branch: 'main'
labels:
- - "npm dependencies"
- - "frontend"
+ - 'npm dependencies'
+ - 'frontend'
open-pull-requests-limit: 0
- - package-ecosystem: "npm"
- directory: "/apps/web"
+ - package-ecosystem: 'npm'
+ directory: '/apps/web'
schedule:
- interval: "weekly"
- target-branch: "main"
+ interval: 'weekly'
+ target-branch: 'main'
labels:
- - "npm dependencies"
- - "frontend"
+ - 'npm dependencies'
+ - 'frontend'
open-pull-requests-limit: 0
diff --git a/.github/labeler.yml b/.github/labeler.yml
new file mode 100644
index 000000000..e6ad018a3
--- /dev/null
+++ b/.github/labeler.yml
@@ -0,0 +1,21 @@
+'apps: marketing':
+ - apps/marketing/**
+
+'apps: web':
+ - apps/web/**
+
+'version bump 👀':
+ - '**/package.json'
+ - '**/package-lock.json'
+
+'🚨 migrations 🚨':
+ - packages/prisma/migrations/**/migration.sql
+
+'🚨 e2e changes 🚨':
+ - packages/app-tests/e2e/**
+
+'🚨 .env changes 🚨':
+ - .env.example
+
+'pkg: ee changes':
+ - packages/ee/**
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index fa29ae591..deda53ff0 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1,10 +1,10 @@
-name: "Continuous Integration"
+name: 'Continuous Integration'
on:
push:
- branches: [ "main" ]
+ branches: ['main']
pull_request:
- branches: [ "main" ]
+ branches: ['main']
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
@@ -19,12 +19,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
fetch-depth: 2
- name: Install Node.js
- uses: actions/setup-node@v3
+ uses: actions/setup-node@v4
with:
node-version: 18
cache: npm
@@ -43,10 +43,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
fetch-depth: 2
- name: Build Docker Image
run: ./docker/build.sh
-
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index d47c37a00..465041c0a 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -1,11 +1,11 @@
-name: "CodeQL"
+name: 'CodeQL'
on:
workflow_dispatch:
push:
- branches: [ "main" ]
+ branches: ['main']
pull_request:
- branches: [ "main" ]
+ branches: ['main']
jobs:
analyze:
@@ -19,30 +19,30 @@ jobs:
strategy:
fail-fast: true
matrix:
- language: [ 'javascript' ]
+ language: ['javascript']
steps:
- - name: Checkout repository
- uses: actions/checkout@v3
+ - name: Checkout repository
+ uses: actions/checkout@v4
- - uses: actions/setup-node@v3
- with:
- node-version: 18
- cache: npm
+ - uses: actions/setup-node@v4
+ with:
+ node-version: 18
+ cache: npm
- - name: Install Dependencies
- run: npm ci
+ - name: Install Dependencies
+ run: npm ci
- - name: Copy env
- run: cp .env.example .env
+ - name: Copy env
+ run: cp .env.example .env
- - name: Build Documenso
- run: npm run build
+ - name: Build Documenso
+ run: npm run build
- - name: Initialize CodeQL
- uses: github/codeql-action/init@v2
- with:
- languages: ${{ matrix.language }}
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@v2
+ with:
+ languages: ${{ matrix.language }}
- - name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@v2
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@v2
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 000000000..80d188964
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,24 @@
+name: Deploy to Production
+
+on:
+ push:
+ tags:
+ - '*'
+
+jobs:
+ deploy:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ with:
+ ref: main
+ fetch-depth: 0
+ token: ${{ secrets.GH_TOKEN }}
+
+ - name: Push to release branch
+ run: |
+ git checkout release || git checkout -b release
+ git merge --ff-only main
+ git push origin release
diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml
index 50c25f923..7b05458d9 100644
--- a/.github/workflows/e2e-tests.yml
+++ b/.github/workflows/e2e-tests.yml
@@ -1,18 +1,20 @@
name: Playwright Tests
on:
push:
- branches: [ "main" ]
+ branches: ['main']
pull_request:
- branches: [ "main" ]
+ branches: ['main']
jobs:
e2e_tests:
+ name: "E2E Tests"
timeout-minutes: 60
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
- - uses: actions/setup-node@v3
+ - uses: actions/checkout@v4
+ - uses: actions/setup-node@v4
with:
node-version: 18
+ cache: npm
- name: Install dependencies
run: npm ci
diff --git a/.github/workflows/first-interaction.yml b/.github/workflows/first-interaction.yml
new file mode 100644
index 000000000..5f53eb280
--- /dev/null
+++ b/.github/workflows/first-interaction.yml
@@ -0,0 +1,29 @@
+name: 'Welcome New Contributors'
+
+on:
+ pull_request:
+ types: ['opened']
+ issues:
+ types: ['opened']
+
+permissions:
+ pull-requests: write
+ issues: write
+
+jobs:
+ welcome-message:
+ name: Welcome Contributors
+ if: github.event.action == 'opened'
+ runs-on: ubuntu-latest
+ timeout-minutes: 10
+ steps:
+ - uses: actions/first-interaction@v1
+ with:
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
+ pr-message: |
+ Thank you for creating your first Pull Request and for being a part of the open signing revolution! 💚🚀
+ Feel free to hop into our community in [Discord](https://documen.so/discord)
+ issue-message: |
+ Thank you for opening your first issue and for being a part of the open signing revolution!
+ One of our team members will review it and get back to you as soon as it possible 💚
+ Meanwhile, please feel free to hop into our community in [Discord](https://documen.so/discord)
diff --git a/.github/workflows/issue-assignee-check.yml b/.github/workflows/issue-assignee-check.yml
new file mode 100644
index 000000000..1ce7a02be
--- /dev/null
+++ b/.github/workflows/issue-assignee-check.yml
@@ -0,0 +1,59 @@
+name: 'Issue Assignee Check'
+
+on:
+ issues:
+ types: ['assigned']
+
+permissions:
+ issues: write
+
+jobs:
+ countIssues:
+ if: ${{ github.event.issue.assignee }} && github.event.action == 'assigned' && github.event.sender.type == 'User'
+ runs-on: ubuntu-latest
+ steps:
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '18'
+ cache: npm
+
+ - name: Install Octokit
+ run: npm install @octokit/rest@18
+
+ - name: Check Assigned User's Issue Count
+ id: parse-comment
+ uses: actions/github-script@v5
+ with:
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ script: |
+ const { Octokit } = require("@octokit/rest");
+ const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN });
+
+ const username = context.payload.issue.assignee.login;
+ console.log(`Username Extracted: ${username}`);
+
+ const { data: issues } = await octokit.issues.listForRepo({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ assignee: username,
+ state: 'open'
+ });
+
+ const issueCount = issues.length;
+ console.log(`Issue Count For ${username}: ${issueCount}`);
+
+ if (issueCount > 3) {
+ let issueCountMessage = `### 🚨 Documenso Police 🚨`;
+ issueCountMessage += `\n@${username} has ${issueCount} open issues assigned already. Consider whether this issue should be assigned to them or left open for another contributor.`;
+
+ await octokit.request('POST /repos/{owner}/{repo}/issues/{issue_number}/comments', {
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: context.issue.number,
+ body: issueCountMessage,
+ headers: {
+ 'Authorization': `token ${{ secrets.GITHUB_TOKEN }}`,
+ }
+ });
+ }
diff --git a/.github/workflows/issue-opened.yml b/.github/workflows/issue-opened.yml
new file mode 100644
index 000000000..ed9f2811a
--- /dev/null
+++ b/.github/workflows/issue-opened.yml
@@ -0,0 +1,21 @@
+name: 'Label Issues'
+
+on:
+ issues:
+ types: ['opened', 'reopened']
+
+jobs:
+ label_issues:
+ runs-on: ubuntu-latest
+ permissions:
+ issues: write
+ steps:
+ - uses: actions/github-script@v6
+ with:
+ script: |
+ github.rest.issues.addLabels({
+ issue_number: context.issue.number,
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ labels: ["needs triage"]
+ })
diff --git a/.github/workflows/pr-labeler.yml b/.github/workflows/pr-labeler.yml
new file mode 100644
index 000000000..1a5afd359
--- /dev/null
+++ b/.github/workflows/pr-labeler.yml
@@ -0,0 +1,20 @@
+name: 'PR Labeler'
+
+on:
+ - pull_request_target
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ labeler:
+ permissions:
+ contents: read
+ pull-requests: write
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/labeler@v4
+ with:
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
+ sync-labels: ''
diff --git a/.github/workflows/pr-review-reminder.yml b/.github/workflows/pr-review-reminder.yml
new file mode 100644
index 000000000..cc272fbfe
--- /dev/null
+++ b/.github/workflows/pr-review-reminder.yml
@@ -0,0 +1,60 @@
+name: 'PR Review Reminder'
+
+on:
+ pull_request:
+ types: ['opened', 'reopened', 'ready_for_review', 'review_requested']
+
+permissions:
+ pull-requests: write
+
+jobs:
+ checkPRs:
+ if: ${{ github.event.pull_request.user.login }} && github.event.action == ('opened' || 'reopened' || 'ready_for_review' || 'review_requested')
+ runs-on: ubuntu-latest
+ steps:
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '18'
+ cache: npm
+
+ - name: Install Octokit
+ run: npm install @octokit/rest@18
+
+ - name: Check user's PRs awaiting review
+ id: parse-prs
+ uses: actions/github-script@v5
+ with:
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ script: |
+ const { Octokit } = require("@octokit/rest");
+ const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN });
+
+ const username = context.payload.pull_request.user.login;
+ console.log(`Username Extracted: ${username}`);
+
+ const { data: pullRequests } = await octokit.pulls.list({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ state: 'open',
+ sort: 'created',
+ direction: 'asc',
+ });
+
+ const userPullRequests = pullRequests.filter(pr => pr.user.login === username && (pr.state === 'open' || pr.state === 'ready_for_review'));
+ const prCount = userPullRequests.length;
+ console.log(`PR Count for ${username}: ${prCount}`);
+
+ if (prCount > 3) {
+ let prReminderMessage = `🚨 @${username} has ${prCount} pull requests awaiting review. Please consider reviewing them when possible. 🚨`;
+
+ await octokit.request('POST /repos/{owner}/{repo}/issues/{issue_number}/comments', {
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: context.payload.pull_request.number,
+ body: prReminderMessage,
+ headers: {
+ 'Authorization': `token ${{ secrets.GITHUB_TOKEN }}`,
+ }
+ });
+ }
diff --git a/.github/workflows/semantic-pull-requests.yml b/.github/workflows/semantic-pull-requests.yml
index af6e624c6..7685562b5 100644
--- a/.github/workflows/semantic-pull-requests.yml
+++ b/.github/workflows/semantic-pull-requests.yml
@@ -1,4 +1,4 @@
-name: "Validate PR Name"
+name: 'Validate PR Name'
on:
pull_request_target:
@@ -9,7 +9,7 @@ on:
- synchronize
permissions:
- pull-requests: read
+ pull-requests: write
jobs:
validate-pr:
@@ -17,5 +17,28 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: amannn/action-semantic-pull-request@v5
+ id: lint_pr_title
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+ - uses: marocchino/sticky-pull-request-comment@v2
+ if: always() && (steps.lint_pr_title.outputs.error_message != null)
+ with:
+ header: pr-title-lint-error
+ message: |
+ Hey There! and thank you for opening this pull request! 📝👋🏼
+
+ We require pull request titles to follow the [Conventional Commits Spec](https://www.conventionalcommits.org/en/v1.0.0/) and it looks like your proposed title needs to be adjusted.
+
+ Details:
+
+ ```
+ ${{ steps.lint_pr_title.outputs.error_message }}
+ ```
+
+ - if: ${{ steps.lint_pr_title.outputs.error_message == null }}
+ uses: marocchino/sticky-pull-request-comment@v2
+ with:
+ header: pr-title-lint-error
+ message: |
+ Thank you for following the naming conventions for pull request titles! 💚🚀
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
new file mode 100644
index 000000000..efd681a71
--- /dev/null
+++ b/.github/workflows/stale.yml
@@ -0,0 +1,25 @@
+name: 'Mark Stale Issues and PRs'
+
+on:
+ schedule:
+ - cron: '0 */8 * * *'
+
+jobs:
+ stale:
+ runs-on: ubuntu-latest
+ permissions:
+ issues: write
+ pull-requests: write
+
+ steps:
+ - uses: actions/stale@v4
+ with:
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
+ days-before-pr-stale: 30
+ days-before-issue-stale: 30
+ stale-issue-message: 'This issue has not seen activity for a while. It will be closed in 30 days unless further activity is detected'
+ stale-pr-message: 'This PR has not seen activitiy for a while. It will be closed in 30 days unless further activity is detected.'
+ close-issue-message: 'This issue has been closed because of inactivity.'
+ close-pr-message: 'This PR has been closed because of inactivity.'
+ exempt-pr-labels: 'WIP,on-hold,needs review'
+ exempt-issue-labels: 'WIP,on-hold,needs review,roadmap,assigned'
diff --git a/README.md b/README.md
index 89f44a926..24d932858 100644
--- a/README.md
+++ b/README.md
@@ -139,11 +139,13 @@ npm run d
1. **App** - http://localhost:3000
2. **Incoming Mail Access** - http://localhost:9000
-
3. **Database Connection Details**
+
- **Port**: 54320
- **Connection**: Use your favorite database client to connect using the provided port.
+4. **S3 Storage Dashboard** - http://localhost:9001
+
## Developer Setup
### Manual Setup
diff --git a/apps/marketing/src/app/(marketing)/layout.tsx b/apps/marketing/src/app/(marketing)/layout.tsx
index 365d8a5d1..248414b33 100644
--- a/apps/marketing/src/app/(marketing)/layout.tsx
+++ b/apps/marketing/src/app/(marketing)/layout.tsx
@@ -29,7 +29,7 @@ export default function MarketingLayout({ children }: MarketingLayoutProps) {
return (
@@ -41,7 +41,7 @@ export default function MarketingLayout({ children }: MarketingLayoutProps) {
-
{children}
+
{children}
diff --git a/apps/marketing/src/app/(marketing)/singleplayer/client.tsx b/apps/marketing/src/app/(marketing)/singleplayer/client.tsx
index 1dcb2d76b..b7654c7cf 100644
--- a/apps/marketing/src/app/(marketing)/singleplayer/client.tsx
+++ b/apps/marketing/src/app/(marketing)/singleplayer/client.tsx
@@ -17,15 +17,14 @@ import { AddFieldsFormPartial } from '@documenso/ui/primitives/document-flow/add
import type { TAddFieldsFormSchema } from '@documenso/ui/primitives/document-flow/add-fields.types';
import { AddSignatureFormPartial } from '@documenso/ui/primitives/document-flow/add-signature';
import type { TAddSignatureFormSchema } from '@documenso/ui/primitives/document-flow/add-signature.types';
-import {
- DocumentFlowFormContainer,
- DocumentFlowFormContainerHeader,
-} from '@documenso/ui/primitives/document-flow/document-flow-root';
+import { DocumentFlowFormContainer } from '@documenso/ui/primitives/document-flow/document-flow-root';
import type { DocumentFlowStep } from '@documenso/ui/primitives/document-flow/types';
import { LazyPDFViewer } from '@documenso/ui/primitives/lazy-pdf-viewer';
+import { Stepper } from '@documenso/ui/primitives/stepper';
import { useToast } from '@documenso/ui/primitives/use-toast';
-type SinglePlayerModeStep = 'fields' | 'sign';
+const SinglePlayerModeSteps = ['fields', 'sign'] as const;
+type SinglePlayerModeStep = (typeof SinglePlayerModeSteps)[number];
// !: This entire file is a hack to get around failed prerendering of
// !: the Single Player Mode page. This regression was introduced during
@@ -226,37 +225,35 @@ export const SinglePlayerClient = () => {
- e.preventDefault()}>
-
-
- {/* Add fields to PDF page. */}
- {step === 'fields' && (
+ e.preventDefault()}
+ >
+ setStep(SinglePlayerModeSteps[step - 1])}
+ >
+ {/* Add fields to PDF page. */}
- )}
- {/* Enter user details and signature. */}
- {step === 'sign' && (
+ {/* Enter user details and signature. */}
+
field.type === 'NAME'))}
requireSignature={Boolean(fields.find((field) => field.type === 'SIGNATURE'))}
/>
- )}
+
diff --git a/apps/marketing/src/pages/api/trpc/[trpc].ts b/apps/marketing/src/pages/api/trpc/[trpc].ts
index 0bc991a98..c43291ea1 100644
--- a/apps/marketing/src/pages/api/trpc/[trpc].ts
+++ b/apps/marketing/src/pages/api/trpc/[trpc].ts
@@ -4,6 +4,11 @@ import { appRouter } from '@documenso/trpc/server/router';
export const config = {
maxDuration: 60,
+ api: {
+ bodyParser: {
+ sizeLimit: '50mb',
+ },
+ },
};
export default trpcNext.createNextApiHandler({
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 e775bffdc..ffce3bd6c 100644
--- a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx
+++ b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx
@@ -4,8 +4,8 @@ import { useState } from 'react';
import { useRouter } from 'next/navigation';
-import type { DocumentData, Field, Recipient, User } from '@documenso/prisma/client';
import { DocumentStatus } from '@documenso/prisma/client';
+import type { DocumentData, Field, Recipient, User } from '@documenso/prisma/client';
import type { DocumentWithData } from '@documenso/prisma/types/document-with-data';
import { trpc } from '@documenso/trpc/react';
import { cn } from '@documenso/ui/lib/utils';
@@ -18,12 +18,10 @@ import { AddSubjectFormPartial } from '@documenso/ui/primitives/document-flow/ad
import type { TAddSubjectFormSchema } from '@documenso/ui/primitives/document-flow/add-subject.types';
import { AddTitleFormPartial } from '@documenso/ui/primitives/document-flow/add-title';
import type { TAddTitleFormSchema } from '@documenso/ui/primitives/document-flow/add-title.types';
-import {
- DocumentFlowFormContainer,
- DocumentFlowFormContainerHeader,
-} from '@documenso/ui/primitives/document-flow/document-flow-root';
+import { DocumentFlowFormContainer } from '@documenso/ui/primitives/document-flow/document-flow-root';
import type { DocumentFlowStep } from '@documenso/ui/primitives/document-flow/types';
import { LazyPDFViewer } from '@documenso/ui/primitives/lazy-pdf-viewer';
+import { Stepper } from '@documenso/ui/primitives/stepper';
import { useToast } from '@documenso/ui/primitives/use-toast';
export type EditDocumentFormProps = {
@@ -36,6 +34,7 @@ export type EditDocumentFormProps = {
};
type EditDocumentStep = 'title' | 'signers' | 'fields' | 'subject';
+const EditDocumentSteps: EditDocumentStep[] = ['title', 'signers', 'fields', 'subject'];
export const EditDocumentForm = ({
className,
@@ -48,6 +47,7 @@ export const EditDocumentForm = ({
const { toast } = useToast();
const router = useRouter();
+ // controlled stepper state
const [step, setStep] = useState(
document.status === DocumentStatus.DRAFT ? 'title' : 'signers',
);
@@ -67,24 +67,19 @@ export const EditDocumentForm = ({
title: 'Add Signers',
description: 'Add the people who will sign the document.',
stepIndex: 2,
- onBackStep: () => document.status === DocumentStatus.DRAFT && setStep('title'),
},
fields: {
title: 'Add Fields',
description: 'Add all relevant fields for each recipient.',
stepIndex: 3,
- onBackStep: () => setStep('signers'),
},
subject: {
title: 'Add Subject',
description: 'Add the subject and message you wish to send to signers.',
stepIndex: 4,
- onBackStep: () => setStep('fields'),
},
};
- const currentDocumentFlow = documentFlow[step];
-
const onAddTitleFormSubmit = async (data: TAddTitleFormSchema) => {
try {
// Custom invocation server action
@@ -116,7 +111,6 @@ export const EditDocumentForm = ({
});
router.refresh();
-
setStep('fields');
} catch (err) {
console.error(err);
@@ -138,7 +132,6 @@ export const EditDocumentForm = ({
});
router.refresh();
-
setStep('subject');
} catch (err) {
console.error(err);
@@ -181,6 +174,8 @@ export const EditDocumentForm = ({
}
};
+ const currentDocumentFlow = documentFlow[step];
+
return (