mirror of
https://github.com/documenso/documenso.git
synced 2026-07-12 14:05:20 +10:00
Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1b171f7d1b | |||
| d05d051053 | |||
| 30c5cf6d70 | |||
| dfac91916c | |||
| a5a795cb7b | |||
| b6da33282e | |||
| 0d1496bc26 | |||
| b5e1874ced | |||
| 0b8d107291 | |||
| f66f01a09a | |||
| 960217c78d |
@@ -1,113 +0,0 @@
|
||||
---
|
||||
date: 2026-03-07
|
||||
title: Search Query Optimization
|
||||
---
|
||||
|
||||
## Problem
|
||||
|
||||
The `searchDocumentsWithKeyword` and `searchTemplatesWithKeyword` functions generate a single massive Prisma `findMany` with 7 OR branches. This produces a SQL query that:
|
||||
|
||||
- Joins `Team` twice (aliased j3 and j8) for the two team-access branches
|
||||
- Embeds 4-level deep EXISTS subqueries (`TeamGroup -> OrganisationGroup -> OrganisationGroupMember -> OrganisationMember`) for each team branch
|
||||
- Uses `ILIKE` across multiple columns with no way for Postgres to use indexes effectively across the OR
|
||||
- Includes `recipients: true` on the result even though only a small subset of fields are needed
|
||||
- Fetches all matching rows then filters visibility **in application code**
|
||||
|
||||
With 1,000 documents seeded under `medium-account@documenso.com`, this query is noticeably slow.
|
||||
|
||||
---
|
||||
|
||||
## Option A: Pre-resolve team IDs, keep Prisma
|
||||
|
||||
**Change:** Before the envelope query, resolve the user's accessible team IDs in a single query:
|
||||
|
||||
```ts
|
||||
const teamIds = await prisma.teamGroup
|
||||
.findMany({
|
||||
where: {
|
||||
organisationGroup: {
|
||||
organisationGroupMembers: {
|
||||
some: { organisationMember: { userId } },
|
||||
},
|
||||
},
|
||||
},
|
||||
select: { teamId: true },
|
||||
})
|
||||
.then((rows) => [...new Set(rows.map((r) => r.teamId))]);
|
||||
```
|
||||
|
||||
Then replace `team: buildTeamWhereQuery(...)` with `teamId: { in: teamIds }` in the envelope query.
|
||||
|
||||
**Benefits:**
|
||||
|
||||
- Eliminates the duplicated 4-level deep join chain from the envelope query
|
||||
- The team ID resolution is a simple indexed lookup (runs once, not twice)
|
||||
- Minimal code change -- still Prisma, same structure
|
||||
- Can also pre-resolve team roles to move visibility filtering into the WHERE clause
|
||||
|
||||
**Drawbacks:**
|
||||
|
||||
- Still a single large OR query with ILIKE branches
|
||||
- Prisma still generates suboptimal SQL for the remaining OR conditions
|
||||
|
||||
---
|
||||
|
||||
## Option B: Kysely rewrite with pre-resolved teams
|
||||
|
||||
**Change:** Rewrite using Kysely (already set up in codebase as `kyselyPrisma.$kysely`). Follow the pattern in `find-envelopes.ts` -- use Kysely for filtering/ID fetching, then Prisma for hydration.
|
||||
|
||||
Structure as a UNION of targeted queries instead of a single OR:
|
||||
|
||||
```
|
||||
Query 1: owned docs matching title/externalId (simple indexed lookup)
|
||||
Query 2: docs where user is recipient matching title (EXISTS on Recipient)
|
||||
Query 3: team docs matching title/externalId (using pre-resolved teamIds)
|
||||
UNION ALL -> deduplicate -> ORDER BY createdAt DESC -> LIMIT 20
|
||||
```
|
||||
|
||||
Then hydrate the 20 IDs with Prisma for the include data.
|
||||
|
||||
**Benefits:**
|
||||
|
||||
- Each sub-query is simple and independently optimizable by Postgres
|
||||
- UNION eliminates the massive OR which forces bad query plans
|
||||
- Kysely gives control over exact SQL structure
|
||||
- Only hydrate the final 20 results (not all matches)
|
||||
- Follows existing `find-envelopes.ts` pattern -- not a new paradigm
|
||||
|
||||
**Drawbacks:**
|
||||
|
||||
- More code than Option A
|
||||
- Two query layers (Kysely for IDs, Prisma for hydration)
|
||||
|
||||
---
|
||||
|
||||
## Option C: Hybrid -- pre-resolve teams + simplify Prisma OR
|
||||
|
||||
**Change:** Pre-resolve team IDs (like Option A), but also restructure the Prisma query to reduce OR branches:
|
||||
|
||||
- Merge "owned + title" and "owned + externalId" and "owned + recipient email" into a single owned-docs branch with nested OR
|
||||
- Merge "team + title" and "team + externalId" into a single team-docs branch
|
||||
- Keep "recipient inbox" branches separate
|
||||
|
||||
This reduces from 7 OR branches to ~3-4, with simpler conditions in each.
|
||||
|
||||
**Benefits:**
|
||||
|
||||
- Simpler than Kysely rewrite
|
||||
- Fewer OR branches = better query plan
|
||||
- Pre-resolved team IDs eliminate the deep joins
|
||||
- Still pure Prisma
|
||||
|
||||
**Drawbacks:**
|
||||
|
||||
- Postgres still has to handle OR across different access patterns in one query
|
||||
- Less control over SQL than Kysely
|
||||
|
||||
---
|
||||
|
||||
## Recommendation
|
||||
|
||||
**Option B (Kysely)** is the strongest choice. The codebase already uses this exact pattern for `find-envelopes.ts` which solves the same class of problem. The UNION approach gives Postgres the best chance at using indexes per sub-query. Pre-resolving team IDs is a prerequisite for all options and is trivially cheap.
|
||||
|
||||
The template search query has the same structure and should get the same treatment.
|
||||
@@ -1,337 +0,0 @@
|
||||
---
|
||||
name: create-documentation
|
||||
description: Generate markdown documentation for a module or feature
|
||||
---
|
||||
|
||||
You are creating proper markdown documentation for a feature or guide in the Documenso documentation site.
|
||||
|
||||
**Read [WRITING_STYLE.md](../../../WRITING_STYLE.md) first** for tone, formatting conventions, and anti-patterns to avoid.
|
||||
|
||||
## Your Task
|
||||
|
||||
1. **Identify the scope** - Based on the conversation context, determine what feature or topic needs documentation. Ask the user if unclear.
|
||||
2. **Identify the audience** - Is this for Users, Developers, or Self-Hosters?
|
||||
3. **Read the source code** - Understand the feature, API, or configuration being documented.
|
||||
4. **Read existing docs** - Check `apps/docs/content/docs/` for documentation to update.
|
||||
5. **Write comprehensive documentation** - Create or update MDX docs following the patterns below.
|
||||
6. **Update navigation** - Add to the relevant `meta.json` if creating a new page.
|
||||
|
||||
## Documentation Framework
|
||||
|
||||
This project uses [Fumadocs](https://fumadocs.dev). All documentation lives in `apps/docs/content/docs/` as MDX files. The docs app is a Next.js app at `apps/docs/`.
|
||||
|
||||
## Documentation Structure
|
||||
|
||||
```
|
||||
apps/docs/content/docs/
|
||||
├── index.mdx # Landing page with audience navigation
|
||||
├── meta.json # Root navigation: guides + resources
|
||||
├── users/ # Application usage guides
|
||||
│ ├── meta.json # { "root": true, "pages": [...] }
|
||||
│ ├── getting-started/ # Account creation, first document
|
||||
│ ├── documents/ # Upload, recipients, fields, send
|
||||
│ │ └── advanced/ # AI detection, visibility, placeholders
|
||||
│ ├── templates/ # Create and use templates
|
||||
│ ├── organisations/ # Overview, members, groups, SSO, billing
|
||||
│ │ ├── single-sign-on/
|
||||
│ │ └── preferences/
|
||||
│ └── settings/ # Profile, security, API tokens
|
||||
├── developers/ # API and integration docs
|
||||
│ ├── meta.json # { "root": true, "pages": [...] }
|
||||
│ ├── getting-started/ # Authentication, first API call
|
||||
│ ├── api/ # Documents, recipients, fields, templates, teams
|
||||
│ ├── webhooks/ # Setup, events, verification
|
||||
│ ├── embedding/ # Authoring, direct links, CSS vars, SDKs
|
||||
│ │ └── sdks/ # React, Vue, Svelte, Solid, Preact, Angular
|
||||
│ ├── examples/ # Common workflows
|
||||
│ ├── local-development/ # Quickstart, manual, translations
|
||||
│ └── contributing/ # Contributing translations
|
||||
├── self-hosting/ # Self-hosting documentation
|
||||
│ ├── meta.json # { "root": true, "pages": [...] }
|
||||
│ ├── getting-started/ # Quick start, requirements, tips
|
||||
│ ├── deployment/ # Docker, docker-compose, Kubernetes, Railway
|
||||
│ ├── configuration/ # Environment, database, email, storage
|
||||
│ │ ├── signing-certificate/ # Local, Google Cloud HSM, timestamp
|
||||
│ │ └── advanced/ # OAuth providers, AI features
|
||||
│ └── maintenance/ # Upgrades, backups, troubleshooting
|
||||
├── concepts/ # Shared across audiences
|
||||
│ └── ... # Document lifecycle, field types, signing
|
||||
├── compliance/ # eSign, GDPR, standards, certifications
|
||||
└── policies/ # Terms, privacy, security, licenses
|
||||
```
|
||||
|
||||
### Where to Put Documentation
|
||||
|
||||
| Type | Location | When to use |
|
||||
| ------------------- | ------------------------------------------------ | -------------------------------------------------- |
|
||||
| **User Guide** | `apps/docs/content/docs/users/<section>/` | UI workflows for using the Documenso web app |
|
||||
| **Developer Guide** | `apps/docs/content/docs/developers/<section>/` | API reference, SDK guides, webhooks, embedding |
|
||||
| **Self-Hosting** | `apps/docs/content/docs/self-hosting/<section>/` | Deployment, configuration, environment variables |
|
||||
| **Concept** | `apps/docs/content/docs/concepts/` | Cross-audience concepts (document lifecycle, etc.) |
|
||||
| **Compliance** | `apps/docs/content/docs/compliance/` | Legal and regulatory documentation |
|
||||
|
||||
### Navigation (meta.json)
|
||||
|
||||
Each directory has a `meta.json` controlling navigation order:
|
||||
|
||||
```json
|
||||
{
|
||||
"title": "Section Title",
|
||||
"pages": ["getting-started", "documents", "templates"]
|
||||
}
|
||||
```
|
||||
|
||||
Top-level audience sections use `"root": true`:
|
||||
|
||||
```json
|
||||
{
|
||||
"title": "Users",
|
||||
"description": "Send and sign documents",
|
||||
"root": true,
|
||||
"pages": ["getting-started", "documents", "templates", "organisations", "settings"]
|
||||
}
|
||||
```
|
||||
|
||||
Root `meta.json` uses `---Label---` for section dividers:
|
||||
|
||||
```json
|
||||
{
|
||||
"title": "Documentation",
|
||||
"pages": [
|
||||
"---Guides---",
|
||||
"users",
|
||||
"developers",
|
||||
"self-hosting",
|
||||
"---Resources---",
|
||||
"concepts",
|
||||
"compliance",
|
||||
"policies"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## MDX File Format
|
||||
|
||||
### Frontmatter
|
||||
|
||||
Every page needs frontmatter:
|
||||
|
||||
```yaml
|
||||
---
|
||||
title: Upload Documents
|
||||
description: Upload documents to Documenso to prepare them for signing. Covers supported formats, file size limits, and upload methods.
|
||||
---
|
||||
```
|
||||
|
||||
### Fumadocs Components
|
||||
|
||||
Import components at the top of the file (after frontmatter):
|
||||
|
||||
```mdx
|
||||
import { Accordion, Accordions } from 'fumadocs-ui/components/accordion';
|
||||
import { Callout } from 'fumadocs-ui/components/callout';
|
||||
import { Step, Steps } from 'fumadocs-ui/components/steps';
|
||||
import { Tab, Tabs } from 'fumadocs-ui/components/tabs';
|
||||
|
||||
;
|
||||
```
|
||||
|
||||
Callouts (use sparingly for warnings, beta features, security):
|
||||
|
||||
```mdx
|
||||
<Callout type="info">Informational note about behavior.</Callout>
|
||||
|
||||
<Callout type="warn">Warning about potential issues or breaking changes.</Callout>
|
||||
|
||||
<Callout type="error">Critical warning about data loss or security.</Callout>
|
||||
```
|
||||
|
||||
Steps (for sequential UI instructions):
|
||||
|
||||
```mdx
|
||||
{/* prettier-ignore */}
|
||||
<Steps>
|
||||
<Step>
|
||||
### Step title
|
||||
|
||||
Step description.
|
||||
|
||||
</Step>
|
||||
<Step>
|
||||
### Next step
|
||||
|
||||
Next description.
|
||||
|
||||
</Step>
|
||||
</Steps>
|
||||
```
|
||||
|
||||
Tabs (for multiple approaches or platforms):
|
||||
|
||||
````mdx
|
||||
<Tabs items={['cURL', 'JavaScript', 'Python']}>
|
||||
<Tab value="cURL">```bash curl -X POST ... ```</Tab>
|
||||
<Tab value="JavaScript">```typescript const response = await fetch(...) ```</Tab>
|
||||
</Tabs>
|
||||
````
|
||||
|
||||
## Page Structure by Audience
|
||||
|
||||
### User Documentation
|
||||
|
||||
```mdx
|
||||
---
|
||||
title: Feature Name
|
||||
description: Brief description for SEO and previews.
|
||||
---
|
||||
|
||||
import { Callout } from 'fumadocs-ui/components/callout';
|
||||
import { Step, Steps } from 'fumadocs-ui/components/steps';
|
||||
|
||||
## Limitations
|
||||
|
||||
| Limitation | Value |
|
||||
| ----------------- | -------- |
|
||||
| Supported format | PDF only |
|
||||
| Maximum file size | 50MB |
|
||||
|
||||
## How to Do the Thing
|
||||
|
||||
{/* prettier-ignore */}
|
||||
<Steps>
|
||||
<Step>
|
||||
### Navigate to the page
|
||||
|
||||
Open **Settings > Feature**.
|
||||
|
||||
</Step>
|
||||
<Step>
|
||||
### Configure the setting
|
||||
|
||||
Fill in the required fields and click **Save**.
|
||||
|
||||
</Step>
|
||||
</Steps>
|
||||
|
||||
---
|
||||
|
||||
## See Also
|
||||
|
||||
- [Related Guide](/docs/users/related)
|
||||
```
|
||||
|
||||
### Developer Documentation
|
||||
|
||||
````mdx
|
||||
---
|
||||
title: Documents API
|
||||
description: Create, manage, and send documents for signing via the API.
|
||||
---
|
||||
|
||||
import { Callout } from 'fumadocs-ui/components/callout';
|
||||
import { Tab, Tabs } from 'fumadocs-ui/components/tabs';
|
||||
|
||||
<Callout type="warn">
|
||||
This guide may not reflect the latest endpoints. For an always up-to-date reference, see the
|
||||
[OpenAPI Reference](https://openapi.documenso.com).
|
||||
</Callout>
|
||||
|
||||
## Overview
|
||||
|
||||
Brief description of the resource and what you can do with it.
|
||||
|
||||
## Resource Object
|
||||
|
||||
| Property | Type | Description |
|
||||
| -------- | ------ | ----------------- |
|
||||
| `id` | string | Unique identifier |
|
||||
| `status` | string | Current status |
|
||||
|
||||
## Create a Resource
|
||||
|
||||
```typescript
|
||||
const response = await fetch('https://app.documenso.com/api/v2/document', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Authorization: 'Bearer YOUR_API_TOKEN',
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
title: 'Service Agreement',
|
||||
}),
|
||||
});
|
||||
```
|
||||
````
|
||||
|
||||
---
|
||||
|
||||
## See Also
|
||||
|
||||
- [Related Guide](/docs/developers/related)
|
||||
|
||||
````
|
||||
|
||||
### Self-Hosting Documentation
|
||||
|
||||
```mdx
|
||||
---
|
||||
title: Environment Variables
|
||||
description: Complete reference for all environment variables used to configure Documenso.
|
||||
---
|
||||
|
||||
## Required Variables
|
||||
|
||||
| Variable | Description |
|
||||
| ------------------ | ------------------------------------------------ |
|
||||
| `NEXTAUTH_SECRET` | Secret key for session encryption (min 32 chars) |
|
||||
| `DATABASE_URL` | PostgreSQL connection URL |
|
||||
|
||||
---
|
||||
|
||||
## Optional Variables
|
||||
|
||||
| Variable | Default | Description |
|
||||
| -------------- | ------- | ---------------------- |
|
||||
| `PORT` | `3000` | Port the server runs on |
|
||||
|
||||
---
|
||||
|
||||
## See Also
|
||||
|
||||
- [Database Configuration](/docs/self-hosting/configuration/database)
|
||||
````
|
||||
|
||||
## Documentation Audiences
|
||||
|
||||
Tailor content to the audience:
|
||||
|
||||
- **User docs**: Focus on UI workflows, bold UI elements (**Settings**, **Save**), use `>` for navigation paths (**Settings > Team > Members**), number sequential steps, no code required
|
||||
- **Developer docs**: API/SDK examples, authentication, webhooks, code samples in TypeScript, link to OpenAPI reference
|
||||
- **Self-hosting docs**: Deployment guides, environment variables, Docker/non-Docker approaches, system requirements, troubleshooting
|
||||
|
||||
## Guidelines
|
||||
|
||||
See [WRITING_STYLE.md](../../../WRITING_STYLE.md) for complete guidelines. Key points:
|
||||
|
||||
- **Tone**: Direct, second-person, no emojis, no excessive personality
|
||||
- **Examples**: Progressive complexity, all must be valid TypeScript
|
||||
- **Tables**: Use Sharp-style nested parameter tables for API docs
|
||||
- **Callouts**: Use sparingly for warnings, beta features, security
|
||||
- **Cross-references**: Link related docs, add "See Also" sections
|
||||
- **Navigation**: Update `meta.json` when adding new pages
|
||||
- **Limitations**: Explicitly list what is NOT supported
|
||||
- **Images**: Use `.webp` format, store in `apps/docs/public/`
|
||||
|
||||
## Process
|
||||
|
||||
1. **Identify the audience** - Users, Developers, or Self-Hosters?
|
||||
2. **Explore the code** - Read source files to understand the feature
|
||||
3. **Check existing docs** - Look in `apps/docs/content/docs/` for related pages
|
||||
4. **Draft the structure** - Outline sections before writing
|
||||
5. **Write content** - Fill in each section following audience-specific patterns
|
||||
6. **Update navigation** - Add to relevant `meta.json` if creating a new page
|
||||
7. **Add cross-references** - Link from related docs, add "See Also" section
|
||||
|
||||
## Begin
|
||||
|
||||
Analyze the conversation context to determine the documentation scope, read the relevant source code, and create comprehensive MDX documentation in `apps/docs/content/docs/`.
|
||||
@@ -1,4 +1,4 @@
|
||||
name: 'Setup node and cache node_modules'
|
||||
name: 'Setup node and install dependencies with pnpm'
|
||||
inputs:
|
||||
node_version:
|
||||
required: false
|
||||
@@ -7,33 +7,19 @@ inputs:
|
||||
runs:
|
||||
using: 'composite'
|
||||
steps:
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
|
||||
- name: Set up Node ${{ inputs.node_version }}
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: ${{ inputs.node_version }}
|
||||
|
||||
- name: Cache npm
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ~/.npm
|
||||
key: npm-${{ hashFiles('package-lock.json') }}
|
||||
restore-keys: npm-
|
||||
|
||||
- name: Cache node_modules
|
||||
uses: actions/cache@v3
|
||||
id: cache-node-modules
|
||||
with:
|
||||
path: |
|
||||
node_modules
|
||||
packages/*/node_modules
|
||||
apps/*/node_modules
|
||||
key: modules-${{ hashFiles('package-lock.json') }}
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Install dependencies
|
||||
if: steps.cache-node-modules.outputs.cache-hit != 'true'
|
||||
shell: bash
|
||||
run: |
|
||||
npm ci --no-audit
|
||||
npm run prisma:generate
|
||||
pnpm install --frozen-lockfile
|
||||
pnpm run prisma:generate
|
||||
env:
|
||||
HUSKY: '0'
|
||||
|
||||
@@ -10,10 +10,10 @@ runs:
|
||||
path: |
|
||||
~/.cache/ms-playwright
|
||||
${{ github.workspace }}/node_modules/playwright
|
||||
key: playwright-${{ hashFiles('**/package-lock.json') }}
|
||||
key: playwright-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||
restore-keys: playwright-
|
||||
|
||||
- name: Install playwright
|
||||
if: steps.cache-playwright.outputs.cache-hit != 'true'
|
||||
run: npx playwright install --with-deps
|
||||
run: pnpm exec playwright install --with-deps
|
||||
shell: bash
|
||||
|
||||
@@ -12,11 +12,10 @@ updates:
|
||||
open-pull-requests-limit: 0
|
||||
|
||||
- package-ecosystem: 'npm'
|
||||
directory: '/apps/web'
|
||||
directory: '/'
|
||||
schedule:
|
||||
interval: 'weekly'
|
||||
target-branch: 'main'
|
||||
labels:
|
||||
- 'npm dependencies'
|
||||
- 'frontend'
|
||||
- 'dependencies'
|
||||
open-pull-requests-limit: 0
|
||||
|
||||
@@ -12,20 +12,6 @@ concurrency:
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
typecheck:
|
||||
name: Typecheck
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 2
|
||||
|
||||
- uses: ./.github/actions/node-install
|
||||
|
||||
- name: Typecheck
|
||||
run: npm run typecheck -w @documenso/remix
|
||||
|
||||
build_app:
|
||||
name: Build App
|
||||
runs-on: ubuntu-latest
|
||||
@@ -41,7 +27,7 @@ jobs:
|
||||
run: cp .env.example .env
|
||||
|
||||
- name: Build app
|
||||
run: npm run build
|
||||
run: pnpm run build
|
||||
|
||||
build_docker:
|
||||
name: Build Docker Image
|
||||
|
||||
@@ -31,7 +31,7 @@ jobs:
|
||||
- uses: ./.github/actions/node-install
|
||||
|
||||
- name: Build app
|
||||
run: npm run build
|
||||
run: pnpm run build
|
||||
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v3
|
||||
|
||||
@@ -23,21 +23,21 @@ jobs:
|
||||
- uses: ./.github/actions/node-install
|
||||
|
||||
- name: Start Services
|
||||
run: npm run dx:up
|
||||
run: pnpm run dx:up
|
||||
|
||||
- uses: ./.github/actions/playwright-install
|
||||
|
||||
- name: Create the database
|
||||
run: npm run prisma:migrate-dev
|
||||
run: pnpm run prisma:migrate-dev
|
||||
|
||||
- name: Seed the database
|
||||
run: npm run prisma:seed
|
||||
run: pnpm run prisma:seed
|
||||
|
||||
- name: Install playwright browsers
|
||||
run: npx playwright install --with-deps
|
||||
run: pnpm exec playwright install --with-deps
|
||||
|
||||
- name: Run Playwright tests
|
||||
run: npm run ci
|
||||
run: pnpm run ci
|
||||
env:
|
||||
# Needed since we use next start which will set the NODE_ENV to production
|
||||
NEXT_PRIVATE_SIGNING_LOCAL_FILE_PATH: './example/cert.p12'
|
||||
|
||||
@@ -16,14 +16,16 @@ jobs:
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 2
|
||||
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
|
||||
- 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
|
||||
run: pnpm install @octokit/rest@18
|
||||
|
||||
- name: Check Assigned User's Issue Count
|
||||
id: parse-comment
|
||||
|
||||
@@ -16,14 +16,17 @@ jobs:
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 2
|
||||
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
|
||||
- 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
|
||||
run: pnpm install @octokit/rest@18
|
||||
|
||||
- name: Check user's PRs awaiting review
|
||||
id: parse-prs
|
||||
|
||||
@@ -29,7 +29,7 @@ jobs:
|
||||
|
||||
- name: Compile translations
|
||||
id: compile_translations
|
||||
run: npm run translate:compile -- -- --strict
|
||||
run: pnpm run translate:compile -- --strict
|
||||
continue-on-error: true
|
||||
|
||||
- name: Pull translations from Crowdin
|
||||
|
||||
@@ -25,7 +25,7 @@ jobs:
|
||||
- uses: ./.github/actions/node-install
|
||||
|
||||
- name: Extract translations
|
||||
run: npm run translate:extract
|
||||
run: pnpm run translate:extract
|
||||
|
||||
- name: Commit changes and push to reserved branch
|
||||
env:
|
||||
@@ -78,7 +78,7 @@ jobs:
|
||||
|
||||
- name: Compile translations
|
||||
id: compile_translations
|
||||
run: npm run translate:compile -- -- --strict
|
||||
run: pnpm run translate:compile -- --strict
|
||||
continue-on-error: true
|
||||
|
||||
- name: Upload missing translations
|
||||
|
||||
+1
-4
@@ -20,9 +20,7 @@ build
|
||||
*.pem
|
||||
|
||||
# debug
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
|
||||
# local env files
|
||||
.env
|
||||
@@ -63,7 +61,6 @@ CLAUDE.md
|
||||
|
||||
# scripts
|
||||
scripts/output*
|
||||
scripts/bench-*
|
||||
|
||||
# license
|
||||
.documenso-license.json
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
legacy-peer-deps = true
|
||||
prefer-dedupe = true
|
||||
# Hoist packages that expect to be resolvable from any workspace.
|
||||
# Start strict, add patterns here only as needed.
|
||||
shamefully-hoist=true
|
||||
|
||||
@@ -24,8 +24,8 @@ Run these commands to understand where the previous session left off:
|
||||
```bash
|
||||
git status # See uncommitted changes
|
||||
git log --oneline -10 # See recent commits
|
||||
npm run typecheck -w @documenso/remix # Check for type errors
|
||||
npm run lint:fix # Check for linting issues
|
||||
pnpm run typecheck -w @documenso/remix # Check for type errors
|
||||
pnpm run lint:fix # Check for linting issues
|
||||
```
|
||||
|
||||
Review the code that's already been written to understand:
|
||||
@@ -67,9 +67,9 @@ Review the code that's already been written to understand:
|
||||
Work continuously through these steps:
|
||||
|
||||
1. **Implement** - Write the code for the current task
|
||||
2. **Typecheck** - Run `npm run typecheck -w @documenso/remix` to verify types
|
||||
3. **Lint** - Run `npm run lint:fix` to fix linting issues
|
||||
4. **Test** - If non-trivial, run E2E tests: `npm run test:dev -w @documenso/app-tests`
|
||||
2. **Typecheck** - Run `pnpm run typecheck -w @documenso/remix` to verify types
|
||||
3. **Lint** - Run `pnpm run lint:fix` to fix linting issues
|
||||
4. **Test** - If non-trivial, run E2E tests: `pnpm run test:dev -w @documenso/app-tests`
|
||||
5. **Fix** - If tests fail, fix and re-run
|
||||
6. **Repeat** - Move to next task
|
||||
|
||||
@@ -93,18 +93,18 @@ Work continuously through these steps:
|
||||
|
||||
```bash
|
||||
# Type checking
|
||||
npm run typecheck -w @documenso/remix
|
||||
pnpm run typecheck -w @documenso/remix
|
||||
|
||||
# Linting
|
||||
npm run lint:fix
|
||||
pnpm run lint:fix
|
||||
|
||||
# E2E Tests (only for non-trivial work)
|
||||
npm run test:dev -w @documenso/app-tests # Run E2E tests in dev mode
|
||||
npm run test-ui:dev -w @documenso/app-tests # Run E2E tests with UI
|
||||
npm run test:e2e # Run full E2E test suite
|
||||
pnpm run test:dev -w @documenso/app-tests # Run E2E tests in dev mode
|
||||
pnpm run test-ui:dev -w @documenso/app-tests # Run E2E tests with UI
|
||||
pnpm run test:e2e # Run full E2E test suite
|
||||
|
||||
# Development
|
||||
npm run dev # Start dev server
|
||||
pnpm run dev # Start dev server
|
||||
```
|
||||
|
||||
## Begin
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
---
|
||||
description: Generate markdown documentation for a module or feature
|
||||
argument-hint: <topic-or-feature>
|
||||
---
|
||||
|
||||
You are generating documentation for the Documenso project.
|
||||
|
||||
## Your Task
|
||||
|
||||
Load and follow the skill at `.agents/skills/create-documentation/SKILL.md`. It contains the complete instructions for writing documentation including:
|
||||
|
||||
- Documentation structure and file locations
|
||||
- MDX format and Fumadocs components
|
||||
- Audience-specific patterns (Users, Developers, Self-Hosters)
|
||||
- Navigation (`meta.json`) updates
|
||||
- Writing style guidelines
|
||||
|
||||
## Context
|
||||
|
||||
The topic or feature to document is: `$ARGUMENTS`
|
||||
|
||||
## Begin
|
||||
|
||||
1. **Read the skill** at `.agents/skills/create-documentation/SKILL.md`
|
||||
2. **Read WRITING_STYLE.md** for tone and formatting conventions
|
||||
3. **Follow the skill instructions** to create comprehensive documentation
|
||||
4. **Use TodoWrite** to track your progress throughout
|
||||
@@ -7,17 +7,70 @@ You are creating a new justification file in the `.agents/justifications/` direc
|
||||
|
||||
## Your Task
|
||||
|
||||
Load and follow the skill at `.agents/skills/create-justification/SKILL.md`. It contains the complete instructions for creating justification files including:
|
||||
1. **Determine the slug** - Use `$ARGUMENTS` as the file slug (kebab-case recommended)
|
||||
2. **Gather content** - Collect or generate the justification content
|
||||
3. **Create the file** - Use the create-justification script to generate the file
|
||||
|
||||
- Unique three-word ID generation
|
||||
- Frontmatter format with date and title
|
||||
- Script usage (`scripts/create-justification.ts`)
|
||||
## Usage
|
||||
|
||||
## Context
|
||||
The script will automatically:
|
||||
|
||||
The justification slug and optional content: `$ARGUMENTS`
|
||||
- Generate a unique three-word ID (e.g., `swift-emerald-river`)
|
||||
- Create frontmatter with current date and formatted title
|
||||
- Save the file as `{id}-{slug}.md` in `.agents/justifications/`
|
||||
|
||||
## Creating the File
|
||||
|
||||
### Option 1: Direct Content
|
||||
|
||||
If you have the content ready, run:
|
||||
|
||||
```bash
|
||||
pnpm exec tsx scripts/create-justification.ts "$ARGUMENTS" "Your justification content here"
|
||||
```
|
||||
|
||||
### Option 2: Multi-line Content (Heredoc)
|
||||
|
||||
For multi-line content, use heredoc:
|
||||
|
||||
```bash
|
||||
pnpm exec tsx scripts/create-justification.ts "$ARGUMENTS" << HEREDOC
|
||||
Your multi-line
|
||||
justification content
|
||||
goes here
|
||||
HEREDOC
|
||||
```
|
||||
|
||||
### Option 3: Pipe Content
|
||||
|
||||
You can also pipe content:
|
||||
|
||||
```bash
|
||||
echo "Your content" | pnpm exec tsx scripts/create-justification.ts "$ARGUMENTS"
|
||||
```
|
||||
|
||||
## File Format
|
||||
|
||||
The created file will have:
|
||||
|
||||
```markdown
|
||||
---
|
||||
date: 2026-01-13
|
||||
title: Justification Title
|
||||
---
|
||||
|
||||
Your content here
|
||||
```
|
||||
|
||||
The title is automatically formatted from the slug (e.g., `architecture-decision` → `Architecture Decision`).
|
||||
|
||||
## Guidelines
|
||||
|
||||
- Use descriptive slugs in kebab-case (e.g., `tech-stack-choice`, `api-design-rationale`)
|
||||
- Include clear reasoning and context for the decision
|
||||
- The unique ID ensures no filename conflicts
|
||||
- Files are automatically dated for organization
|
||||
|
||||
## Begin
|
||||
|
||||
1. **Read the skill** at `.agents/skills/create-justification/SKILL.md`
|
||||
2. **Create the justification file** using the slug from `$ARGUMENTS` and appropriate content documenting the reasoning or justification
|
||||
Create a justification file using the slug from `$ARGUMENTS` and appropriate content documenting the reasoning or justification.
|
||||
|
||||
@@ -7,17 +7,70 @@ You are creating a new plan file in the `.agents/plans/` directory.
|
||||
|
||||
## Your Task
|
||||
|
||||
Load and follow the skill at `.agents/skills/create-plan/SKILL.md`. It contains the complete instructions for creating plan files including:
|
||||
1. **Determine the slug** - Use `$ARGUMENTS` as the file slug (kebab-case recommended)
|
||||
2. **Gather content** - Collect or generate the plan content
|
||||
3. **Create the file** - Use the create-plan script to generate the file
|
||||
|
||||
- Unique three-word ID generation
|
||||
- Frontmatter format with date and title
|
||||
- Script usage (`scripts/create-plan.ts`)
|
||||
## Usage
|
||||
|
||||
## Context
|
||||
The script will automatically:
|
||||
|
||||
The plan slug and optional content: `$ARGUMENTS`
|
||||
- Generate a unique three-word ID (e.g., `happy-blue-moon`)
|
||||
- Create frontmatter with current date and formatted title
|
||||
- Save the file as `{id}-{slug}.md` in `.agents/plans/`
|
||||
|
||||
## Creating the File
|
||||
|
||||
### Option 1: Direct Content
|
||||
|
||||
If you have the content ready, run:
|
||||
|
||||
```bash
|
||||
pnpm exec tsx scripts/create-plan.ts "$ARGUMENTS" "Your plan content here"
|
||||
```
|
||||
|
||||
### Option 2: Multi-line Content (Heredoc)
|
||||
|
||||
For multi-line content, use heredoc:
|
||||
|
||||
```bash
|
||||
pnpm exec tsx scripts/create-plan.ts "$ARGUMENTS" << HEREDOC
|
||||
Your multi-line
|
||||
plan content
|
||||
goes here
|
||||
HEREDOC
|
||||
```
|
||||
|
||||
### Option 3: Pipe Content
|
||||
|
||||
You can also pipe content:
|
||||
|
||||
```bash
|
||||
echo "Your content" | pnpm exec tsx scripts/create-plan.ts "$ARGUMENTS"
|
||||
```
|
||||
|
||||
## File Format
|
||||
|
||||
The created file will have:
|
||||
|
||||
```markdown
|
||||
---
|
||||
date: 2026-01-13
|
||||
title: Plan Title
|
||||
---
|
||||
|
||||
Your content here
|
||||
```
|
||||
|
||||
The title is automatically formatted from the slug (e.g., `my-feature` → `My Feature`).
|
||||
|
||||
## Guidelines
|
||||
|
||||
- Use descriptive slugs in kebab-case (e.g., `user-authentication`, `api-integration`)
|
||||
- Include clear, actionable plan content
|
||||
- The unique ID ensures no filename conflicts
|
||||
- Files are automatically dated for organization
|
||||
|
||||
## Begin
|
||||
|
||||
1. **Read the skill** at `.agents/skills/create-plan/SKILL.md`
|
||||
2. **Create the plan file** using the slug from `$ARGUMENTS` and appropriate content
|
||||
Create a plan file using the slug from `$ARGUMENTS` and appropriate content for the planning task.
|
||||
|
||||
@@ -7,17 +7,70 @@ You are creating a new scratch file in the `.agents/scratches/` directory.
|
||||
|
||||
## Your Task
|
||||
|
||||
Load and follow the skill at `.agents/skills/create-scratch/SKILL.md`. It contains the complete instructions for creating scratch files including:
|
||||
1. **Determine the slug** - Use `$ARGUMENTS` as the file slug (kebab-case recommended)
|
||||
2. **Gather content** - Collect or generate the scratch content
|
||||
3. **Create the file** - Use the create-scratch script to generate the file
|
||||
|
||||
- Unique three-word ID generation
|
||||
- Frontmatter format with date and title
|
||||
- Script usage (`scripts/create-scratch.ts`)
|
||||
## Usage
|
||||
|
||||
## Context
|
||||
The script will automatically:
|
||||
|
||||
The scratch slug and optional content: `$ARGUMENTS`
|
||||
- Generate a unique three-word ID (e.g., `calm-teal-cloud`)
|
||||
- Create frontmatter with current date and formatted title
|
||||
- Save the file as `{id}-{slug}.md` in `.agents/scratches/`
|
||||
|
||||
## Creating the File
|
||||
|
||||
### Option 1: Direct Content
|
||||
|
||||
If you have the content ready, run:
|
||||
|
||||
```bash
|
||||
pnpm exec tsx scripts/create-scratch.ts "$ARGUMENTS" "Your scratch content here"
|
||||
```
|
||||
|
||||
### Option 2: Multi-line Content (Heredoc)
|
||||
|
||||
For multi-line content, use heredoc:
|
||||
|
||||
```bash
|
||||
pnpm exec tsx scripts/create-scratch.ts "$ARGUMENTS" << HEREDOC
|
||||
Your multi-line
|
||||
scratch content
|
||||
goes here
|
||||
HEREDOC
|
||||
```
|
||||
|
||||
### Option 3: Pipe Content
|
||||
|
||||
You can also pipe content:
|
||||
|
||||
```bash
|
||||
echo "Your content" | pnpm exec tsx scripts/create-scratch.ts "$ARGUMENTS"
|
||||
```
|
||||
|
||||
## File Format
|
||||
|
||||
The created file will have:
|
||||
|
||||
```markdown
|
||||
---
|
||||
date: 2026-01-13
|
||||
title: Scratch Title
|
||||
---
|
||||
|
||||
Your content here
|
||||
```
|
||||
|
||||
The title is automatically formatted from the slug (e.g., `quick-notes` → `Quick Notes`).
|
||||
|
||||
## Guidelines
|
||||
|
||||
- Use descriptive slugs in kebab-case (e.g., `exploration-ideas`, `temporary-notes`)
|
||||
- Scratch files are for temporary notes, explorations, or ideas
|
||||
- The unique ID ensures no filename conflicts
|
||||
- Files are automatically dated for organization
|
||||
|
||||
## Begin
|
||||
|
||||
1. **Read the skill** at `.agents/skills/create-scratch/SKILL.md`
|
||||
2. **Create the scratch file** using the slug from `$ARGUMENTS` and appropriate content for notes or exploration
|
||||
Create a scratch file using the slug from `$ARGUMENTS` and appropriate content for notes or exploration.
|
||||
|
||||
@@ -0,0 +1,201 @@
|
||||
---
|
||||
description: Generate MDX documentation for a module or feature
|
||||
argument-hint: <module-path-or-feature>
|
||||
---
|
||||
|
||||
You are creating proper MDX documentation for a module or feature in Documenso using Nextra.
|
||||
|
||||
## Your Task
|
||||
|
||||
1. **Identify the scope** - What does `$ARGUMENTS` refer to? (file, directory, or feature name)
|
||||
2. **Read the source code** - Understand the public API, types, and behavior
|
||||
3. **Read existing docs** - Check if there's documentation to update or reference
|
||||
4. **Write comprehensive documentation** - Create or update MDX docs in the appropriate location
|
||||
5. **Update navigation** - Add entry to `_meta.js` if creating a new page
|
||||
|
||||
## Documentation Structure
|
||||
|
||||
Create documentation in the appropriate location:
|
||||
|
||||
- **Developer docs**: `apps/docs/`
|
||||
- **User docs**: `apps/docs/`
|
||||
|
||||
### File Format
|
||||
|
||||
All documentation files must be `.mdx` files with frontmatter:
|
||||
|
||||
```mdx
|
||||
---
|
||||
title: Page Title
|
||||
description: Brief description for SEO and meta tags
|
||||
---
|
||||
|
||||
# Page Title
|
||||
|
||||
Content starts here...
|
||||
```
|
||||
|
||||
### Navigation
|
||||
|
||||
Each directory should have a `_meta.js` file that defines the navigation structure:
|
||||
|
||||
```javascript
|
||||
export default {
|
||||
index: 'Introduction',
|
||||
'feature-name': 'Feature Name',
|
||||
'another-feature': 'Another Feature',
|
||||
};
|
||||
```
|
||||
|
||||
If creating a new page, add it to the appropriate `_meta.js` file.
|
||||
|
||||
### Documentation Format
|
||||
|
||||
````mdx
|
||||
---
|
||||
title: <Module|Feature Name>
|
||||
description: Brief description of what this does and when to use it
|
||||
---
|
||||
|
||||
# <Module|Feature Name>
|
||||
|
||||
Brief description of what this module/feature does and when to use it.
|
||||
|
||||
## Installation
|
||||
|
||||
If there are specific packages or imports needed:
|
||||
|
||||
```bash
|
||||
pnpm install @documenso/package-name
|
||||
```
|
||||
|
||||
## Quick Start
|
||||
|
||||
```jsx
|
||||
// Minimal working example
|
||||
import { Component } from '@documenso/package';
|
||||
|
||||
const Example = () => {
|
||||
return <Component />;
|
||||
};
|
||||
```
|
||||
|
||||
## API Reference
|
||||
|
||||
### Component/Function Name
|
||||
|
||||
Description of what it does.
|
||||
|
||||
#### Props/Parameters
|
||||
|
||||
| Prop/Param | Type | Description |
|
||||
| ---------- | -------------------- | ------------------------- |
|
||||
| prop | `string` | Description of the prop |
|
||||
| optional | `boolean` (optional) | Optional prop description |
|
||||
|
||||
#### Example
|
||||
|
||||
```jsx
|
||||
import { Component } from '@documenso/package';
|
||||
|
||||
<Component prop="value" optional={true} />;
|
||||
```
|
||||
|
||||
### Types
|
||||
|
||||
#### `TypeName`
|
||||
|
||||
```typescript
|
||||
type TypeName = {
|
||||
property: string;
|
||||
optional?: boolean;
|
||||
};
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
### Common Use Case
|
||||
|
||||
```jsx
|
||||
// Full working example
|
||||
```
|
||||
|
||||
### Advanced Usage
|
||||
|
||||
```jsx
|
||||
// More complex example
|
||||
```
|
||||
|
||||
## Related
|
||||
|
||||
- [Link to related documentation](/developers/path)
|
||||
- [Another related page](/users/path)
|
||||
````
|
||||
|
||||
## Guidelines
|
||||
|
||||
### Content Quality
|
||||
|
||||
- **Be accurate** - Verify behavior by reading the code
|
||||
- **Be complete** - Document all public API surface
|
||||
- **Be practical** - Include real, working examples
|
||||
- **Be concise** - Don't over-explain obvious things
|
||||
- **Be user-focused** - Write for the target audience (developers or users)
|
||||
|
||||
### Code Examples
|
||||
|
||||
- Use appropriate language tags: `jsx`, `tsx`, `typescript`, `bash`, `json`
|
||||
- Show imports when not obvious
|
||||
- Include expected output in comments where helpful
|
||||
- Progress from simple to complex
|
||||
- Use real examples from the codebase when possible
|
||||
|
||||
### Formatting
|
||||
|
||||
- Always include frontmatter with `title` and `description`
|
||||
- Use proper markdown headers (h1 for title, h2 for sections)
|
||||
- Use tables for props/parameters documentation (matching existing style)
|
||||
- Use code fences with appropriate language tags
|
||||
- Use Nextra components when appropriate:
|
||||
- `<Callout type="info">` for notes
|
||||
- `<Steps>` for step-by-step instructions
|
||||
- Use relative links for internal documentation (e.g., `/developers/embedding/react`)
|
||||
|
||||
### Nextra Components
|
||||
|
||||
You can import and use Nextra components:
|
||||
|
||||
```jsx
|
||||
import { Callout, Steps } from 'nextra/components';
|
||||
|
||||
<Callout type="info">
|
||||
This is an informational note.
|
||||
</Callout>
|
||||
|
||||
<Steps>
|
||||
<Steps.Step>First step</Steps.Step>
|
||||
<Steps.Step>Second step</Steps.Step>
|
||||
</Steps>
|
||||
```
|
||||
|
||||
### Maintenance
|
||||
|
||||
- Include types inline so docs don't get stale
|
||||
- Reference source file locations for complex behavior
|
||||
- Keep examples up-to-date with the codebase
|
||||
- Update `_meta.js` when adding new pages
|
||||
|
||||
## Process
|
||||
|
||||
1. **Explore the code** - Read source files to understand the API
|
||||
2. **Identify the audience** - Is this for developers or users?
|
||||
3. **Check existing docs** - Look for similar pages to match style
|
||||
4. **Draft the structure** - Outline sections before writing
|
||||
5. **Write content** - Fill in each section with frontmatter
|
||||
6. **Add examples** - Create working code samples
|
||||
7. **Update navigation** - Add to `_meta.js` if needed
|
||||
8. **Review** - Read through for clarity and accuracy
|
||||
|
||||
## Begin
|
||||
|
||||
Analyze `$ARGUMENTS`, read the relevant source code, check existing documentation patterns, and create comprehensive MDX documentation following the Documenso documentation style.
|
||||
@@ -55,9 +55,9 @@ You are implementing a specification from the `.agents/plans/` directory. Work a
|
||||
Work continuously through these steps:
|
||||
|
||||
1. **Implement** - Write the code for the current task
|
||||
2. **Typecheck** - Run `npm run typecheck -w @documenso/remix` to verify types
|
||||
3. **Lint** - Run `npm run lint:fix` to fix linting issues
|
||||
4. **Test** - If non-trivial, run E2E tests: `npm run test:dev -w @documenso/app-tests`
|
||||
2. **Typecheck** - Run `pnpm run typecheck -w @documenso/remix` to verify types
|
||||
3. **Lint** - Run `pnpm run lint:fix` to fix linting issues
|
||||
4. **Test** - If non-trivial, run E2E tests: `pnpm run test:dev -w @documenso/app-tests`
|
||||
5. **Fix** - If tests fail, fix and re-run
|
||||
6. **Repeat** - Move to next task
|
||||
|
||||
@@ -81,18 +81,18 @@ Work continuously through these steps:
|
||||
|
||||
```bash
|
||||
# Type checking
|
||||
npm run typecheck -w @documenso/remix
|
||||
pnpm run typecheck -w @documenso/remix
|
||||
|
||||
# Linting
|
||||
npm run lint:fix
|
||||
pnpm run lint:fix
|
||||
|
||||
# E2E Tests (only for non-trivial work)
|
||||
npm run test:dev -w @documenso/app-tests # Run E2E tests in dev mode
|
||||
npm run test-ui:dev -w @documenso/app-tests # Run E2E tests with UI
|
||||
npm run test:e2e # Run full E2E test suite
|
||||
pnpm run test:dev -w @documenso/app-tests # Run E2E tests in dev mode
|
||||
pnpm run test-ui:dev -w @documenso/app-tests # Run E2E tests with UI
|
||||
pnpm run test:e2e # Run full E2E test suite
|
||||
|
||||
# Development
|
||||
npm run dev # Start dev server
|
||||
pnpm run dev # Start dev server
|
||||
```
|
||||
|
||||
## Begin
|
||||
|
||||
+2
-2
@@ -21,13 +21,13 @@ I help you create new justification files in the `.agents/justifications/` direc
|
||||
Run the script with a slug and content:
|
||||
|
||||
```bash
|
||||
npx tsx scripts/create-justification.ts "decision-name" "Justification content here"
|
||||
pnpm exec tsx scripts/create-justification.ts "decision-name" "Justification content here"
|
||||
```
|
||||
|
||||
Or use heredoc for multi-line content:
|
||||
|
||||
```bash
|
||||
npx tsx scripts/create-justification.ts "decision-name" << HEREDOC
|
||||
pnpm exec tsx scripts/create-justification.ts "decision-name" << HEREDOC
|
||||
Multi-line
|
||||
justification content
|
||||
goes here
|
||||
@@ -21,13 +21,13 @@ I help you create new plan files in the `.agents/plans/` directory. Each plan fi
|
||||
Run the script with a slug and content:
|
||||
|
||||
```bash
|
||||
npx tsx scripts/create-plan.ts "feature-name" "Plan content here"
|
||||
pnpm exec tsx scripts/create-plan.ts "feature-name" "Plan content here"
|
||||
```
|
||||
|
||||
Or use heredoc for multi-line content:
|
||||
|
||||
```bash
|
||||
npx tsx scripts/create-plan.ts "feature-name" << HEREDOC
|
||||
pnpm exec tsx scripts/create-plan.ts "feature-name" << HEREDOC
|
||||
Multi-line
|
||||
plan content
|
||||
goes here
|
||||
@@ -21,13 +21,13 @@ I help you create new scratch files in the `.agents/scratches/` directory. Each
|
||||
Run the script with a slug and content:
|
||||
|
||||
```bash
|
||||
npx tsx scripts/create-scratch.ts "note-name" "Scratch content here"
|
||||
pnpm exec tsx scripts/create-scratch.ts "note-name" "Scratch content here"
|
||||
```
|
||||
|
||||
Or use heredoc for multi-line content:
|
||||
|
||||
```bash
|
||||
npx tsx scripts/create-scratch.ts "note-name" << HEREDOC
|
||||
pnpm exec tsx scripts/create-scratch.ts "note-name" << HEREDOC
|
||||
Multi-line
|
||||
scratch content
|
||||
goes here
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
../../.agents/skills/agent-browser
|
||||
@@ -2,16 +2,16 @@
|
||||
|
||||
## Build/Test/Lint Commands
|
||||
|
||||
- `npm run build` - Build all packages
|
||||
- `npm run lint` - Lint all packages
|
||||
- `npm run lint:fix` - Auto-fix linting issues
|
||||
- `npm run test:e2e` - Run E2E tests with Playwright
|
||||
- `npm run test:dev -w @documenso/app-tests` - Run single E2E test in dev mode
|
||||
- `npm run test-ui:dev -w @documenso/app-tests` - Run E2E tests with UI
|
||||
- `npm run format` - Format code with Prettier
|
||||
- `npm run dev` - Start development server for Remix app
|
||||
- `pnpm run build` - Build all packages
|
||||
- `pnpm run lint` - Lint all packages
|
||||
- `pnpm run lint:fix` - Auto-fix linting issues
|
||||
- `pnpm run test:e2e` - Run E2E tests with Playwright
|
||||
- `pnpm run test:dev -w @documenso/app-tests` - Run single E2E test in dev mode
|
||||
- `pnpm run test-ui:dev -w @documenso/app-tests` - Run E2E tests with UI
|
||||
- `pnpm run format` - Format code with Prettier
|
||||
- `pnpm run dev` - Start development server for Remix app
|
||||
|
||||
**Important:** Do not run `npm run build` to verify changes unless explicitly asked. Builds take a long time (~2 minutes). Use `npx tsc --noEmit` for type checking specific packages if needed.
|
||||
**Important:** Do not run `pnpm run build` to verify changes unless explicitly asked. Builds take a long time (~2 minutes). Use `pnpm exec tsc --noEmit` for type checking specific packages if needed.
|
||||
|
||||
## Code Style Guidelines
|
||||
|
||||
|
||||
+6
-6
@@ -4,7 +4,7 @@ This document provides a high-level overview of the Documenso codebase to help h
|
||||
|
||||
## Overview
|
||||
|
||||
Documenso is an open-source document signing platform built as a **monorepo** using npm workspaces and Turborepo. The application enables users to create, send, and sign documents electronically.
|
||||
Documenso is an open-source document signing platform built as a **monorepo** using pnpm workspaces and Turborepo. The application enables users to create, send, and sign documents electronically.
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
@@ -324,19 +324,19 @@ documenso/
|
||||
|
||||
```bash
|
||||
# Full setup (install, docker, migrate, seed, dev)
|
||||
npm run d
|
||||
pnpm run d
|
||||
|
||||
# Start development server
|
||||
npm run dev
|
||||
pnpm run dev
|
||||
|
||||
# Database GUI
|
||||
npm run prisma:studio
|
||||
pnpm run prisma:studio
|
||||
|
||||
# Type checking (faster than build)
|
||||
npx tsc --noEmit
|
||||
pnpm exec tsc --noEmit
|
||||
|
||||
# E2E tests
|
||||
npm run test:e2e
|
||||
pnpm run test:e2e
|
||||
```
|
||||
|
||||
### Docker Services (Development)
|
||||
|
||||
+1
-1
@@ -50,7 +50,7 @@ The development branch is <code>main</code>. All pull requests should be made ag
|
||||
You can build the project with:
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
pnpm run build
|
||||
```
|
||||
|
||||
## AI-Assisted Development with OpenCode
|
||||
|
||||
@@ -119,16 +119,15 @@ git clone https://github.com/<your-username>/documenso
|
||||
|
||||
2. Set up your `.env` file using the recommendations in the `.env.example` file. Alternatively, just run `cp .env.example .env` to get started with our handpicked defaults.
|
||||
|
||||
3. Run `npm run dx` in the root directory
|
||||
|
||||
3. Run `pnpm run dx` in the root directory
|
||||
- This will spin up a postgres database and inbucket mailserver in a docker container.
|
||||
|
||||
4. Run `npm run dev` in the root directory
|
||||
4. Run `pnpm run dev` in the root directory
|
||||
|
||||
5. Want it even faster? Just use
|
||||
|
||||
```sh
|
||||
npm run d
|
||||
pnpm run d
|
||||
```
|
||||
|
||||
#### Access Points for Your Application
|
||||
@@ -136,7 +135,6 @@ 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.
|
||||
|
||||
@@ -156,12 +154,11 @@ After forking the repository, clone it to your local device by using the followi
|
||||
git clone https://github.com/<your-username>/documenso
|
||||
```
|
||||
|
||||
2. Run `npm i` in the root directory
|
||||
2. Run `pnpm install` in the root directory
|
||||
|
||||
3. Create your `.env` from the `.env.example`. You can use `cp .env.example .env` to get started with our handpicked defaults.
|
||||
|
||||
4. Set the following environment variables:
|
||||
|
||||
- NEXTAUTH_SECRET
|
||||
- NEXT_PUBLIC_WEBAPP_URL
|
||||
- NEXT_PRIVATE_DATABASE_URL
|
||||
@@ -169,17 +166,17 @@ git clone https://github.com/<your-username>/documenso
|
||||
- NEXT_PRIVATE_SMTP_FROM_NAME
|
||||
- NEXT_PRIVATE_SMTP_FROM_ADDRESS
|
||||
|
||||
5. Create the database schema by running `npm run prisma:migrate-dev`
|
||||
5. Create the database schema by running `pnpm run prisma:migrate-dev`
|
||||
|
||||
6. Run `npm run translate:compile` in the root directory to compile lingui
|
||||
6. Run `pnpm run translate:compile` in the root directory to compile lingui
|
||||
|
||||
7. Run `npm run dev` in the root directory to start
|
||||
7. Run `pnpm run dev` in the root directory to start
|
||||
|
||||
8. Register a new user at http://localhost:3000/signup
|
||||
|
||||
---
|
||||
|
||||
- Optional: Seed the database using `npm run prisma:seed -w @documenso/prisma` to create a test user and document.
|
||||
- Optional: Seed the database using `pnpm run prisma:seed -w @documenso/prisma` to create a test user and document.
|
||||
- Optional: Create your own signing certificate.
|
||||
- To generate your own using these steps and a Linux Terminal or Windows Subsystem for Linux (WSL), see **[Create your own signing certificate](./SIGNING.md)**.
|
||||
|
||||
@@ -244,16 +241,16 @@ The following environment variables must be set:
|
||||
Now you can install the dependencies and build it:
|
||||
|
||||
```
|
||||
npm i
|
||||
npm run build
|
||||
npm run prisma:migrate-deploy
|
||||
pnpm install
|
||||
pnpm run build
|
||||
pnpm run prisma:migrate-deploy
|
||||
```
|
||||
|
||||
Finally, you can start it with:
|
||||
|
||||
```
|
||||
cd apps/remix
|
||||
npm run start
|
||||
pnpm run start
|
||||
```
|
||||
|
||||
This will start the server on `localhost:3000`. For now, any reverse proxy can then do the frontend and SSL termination.
|
||||
@@ -313,7 +310,7 @@ If you are deploying to a cluster that uses only IPv6, You can use a custom comm
|
||||
For local docker run
|
||||
|
||||
```bash
|
||||
docker run -it documenso:latest npm run start -- -H ::
|
||||
docker run -it documenso:latest pnpm run start -- -H ::
|
||||
```
|
||||
|
||||
For k8s or docker-compose
|
||||
@@ -324,7 +321,7 @@ containers:
|
||||
image: documenso:latest
|
||||
imagePullPolicy: IfNotPresent
|
||||
command:
|
||||
- npm
|
||||
- pnpm
|
||||
args:
|
||||
- run
|
||||
- start
|
||||
@@ -338,13 +335,13 @@ containers:
|
||||
Wrap your package script with the `with:env` script like such:
|
||||
|
||||
```
|
||||
npm run with:env -- npm run myscript
|
||||
pnpm run with:env pnpm run myscript
|
||||
```
|
||||
|
||||
The same can be done when using `npx` for one of the bin scripts:
|
||||
The same can be done when using `pnpm exec` for one of the bin scripts:
|
||||
|
||||
```
|
||||
npm run with:env -- npx myscript
|
||||
pnpm run with:env pnpm exec myscript
|
||||
```
|
||||
|
||||
This will load environment variables from your `.env` and `.env.local` files.
|
||||
|
||||
+15
-8
@@ -1,11 +1,11 @@
|
||||
---
|
||||
title: V1 Authoring
|
||||
description: Embed V1 document and template creation directly in your application.
|
||||
title: Authoring
|
||||
description: Embed document and template creation directly in your application.
|
||||
---
|
||||
|
||||
import { Callout } from 'fumadocs-ui/components/callout';
|
||||
|
||||
V1 authoring components allow your users to create and edit documents and templates using the V1 Documents and Templates API without leaving your application.
|
||||
In addition to embedding signing, Documenso supports embedded authoring. It allows your users to create and edit documents and templates without leaving your application.
|
||||
|
||||
<Callout type="warn">
|
||||
Embedded authoring is included with [Enterprise](https://documen.so/enterprise-cta) plans. It is
|
||||
@@ -15,7 +15,7 @@ V1 authoring components allow your users to create and edit documents and templa
|
||||
|
||||
## Components
|
||||
|
||||
The SDK provides four V1 authoring components:
|
||||
The SDK provides four authoring components:
|
||||
|
||||
| Component | Purpose |
|
||||
| ----------------------- | ----------------------- |
|
||||
@@ -24,16 +24,24 @@ The SDK provides four V1 authoring components:
|
||||
| `EmbedUpdateDocumentV1` | Edit existing documents |
|
||||
| `EmbedUpdateTemplateV1` | Edit existing templates |
|
||||
|
||||
All authoring components require a **presign token** for authentication instead of a regular token.
|
||||
|
||||
---
|
||||
|
||||
## Presign Tokens
|
||||
|
||||
All authoring components require a **presign token** for authentication. See the [Authoring overview](/docs/developers/embedding/authoring) for details on obtaining presign tokens.
|
||||
Before using any authoring component, obtain a presign token from your backend:
|
||||
|
||||
```
|
||||
POST /api/v2/embedding/create-presign-token
|
||||
```
|
||||
|
||||
This endpoint requires your Documenso API key. The token has a default expiration of 1 hour.
|
||||
|
||||
See the [API documentation](https://openapi.documenso.com/reference#tag/embedding) for full details.
|
||||
|
||||
<Callout type="warn">
|
||||
A presigned token is NOT an API token
|
||||
Presign tokens should be created server-side. Never expose your API key in client-side code.
|
||||
</Callout>
|
||||
|
||||
---
|
||||
@@ -139,7 +147,7 @@ const TemplateEditor = ({ presignToken, templateId }) => {
|
||||
| `externalId` | `string` | No | Your reference ID to link with the document or template |
|
||||
| `host` | `string` | No | Custom host URL. Defaults to `https://app.documenso.com` |
|
||||
| `css` | `string` | No | Custom CSS string (Platform Plan) |
|
||||
| `cssVars` | `object` | No | [CSS variable](/docs/developers/embedding/css-variables) overrides (Platform Plan) |
|
||||
| `cssVars` | `object` | No | CSS variable overrides (Platform Plan) |
|
||||
| `darkModeDisabled` | `boolean` | No | Disable dark mode (Platform Plan) |
|
||||
| `className` | `string` | No | CSS class for the iframe |
|
||||
| `features` | `object` | No | Feature toggles for the authoring experience |
|
||||
@@ -293,7 +301,6 @@ Pass extra props to the iframe for testing experimental features:
|
||||
## See Also
|
||||
|
||||
- [Embedding Overview](/docs/developers/embedding) - Signing embed concepts and props
|
||||
- [V2 Authoring](/docs/developers/embedding/authoring/v2) - V2 envelope authoring
|
||||
- [CSS Variables](/docs/developers/embedding/css-variables) - Customize appearance
|
||||
- [Documents API](/docs/developers/api/documents) - Create documents via API
|
||||
- [Templates API](/docs/developers/api/templates) - Create templates via API
|
||||
@@ -1,56 +0,0 @@
|
||||
---
|
||||
title: Authoring
|
||||
description: Embed document, template, and envelope creation directly in your application.
|
||||
---
|
||||
|
||||
import { Callout } from 'fumadocs-ui/components/callout';
|
||||
|
||||
In addition to embedding signing, Documenso supports embedded authoring. It allows your users to create and edit documents, templates, and envelopes without leaving your application.
|
||||
|
||||
<Callout type="warn">
|
||||
Embedded authoring is included with [Enterprise](https://documen.so/enterprise-cta) plans. It is
|
||||
also available as a paid add-on for the [Platform Plan](https://documen.so/platform-cta-pricing).
|
||||
Contact sales for access.
|
||||
</Callout>
|
||||
|
||||
## Versions
|
||||
|
||||
Embedded authoring is available in two versions:
|
||||
|
||||
- **[V1 Authoring](/docs/developers/embedding/authoring/v1)** — Works with V1 Documents and Templates.
|
||||
- **[V2 Authoring](/docs/developers/embedding/authoring/v2)** — Works with Envelopes, which are the unified model for documents and templates.
|
||||
|
||||
### Comparison
|
||||
|
||||
| Aspect | V1 | V2 |
|
||||
| --- | --- | --- |
|
||||
| Entity model | Documents and Templates (separate) | Envelopes (unified, can be documents or templates) |
|
||||
| API compatibility | V1 Documents/Templates API | V2 Envelopes API |
|
||||
| Customization | 6 simple boolean flags | Rich structured settings with sections (general, settings, actions, envelope items, recipients) |
|
||||
|
||||
---
|
||||
|
||||
## Presign Tokens
|
||||
|
||||
Before using any authoring component, obtain a presign token from your backend:
|
||||
|
||||
```
|
||||
POST /api/v2/embedding/create-presign-token
|
||||
```
|
||||
|
||||
This endpoint requires your Documenso API key. The token has a default expiration of 1 hour.
|
||||
|
||||
See the [API documentation](https://openapi.documenso.com/reference#tag/embedding) for full details.
|
||||
|
||||
<Callout type="warn">
|
||||
Presign tokens should be created server-side. Never expose your API key in client-side code.
|
||||
</Callout>
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
- [V1 Authoring](/docs/developers/embedding/authoring/v1) — Create and edit documents and templates using V1 components
|
||||
- [V2 Authoring](/docs/developers/embedding/authoring/v2) — Create and edit envelopes using V2 components
|
||||
- [CSS Variables](/docs/developers/embedding/css-variables) — Customize the appearance of embedded components
|
||||
- [SDKs](/docs/developers/embedding/sdks) — Framework-specific SDK documentation
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"title": "Authoring",
|
||||
"pages": ["v1", "v2"]
|
||||
}
|
||||
@@ -1,340 +0,0 @@
|
||||
---
|
||||
title: V2 Authoring
|
||||
description: Embed envelope creation and editing directly in your application.
|
||||
---
|
||||
|
||||
import { Callout } from 'fumadocs-ui/components/callout';
|
||||
|
||||
V2 authoring components allow your users to create and edit envelopes without leaving your application. Envelopes are the unified model for documents and templates in the V2 API.
|
||||
|
||||
<Callout type="warn">
|
||||
Embedded authoring is included with [Enterprise](https://documen.so/enterprise-cta) plans. It is
|
||||
also available as a paid add-on for the [Platform Plan](https://documen.so/platform-cta-pricing).
|
||||
Contact sales for access.
|
||||
</Callout>
|
||||
|
||||
## Components
|
||||
|
||||
The SDK provides two V2 authoring components:
|
||||
|
||||
| Component | Purpose |
|
||||
| ---------------------- | ------------------------ |
|
||||
| `EmbedCreateEnvelope` | Create new envelopes |
|
||||
| `EmbedUpdateEnvelope` | Edit existing envelopes |
|
||||
|
||||
---
|
||||
|
||||
## Presign Tokens
|
||||
|
||||
All authoring components require a **presign token** for authentication. See the [Authoring overview](/docs/developers/embedding/authoring) for details on obtaining presign tokens.
|
||||
|
||||
<Callout type="warn">
|
||||
A presigned token is NOT an API token
|
||||
</Callout>
|
||||
|
||||
---
|
||||
|
||||
## Creating Envelopes
|
||||
|
||||
Use `EmbedCreateEnvelope` to embed envelope creation. The `type` prop determines whether the envelope is created as a document or template.
|
||||
|
||||
```jsx
|
||||
import { EmbedCreateEnvelope } from '@documenso/embed-react';
|
||||
|
||||
const EnvelopeCreator = ({ presignToken }) => {
|
||||
return (
|
||||
<div style={{ height: '800px', width: '100%' }}>
|
||||
<EmbedCreateEnvelope
|
||||
presignToken={presignToken}
|
||||
type="DOCUMENT"
|
||||
externalId="order-12345"
|
||||
onEnvelopeCreated={(data) => {
|
||||
console.log('Envelope created:', data.envelopeId);
|
||||
console.log('External ID:', data.externalId);
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
To create a template instead of a document, set `type` to `"TEMPLATE"`:
|
||||
|
||||
```jsx
|
||||
<EmbedCreateEnvelope
|
||||
presignToken={presignToken}
|
||||
type="TEMPLATE"
|
||||
externalId="template-12345"
|
||||
onEnvelopeCreated={(data) => {
|
||||
console.log('Template envelope created:', data.envelopeId);
|
||||
}}
|
||||
/>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Editing Envelopes
|
||||
|
||||
Use `EmbedUpdateEnvelope` to embed envelope editing:
|
||||
|
||||
```jsx
|
||||
import { EmbedUpdateEnvelope } from '@documenso/embed-react';
|
||||
|
||||
const EnvelopeEditor = ({ presignToken, envelopeId }) => {
|
||||
return (
|
||||
<div style={{ height: '800px', width: '100%' }}>
|
||||
<EmbedUpdateEnvelope
|
||||
presignToken={presignToken}
|
||||
envelopeId={envelopeId}
|
||||
externalId="order-12345"
|
||||
onEnvelopeUpdated={(data) => {
|
||||
console.log('Envelope updated:', data.envelopeId);
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Props
|
||||
|
||||
### All V2 Authoring Components
|
||||
|
||||
| Prop | Type | Required | Description |
|
||||
| ------------------ | --------- | -------- | -------------------------------------------------------- |
|
||||
| `presignToken` | `string` | Yes | Authentication token from your backend |
|
||||
| `externalId` | `string` | No | Your reference ID to link with the envelope |
|
||||
| `host` | `string` | No | Custom host URL. Defaults to `https://app.documenso.com` |
|
||||
| `css` | `string` | No | Custom CSS string (Platform Plan) |
|
||||
| `cssVars` | `object` | No | [CSS variable](/docs/developers/embedding/css-variables) overrides (Platform Plan) |
|
||||
| `darkModeDisabled` | `boolean` | No | Disable dark mode (Platform Plan) |
|
||||
| `className` | `string` | No | CSS class for the iframe |
|
||||
| `features` | `object` | No | Feature toggles for the authoring experience |
|
||||
|
||||
### Create Component Only
|
||||
|
||||
| Prop | Type | Required | Description |
|
||||
| ------ | ------------------------------ | -------- | --------------------------------------------------- |
|
||||
| `type` | `"DOCUMENT"` \| `"TEMPLATE"` | Yes | Whether to create a document or template envelope |
|
||||
|
||||
### Update Component Only
|
||||
|
||||
| Prop | Type | Required | Description |
|
||||
| ------------ | -------- | -------- | ---------------------------- |
|
||||
| `envelopeId` | `string` | Yes | The envelope ID to edit |
|
||||
|
||||
---
|
||||
|
||||
## Feature Toggles
|
||||
|
||||
V2 authoring provides rich, structured feature toggles organized into sections. Pass a partial configuration to customize the authoring experience — any omitted fields will use their defaults.
|
||||
|
||||
```jsx
|
||||
<EmbedCreateEnvelope
|
||||
presignToken={presignToken}
|
||||
type="DOCUMENT"
|
||||
features={{
|
||||
general: {
|
||||
allowConfigureEnvelopeTitle: false,
|
||||
allowUploadAndRecipientStep: false,
|
||||
allowAddFieldsStep: false,
|
||||
allowPreviewStep: false,
|
||||
},
|
||||
settings: {
|
||||
allowConfigureSignatureTypes: false,
|
||||
allowConfigureLanguage: false,
|
||||
allowConfigureDateFormat: false,
|
||||
},
|
||||
recipients: {
|
||||
allowApproverRole: false,
|
||||
allowViewerRole: false,
|
||||
},
|
||||
}}
|
||||
/>
|
||||
```
|
||||
|
||||
### General
|
||||
|
||||
Controls the overall authoring flow and UI:
|
||||
|
||||
| Property | Type | Default | Description |
|
||||
| ------------------------------- | --------- | ------- | ------------------------------------------------ |
|
||||
| `allowConfigureEnvelopeTitle` | `boolean` | `true` | Allow editing the envelope title |
|
||||
| `allowUploadAndRecipientStep` | `boolean` | `true` | Show the upload and recipient configuration step |
|
||||
| `allowAddFieldsStep` | `boolean` | `true` | Show the add fields step |
|
||||
| `allowPreviewStep` | `boolean` | `true` | Show the preview step |
|
||||
| `minimizeLeftSidebar` | `boolean` | `true` | Minimize the left sidebar by default |
|
||||
|
||||
### Settings
|
||||
|
||||
Controls envelope configuration options. Set to `null` to hide envelope settings entirely.
|
||||
|
||||
| Property | Type | Default | Description |
|
||||
| ----------------------------------- | --------- | ------- | ----------------------------------------- |
|
||||
| `allowConfigureSignatureTypes` | `boolean` | `true` | Allow configuring signature types |
|
||||
| `allowConfigureLanguage` | `boolean` | `true` | Allow configuring the language |
|
||||
| `allowConfigureDateFormat` | `boolean` | `true` | Allow configuring the date format |
|
||||
| `allowConfigureTimezone` | `boolean` | `true` | Allow configuring the timezone |
|
||||
| `allowConfigureRedirectUrl` | `boolean` | `true` | Allow configuring a redirect URL |
|
||||
| `allowConfigureDistribution` | `boolean` | `true` | Allow configuring distribution settings |
|
||||
| `allowConfigureExpirationPeriod` | `boolean` | `true` | Allow configuring the expiration period |
|
||||
| `allowConfigureEmailSender` | `boolean` | `true` | Allow configuring the email sender |
|
||||
| `allowConfigureEmailReplyTo` | `boolean` | `true` | Allow configuring the email reply-to |
|
||||
|
||||
### Actions
|
||||
|
||||
Controls available actions during authoring:
|
||||
|
||||
| Property | Type | Default | Description |
|
||||
| ------------------ | --------- | ------- | ------------------------ |
|
||||
| `allowAttachments` | `boolean` | `true` | Allow adding attachments |
|
||||
|
||||
### Envelope Items
|
||||
|
||||
Controls how envelope items (individual files within the envelope) can be managed. Set to `null` to prevent any item modifications.
|
||||
|
||||
| Property | Type | Default | Description |
|
||||
| --------------------- | --------- | ------- | ------------------------------------ |
|
||||
| `allowConfigureTitle` | `boolean` | `true` | Allow editing item titles |
|
||||
| `allowConfigureOrder` | `boolean` | `true` | Allow reordering items |
|
||||
| `allowUpload` | `boolean` | `true` | Allow uploading new items |
|
||||
| `allowDelete` | `boolean` | `true` | Allow deleting items |
|
||||
|
||||
### Recipients
|
||||
|
||||
Controls recipient configuration options. Set to `null` to prevent any recipient modifications.
|
||||
|
||||
| Property | Type | Default | Description |
|
||||
| --------------------------------- | --------- | ------- | ---------------------------------------- |
|
||||
| `allowConfigureSigningOrder` | `boolean` | `true` | Allow configuring the signing order |
|
||||
| `allowConfigureDictateNextSigner` | `boolean` | `true` | Allow configuring dictate next signer |
|
||||
| `allowApproverRole` | `boolean` | `true` | Allow the approver recipient role |
|
||||
| `allowViewerRole` | `boolean` | `true` | Allow the viewer recipient role |
|
||||
| `allowCCerRole` | `boolean` | `true` | Allow the CC recipient role |
|
||||
| `allowAssistantRole` | `boolean` | `true` | Allow the assistant recipient role |
|
||||
|
||||
### Disabling Steps
|
||||
|
||||
You can also disable entire steps of the authoring flow. This allows you to skip steps that are not relevant to your use case:
|
||||
|
||||
```jsx
|
||||
<EmbedCreateEnvelope
|
||||
presignToken={presignToken}
|
||||
type="DOCUMENT"
|
||||
features={{
|
||||
general: {
|
||||
allowUploadAndRecipientStep: false, // Skip the upload and recipient step
|
||||
allowAddFieldsStep: false, // Skip the add fields step
|
||||
allowPreviewStep: false, // Skip the preview step
|
||||
},
|
||||
settings: null, // Hide all envelope settings
|
||||
envelopeItems: null, // Prevent item modifications
|
||||
recipients: null, // Prevent recipient modifications
|
||||
}}
|
||||
/>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Event Callbacks
|
||||
|
||||
### `onEnvelopeCreated`
|
||||
|
||||
Fired when an envelope is successfully created:
|
||||
|
||||
| Field | Type | Description |
|
||||
| ------------ | ---------------- | --------------------------------------- |
|
||||
| `envelopeId` | `string` | The ID of the created envelope |
|
||||
| `externalId` | `string \| null` | Your external reference ID, if provided |
|
||||
|
||||
### `onEnvelopeUpdated`
|
||||
|
||||
Fired when an envelope is successfully updated:
|
||||
|
||||
| Field | Type | Description |
|
||||
| ------------ | ---------------- | --------------------------------------- |
|
||||
| `envelopeId` | `string` | The ID of the updated envelope |
|
||||
| `externalId` | `string \| null` | Your external reference ID, if provided |
|
||||
|
||||
---
|
||||
|
||||
## Complete Integration Example
|
||||
|
||||
This example shows a full workflow where users create an envelope and then edit it:
|
||||
|
||||
```tsx
|
||||
import { useState } from 'react';
|
||||
|
||||
import { EmbedCreateEnvelope, EmbedUpdateEnvelope } from '@documenso/embed-react';
|
||||
|
||||
const EnvelopeManager = ({ presignToken }) => {
|
||||
const [envelopeId, setEnvelopeId] = useState(null);
|
||||
const [mode, setMode] = useState('create');
|
||||
|
||||
if (mode === 'success') {
|
||||
return (
|
||||
<div>
|
||||
<h2>Envelope updated successfully</h2>
|
||||
<button
|
||||
onClick={() => {
|
||||
setEnvelopeId(null);
|
||||
setMode('create');
|
||||
}}
|
||||
>
|
||||
Create Another Envelope
|
||||
</button>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
if (mode === 'edit' && envelopeId) {
|
||||
return (
|
||||
<div style={{ height: '800px', width: '100%' }}>
|
||||
<button onClick={() => setMode('create')}>Back to Create</button>
|
||||
<EmbedUpdateEnvelope
|
||||
presignToken={presignToken}
|
||||
envelopeId={envelopeId}
|
||||
onEnvelopeUpdated={(data) => {
|
||||
console.log('Envelope updated:', data.envelopeId);
|
||||
setMode('success');
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div style={{ height: '800px', width: '100%' }}>
|
||||
<EmbedCreateEnvelope
|
||||
presignToken={presignToken}
|
||||
type="DOCUMENT"
|
||||
features={{
|
||||
general: {
|
||||
allowConfigureEnvelopeTitle: false,
|
||||
},
|
||||
settings: {
|
||||
allowConfigureSignatureTypes: false,
|
||||
allowConfigureLanguage: false,
|
||||
},
|
||||
}}
|
||||
onEnvelopeCreated={(data) => {
|
||||
console.log('Envelope created:', data.envelopeId);
|
||||
setEnvelopeId(data.envelopeId);
|
||||
setMode('edit');
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## See Also
|
||||
|
||||
- [Authoring Overview](/docs/developers/embedding/authoring) - V1 vs V2 comparison and presign tokens
|
||||
- [V1 Authoring](/docs/developers/embedding/authoring/v1) - V1 document and template authoring
|
||||
- [Embedding Overview](/docs/developers/embedding) - Signing embed concepts and props
|
||||
- [CSS Variables](/docs/developers/embedding/css-variables) - Customize appearance
|
||||
@@ -59,7 +59,6 @@ Use the `cssVars` prop on any embed component to override default colors, spacin
|
||||
| `destructiveForeground` | Destructive/danger text color |
|
||||
| `ring` | Focus ring color |
|
||||
| `warning` | Warning/alert color |
|
||||
| `envelopeEditorBackground` | Envelope editor background color. _V2 Envelope Editor only._ |
|
||||
|
||||
### Spacing
|
||||
|
||||
|
||||
@@ -271,8 +271,6 @@ Documenso uses a PostgreSQL-based job queue by default. Jobs (email delivery, do
|
||||
| ----------------------------- | -------------------------------------------- | ------- |
|
||||
| `DOCUMENSO_DISABLE_TELEMETRY` | Set to `true` to disable anonymous telemetry | `false` |
|
||||
|
||||
Telemetry also auto-disables when `NEXT_PRIVATE_DOCUMENSO_LICENSE_KEY` is configured.
|
||||
|
||||
Telemetry collects only: app version, installation ID, and node ID. No personal data is collected.
|
||||
|
||||
---
|
||||
|
||||
+11
-11
@@ -10,27 +10,27 @@
|
||||
"postinstall": "fumadocs-mdx"
|
||||
},
|
||||
"dependencies": {
|
||||
"@radix-ui/react-tabs": "^1.1.13",
|
||||
"@radix-ui/react-tabs": "catalog:",
|
||||
"fumadocs-core": "16.5.0",
|
||||
"fumadocs-mdx": "14.2.6",
|
||||
"fumadocs-ui": "16.5.0",
|
||||
"lucide-react": "^0.563.0",
|
||||
"mermaid": "^11.12.2",
|
||||
"next": "16.1.6",
|
||||
"lucide-react": "catalog:",
|
||||
"mermaid": "^11.12.3",
|
||||
"next": "catalog:",
|
||||
"next-plausible": "^3.12.5",
|
||||
"next-themes": "^0.4.6",
|
||||
"react": "^19.2.4",
|
||||
"react-dom": "^19.2.4",
|
||||
"react": "catalog:",
|
||||
"react-dom": "catalog:",
|
||||
"tailwind-merge": "^3.4.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tailwindcss/postcss": "^4.1.18",
|
||||
"@types/mdx": "^2.0.13",
|
||||
"@types/node": "^25.1.0",
|
||||
"@types/react": "^19.2.10",
|
||||
"@types/react-dom": "^19.2.3",
|
||||
"postcss": "^8.5.6",
|
||||
"@types/node": "catalog:",
|
||||
"@types/react": "catalog:",
|
||||
"@types/react-dom": "catalog:",
|
||||
"postcss": "catalog:",
|
||||
"tailwindcss": "^4.1.18",
|
||||
"typescript": "^5.9.3"
|
||||
"typescript": "catalog:"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,13 +6,19 @@
|
||||
"dev": "next dev -p 3003",
|
||||
"build": "next build",
|
||||
"start": "next start -p 3003",
|
||||
"lint:fix": "next lint --fix",
|
||||
"lint:fix": "eslint . --fix",
|
||||
"clean": "rimraf .next && rimraf node_modules"
|
||||
},
|
||||
"dependencies": {
|
||||
"@documenso/prisma": "*",
|
||||
"luxon": "^3.7.2",
|
||||
"next": "15.5.12"
|
||||
"@documenso/prisma": "workspace:*",
|
||||
"luxon": "catalog:",
|
||||
"next": "catalog:",
|
||||
"react": "catalog:",
|
||||
"react-dom": "catalog:"
|
||||
},
|
||||
"devDependencies": {}
|
||||
"devDependencies": {
|
||||
"@types/node": "catalog:",
|
||||
"@types/react": "catalog:",
|
||||
"typescript": "catalog:"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "ES2017",
|
||||
"lib": ["dom", "dom.iterable", "esnext"],
|
||||
"lib": [
|
||||
"dom",
|
||||
"dom.iterable",
|
||||
"esnext"
|
||||
],
|
||||
"allowJs": true,
|
||||
"skipLibCheck": true,
|
||||
"strict": true,
|
||||
@@ -11,7 +15,7 @@
|
||||
"moduleResolution": "bundler",
|
||||
"resolveJsonModule": true,
|
||||
"isolatedModules": true,
|
||||
"jsx": "preserve",
|
||||
"jsx": "react-jsx",
|
||||
"incremental": true,
|
||||
"plugins": [
|
||||
{
|
||||
@@ -19,9 +23,19 @@
|
||||
}
|
||||
],
|
||||
"paths": {
|
||||
"@/*": ["./*"]
|
||||
"@/*": [
|
||||
"./*"
|
||||
]
|
||||
}
|
||||
},
|
||||
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
||||
"exclude": ["node_modules"]
|
||||
"include": [
|
||||
"next-env.d.ts",
|
||||
"**/*.ts",
|
||||
"**/*.tsx",
|
||||
".next/types/**/*.ts",
|
||||
".next/dev/types/**/*.ts"
|
||||
],
|
||||
"exclude": [
|
||||
"node_modules"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -17,25 +17,21 @@ cd "$WEB_APP_DIR"
|
||||
start_time=$(date +%s)
|
||||
|
||||
echo "[Build]: Extracting and compiling translations"
|
||||
npm run translate --prefix ../../
|
||||
|
||||
echo "[Build]: Typechecking app"
|
||||
npm run typecheck
|
||||
pnpm run --filter @documenso/root translate
|
||||
|
||||
echo "[Build]: Building app"
|
||||
npm run build:app
|
||||
pnpm run build:app
|
||||
|
||||
echo "[Build]: Building server"
|
||||
npm run build:server
|
||||
pnpm run build:server
|
||||
|
||||
# Copy over the entry point for the server.
|
||||
cp server/main.js build/server/main.js
|
||||
|
||||
# Copy over all web.js translations.
|
||||
# Rolldown preserveModules mirrors the source tree under build/server/hono/.
|
||||
# Copy over all web.js translations
|
||||
cp -r ../../packages/lib/translations build/server/hono/packages/lib/translations
|
||||
|
||||
# Time taken
|
||||
end_time=$(date +%s)
|
||||
|
||||
echo "[Build]: Done in $((end_time - start_time)) seconds"
|
||||
echo "[Build]: Done in $((end_time - start_time)) seconds"
|
||||
@@ -1,26 +0,0 @@
|
||||
FROM node:20-alpine AS dependencies-env
|
||||
RUN npm i -g pnpm
|
||||
COPY . /app
|
||||
|
||||
FROM dependencies-env AS development-dependencies-env
|
||||
COPY ./package.json pnpm-lock.yaml /app/
|
||||
WORKDIR /app
|
||||
RUN pnpm i --frozen-lockfile
|
||||
|
||||
FROM dependencies-env AS production-dependencies-env
|
||||
COPY ./package.json pnpm-lock.yaml /app/
|
||||
WORKDIR /app
|
||||
RUN pnpm i --prod --frozen-lockfile
|
||||
|
||||
FROM dependencies-env AS build-env
|
||||
COPY ./package.json pnpm-lock.yaml /app/
|
||||
COPY --from=development-dependencies-env /app/node_modules /app/node_modules
|
||||
WORKDIR /app
|
||||
RUN pnpm build
|
||||
|
||||
FROM dependencies-env
|
||||
COPY ./package.json pnpm-lock.yaml /app/
|
||||
COPY --from=production-dependencies-env /app/node_modules /app/node_modules
|
||||
COPY --from=build-env /app/build /app/build
|
||||
WORKDIR /app
|
||||
CMD ["pnpm", "start"]
|
||||
@@ -29,7 +29,7 @@ import { Sheet, SheetContent, SheetTrigger } from '@documenso/ui/primitives/shee
|
||||
import { useToast } from '@documenso/ui/primitives/use-toast';
|
||||
|
||||
import { FieldAdvancedSettingsDrawer } from '~/components/embed/authoring/field-advanced-settings-drawer';
|
||||
import PDFViewerLazy from '~/components/general/pdf-viewer/pdf-viewer-lazy';
|
||||
import { PDFViewer } from '~/components/general/pdf-viewer/pdf-viewer';
|
||||
|
||||
import type { TConfigureEmbedFormSchema } from './configure-document-view.types';
|
||||
import type { TConfigureFieldsFormSchema } from './configure-fields-view.types';
|
||||
@@ -549,7 +549,7 @@ export const ConfigureFieldsView = ({
|
||||
<Form {...form}>
|
||||
<div>
|
||||
{normalizedDocumentData && (
|
||||
<PDFViewerLazy data={normalizedDocumentData} scrollParentRef="window" />
|
||||
<PDFViewer data={normalizedDocumentData} scrollParentRef="window" />
|
||||
)}
|
||||
|
||||
<ElementVisible target={PDF_VIEWER_PAGE_SELECTOR}>
|
||||
|
||||
@@ -41,7 +41,7 @@ import { SignaturePadDialog } from '@documenso/ui/primitives/signature-pad/signa
|
||||
import { useToast } from '@documenso/ui/primitives/use-toast';
|
||||
|
||||
import { BrandingLogo } from '~/components/general/branding-logo';
|
||||
import PDFViewerLazy from '~/components/general/pdf-viewer/pdf-viewer-lazy';
|
||||
import { PDFViewer } from '~/components/general/pdf-viewer/pdf-viewer';
|
||||
import { injectCss } from '~/utils/css-vars';
|
||||
|
||||
import type { DirectTemplateLocalField } from '../general/direct-template/direct-template-signing-form';
|
||||
@@ -340,7 +340,7 @@ export const EmbedDirectTemplateClientPage = ({
|
||||
<div className="relative flex w-full flex-col gap-x-6 gap-y-12 md:flex-row">
|
||||
{/* Viewer */}
|
||||
<div className="flex-1">
|
||||
<PDFViewerLazy
|
||||
<PDFViewer
|
||||
data={getDocumentDataUrlForPdfViewer({
|
||||
envelopeId: envelopeItems[0]?.envelopeId,
|
||||
envelopeItemId: envelopeItems[0]?.id,
|
||||
|
||||
@@ -30,7 +30,7 @@ import { SignaturePadDialog } from '@documenso/ui/primitives/signature-pad/signa
|
||||
import { useToast } from '@documenso/ui/primitives/use-toast';
|
||||
|
||||
import { BrandingLogo } from '~/components/general/branding-logo';
|
||||
import PDFViewerLazy from '~/components/general/pdf-viewer/pdf-viewer-lazy';
|
||||
import { PDFViewer } from '~/components/general/pdf-viewer/pdf-viewer';
|
||||
import { injectCss } from '~/utils/css-vars';
|
||||
|
||||
import { DocumentSigningAttachmentsPopover } from '../general/document-signing/document-signing-attachments-popover';
|
||||
@@ -74,7 +74,7 @@ export const EmbedSignDocumentV1ClientPage = ({
|
||||
const { _ } = useLingui();
|
||||
const { toast } = useToast();
|
||||
|
||||
const { fullName, email, signature, setFullName, setEmail, setSignature } =
|
||||
const { fullName, email, signature, setFullName, setSignature } =
|
||||
useRequiredDocumentSigningContext();
|
||||
|
||||
const [hasFinishedInit, setHasFinishedInit] = useState(false);
|
||||
@@ -89,7 +89,6 @@ export const EmbedSignDocumentV1ClientPage = ({
|
||||
|
||||
const [isExpanded, setIsExpanded] = useState(false);
|
||||
const [isNameLocked, setIsNameLocked] = useState(false);
|
||||
const [isEmailLocked, setIsEmailLocked] = useState(!!email);
|
||||
const [showPendingFieldTooltip, setShowPendingFieldTooltip] = useState(false);
|
||||
const [_showOtherRecipientsCompletedFields, setShowOtherRecipientsCompletedFields] =
|
||||
useState(false);
|
||||
@@ -206,19 +205,13 @@ export const EmbedSignDocumentV1ClientPage = ({
|
||||
try {
|
||||
const data = ZSignDocumentEmbedDataSchema.parse(JSON.parse(decodeURIComponent(atob(hash))));
|
||||
|
||||
if (!isCompleted && data.name && !fullName) {
|
||||
if (!isCompleted && data.name) {
|
||||
setFullName(data.name);
|
||||
}
|
||||
|
||||
// Since a recipient can be provided a name we can lock it without requiring
|
||||
// a to be provided by the parent application, unlike direct templates.
|
||||
setIsNameLocked(!!data.lockName);
|
||||
|
||||
if (!isCompleted && data.email && !email) {
|
||||
setEmail(data.email);
|
||||
setIsEmailLocked(!!data.lockEmail);
|
||||
}
|
||||
|
||||
setAllowDocumentRejection(!!data.allowDocumentRejection);
|
||||
setShowOtherRecipientsCompletedFields(!!data.showOtherRecipientsCompletedFields);
|
||||
|
||||
@@ -295,7 +288,7 @@ export const EmbedSignDocumentV1ClientPage = ({
|
||||
<div className="embed--DocumentContainer relative flex w-full flex-col gap-x-6 gap-y-12 md:flex-row">
|
||||
{/* Viewer */}
|
||||
<div className="embed--DocumentViewer flex-1">
|
||||
<PDFViewerLazy
|
||||
<PDFViewer
|
||||
data={getDocumentDataUrlForPdfViewer({
|
||||
envelopeId: envelopeItems[0]?.envelopeId,
|
||||
envelopeItemId: envelopeItems[0]?.id,
|
||||
@@ -456,8 +449,7 @@ export const EmbedSignDocumentV1ClientPage = ({
|
||||
id="email"
|
||||
className="mt-2 bg-background"
|
||||
value={email}
|
||||
onChange={(e) => setEmail(e.target.value)}
|
||||
disabled={isEmailLocked}
|
||||
disabled
|
||||
/>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ export const EmbedSignDocumentV2ClientPage = ({
|
||||
}: EmbedSignDocumentV2ClientPageProps) => {
|
||||
const { _ } = useLingui();
|
||||
|
||||
const { envelope, recipient, envelopeData, setFullName, setEmail, fullName, email } =
|
||||
const { envelope, recipient, envelopeData, setFullName, setEmail, fullName } =
|
||||
useRequiredEnvelopeSigningContext();
|
||||
|
||||
const { isCompleted, isRejected, recipientSignature } = envelopeData;
|
||||
@@ -36,9 +36,7 @@ export const EmbedSignDocumentV2ClientPage = ({
|
||||
const [hasFinishedInit, setHasFinishedInit] = useState(false);
|
||||
const [allowDocumentRejection, setAllowDocumentRejection] = useState(false);
|
||||
const [isNameLocked, setIsNameLocked] = useState(false);
|
||||
const [isEmailLocked, setIsEmailLocked] = useState(
|
||||
envelope.type === EnvelopeType.DOCUMENT && !!email,
|
||||
);
|
||||
const [isEmailLocked, setIsEmailLocked] = useState(envelope.type === EnvelopeType.DOCUMENT);
|
||||
|
||||
const onDocumentCompleted = (data: {
|
||||
token: string;
|
||||
@@ -130,22 +128,19 @@ export const EmbedSignDocumentV2ClientPage = ({
|
||||
const data = ZSignDocumentEmbedDataSchema.parse(JSON.parse(decodeURIComponent(atob(hash))));
|
||||
|
||||
if (!isCompleted && data.name) {
|
||||
// For documents, only use the hash name if the recipient doesn't already have one.
|
||||
// For templates, always allow the hash name to be used.
|
||||
if (envelope.type === EnvelopeType.TEMPLATE || !fullName) {
|
||||
setFullName(data.name);
|
||||
}
|
||||
setFullName(data.name);
|
||||
}
|
||||
|
||||
// Since a recipient can be provided a name we can lock it without requiring
|
||||
// a to be provided by the parent application, unlike direct templates.
|
||||
setIsNameLocked(!!data.lockName);
|
||||
|
||||
if (!isCompleted && data.email) {
|
||||
// For documents, only use the hash email if the recipient doesn't already have one.
|
||||
// For templates, always allow the hash email to be used.
|
||||
if (envelope.type === EnvelopeType.TEMPLATE || !email) {
|
||||
if (envelope.type === EnvelopeType.TEMPLATE) {
|
||||
if (!isCompleted && data.email) {
|
||||
setEmail(data.email);
|
||||
}
|
||||
|
||||
if (data.email) {
|
||||
setIsEmailLocked(!!data.lockEmail);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ import { Label } from '@documenso/ui/primitives/label';
|
||||
import { SignaturePadDialog } from '@documenso/ui/primitives/signature-pad/signature-pad-dialog';
|
||||
import { useToast } from '@documenso/ui/primitives/use-toast';
|
||||
|
||||
import PDFViewerLazy from '~/components/general/pdf-viewer/pdf-viewer-lazy';
|
||||
import { PDFViewer } from '~/components/general/pdf-viewer/pdf-viewer';
|
||||
|
||||
import { useRequiredDocumentSigningContext } from '../../general/document-signing/document-signing-provider';
|
||||
import { DocumentSigningRejectDialog } from '../../general/document-signing/document-signing-reject-dialog';
|
||||
@@ -181,8 +181,8 @@ export const MultiSignDocumentSigningView = ({
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="min-h-screen bg-background">
|
||||
<div className="relative h-full w-full p-8">
|
||||
<div className="min-h-screen overflow-hidden bg-background">
|
||||
<div id="document-field-portal-root" className="relative h-full w-full overflow-y-auto p-8">
|
||||
{match({ isLoading, document })
|
||||
.with({ isLoading: true }, () => (
|
||||
<div className="flex min-h-[400px] w-full items-center justify-center">
|
||||
@@ -229,7 +229,7 @@ export const MultiSignDocumentSigningView = ({
|
||||
'md:mx-auto md:max-w-2xl': document.status === DocumentStatus.COMPLETED,
|
||||
})}
|
||||
>
|
||||
<PDFViewerLazy
|
||||
<PDFViewer
|
||||
data={getDocumentDataUrlForPdfViewer({
|
||||
envelopeId: document.envelopeId,
|
||||
envelopeItemId: document.envelopeItems[0]?.id,
|
||||
@@ -369,39 +369,35 @@ export const MultiSignDocumentSigningView = ({
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{hasDocumentLoaded && showPendingFieldTooltip && pendingFields.length > 0 && (
|
||||
<ElementVisible
|
||||
target={`${PDF_VIEWER_PAGE_SELECTOR}[data-page-number="${pendingFields[0].page}"]`}
|
||||
>
|
||||
<FieldToolTip
|
||||
key={pendingFields[0].id}
|
||||
field={pendingFields[0]}
|
||||
color="warning"
|
||||
>
|
||||
<Trans>Click to insert field</Trans>
|
||||
</FieldToolTip>
|
||||
</ElementVisible>
|
||||
)}
|
||||
|
||||
{/* Fields */}
|
||||
{hasDocumentLoaded && (
|
||||
<EmbedDocumentFields
|
||||
fields={pendingFields}
|
||||
metadata={document.documentMeta}
|
||||
onSignField={onSignField}
|
||||
onUnsignField={onUnsignField}
|
||||
/>
|
||||
)}
|
||||
|
||||
{/* Completed fields */}
|
||||
{document.status !== DocumentStatus.COMPLETED && (
|
||||
<DocumentReadOnlyFields
|
||||
documentMeta={document.documentMeta ?? undefined}
|
||||
fields={completedFields}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{hasDocumentLoaded && showPendingFieldTooltip && pendingFields.length > 0 && (
|
||||
<ElementVisible
|
||||
target={`${PDF_VIEWER_PAGE_SELECTOR}[data-page-number="${pendingFields[0].page}"]`}
|
||||
>
|
||||
<FieldToolTip key={pendingFields[0].id} field={pendingFields[0]} color="warning">
|
||||
<Trans>Click to insert field</Trans>
|
||||
</FieldToolTip>
|
||||
</ElementVisible>
|
||||
)}
|
||||
|
||||
{/* Fields */}
|
||||
{hasDocumentLoaded && (
|
||||
<EmbedDocumentFields
|
||||
fields={pendingFields}
|
||||
metadata={document.documentMeta}
|
||||
onSignField={onSignField}
|
||||
onUnsignField={onUnsignField}
|
||||
/>
|
||||
)}
|
||||
|
||||
{/* Completed fields */}
|
||||
{document.status !== DocumentStatus.COMPLETED && (
|
||||
<DocumentReadOnlyFields
|
||||
documentMeta={document.documentMeta ?? undefined}
|
||||
fields={completedFields}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
))
|
||||
.otherwise(() => null)}
|
||||
|
||||
@@ -96,7 +96,7 @@ export const EditorFieldDropdownForm = ({
|
||||
mode: 'onChange',
|
||||
defaultValues: {
|
||||
defaultValue: value.defaultValue,
|
||||
values: value.values || [{ value: t`Option 1` }],
|
||||
values: [{ value: t`Option 1` }],
|
||||
required: value.required || false,
|
||||
readOnly: value.readOnly || false,
|
||||
fontSize: value.fontSize || DEFAULT_FIELD_FONT_SIZE,
|
||||
|
||||
@@ -4,7 +4,6 @@ import type { MessageDescriptor } from '@lingui/core';
|
||||
import { msg } from '@lingui/core/macro';
|
||||
import { useLingui } from '@lingui/react';
|
||||
import { Trans } from '@lingui/react/macro';
|
||||
import { keepPreviousData } from '@tanstack/react-query';
|
||||
import { CheckIcon, Loader, Monitor, Moon, Sun } from 'lucide-react';
|
||||
import { useHotkeys } from 'react-hotkeys-hook';
|
||||
import { useNavigate } from 'react-router';
|
||||
@@ -66,16 +65,14 @@ export function AppCommandMenu({ open, onOpenChange }: AppCommandMenuProps) {
|
||||
const [pages, setPages] = useState<string[]>([]);
|
||||
|
||||
const debouncedSearch = useDebouncedValue(search, 200);
|
||||
const hasValidSearch = debouncedSearch.trim().length > 0;
|
||||
|
||||
const { data: searchDocumentsData, isFetching: isFetchingDocuments } =
|
||||
const { data: searchDocumentsData, isPending: isSearchingDocuments } =
|
||||
trpcReact.document.search.useQuery(
|
||||
{
|
||||
query: debouncedSearch,
|
||||
},
|
||||
{
|
||||
enabled: open === true && hasValidSearch,
|
||||
placeholderData: keepPreviousData,
|
||||
placeholderData: (previousData) => previousData,
|
||||
// Do not batch this due to relatively long request time compared to
|
||||
// other queries which are generally batched with this.
|
||||
...SKIP_QUERY_BATCH_META,
|
||||
@@ -83,19 +80,6 @@ export function AppCommandMenu({ open, onOpenChange }: AppCommandMenuProps) {
|
||||
},
|
||||
);
|
||||
|
||||
const { data: searchTemplatesData, isFetching: isFetchingTemplates } =
|
||||
trpcReact.template.search.useQuery(
|
||||
{
|
||||
query: debouncedSearch,
|
||||
},
|
||||
{
|
||||
enabled: open === true && hasValidSearch,
|
||||
placeholderData: keepPreviousData,
|
||||
...SKIP_QUERY_BATCH_META,
|
||||
...DO_NOT_INVALIDATE_QUERY_ON_MUTATION,
|
||||
},
|
||||
);
|
||||
|
||||
const teamUrl = useMemo(() => {
|
||||
let teamUrl = currentTeam?.url || null;
|
||||
|
||||
@@ -150,23 +134,17 @@ export function AppCommandMenu({ open, onOpenChange }: AppCommandMenuProps) {
|
||||
];
|
||||
}, [currentTeam, organisations]);
|
||||
|
||||
const documentSearchResults =
|
||||
hasValidSearch && searchDocumentsData
|
||||
? searchDocumentsData.map((document) => ({
|
||||
label: document.title,
|
||||
path: document.path,
|
||||
value: document.value,
|
||||
}))
|
||||
: [];
|
||||
const searchResults = useMemo(() => {
|
||||
if (!searchDocumentsData) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const templateSearchResults =
|
||||
hasValidSearch && searchTemplatesData
|
||||
? searchTemplatesData.map((template) => ({
|
||||
label: template.title,
|
||||
path: template.path,
|
||||
value: template.value,
|
||||
}))
|
||||
: [];
|
||||
return searchDocumentsData.map((document) => ({
|
||||
label: document.title,
|
||||
path: document.path,
|
||||
value: document.value,
|
||||
}));
|
||||
}, [searchDocumentsData]);
|
||||
|
||||
const currentPage = pages[pages.length - 1];
|
||||
|
||||
@@ -244,9 +222,19 @@ export function AppCommandMenu({ open, onOpenChange }: AppCommandMenuProps) {
|
||||
/>
|
||||
|
||||
<CommandList>
|
||||
<CommandEmpty>
|
||||
<Trans>No results found.</Trans>
|
||||
</CommandEmpty>
|
||||
{isSearchingDocuments ? (
|
||||
<CommandEmpty>
|
||||
<div className="flex items-center justify-center">
|
||||
<span className="animate-spin">
|
||||
<Loader />
|
||||
</span>
|
||||
</div>
|
||||
</CommandEmpty>
|
||||
) : (
|
||||
<CommandEmpty>
|
||||
<Trans>No results found.</Trans>
|
||||
</CommandEmpty>
|
||||
)}
|
||||
|
||||
{!currentPage && (
|
||||
<>
|
||||
@@ -275,27 +263,9 @@ export function AppCommandMenu({ open, onOpenChange }: AppCommandMenuProps) {
|
||||
</CommandItem>
|
||||
</CommandGroup>
|
||||
|
||||
{(isFetchingDocuments || documentSearchResults.length > 0) && (
|
||||
{searchResults.length > 0 && (
|
||||
<CommandGroup className="mx-2 p-0 pb-2" heading={_(msg`Your documents`)}>
|
||||
{isFetchingDocuments ? (
|
||||
<div className="flex items-center justify-center py-2">
|
||||
<Loader className="h-4 w-4 animate-spin" />
|
||||
</div>
|
||||
) : (
|
||||
<Commands push={push} pages={documentSearchResults} />
|
||||
)}
|
||||
</CommandGroup>
|
||||
)}
|
||||
|
||||
{(isFetchingTemplates || templateSearchResults.length > 0) && (
|
||||
<CommandGroup className="mx-2 p-0 pb-2" heading={_(msg`Your templates`)}>
|
||||
{isFetchingTemplates ? (
|
||||
<div className="flex items-center justify-center py-2">
|
||||
<Loader className="h-4 w-4 animate-spin" />
|
||||
</div>
|
||||
) : (
|
||||
<Commands push={push} pages={templateSearchResults} />
|
||||
)}
|
||||
<Commands push={push} pages={searchResults} />
|
||||
</CommandGroup>
|
||||
)}
|
||||
</>
|
||||
|
||||
@@ -19,7 +19,7 @@ import { useToast } from '@documenso/ui/primitives/use-toast';
|
||||
|
||||
import { useRequiredDocumentSigningAuthContext } from '~/components/general/document-signing/document-signing-auth-provider';
|
||||
import { useRequiredDocumentSigningContext } from '~/components/general/document-signing/document-signing-provider';
|
||||
import PDFViewerLazy from '~/components/general/pdf-viewer/pdf-viewer-lazy';
|
||||
import { PDFViewer } from '~/components/general/pdf-viewer/pdf-viewer';
|
||||
|
||||
import {
|
||||
DirectTemplateConfigureForm,
|
||||
@@ -152,7 +152,7 @@ export const DirectTemplatePageView = ({
|
||||
gradient
|
||||
>
|
||||
<CardContent className="p-2">
|
||||
<PDFViewerLazy
|
||||
<PDFViewer
|
||||
key={template.id}
|
||||
data={getDocumentDataUrlForPdfViewer({
|
||||
envelopeId: template.envelopeId,
|
||||
|
||||
+2
-2
@@ -46,7 +46,7 @@ import { DocumentSigningRadioField } from '~/components/general/document-signing
|
||||
import { DocumentSigningRejectDialog } from '~/components/general/document-signing/document-signing-reject-dialog';
|
||||
import { DocumentSigningSignatureField } from '~/components/general/document-signing/document-signing-signature-field';
|
||||
import { DocumentSigningTextField } from '~/components/general/document-signing/document-signing-text-field';
|
||||
import PDFViewerLazy from '~/components/general/pdf-viewer/pdf-viewer-lazy';
|
||||
import { PDFViewer } from '~/components/general/pdf-viewer/pdf-viewer';
|
||||
|
||||
import { useRequiredDocumentSigningAuthContext } from './document-signing-auth-provider';
|
||||
import { DocumentSigningCompleteDialog } from './document-signing-complete-dialog';
|
||||
@@ -273,7 +273,7 @@ export const DocumentSigningPageViewV1 = ({
|
||||
<div className="flex-1">
|
||||
<Card className="rounded-xl before:rounded-xl" gradient>
|
||||
<CardContent className="p-2">
|
||||
<PDFViewerLazy
|
||||
<PDFViewer
|
||||
key={document.envelopeItems[0]?.id}
|
||||
data={getDocumentDataUrlForPdfViewer({
|
||||
envelopeId: document.envelopeId,
|
||||
|
||||
+100
-147
@@ -1,23 +1,15 @@
|
||||
import { useMemo, useRef, useState } from 'react';
|
||||
import { useMemo, useRef } from 'react';
|
||||
|
||||
import { Plural, Trans, useLingui } from '@lingui/react/macro';
|
||||
import { Plural, Trans } from '@lingui/react/macro';
|
||||
import { EnvelopeType, RecipientRole } from '@prisma/client';
|
||||
import { motion } from 'framer-motion';
|
||||
import {
|
||||
ArrowLeftIcon,
|
||||
BanIcon,
|
||||
DownloadCloudIcon,
|
||||
PanelLeftCloseIcon,
|
||||
PanelLeftOpenIcon,
|
||||
PaperclipIcon,
|
||||
} from 'lucide-react';
|
||||
import { ArrowLeftIcon, BanIcon, DownloadCloudIcon, PaperclipIcon } from 'lucide-react';
|
||||
import { Link } from 'react-router';
|
||||
import { match } from 'ts-pattern';
|
||||
|
||||
import { useCurrentEnvelopeRender } from '@documenso/lib/client-only/providers/envelope-render-provider';
|
||||
import { PDF_VIEWER_ERROR_MESSAGES } from '@documenso/lib/constants/pdf-viewer-i18n';
|
||||
import { mapSecondaryIdToDocumentId } from '@documenso/lib/utils/envelope';
|
||||
import { cn } from '@documenso/ui/lib/utils';
|
||||
import { Button } from '@documenso/ui/primitives/button';
|
||||
import { Separator } from '@documenso/ui/primitives/separator';
|
||||
|
||||
@@ -65,9 +57,6 @@ export const DocumentSigningPageViewV2 = () => {
|
||||
onDocumentRejected,
|
||||
} = useEmbedSigningContext() || {};
|
||||
|
||||
const { t } = useLingui();
|
||||
const [isSidebarCollapsed, setIsSidebarCollapsed] = useState(false);
|
||||
|
||||
/**
|
||||
* The total remaining fields remaining for the current recipient or selected assistant recipient.
|
||||
*
|
||||
@@ -97,157 +86,121 @@ export const DocumentSigningPageViewV2 = () => {
|
||||
{/* Main Content Area */}
|
||||
<div className="flex h-[calc(100vh-4rem)] w-screen">
|
||||
{/* Left Section - Step Navigation */}
|
||||
<div
|
||||
className={cn(
|
||||
'embed--DocumentWidgetContainer hidden flex-shrink-0 flex-col border-r border-border bg-background transition-[width] duration-300 lg:flex',
|
||||
isSidebarCollapsed ? 'w-12' : 'w-80',
|
||||
)}
|
||||
>
|
||||
{isSidebarCollapsed && (
|
||||
<div className="flex justify-center pt-4">
|
||||
<Button
|
||||
variant="ghost"
|
||||
className="h-7 w-7 p-0"
|
||||
aria-label={t`Expand sidebar`}
|
||||
onClick={() => setIsSidebarCollapsed(false)}
|
||||
>
|
||||
<PanelLeftOpenIcon className="h-4 w-4" />
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
<div className="embed--DocumentWidgetContainer hidden w-80 flex-shrink-0 flex-col overflow-y-auto border-r border-border bg-background py-4 lg:flex">
|
||||
<div className="px-4">
|
||||
<h3 className="flex items-end justify-between text-sm font-semibold text-foreground">
|
||||
{match(recipient.role)
|
||||
.with(RecipientRole.VIEWER, () => <Trans>View Document</Trans>)
|
||||
.with(RecipientRole.SIGNER, () => <Trans>Sign Document</Trans>)
|
||||
.with(RecipientRole.APPROVER, () => <Trans>Approve Document</Trans>)
|
||||
.with(RecipientRole.ASSISTANT, () => <Trans>Assist Document</Trans>)
|
||||
.otherwise(() => null)}
|
||||
|
||||
<div
|
||||
className={cn(
|
||||
'flex flex-1 flex-col overflow-hidden py-4',
|
||||
isSidebarCollapsed && 'invisible w-0',
|
||||
)}
|
||||
>
|
||||
<div className="px-4">
|
||||
<h3 className="flex items-end justify-between text-sm font-semibold text-foreground">
|
||||
{match(recipient.role)
|
||||
.with(RecipientRole.VIEWER, () => <Trans>View Document</Trans>)
|
||||
.with(RecipientRole.SIGNER, () => <Trans>Sign Document</Trans>)
|
||||
.with(RecipientRole.APPROVER, () => <Trans>Approve Document</Trans>)
|
||||
.with(RecipientRole.ASSISTANT, () => <Trans>Assist Document</Trans>)
|
||||
.otherwise(() => null)}
|
||||
|
||||
<div className="ml-2 flex items-center gap-1">
|
||||
<span className="rounded border bg-muted/50 px-2 py-0.5 text-xs text-muted-foreground">
|
||||
<Plural
|
||||
value={recipientFieldsRemaining.length}
|
||||
one="1 Field Remaining"
|
||||
other="# Fields Remaining"
|
||||
/>
|
||||
</span>
|
||||
|
||||
<Button
|
||||
variant="ghost"
|
||||
className="h-7 w-7 p-0"
|
||||
aria-label={t`Collapse sidebar`}
|
||||
onClick={() => setIsSidebarCollapsed(true)}
|
||||
>
|
||||
<PanelLeftCloseIcon className="h-4 w-4" />
|
||||
</Button>
|
||||
</div>
|
||||
</h3>
|
||||
|
||||
<div className="relative my-4 h-[4px] rounded-md bg-muted">
|
||||
<motion.div
|
||||
layout="size"
|
||||
layoutId="document-flow-container-step"
|
||||
className="absolute inset-y-0 left-0 bg-primary"
|
||||
style={{
|
||||
width: `${100 - (100 / requiredRecipientFields.length) * (recipientFieldsRemaining.length ?? 0)}%`,
|
||||
}}
|
||||
<span className="ml-2 rounded border bg-muted/50 px-2 py-0.5 text-xs text-muted-foreground">
|
||||
<Plural
|
||||
value={recipientFieldsRemaining.length}
|
||||
one="1 Field Remaining"
|
||||
other="# Fields Remaining"
|
||||
/>
|
||||
</div>
|
||||
</span>
|
||||
</h3>
|
||||
|
||||
<div className="embed--DocumentWidgetContent mt-6 space-y-3">
|
||||
<EnvelopeSignerForm />
|
||||
</div>
|
||||
<div className="relative my-4 h-[4px] rounded-md bg-muted">
|
||||
<motion.div
|
||||
layout="size"
|
||||
layoutId="document-flow-container-step"
|
||||
className="absolute inset-y-0 left-0 bg-primary"
|
||||
style={{
|
||||
width: `${100 - (100 / requiredRecipientFields.length) * (recipientFieldsRemaining.length ?? 0)}%`,
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<Separator className="my-6" />
|
||||
<div className="embed--DocumentWidgetContent mt-6 space-y-3">
|
||||
<EnvelopeSignerForm />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Quick Actions. */}
|
||||
{!isDirectTemplate && (
|
||||
<div className="embed--Actions space-y-3 px-4">
|
||||
<h4 className="text-sm font-semibold text-foreground">
|
||||
<Trans>Actions</Trans>
|
||||
</h4>
|
||||
<Separator className="my-6" />
|
||||
|
||||
<DocumentSigningAttachmentsPopover
|
||||
envelopeId={envelope.id}
|
||||
{/* Quick Actions. */}
|
||||
{!isDirectTemplate && (
|
||||
<div className="embed--Actions space-y-3 px-4">
|
||||
<h4 className="text-sm font-semibold text-foreground">
|
||||
<Trans>Actions</Trans>
|
||||
</h4>
|
||||
|
||||
<DocumentSigningAttachmentsPopover
|
||||
envelopeId={envelope.id}
|
||||
token={recipient.token}
|
||||
trigger={
|
||||
<Button variant="ghost" size="sm" className="w-full justify-start">
|
||||
<PaperclipIcon className="mr-2 h-4 w-4" />
|
||||
<Trans>Attachments</Trans>
|
||||
</Button>
|
||||
}
|
||||
/>
|
||||
|
||||
<EnvelopeDownloadDialog
|
||||
envelopeId={envelope.id}
|
||||
envelopeStatus={envelope.status}
|
||||
envelopeItems={envelope.envelopeItems}
|
||||
token={recipient.token}
|
||||
trigger={
|
||||
<Button variant="ghost" size="sm" className="w-full justify-start">
|
||||
<DownloadCloudIcon className="mr-2 h-4 w-4" />
|
||||
<Trans>Download PDF</Trans>
|
||||
</Button>
|
||||
}
|
||||
/>
|
||||
|
||||
{envelope.type === EnvelopeType.DOCUMENT && allowDocumentRejection && (
|
||||
<DocumentSigningRejectDialog
|
||||
documentId={mapSecondaryIdToDocumentId(envelope.secondaryId)}
|
||||
token={recipient.token}
|
||||
onRejected={
|
||||
onDocumentRejected &&
|
||||
((reason) =>
|
||||
onDocumentRejected({
|
||||
token: recipient.token,
|
||||
documentId: mapSecondaryIdToDocumentId(envelope.secondaryId),
|
||||
envelopeId: envelope.id,
|
||||
recipientId: recipient.id,
|
||||
reason,
|
||||
}))
|
||||
}
|
||||
trigger={
|
||||
<Button variant="ghost" size="sm" className="w-full justify-start">
|
||||
<PaperclipIcon className="mr-2 h-4 w-4" />
|
||||
<Trans>Attachments</Trans>
|
||||
<Button
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
className="w-full justify-start hover:text-destructive"
|
||||
>
|
||||
<BanIcon className="mr-2 h-4 w-4" />
|
||||
<Trans>Reject Document</Trans>
|
||||
</Button>
|
||||
}
|
||||
/>
|
||||
|
||||
<EnvelopeDownloadDialog
|
||||
envelopeId={envelope.id}
|
||||
envelopeStatus={envelope.status}
|
||||
envelopeItems={envelope.envelopeItems}
|
||||
token={recipient.token}
|
||||
trigger={
|
||||
<Button variant="ghost" size="sm" className="w-full justify-start">
|
||||
<DownloadCloudIcon className="mr-2 h-4 w-4" />
|
||||
<Trans>Download PDF</Trans>
|
||||
</Button>
|
||||
}
|
||||
/>
|
||||
|
||||
{envelope.type === EnvelopeType.DOCUMENT && allowDocumentRejection && (
|
||||
<DocumentSigningRejectDialog
|
||||
documentId={mapSecondaryIdToDocumentId(envelope.secondaryId)}
|
||||
token={recipient.token}
|
||||
onRejected={
|
||||
onDocumentRejected &&
|
||||
((reason) =>
|
||||
onDocumentRejected({
|
||||
token: recipient.token,
|
||||
documentId: mapSecondaryIdToDocumentId(envelope.secondaryId),
|
||||
envelopeId: envelope.id,
|
||||
recipientId: recipient.id,
|
||||
reason,
|
||||
}))
|
||||
}
|
||||
trigger={
|
||||
<Button
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
className="w-full justify-start hover:text-destructive"
|
||||
>
|
||||
<BanIcon className="mr-2 h-4 w-4" />
|
||||
<Trans>Reject Document</Trans>
|
||||
</Button>
|
||||
}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className="embed--DocumentWidgetFooter mt-auto">
|
||||
{/* Footer of left sidebar. */}
|
||||
{!isEmbed && (
|
||||
<div className="px-4">
|
||||
<Button asChild variant="ghost" className="w-full justify-start">
|
||||
<Link to="/">
|
||||
<ArrowLeftIcon className="mr-2 h-4 w-4" />
|
||||
<Trans>Return</Trans>
|
||||
</Link>
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className="embed--DocumentWidgetFooter mt-auto">
|
||||
{/* Footer of left sidebar. */}
|
||||
{!isEmbed && (
|
||||
<div className="px-4">
|
||||
<Button asChild variant="ghost" className="w-full justify-start">
|
||||
<Link to="/">
|
||||
<ArrowLeftIcon className="mr-2 h-4 w-4" />
|
||||
<Trans>Return</Trans>
|
||||
</Link>
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div
|
||||
className="embed--DocumentContainer min-w-0 flex-1 overflow-y-auto"
|
||||
className="embed--DocumentContainer flex-1 overflow-y-auto"
|
||||
ref={scrollableContainerRef}
|
||||
>
|
||||
<div className="flex flex-col">
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { useEffect, useState } from 'react';
|
||||
import { useEffect, useRef, useState } from 'react';
|
||||
|
||||
import { Trans } from '@lingui/react/macro';
|
||||
import { type DocumentData, DocumentStatus, type EnvelopeItem, EnvelopeType } from '@prisma/client';
|
||||
@@ -25,7 +25,7 @@ import {
|
||||
|
||||
import { EnvelopeDownloadDialog } from '~/components/dialogs/envelope-download-dialog';
|
||||
import { EnvelopePdfViewer } from '~/components/general/pdf-viewer/envelope-pdf-viewer';
|
||||
import PDFViewerLazy from '~/components/general/pdf-viewer/pdf-viewer-lazy';
|
||||
import { PDFViewer } from '~/components/general/pdf-viewer/pdf-viewer';
|
||||
|
||||
import { EnvelopeRendererFileSelector } from '../envelope-editor/envelope-file-selector';
|
||||
import { EnvelopeGenericPageRenderer } from '../envelope-editor/envelope-generic-page-renderer';
|
||||
@@ -150,7 +150,7 @@ export const DocumentCertificateQRView = ({
|
||||
</div>
|
||||
|
||||
<div className="mt-12 w-full">
|
||||
<PDFViewerLazy
|
||||
<PDFViewer
|
||||
key={envelopeItems[0]?.id}
|
||||
data={getDocumentDataUrlForPdfViewer({
|
||||
envelopeId: envelopeItems[0]?.envelopeId,
|
||||
@@ -184,6 +184,8 @@ const DocumentCertificateQrV2 = ({
|
||||
}: DocumentCertificateQrV2Props) => {
|
||||
const { envelopeItems } = useCurrentEnvelopeRender();
|
||||
|
||||
const scrollableContainerRef = useRef<HTMLDivElement>(null);
|
||||
|
||||
return (
|
||||
<div className="flex min-h-screen flex-col items-start">
|
||||
<div className="flex w-full flex-col justify-between gap-4 md:flex-row md:items-end">
|
||||
@@ -214,12 +216,12 @@ const DocumentCertificateQrV2 = ({
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="mt-12 w-full">
|
||||
<div className="mt-12 max-h-[80vh] w-full overflow-y-auto" ref={scrollableContainerRef}>
|
||||
<EnvelopeRendererFileSelector className="mb-4 p-0" fields={[]} secondaryOverride={''} />
|
||||
|
||||
<EnvelopePdfViewer
|
||||
scrollParentRef="window"
|
||||
customPageRenderer={EnvelopeGenericPageRenderer}
|
||||
scrollParentRef={scrollableContainerRef}
|
||||
errorMessage={PDF_VIEWER_ERROR_MESSAGES.preview}
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -31,7 +31,7 @@ import type { DocumentFlowStep } from '@documenso/ui/primitives/document-flow/ty
|
||||
import { Stepper } from '@documenso/ui/primitives/stepper';
|
||||
import { useToast } from '@documenso/ui/primitives/use-toast';
|
||||
|
||||
import PDFViewerLazy from '~/components/general/pdf-viewer/pdf-viewer-lazy';
|
||||
import { PDFViewer } from '~/components/general/pdf-viewer/pdf-viewer';
|
||||
import { useCurrentTeam } from '~/providers/team';
|
||||
|
||||
export type DocumentEditFormProps = {
|
||||
@@ -441,7 +441,7 @@ export const DocumentEditForm = ({
|
||||
gradient
|
||||
>
|
||||
<CardContent className="p-2">
|
||||
<PDFViewerLazy
|
||||
<PDFViewer
|
||||
key={document.envelopeItems[0]?.id}
|
||||
data={getDocumentDataUrlForPdfViewer({
|
||||
envelopeId: document.envelopeId,
|
||||
|
||||
@@ -152,12 +152,9 @@ export const EnvelopeEditorFieldsPage = () => {
|
||||
|
||||
return (
|
||||
<div className="relative flex h-full">
|
||||
<div
|
||||
className="flex h-full w-full flex-col overflow-y-auto px-2"
|
||||
ref={scrollableContainerRef}
|
||||
>
|
||||
<div className="flex h-full w-full flex-col overflow-y-auto" ref={scrollableContainerRef}>
|
||||
{/* Horizontal envelope item selector */}
|
||||
<EnvelopeRendererFileSelector className="px-0" fields={editorFields.localFields} />
|
||||
<EnvelopeRendererFileSelector fields={editorFields.localFields} />
|
||||
|
||||
{/* Document View */}
|
||||
<div className="mt-4 flex h-full flex-col items-center justify-center">
|
||||
|
||||
+15
-31
@@ -1,6 +1,6 @@
|
||||
import { useEffect, useMemo, useRef, useState } from 'react';
|
||||
|
||||
import type { Faker } from '@faker-js/faker';
|
||||
import { faker } from '@faker-js/faker/locale/en';
|
||||
import { Trans } from '@lingui/react/macro';
|
||||
import { FieldType, SigningStatus } from '@prisma/client';
|
||||
import { FileTextIcon } from 'lucide-react';
|
||||
@@ -26,8 +26,9 @@ import { EnvelopePdfViewer } from '~/components/general/pdf-viewer/envelope-pdf-
|
||||
|
||||
import { EnvelopeRendererFileSelector } from './envelope-file-selector';
|
||||
|
||||
// Todo: Envelopes - Dynamically import faker
|
||||
export const EnvelopeEditorPreviewPage = () => {
|
||||
const { envelope, editorFields, editorConfig } = useCurrentEnvelopeEditor();
|
||||
const { envelope, editorFields } = useCurrentEnvelopeEditor();
|
||||
|
||||
const { currentEnvelopeItem, fields } = useCurrentEnvelopeRender();
|
||||
|
||||
@@ -37,20 +38,7 @@ export const EnvelopeEditorPreviewPage = () => {
|
||||
'recipient',
|
||||
);
|
||||
|
||||
const [fakerInstance, setFakerInstance] = useState<Faker | null>(null);
|
||||
|
||||
useEffect(() => {
|
||||
void import('@faker-js/faker/locale/en').then((mod) => {
|
||||
setFakerInstance(mod.faker);
|
||||
});
|
||||
}, []);
|
||||
|
||||
const fieldsWithPlaceholders = useMemo(() => {
|
||||
if (!fakerInstance) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const faker = fakerInstance;
|
||||
return fields.map((field) => {
|
||||
const fieldMeta = ZFieldAndMetaSchema.parse(field);
|
||||
|
||||
@@ -201,7 +189,7 @@ export const EnvelopeEditorPreviewPage = () => {
|
||||
.exhaustive(),
|
||||
};
|
||||
});
|
||||
}, [fields, envelope, envelope.recipients, envelope.documentMeta, fakerInstance]);
|
||||
}, [fields, envelope, envelope.recipients, envelope.documentMeta]);
|
||||
|
||||
/**
|
||||
* Set the selected recipient to the first recipient in the envelope.
|
||||
@@ -222,30 +210,26 @@ export const EnvelopeEditorPreviewPage = () => {
|
||||
...recipient,
|
||||
signingStatus: SigningStatus.SIGNED,
|
||||
}))}
|
||||
presignToken={editorConfig?.embedded?.presignToken}
|
||||
overrideSettings={{
|
||||
mode: 'export',
|
||||
}}
|
||||
>
|
||||
<div className="relative flex h-full">
|
||||
<div
|
||||
className="flex h-full w-full flex-col overflow-y-auto px-2"
|
||||
ref={scrollableContainerRef}
|
||||
>
|
||||
<div className="flex w-full flex-col overflow-y-auto" ref={scrollableContainerRef}>
|
||||
{/* Horizontal envelope item selector */}
|
||||
<EnvelopeRendererFileSelector className="px-0" fields={editorFields.localFields} />
|
||||
|
||||
<Alert variant="warning" className="mx-auto max-w-[800px]">
|
||||
<AlertTitle>
|
||||
<Trans>Preview Mode</Trans>
|
||||
</AlertTitle>
|
||||
<AlertDescription>
|
||||
<Trans>Preview what the signed document will look like with placeholder data</Trans>
|
||||
</AlertDescription>
|
||||
</Alert>
|
||||
<EnvelopeRendererFileSelector fields={editorFields.localFields} />
|
||||
|
||||
{/* Document View */}
|
||||
<div className="mt-4 flex h-full flex-col items-center justify-center">
|
||||
<Alert variant="warning" className="mb-4 max-w-[800px]">
|
||||
<AlertTitle>
|
||||
<Trans>Preview Mode</Trans>
|
||||
</AlertTitle>
|
||||
<AlertDescription>
|
||||
<Trans>Preview what the signed document will look like with placeholder data</Trans>
|
||||
</AlertDescription>
|
||||
</Alert>
|
||||
|
||||
{currentEnvelopeItem !== null ? (
|
||||
<EnvelopePdfViewer
|
||||
customPageRenderer={EnvelopeGenericPageRenderer}
|
||||
|
||||
@@ -62,12 +62,7 @@ export const EnvelopeRendererFileSelector = ({
|
||||
const { envelopeItems, currentEnvelopeItem, setCurrentEnvelopeItem } = useCurrentEnvelopeRender();
|
||||
|
||||
return (
|
||||
<div
|
||||
className={cn(
|
||||
'scrollbar-hidden flex h-fit flex-shrink-0 space-x-2 overflow-x-auto p-4',
|
||||
className,
|
||||
)}
|
||||
>
|
||||
<div className={cn('flex h-fit flex-shrink-0 space-x-2 overflow-x-auto p-4', className)}>
|
||||
{envelopeItems.map((doc, i) => (
|
||||
<EnvelopeItemSelector
|
||||
key={doc.id}
|
||||
|
||||
@@ -8,8 +8,7 @@ import { PDF_VIEWER_ERROR_MESSAGES } from '@documenso/lib/constants/pdf-viewer-i
|
||||
import { cn } from '@documenso/ui/lib/utils';
|
||||
import { Alert, AlertDescription, AlertTitle } from '@documenso/ui/primitives/alert';
|
||||
|
||||
import type { PDFViewerProps } from './pdf-viewer';
|
||||
import PDFViewerLazy from './pdf-viewer-lazy';
|
||||
import { PDFViewer, type PDFViewerProps } from './pdf-viewer';
|
||||
|
||||
export type EnvelopePdfViewerProps = {
|
||||
/**
|
||||
@@ -53,8 +52,7 @@ export const EnvelopePdfViewer = ({
|
||||
}
|
||||
|
||||
return (
|
||||
<PDFViewerLazy
|
||||
key={`${currentEnvelopeItem.envelopeId}-${currentEnvelopeItem.id}`}
|
||||
<PDFViewer
|
||||
{...props}
|
||||
className={cn('h-full w-full max-w-[800px]', className)}
|
||||
data={currentEnvelopeItem.data}
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
/**
|
||||
* We need to double wrap the PDFViewer to avoid the following errors:
|
||||
*
|
||||
* 1. Lazy prevents the pdfjs worker from being bundled
|
||||
* 2. onMount guard prevents "Worker not defined"
|
||||
*/
|
||||
import { Suspense, lazy, useEffect, useState } from 'react';
|
||||
|
||||
import { cn } from '@documenso/ui/lib/utils';
|
||||
|
||||
import type { PDFViewerProps } from './pdf-viewer';
|
||||
import { PdfViewerLoadingState } from './pdf-viewer-states';
|
||||
|
||||
const PDFViewer = lazy(async () => import('./pdf-viewer'));
|
||||
|
||||
export default function PDFViewerLazy(props: PDFViewerProps) {
|
||||
const [isClient, setIsClient] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
setIsClient(true);
|
||||
}, []);
|
||||
|
||||
const fallback = (
|
||||
<div className={cn('h-full w-full', props.className)}>
|
||||
<PdfViewerLoadingState />
|
||||
</div>
|
||||
);
|
||||
|
||||
if (!isClient) {
|
||||
return fallback;
|
||||
}
|
||||
|
||||
return <Suspense fallback={fallback}>{PDFViewer && <PDFViewer {...props} />}</Suspense>;
|
||||
}
|
||||
@@ -28,14 +28,7 @@ export const PdfViewerPageImage = ({ imageLoadingState, imageProps }: PdfViewerP
|
||||
)}
|
||||
|
||||
{/* The PDF image. */}
|
||||
{imageProps.src && (
|
||||
<img
|
||||
{...imageProps}
|
||||
className={cn(imageProps.className, 'select-none')}
|
||||
draggable={false}
|
||||
alt=""
|
||||
/>
|
||||
)}
|
||||
{imageProps.src && <img {...imageProps} className={cn(imageProps.className, '')} alt="" />}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -62,14 +62,14 @@ export type PDFViewerProps = {
|
||||
customPageRenderer?: React.FunctionComponent<{ pageData: PageRenderData }>;
|
||||
} & React.HTMLAttributes<HTMLDivElement>;
|
||||
|
||||
export default function PDFViewer({
|
||||
export const PDFViewer = ({
|
||||
className,
|
||||
data,
|
||||
scrollParentRef,
|
||||
onDocumentLoad,
|
||||
customPageRenderer,
|
||||
...props
|
||||
}: PDFViewerProps) {
|
||||
}: PDFViewerProps) => {
|
||||
const { t } = useLingui();
|
||||
const { toast } = useToast();
|
||||
|
||||
@@ -77,7 +77,7 @@ export default function PDFViewer({
|
||||
|
||||
const [loadingState, setLoadingState] = useState<LoadingState>('loading');
|
||||
|
||||
const pdfRef = useRef<pdfjsLib.PDFDocumentProxy | null>(null);
|
||||
const [pdf, setPdf] = useState<pdfjsLib.PDFDocumentProxy | null>(null);
|
||||
|
||||
const [pages, setPages] = useState<PageMeta[]>([]);
|
||||
|
||||
@@ -86,17 +86,11 @@ export default function PDFViewer({
|
||||
return;
|
||||
}
|
||||
|
||||
let isCancelled = false;
|
||||
|
||||
const fetchMetadata = async () => {
|
||||
try {
|
||||
setLoadingState('loading');
|
||||
setPages([]);
|
||||
|
||||
if (isCancelled) {
|
||||
return;
|
||||
}
|
||||
|
||||
let result: Uint8Array | null = typeof data === 'string' ? null : new Uint8Array(data);
|
||||
|
||||
if (typeof data === 'string') {
|
||||
@@ -109,25 +103,13 @@ export default function PDFViewer({
|
||||
result = new Uint8Array(await response.arrayBuffer());
|
||||
}
|
||||
|
||||
if (isCancelled) {
|
||||
return;
|
||||
const loadedPdf = await pdfjsLib.getDocument({ data: result! }).promise;
|
||||
|
||||
if (pdf) {
|
||||
await pdf.destroy();
|
||||
}
|
||||
|
||||
const loadedPdf = await pdfjsLib.getDocument({ data: result!, cMapUrl: '/static/cmaps/' })
|
||||
.promise;
|
||||
|
||||
if (isCancelled) {
|
||||
await loadedPdf.destroy();
|
||||
return;
|
||||
}
|
||||
|
||||
// Destroy previous PDF if it exists
|
||||
if (pdfRef.current) {
|
||||
await pdfRef.current.destroy();
|
||||
}
|
||||
|
||||
// eslint-disable-next-line require-atomic-updates
|
||||
pdfRef.current = loadedPdf;
|
||||
setPdf(loadedPdf);
|
||||
|
||||
// Fetch the pages
|
||||
const pages = await pMap(
|
||||
@@ -143,18 +125,10 @@ export default function PDFViewer({
|
||||
},
|
||||
);
|
||||
|
||||
if (isCancelled) {
|
||||
return;
|
||||
}
|
||||
|
||||
setPages(pages);
|
||||
|
||||
setLoadingState('loaded');
|
||||
} catch (err) {
|
||||
if (isCancelled) {
|
||||
return;
|
||||
}
|
||||
|
||||
console.error(err);
|
||||
setLoadingState('error');
|
||||
|
||||
@@ -169,11 +143,8 @@ export default function PDFViewer({
|
||||
void fetchMetadata();
|
||||
|
||||
return () => {
|
||||
isCancelled = true;
|
||||
|
||||
if (pdfRef.current) {
|
||||
void pdfRef.current.destroy();
|
||||
pdfRef.current = null;
|
||||
if (pdf) {
|
||||
void pdf.destroy();
|
||||
}
|
||||
};
|
||||
}, [data]);
|
||||
@@ -191,7 +162,7 @@ export default function PDFViewer({
|
||||
if (!data) {
|
||||
return (
|
||||
<div ref={$el} className={cn('h-full w-full', className)} {...props}>
|
||||
<p className="py-32 text-center text-sm text-muted-foreground">
|
||||
<p className="text-muted-foreground py-32 text-center text-sm">
|
||||
<Trans>No document found</Trans>
|
||||
</p>
|
||||
</div>
|
||||
@@ -207,23 +178,23 @@ export default function PDFViewer({
|
||||
{hasError && <PdfViewerErrorState />}
|
||||
|
||||
{/* Loaded State */}
|
||||
{loadingState === 'loaded' && pages.length > 0 && pdfRef.current && (
|
||||
{loadingState === 'loaded' && pages.length > 0 && pdf && (
|
||||
<VirtualizedPageList
|
||||
scrollParentRef={scrollParentRef}
|
||||
constraintRef={$el}
|
||||
numPages={pages.length}
|
||||
pages={pages}
|
||||
pdf={pdfRef.current}
|
||||
pdf={pdf}
|
||||
customPageRenderer={customPageRenderer}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
type VirtualizedPageListProps = {
|
||||
scrollParentRef: ScrollTarget;
|
||||
constraintRef: React.RefObject<HTMLDivElement>;
|
||||
constraintRef: React.RefObject<HTMLDivElement | null>;
|
||||
pages: PageMeta[];
|
||||
numPages: number;
|
||||
pdf: pdfjsLib.PDFDocumentProxy;
|
||||
@@ -307,7 +278,7 @@ const VirtualizedPageList = ({
|
||||
customPageRenderer={customPageRenderer}
|
||||
/>
|
||||
|
||||
<p className="my-2 text-center text-[11px] text-muted-foreground/80">
|
||||
<p className="text-muted-foreground/80 my-2 text-center text-[11px]">
|
||||
<Trans>
|
||||
Page {pageNumber} of {numPages}
|
||||
</Trans>
|
||||
@@ -352,7 +323,7 @@ const PdfViewerPage = ({
|
||||
|
||||
return (
|
||||
<div
|
||||
className="relative w-full rounded border border-border"
|
||||
className="border-border relative w-full rounded border"
|
||||
style={{ width: scaledWidth, height: scaledHeight }}
|
||||
>
|
||||
{CustomPageRenderer && imageLoadingState === 'loaded' && (
|
||||
|
||||
@@ -28,7 +28,7 @@ import { AddTemplateSettingsFormPartial } from '@documenso/ui/primitives/templat
|
||||
import type { TAddTemplateSettingsFormSchema } from '@documenso/ui/primitives/template-flow/add-template-settings.types';
|
||||
import { useToast } from '@documenso/ui/primitives/use-toast';
|
||||
|
||||
import PDFViewerLazy from '~/components/general/pdf-viewer/pdf-viewer-lazy';
|
||||
import { PDFViewer } from '~/components/general/pdf-viewer/pdf-viewer';
|
||||
import { useCurrentTeam } from '~/providers/team';
|
||||
|
||||
export type TemplateEditFormProps = {
|
||||
@@ -313,7 +313,7 @@ export const TemplateEditForm = ({
|
||||
gradient
|
||||
>
|
||||
<CardContent className="p-2">
|
||||
<PDFViewerLazy
|
||||
<PDFViewer
|
||||
key={template.envelopeItems[0]?.id}
|
||||
data={getDocumentDataUrlForPdfViewer({
|
||||
envelopeId: template.envelopeId,
|
||||
|
||||
@@ -3,13 +3,7 @@ import { useMemo } from 'react';
|
||||
import { msg } from '@lingui/core/macro';
|
||||
import { useLingui } from '@lingui/react';
|
||||
import { Trans } from '@lingui/react/macro';
|
||||
import {
|
||||
type Field,
|
||||
type Recipient,
|
||||
RecipientRole,
|
||||
type Signature,
|
||||
SigningStatus,
|
||||
} from '@prisma/client';
|
||||
import { type Field, type Recipient, type Signature, SigningStatus } from '@prisma/client';
|
||||
import { useForm } from 'react-hook-form';
|
||||
import { useRevalidator } from 'react-router';
|
||||
import { z } from 'zod';
|
||||
@@ -27,27 +21,11 @@ import {
|
||||
FormMessage,
|
||||
} from '@documenso/ui/primitives/form/form';
|
||||
import { Input } from '@documenso/ui/primitives/input';
|
||||
import {
|
||||
Select,
|
||||
SelectContent,
|
||||
SelectItem,
|
||||
SelectTrigger,
|
||||
SelectValue,
|
||||
} from '@documenso/ui/primitives/select';
|
||||
import { useToast } from '@documenso/ui/primitives/use-toast';
|
||||
|
||||
const RECIPIENT_ROLE_LABELS: Record<RecipientRole, string> = {
|
||||
[RecipientRole.SIGNER]: 'Signer',
|
||||
[RecipientRole.APPROVER]: 'Approver',
|
||||
[RecipientRole.CC]: 'CC',
|
||||
[RecipientRole.VIEWER]: 'Viewer',
|
||||
[RecipientRole.ASSISTANT]: 'Assistant',
|
||||
};
|
||||
|
||||
const ZAdminUpdateRecipientFormSchema = z.object({
|
||||
name: z.string().min(1),
|
||||
email: z.string().email(),
|
||||
role: z.nativeEnum(RecipientRole),
|
||||
});
|
||||
|
||||
type TAdminUpdateRecipientFormSchema = z.infer<typeof ZAdminUpdateRecipientFormSchema>;
|
||||
@@ -71,7 +49,6 @@ export const AdminDocumentRecipientItemTable = ({ recipient }: RecipientItemProp
|
||||
defaultValues: {
|
||||
name: recipient.name,
|
||||
email: recipient.email,
|
||||
role: recipient.role,
|
||||
},
|
||||
});
|
||||
|
||||
@@ -121,17 +98,12 @@ export const AdminDocumentRecipientItemTable = ({ recipient }: RecipientItemProp
|
||||
] satisfies DataTableColumnDef<(typeof recipient)['fields'][number]>[];
|
||||
}, []);
|
||||
|
||||
const onUpdateRecipientFormSubmit = async ({
|
||||
name,
|
||||
email,
|
||||
role,
|
||||
}: TAdminUpdateRecipientFormSchema) => {
|
||||
const onUpdateRecipientFormSubmit = async ({ name, email }: TAdminUpdateRecipientFormSchema) => {
|
||||
try {
|
||||
await updateRecipient({
|
||||
id: recipient.id,
|
||||
name,
|
||||
email,
|
||||
role,
|
||||
});
|
||||
|
||||
toast({
|
||||
@@ -195,43 +167,6 @@ export const AdminDocumentRecipientItemTable = ({ recipient }: RecipientItemProp
|
||||
)}
|
||||
/>
|
||||
|
||||
<FormField
|
||||
control={form.control}
|
||||
name="role"
|
||||
render={({ field }) => (
|
||||
<FormItem className="flex-1">
|
||||
<FormLabel required>
|
||||
<Trans>Role</Trans>
|
||||
</FormLabel>
|
||||
|
||||
<FormControl>
|
||||
<Select
|
||||
value={field.value}
|
||||
onValueChange={field.onChange}
|
||||
disabled={
|
||||
form.formState.isSubmitting ||
|
||||
recipient.signingStatus === SigningStatus.SIGNED
|
||||
}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectValue />
|
||||
</SelectTrigger>
|
||||
|
||||
<SelectContent>
|
||||
{Object.values(RecipientRole).map((role) => (
|
||||
<SelectItem key={role} value={role}>
|
||||
{RECIPIENT_ROLE_LABELS[role]}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</FormControl>
|
||||
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
|
||||
<div>
|
||||
<Button type="submit" loading={form.formState.isSubmitting}>
|
||||
<Trans>Update Recipient</Trans>
|
||||
|
||||
@@ -148,14 +148,14 @@ export function LayoutContent({ children }: { children: React.ReactNode }) {
|
||||
</TooltipProvider>
|
||||
</SessionProvider>
|
||||
|
||||
<ScrollRestoration />
|
||||
<Scripts />
|
||||
|
||||
<script
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: `window.__ENV__ = ${JSON.stringify(publicEnv)}`,
|
||||
}}
|
||||
/>
|
||||
|
||||
<ScrollRestoration />
|
||||
<Scripts />
|
||||
</body>
|
||||
</html>
|
||||
);
|
||||
|
||||
@@ -2,16 +2,12 @@ import { msg } from '@lingui/core/macro';
|
||||
import { useLingui } from '@lingui/react';
|
||||
import { Trans } from '@lingui/react/macro';
|
||||
import { EnvelopeType, RecipientRole, SigningStatus } from '@prisma/client';
|
||||
import { DownloadIcon } from 'lucide-react';
|
||||
import { DateTime } from 'luxon';
|
||||
import { Link, redirect } from 'react-router';
|
||||
|
||||
import { downloadFile } from '@documenso/lib/client-only/download-file';
|
||||
import { unsafeGetEntireEnvelope } from '@documenso/lib/server-only/admin/get-entire-document';
|
||||
import { base64 } from '@documenso/lib/universal/base64';
|
||||
import { mapSecondaryIdToDocumentId } from '@documenso/lib/utils/envelope';
|
||||
import { trpc } from '@documenso/trpc/react';
|
||||
import { LocalTime } from '@documenso/ui/components/common/local-time';
|
||||
import {
|
||||
Accordion,
|
||||
AccordionContent,
|
||||
@@ -77,31 +73,6 @@ export default function AdminDocumentDetailsPage({ loaderData }: Route.Component
|
||||
},
|
||||
});
|
||||
|
||||
const { mutateAsync: downloadAuditLogs, isPending: isDownloadAuditLogsLoading } =
|
||||
trpc.admin.document.downloadAuditLogs.useMutation();
|
||||
|
||||
const onDownloadAuditLogsClick = async () => {
|
||||
try {
|
||||
const { data, envelopeTitle } = await downloadAuditLogs({
|
||||
envelopeId: envelope.id,
|
||||
});
|
||||
|
||||
const buffer = new Uint8Array(base64.decode(data));
|
||||
const blob = new Blob([buffer], { type: 'application/pdf' });
|
||||
|
||||
downloadFile({
|
||||
data: blob,
|
||||
filename: `${envelopeTitle} - Audit Logs.pdf`,
|
||||
});
|
||||
} catch {
|
||||
toast({
|
||||
title: _(msg`Something went wrong`),
|
||||
description: _(msg`Failed to download audit logs. Please try again later.`),
|
||||
variant: 'destructive',
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div>
|
||||
<div className="flex items-start justify-between">
|
||||
@@ -198,40 +169,6 @@ export default function AdminDocumentDetailsPage({ loaderData }: Route.Component
|
||||
</AccordionTrigger>
|
||||
|
||||
<AccordionContent className="border-t px-4 pt-4">
|
||||
<div className="mb-4 grid grid-cols-4 gap-4 text-sm">
|
||||
<div>
|
||||
<span className="text-muted-foreground">
|
||||
<Trans>Send Status</Trans>
|
||||
</span>
|
||||
<p className="font-medium">{recipient.sendStatus}</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<span className="text-muted-foreground">
|
||||
<Trans>Read Status</Trans>
|
||||
</span>
|
||||
<p className="font-medium">{recipient.readStatus}</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<span className="text-muted-foreground">
|
||||
<Trans>Signing Status</Trans>
|
||||
</span>
|
||||
<p className="font-medium">{recipient.signingStatus}</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<span className="text-muted-foreground">
|
||||
<Trans>Completed At</Trans>
|
||||
</span>
|
||||
<p className="font-medium">
|
||||
{recipient.signedAt ? <LocalTime date={recipient.signedAt} /> : '-'}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr className="mb-4" />
|
||||
|
||||
<AdminDocumentRecipientItemTable recipient={recipient} />
|
||||
</AccordionContent>
|
||||
</AccordionItem>
|
||||
@@ -247,26 +184,11 @@ export default function AdminDocumentDetailsPage({ loaderData }: Route.Component
|
||||
|
||||
<hr className="my-4" />
|
||||
|
||||
<div className="flex items-center justify-between">
|
||||
<h2 className="text-lg font-semibold">
|
||||
<Trans>Audit Logs</Trans>
|
||||
</h2>
|
||||
|
||||
<Button
|
||||
variant="outline"
|
||||
loading={isDownloadAuditLogsLoading}
|
||||
onClick={() => void onDownloadAuditLogsClick()}
|
||||
>
|
||||
{!isDownloadAuditLogsLoading && <DownloadIcon className="mr-1.5 h-4 w-4" />}
|
||||
<Trans>Download Audit Logs</Trans>
|
||||
</Button>
|
||||
</div>
|
||||
|
||||
<Accordion type="single" collapsible className="mt-4 w-full">
|
||||
<Accordion type="single" collapsible className="w-full">
|
||||
<AccordionItem value="audit-logs" className="rounded-lg border">
|
||||
<AccordionTrigger className="px-4">
|
||||
<h2 className="text-lg font-semibold">
|
||||
<Trans>View Audit Logs</Trans>
|
||||
<Trans>Audit Logs</Trans>
|
||||
</h2>
|
||||
</AccordionTrigger>
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ import { EnvelopeRendererFileSelector } from '~/components/general/envelope-edit
|
||||
import { EnvelopeGenericPageRenderer } from '~/components/general/envelope-editor/envelope-generic-page-renderer';
|
||||
import { GenericErrorLayout } from '~/components/general/generic-error-layout';
|
||||
import { EnvelopePdfViewer } from '~/components/general/pdf-viewer/envelope-pdf-viewer';
|
||||
import PDFViewerLazy from '~/components/general/pdf-viewer/pdf-viewer-lazy';
|
||||
import { PDFViewer } from '~/components/general/pdf-viewer/pdf-viewer';
|
||||
import { StackAvatarsWithTooltip } from '~/components/general/stack-avatars-with-tooltip';
|
||||
import { useCurrentTeam } from '~/providers/team';
|
||||
|
||||
@@ -199,7 +199,7 @@ export default function DocumentPage({ params }: Route.ComponentProps) {
|
||||
/>
|
||||
)}
|
||||
|
||||
<PDFViewerLazy
|
||||
<PDFViewer
|
||||
data={getDocumentDataUrlForPdfViewer({
|
||||
envelopeId: envelope.id,
|
||||
envelopeItemId: envelope.envelopeItems[0]?.id,
|
||||
|
||||
@@ -3,7 +3,6 @@ import { Trans } from '@lingui/react/macro';
|
||||
import { EnvelopeType } from '@prisma/client';
|
||||
import { ChevronLeftIcon } from 'lucide-react';
|
||||
import { Link, Outlet, isRouteErrorResponse, redirect } from 'react-router';
|
||||
import type { ShouldRevalidateFunctionArgs } from 'react-router';
|
||||
|
||||
import { getSession } from '@documenso/auth/server/lib/utils/get-session';
|
||||
import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error';
|
||||
@@ -15,10 +14,6 @@ import { GenericErrorLayout } from '~/components/general/generic-error-layout';
|
||||
|
||||
import type { Route } from './+types/settings._layout';
|
||||
|
||||
export const shouldRevalidate = ({ currentParams, nextParams }: ShouldRevalidateFunctionArgs) => {
|
||||
return currentParams.id !== nextParams.id;
|
||||
};
|
||||
|
||||
/**
|
||||
* This file is very similar for templates as well. Any changes here should also be adjusted there as well.
|
||||
*
|
||||
|
||||
@@ -10,7 +10,6 @@ import { z } from 'zod';
|
||||
import { useSessionStorage } from '@documenso/lib/client-only/hooks/use-session-storage';
|
||||
import { useCurrentOrganisation } from '@documenso/lib/client-only/providers/organisation';
|
||||
import { STATS_COUNT_CAP } from '@documenso/lib/constants/document';
|
||||
import { SKIP_QUERY_BATCH_META } from '@documenso/lib/constants/trpc';
|
||||
import { formatAvatarUrl } from '@documenso/lib/utils/avatars';
|
||||
import { parseToIntegerArray } from '@documenso/lib/utils/params';
|
||||
import { formatDocumentsPath } from '@documenso/lib/utils/teams';
|
||||
@@ -86,15 +85,10 @@ export default function DocumentsPage() {
|
||||
[searchParams],
|
||||
);
|
||||
|
||||
const { data, isLoading, isLoadingError } = trpc.document.findDocumentsInternal.useQuery(
|
||||
{
|
||||
...findDocumentSearchParams,
|
||||
folderId,
|
||||
},
|
||||
{
|
||||
...SKIP_QUERY_BATCH_META,
|
||||
},
|
||||
);
|
||||
const { data, isLoading, isLoadingError } = trpc.document.findDocumentsInternal.useQuery({
|
||||
...findDocumentSearchParams,
|
||||
folderId,
|
||||
});
|
||||
|
||||
const getTabHref = (value: keyof typeof ExtendedDocumentStatus) => {
|
||||
const params = new URLSearchParams(searchParams);
|
||||
|
||||
@@ -24,7 +24,7 @@ import { EnvelopeRendererFileSelector } from '~/components/general/envelope-edit
|
||||
import { EnvelopeGenericPageRenderer } from '~/components/general/envelope-editor/envelope-generic-page-renderer';
|
||||
import { GenericErrorLayout } from '~/components/general/generic-error-layout';
|
||||
import { EnvelopePdfViewer } from '~/components/general/pdf-viewer/envelope-pdf-viewer';
|
||||
import PDFViewerLazy from '~/components/general/pdf-viewer/pdf-viewer-lazy';
|
||||
import { PDFViewer } from '~/components/general/pdf-viewer/pdf-viewer';
|
||||
import { TemplateDirectLinkBadge } from '~/components/general/template/template-direct-link-badge';
|
||||
import { TemplatePageViewDocumentsTable } from '~/components/general/template/template-page-view-documents-table';
|
||||
import { TemplatePageViewInformation } from '~/components/general/template/template-page-view-information';
|
||||
@@ -210,7 +210,7 @@ export default function TemplatePage({ params }: Route.ComponentProps) {
|
||||
documentMeta={mockedDocumentMeta}
|
||||
/>
|
||||
|
||||
<PDFViewerLazy
|
||||
<PDFViewer
|
||||
data={getDocumentDataUrlForPdfViewer({
|
||||
envelopeId: envelope.id,
|
||||
envelopeItemId: envelope.envelopeItems[0]?.id,
|
||||
|
||||
@@ -2,13 +2,7 @@ import { msg } from '@lingui/core/macro';
|
||||
import { Trans } from '@lingui/react/macro';
|
||||
import { EnvelopeType } from '@prisma/client';
|
||||
import { ChevronLeftIcon } from 'lucide-react';
|
||||
import {
|
||||
Link,
|
||||
Outlet,
|
||||
type ShouldRevalidateFunctionArgs,
|
||||
isRouteErrorResponse,
|
||||
redirect,
|
||||
} from 'react-router';
|
||||
import { Link, Outlet, isRouteErrorResponse, redirect } from 'react-router';
|
||||
|
||||
import { getSession } from '@documenso/auth/server/lib/utils/get-session';
|
||||
import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error';
|
||||
@@ -20,10 +14,6 @@ import { GenericErrorLayout } from '~/components/general/generic-error-layout';
|
||||
|
||||
import type { Route } from './+types/settings._layout';
|
||||
|
||||
export const shouldRevalidate = ({ currentParams, nextParams }: ShouldRevalidateFunctionArgs) => {
|
||||
return currentParams.id !== nextParams.id;
|
||||
};
|
||||
|
||||
/**
|
||||
* This file is very similar for documents as well. Any changes here should also be adjusted there as well.
|
||||
*
|
||||
|
||||
@@ -20,8 +20,6 @@ import { injectCss } from '~/utils/css-vars';
|
||||
|
||||
import type { Route } from './+types/_layout';
|
||||
|
||||
export const shouldRevalidate = () => false;
|
||||
|
||||
export const loader = async ({ request }: Route.LoaderArgs) => {
|
||||
const url = new URL(request.url);
|
||||
|
||||
|
||||
@@ -38,8 +38,6 @@ import { superLoaderJson, useSuperLoaderData } from '~/utils/super-json-loader';
|
||||
|
||||
import type { Route } from './+types/envelope.create._index';
|
||||
|
||||
export const shouldRevalidate = () => false;
|
||||
|
||||
export const loader = async ({ request }: Route.LoaderArgs) => {
|
||||
const url = new URL(request.url);
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ import { useLayoutEffect, useMemo, useState } from 'react';
|
||||
import { Trans, useLingui } from '@lingui/react/macro';
|
||||
import { EnvelopeType } from '@prisma/client';
|
||||
import { CheckCircle2Icon } from 'lucide-react';
|
||||
import { type ShouldRevalidateFunctionArgs, redirect } from 'react-router';
|
||||
import { redirect } from 'react-router';
|
||||
|
||||
import { EnvelopeEditorProvider } from '@documenso/lib/client-only/providers/envelope-editor-provider';
|
||||
import type { SupportedLanguageCodes } from '@documenso/lib/constants/i18n';
|
||||
@@ -30,10 +30,6 @@ import { superLoaderJson, useSuperLoaderData } from '~/utils/super-json-loader';
|
||||
|
||||
import type { Route } from './+types/envelope.edit.$id';
|
||||
|
||||
export const shouldRevalidate = ({ currentParams, nextParams }: ShouldRevalidateFunctionArgs) => {
|
||||
return currentParams.id !== nextParams.id;
|
||||
};
|
||||
|
||||
export const loader = async ({ request, params }: Route.LoaderArgs) => {
|
||||
const url = new URL(request.url);
|
||||
|
||||
|
||||
+71
-41
@@ -4,76 +4,106 @@
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"build": "./.bin/build.sh",
|
||||
"build:app": "react-router typegen && cross-env NODE_ENV=production react-router build",
|
||||
"build:server": "cross-env NODE_ENV=production rolldown -c rolldown.config.mjs",
|
||||
"dev": "npm run with:env -- react-router dev",
|
||||
"build:app": "pnpm run typecheck && cross-env NODE_ENV=production react-router build",
|
||||
"build:server": "cross-env NODE_ENV=production rollup -c rollup.config.mjs",
|
||||
"dev": "pnpm run with:env react-router dev",
|
||||
"dev:billing": "bash .bin/stripe-dev.sh",
|
||||
"start": "npm run with:env -- cross-env NODE_ENV=production node build/server/main.js",
|
||||
"start": "pnpm run with:env cross-env NODE_ENV=production node build/server/main.js",
|
||||
"clean": "rimraf .react-router && rimraf node_modules",
|
||||
"typecheck": "react-router typegen && tsc",
|
||||
"with:env": "dotenv -e ../../.env -e ../../.env.local --"
|
||||
},
|
||||
"dependencies": {
|
||||
"@cantoo/pdf-lib": "^2.5.3",
|
||||
"@documenso/api": "*",
|
||||
"@documenso/assets": "*",
|
||||
"@documenso/auth": "*",
|
||||
"@documenso/ee": "*",
|
||||
"@documenso/lib": "*",
|
||||
"@documenso/prisma": "*",
|
||||
"@documenso/tailwind-config": "*",
|
||||
"@documenso/trpc": "*",
|
||||
"@documenso/ui": "*",
|
||||
"@documenso/api": "workspace:*",
|
||||
"@documenso/assets": "workspace:*",
|
||||
"@documenso/auth": "workspace:*",
|
||||
"@documenso/ee": "workspace:*",
|
||||
"@documenso/lib": "workspace:*",
|
||||
"@documenso/prisma": "workspace:*",
|
||||
"@documenso/tailwind-config": "workspace:*",
|
||||
"@documenso/trpc": "workspace:*",
|
||||
"@documenso/ui": "workspace:*",
|
||||
"@epic-web/remember": "^1.1.0",
|
||||
"@faker-js/faker": "^10.1.0",
|
||||
"@hono/node-server": "^1.19.11",
|
||||
"@hono/standard-validator": "^0.2.0",
|
||||
"@hono/node-server": "catalog:",
|
||||
"@hono/standard-validator": "catalog:",
|
||||
"@hono/trpc-server": "^0.4.0",
|
||||
"@hookform/resolvers": "^3",
|
||||
"@lingui/core": "^5.6.0",
|
||||
"@hookform/resolvers": "catalog:",
|
||||
"@lingui/core": "catalog:",
|
||||
"@lingui/detect-locale": "^5.6.0",
|
||||
"@lingui/macro": "^5.6.0",
|
||||
"@lingui/react": "^5.6.0",
|
||||
"@oslojs/crypto": "^1.0.1",
|
||||
"@oslojs/encoding": "^1.1.0",
|
||||
"@lingui/macro": "catalog:",
|
||||
"@lingui/react": "catalog:",
|
||||
"@oslojs/crypto": "catalog:",
|
||||
"@oslojs/encoding": "catalog:",
|
||||
"@react-router/node": "^7.12.0",
|
||||
"@react-router/serve": "^7.12.0",
|
||||
"@simplewebauthn/browser": "^13.2.2",
|
||||
"@simplewebauthn/server": "^13.2.2",
|
||||
"@tanstack/react-query": "5.90.10",
|
||||
"autoprefixer": "^10.4.22",
|
||||
"@simplewebauthn/server": "catalog:",
|
||||
"@tanstack/react-query": "catalog:",
|
||||
"autoprefixer": "catalog:",
|
||||
"colord": "^2.9.3",
|
||||
"content-disposition": "^1.0.1",
|
||||
"framer-motion": "^12.23.24",
|
||||
"hono": "^4.12.5",
|
||||
"framer-motion": "catalog:",
|
||||
"hono": "catalog:",
|
||||
"hono-react-router-adapter": "^0.6.5",
|
||||
"input-otp": "^1.4.2",
|
||||
"isbot": "^5.1.32",
|
||||
"konva": "^10.0.9",
|
||||
"lucide-react": "^0.554.0",
|
||||
"luxon": "^3.7.2",
|
||||
"nanoid": "^5.1.6",
|
||||
"konva": "catalog:",
|
||||
"lucide-react": "catalog:",
|
||||
"luxon": "catalog:",
|
||||
"nanoid": "catalog:",
|
||||
"papaparse": "^5.5.3",
|
||||
"posthog-js": "^1.297.2",
|
||||
"posthog-node": "4.18.0",
|
||||
"react": "^18",
|
||||
"posthog-js": "catalog:",
|
||||
"posthog-node": "catalog:",
|
||||
"react": "catalog:",
|
||||
"react-call": "^1.8.1",
|
||||
"react-dom": "^18",
|
||||
"react-dom": "catalog:",
|
||||
"react-dropzone": "^14.3.8",
|
||||
"react-hook-form": "^7.66.1",
|
||||
"react-hook-form": "catalog:",
|
||||
"react-hotkeys-hook": "^4.6.2",
|
||||
"react-icons": "^5.5.0",
|
||||
"react-rnd": "^10.5.2",
|
||||
"react-rnd": "catalog:",
|
||||
"react-router": "^7.12.0",
|
||||
"recharts": "^2.15.4",
|
||||
"remeda": "^2.32.0",
|
||||
"remeda": "catalog:",
|
||||
"remix-themes": "^2.0.4",
|
||||
"satori": "^0.18.3",
|
||||
"tailwindcss": "^3.4.18",
|
||||
"ts-pattern": "^5.9.0",
|
||||
"tailwindcss": "catalog:",
|
||||
"ts-pattern": "catalog:",
|
||||
"ua-parser-js": "^1.0.41",
|
||||
"uqr": "^0.1.2"
|
||||
},
|
||||
"devDependencies": {},
|
||||
"version": "2.8.0"
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.28.5",
|
||||
"@babel/preset-react": "^7.28.5",
|
||||
"@babel/preset-typescript": "^7.28.5",
|
||||
"@lingui/babel-plugin-lingui-macro": "^5.6.0",
|
||||
"@lingui/vite-plugin": "^5.6.0",
|
||||
"@react-router/dev": "^7.12.0",
|
||||
"@react-router/remix-routes-option-adapter": "^7.12.0",
|
||||
"@rollup/plugin-babel": "^6.1.0",
|
||||
"@rollup/plugin-commonjs": "^28.0.9",
|
||||
"@rollup/plugin-json": "^6.1.0",
|
||||
"@rollup/plugin-node-resolve": "^16.0.3",
|
||||
"@rollup/plugin-typescript": "^12.3.0",
|
||||
"@types/content-disposition": "^0.5.9",
|
||||
"@types/formidable": "catalog:",
|
||||
"@types/luxon": "catalog:",
|
||||
"@types/node": "catalog:",
|
||||
"@types/papaparse": "^5.5.0",
|
||||
"@types/react": "catalog:",
|
||||
"@types/react-dom": "catalog:",
|
||||
"@types/ua-parser-js": "^0.7.39",
|
||||
"cross-env": "^10.1.0",
|
||||
"esbuild": "^0.27.0",
|
||||
"remix-flat-routes": "^0.8.5",
|
||||
"rollup": "^4.53.3",
|
||||
"tsx": "catalog:",
|
||||
"typescript": "catalog:",
|
||||
"vite": "catalog:",
|
||||
"vite-plugin-babel-macros": "^1.0.6",
|
||||
"vite-tsconfig-paths": "^5.1.4"
|
||||
},
|
||||
"version": "2.7.1"
|
||||
}
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
import babel from '@rolldown/plugin-babel';
|
||||
import { defineConfig } from 'rolldown';
|
||||
|
||||
/**
|
||||
* Rolldown config for building the Hono server entry.
|
||||
*
|
||||
* Replaces the previous rollup.config.mjs. Rolldown provides built-in
|
||||
* TypeScript, JSX (automatic runtime), JSON, CJS interop, and node
|
||||
* resolution — so we only need a single plugin for lingui macro compilation.
|
||||
*/
|
||||
export default defineConfig({
|
||||
input: 'server/router.ts',
|
||||
output: {
|
||||
dir: 'build/server/hono',
|
||||
format: 'esm',
|
||||
sourcemap: true,
|
||||
preserveModules: true,
|
||||
preserveModulesRoot: '.',
|
||||
},
|
||||
// Externalize all third-party deps from node_modules.
|
||||
// Workspace packages (@documenso/*) resolve to their actual source paths
|
||||
// (outside node_modules) via npm workspace symlinks, so they get bundled.
|
||||
external: [/node_modules/],
|
||||
platform: 'node',
|
||||
resolve: {
|
||||
extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'],
|
||||
tsconfigFilename: 'tsconfig.json',
|
||||
},
|
||||
plugins: [
|
||||
babel({
|
||||
plugins: ['@lingui/babel-plugin-lingui-macro'],
|
||||
parserOpts: {
|
||||
plugins: ['typescript', 'jsx'],
|
||||
},
|
||||
}),
|
||||
],
|
||||
});
|
||||
@@ -0,0 +1,54 @@
|
||||
import linguiMacro from '@lingui/babel-plugin-lingui-macro';
|
||||
import babel from '@rollup/plugin-babel';
|
||||
import commonjs from '@rollup/plugin-commonjs';
|
||||
import json from '@rollup/plugin-json';
|
||||
import resolve from '@rollup/plugin-node-resolve';
|
||||
import typescript from '@rollup/plugin-typescript';
|
||||
import path from 'node:path';
|
||||
|
||||
/** @type {import('rollup').RollupOptions} */
|
||||
const config = {
|
||||
/**
|
||||
* We specifically target the router.ts instead of the entry point so the rollup doesn't go through the
|
||||
* already prebuilt RR7 server files.
|
||||
*/
|
||||
input: 'server/router.ts',
|
||||
output: {
|
||||
dir: 'build/server/hono',
|
||||
format: 'esm',
|
||||
sourcemap: true,
|
||||
preserveModules: true,
|
||||
preserveModulesRoot: '.',
|
||||
},
|
||||
external: [/node_modules/],
|
||||
plugins: [
|
||||
typescript({
|
||||
noEmitOnError: true,
|
||||
moduleResolution: 'bundler',
|
||||
include: ['server/**/*', '../../packages/**/*', '../../packages/lib/translations/**/*'],
|
||||
jsx: 'preserve',
|
||||
}),
|
||||
resolve({
|
||||
rootDir: path.join(process.cwd(), '../..'),
|
||||
preferBuiltins: true,
|
||||
resolveOnly: [
|
||||
'@documenso/api/*',
|
||||
'@documenso/auth/*',
|
||||
'@documenso/lib/*',
|
||||
'@documenso/trpc/*',
|
||||
'@documenso/email/*',
|
||||
],
|
||||
extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'],
|
||||
}),
|
||||
json(),
|
||||
commonjs(),
|
||||
babel({
|
||||
babelHelpers: 'bundled',
|
||||
extensions: ['.ts', '.tsx'],
|
||||
presets: ['@babel/preset-typescript', ['@babel/preset-react', { runtime: 'automatic' }]],
|
||||
plugins: [linguiMacro],
|
||||
}),
|
||||
],
|
||||
};
|
||||
|
||||
export default config;
|
||||
@@ -7,7 +7,6 @@ import { getOptionalSession } from '@documenso/auth/server/lib/utils/get-session
|
||||
import { verifyEmbeddingPresignToken } from '@documenso/lib/server-only/embedding-presign/verify-embedding-presign-token';
|
||||
import { getTeamById } from '@documenso/lib/server-only/team/get-team';
|
||||
import type { DocumentDataVersion } from '@documenso/lib/types/document';
|
||||
import { sha256 } from '@documenso/lib/universal/crypto';
|
||||
import { getFileServerSide } from '@documenso/lib/universal/upload/get-file.server';
|
||||
import { prisma } from '@documenso/prisma';
|
||||
|
||||
@@ -123,12 +122,6 @@ export const handleEnvelopeItemPdfRequest = async ({
|
||||
const documentDataToUse =
|
||||
version === 'current' ? envelopeItem.documentData.data : envelopeItem.documentData.initialData;
|
||||
|
||||
const etag = Buffer.from(sha256(documentDataToUse)).toString('hex');
|
||||
|
||||
if (c.req.header('If-None-Match') === etag) {
|
||||
return c.status(304);
|
||||
}
|
||||
|
||||
const file = await getFileServerSide({
|
||||
type: envelopeItem.documentData.type,
|
||||
data: documentDataToUse,
|
||||
@@ -144,7 +137,6 @@ export const handleEnvelopeItemPdfRequest = async ({
|
||||
|
||||
// Note: Only set these headers on success.
|
||||
c.header('Content-Type', 'application/pdf');
|
||||
c.header('ETag', etag);
|
||||
c.header('Cache-Control', `${cacheStrategy}, max-age=31536000, immutable`);
|
||||
|
||||
return c.body(file);
|
||||
|
||||
+13
-21
@@ -1,13 +1,14 @@
|
||||
import { lingui } from '@lingui/vite-plugin';
|
||||
import { reactRouter } from '@react-router/dev/vite';
|
||||
import babel from '@rolldown/plugin-babel';
|
||||
import autoprefixer from 'autoprefixer';
|
||||
import serverAdapter from 'hono-react-router-adapter/vite';
|
||||
import { createRequire } from 'node:module';
|
||||
import path from 'node:path';
|
||||
import tailwindcss from 'tailwindcss';
|
||||
import { defineConfig, normalizePath } from 'vite';
|
||||
import macrosPlugin from 'vite-plugin-babel-macros';
|
||||
import { viteStaticCopy } from 'vite-plugin-static-copy';
|
||||
import tsconfigPaths from 'vite-tsconfig-paths';
|
||||
|
||||
const require = createRequire(import.meta.url);
|
||||
|
||||
@@ -39,24 +40,16 @@ export default defineConfig({
|
||||
},
|
||||
],
|
||||
}),
|
||||
babel({
|
||||
plugins: ['@lingui/babel-plugin-lingui-macro'],
|
||||
// @rolldown/plugin-babel's built-in TypeScript parser overrides use
|
||||
// `test: "**/*.tsx"` globs which fail to match when React Router appends
|
||||
// query strings (e.g. `?__react-router-build-client-route`) to module IDs.
|
||||
// Specify parser plugins explicitly so they apply unconditionally.
|
||||
parserOpts: {
|
||||
plugins: ['typescript', 'jsx'],
|
||||
},
|
||||
}),
|
||||
lingui().filter((plugin) => plugin.name === 'vite-plugin-lingui'),
|
||||
reactRouter(),
|
||||
macrosPlugin(),
|
||||
lingui(),
|
||||
tsconfigPaths(),
|
||||
serverAdapter({
|
||||
entry: 'server/router.ts',
|
||||
}),
|
||||
],
|
||||
ssr: {
|
||||
noExternal: ['react-dropzone'],
|
||||
noExternal: ['react-dropzone', 'plausible-tracker'],
|
||||
external: [
|
||||
'@napi-rs/canvas',
|
||||
'@node-rs/bcrypt',
|
||||
@@ -65,12 +58,13 @@ export default defineConfig({
|
||||
'playwright',
|
||||
'playwright-core',
|
||||
'@playwright/browser-chromium',
|
||||
'pdfjs-dist',
|
||||
],
|
||||
},
|
||||
optimizeDeps: {
|
||||
entries: ['./app/**/*', '../../packages/ui/**/*', '../../packages/lib/**/*'],
|
||||
include: ['prop-types', 'file-selector', 'attr-accept'],
|
||||
exclude: [
|
||||
'node_modules',
|
||||
'@napi-rs/canvas',
|
||||
'@node-rs/bcrypt',
|
||||
'sharp',
|
||||
@@ -80,7 +74,6 @@ export default defineConfig({
|
||||
],
|
||||
},
|
||||
resolve: {
|
||||
tsconfigPaths: true,
|
||||
alias: {
|
||||
https: 'node:https',
|
||||
'.prisma/client/default': path.resolve(
|
||||
@@ -95,15 +88,14 @@ export default defineConfig({
|
||||
},
|
||||
},
|
||||
/**
|
||||
* Note: Re run rolldown again to build the server afterwards.
|
||||
* Note: Re run rollup again to build the server afterwards.
|
||||
*
|
||||
* See rolldown.config.mjs which is used for that.
|
||||
* See rollup.config.mjs which is used for that.
|
||||
*/
|
||||
build: {
|
||||
// LightningCSS (Vite 8 default) is stricter and rejects nested @page
|
||||
// rules and some Tailwind theme() edge cases. Use esbuild for CSS
|
||||
// minification until LightningCSS support matures or the CSS is updated.
|
||||
cssMinify: 'esbuild',
|
||||
commonjsOptions: {
|
||||
include: [/node_modules/],
|
||||
},
|
||||
rollupOptions: {
|
||||
external: [
|
||||
'@napi-rs/canvas',
|
||||
|
||||
@@ -0,0 +1,769 @@
|
||||
|
||||
> @documenso/remix@2.0.14 build
|
||||
> ./.bin/build.sh
|
||||
|
||||
[Build]: Extracting and compiling translations
|
||||
|
||||
> @documenso/root@2.0.14 translate
|
||||
> npm run translate:extract && npm run translate:compile
|
||||
|
||||
|
||||
> @documenso/root@2.0.14 translate:extract
|
||||
> lingui extract --clean
|
||||
|
||||
✔ Done in 2s
|
||||
Catalog statistics for packages/lib/translations/{locale}/web:
|
||||
┌─────────────┬─────────────┬─────────┐
|
||||
│ Language │ Total count │ Missing │
|
||||
├─────────────┼─────────────┼─────────┤
|
||||
│ en (source) │ 2311 │ - │
|
||||
│ de │ 2311 │ 23 │
|
||||
│ es │ 2311 │ 23 │
|
||||
│ fr │ 2311 │ 23 │
|
||||
│ it │ 2311 │ 26 │
|
||||
│ ja │ 2311 │ 23 │
|
||||
│ ko │ 2311 │ 23 │
|
||||
│ pl │ 2311 │ 23 │
|
||||
│ pt-BR │ 2311 │ 69 │
|
||||
│ zh │ 2311 │ 23 │
|
||||
└─────────────┴─────────────┴─────────┘
|
||||
|
||||
(Use "npm run translate:extract" to update catalogs with new messages.)
|
||||
(Use "npm run translate:compile" to compile catalogs for production. Alternatively, use bundler plugins: https://lingui.dev/ref/cli#compiling-catalogs-in-ci)
|
||||
|
||||
> @documenso/root@2.0.14 translate:compile
|
||||
> lingui compile
|
||||
|
||||
Compiling message catalogs…
|
||||
Done in 943ms
|
||||
[Build]: Building app
|
||||
|
||||
> @documenso/remix@2.0.14 build:app
|
||||
> npm run typecheck && cross-env NODE_ENV=production react-router build
|
||||
|
||||
|
||||
> @documenso/remix@2.0.14 typecheck
|
||||
> react-router typegen && tsc
|
||||
|
||||
app/components/forms/email-preferences-form.tsx(66,7): error TS2322: Type 'JsonValue' is not assignable to type '{ recipientSigningRequest?: boolean | undefined; recipientRemoved?: boolean | undefined; recipientSigned?: boolean | undefined; documentPending?: boolean | undefined; documentCompleted?: boolean | undefined; documentDeleted?: boolean | undefined; ownerDocumentCompleted?: boolean | undefined; } | null | undefined'.
|
||||
Type 'string' has no properties in common with type '{ recipientSigningRequest?: boolean | undefined; recipientRemoved?: boolean | undefined; recipientSigned?: boolean | undefined; documentPending?: boolean | undefined; documentCompleted?: boolean | undefined; documentDeleted?: boolean | undefined; ownerDocumentCompleted?: boolean | undefined; }'.
|
||||
app/components/forms/email-preferences-form.tsx(81,41): error TS2345: Argument of type '(data: { emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }) => Promise<...>' is not assignable to parameter of type 'SubmitHandler<TFieldValues>'.
|
||||
Types of parameters 'data' and 'data' are incompatible.
|
||||
Type 'TFieldValues' is not assignable to type '{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }'.
|
||||
Type 'FieldValues' is missing the following properties from type '{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }': emailReplyTo, emailId, emailDocumentSettings
|
||||
app/components/forms/email-preferences-form.tsx(88,15): error TS2322: Type 'Control<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, any, TFieldValues>' is not assignable to type 'Control<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, any, { ...; }>'.
|
||||
The types of '_options.resolver' are incompatible between these types.
|
||||
Type 'Resolver<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, any, TFieldValu...' is not assignable to type 'Resolver<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, any, { ...; }> ...'.
|
||||
Type 'Resolver<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, any, TFieldValu...' is not assignable to type 'Resolver<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, any, { ...; }>'.
|
||||
Type 'ResolverResult<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, TFieldVal...' is not assignable to type 'ResolverResult<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, { ...; }>...'.
|
||||
Type 'ResolverSuccess<TFieldValues>' is not assignable to type 'ResolverResult<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, { ...; }>...'.
|
||||
Type 'ResolverSuccess<TFieldValues>' is not assignable to type 'ResolverSuccess<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }>'.
|
||||
Type 'TFieldValues' is not assignable to type '{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }'.
|
||||
Type 'FieldValues' is missing the following properties from type '{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }': emailReplyTo, emailId, emailDocumentSettings
|
||||
app/components/forms/email-preferences-form.tsx(129,13): error TS2322: Type 'Control<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, any, TFieldValues>' is not assignable to type 'Control<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, any, { ...; }>'.
|
||||
The types of '_options.resolver' are incompatible between these types.
|
||||
Type 'Resolver<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, any, TFieldValu...' is not assignable to type 'Resolver<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, any, { ...; }> ...'.
|
||||
Type 'Resolver<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, any, TFieldValu...' is not assignable to type 'Resolver<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, any, { ...; }>'.
|
||||
Type 'ResolverResult<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, TFieldVal...' is not assignable to type 'ResolverResult<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, { ...; }>...'.
|
||||
Type 'ResolverSuccess<TFieldValues>' is not assignable to type 'ResolverResult<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, { ...; }>...'.
|
||||
Type 'ResolverSuccess<TFieldValues>' is not assignable to type 'ResolverSuccess<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }>'.
|
||||
Type 'TFieldValues' is not assignable to type '{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }'.
|
||||
Type 'FieldValues' is missing the following properties from type '{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }': emailReplyTo, emailId, emailDocumentSettings
|
||||
app/components/forms/email-preferences-form.tsx(179,13): error TS2322: Type 'Control<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, any, TFieldValues>' is not assignable to type 'Control<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, any, { ...; }>'.
|
||||
The types of '_options.resolver' are incompatible between these types.
|
||||
Type 'Resolver<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, any, TFieldValu...' is not assignable to type 'Resolver<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, any, { ...; }> ...'.
|
||||
Type 'Resolver<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, any, TFieldValu...' is not assignable to type 'Resolver<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, any, { ...; }>'.
|
||||
Type 'ResolverResult<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, TFieldVal...' is not assignable to type 'ResolverResult<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, { ...; }>...'.
|
||||
Type 'ResolverSuccess<TFieldValues>' is not assignable to type 'ResolverResult<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }, { ...; }>...'.
|
||||
Type 'ResolverSuccess<TFieldValues>' is not assignable to type 'ResolverSuccess<{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }>'.
|
||||
Type 'TFieldValues' is not assignable to type '{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }'.
|
||||
Type 'FieldValues' is missing the following properties from type '{ emailReplyTo: string | null; emailId: string | null; emailDocumentSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null; }': emailReplyTo, emailId, emailDocumentSettings
|
||||
app/components/forms/subscription-claim-form.tsx(43,7): error TS2322: Type 'JsonValue' is not assignable to type '{ allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; emailDomains?: boolean | undefined; embedAuthoring?: boolean | undefined; ... 5 more ...; allowEnvelopes?: boolean | undefined; } | undefined'.
|
||||
Type 'null' is not assignable to type '{ allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; emailDomains?: boolean | undefined; embedAuthoring?: boolean | undefined; ... 5 more ...; allowEnvelopes?: boolean | undefined; } | undefined'.
|
||||
app/components/forms/subscription-claim-form.tsx(49,41): error TS2345: Argument of type '(data: { name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }) => Promise<...>' is not assignable to parameter of type 'SubmitHandler<TFieldValues>'.
|
||||
Types of parameters 'data' and 'data' are incompatible.
|
||||
Type 'TFieldValues' is not assignable to type '{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }'.
|
||||
Type 'FieldValues' is missing the following properties from type '{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }': name, teamCount, memberCount, envelopeItemCount, flags
|
||||
app/components/forms/subscription-claim-form.tsx(52,13): error TS2322: Type 'Control<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, TFieldValues>' is not assignable to type 'Control<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, { ...; }>'.
|
||||
The types of '_options.resolver' are incompatible between these types.
|
||||
Type 'Resolver<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, TFieldValues> | undefined' is not assignable to type 'Resolver<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, { ...; }> | undefined'.
|
||||
Type 'Resolver<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, TFieldValues>' is not assignable to type 'Resolver<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, { ...; }>'.
|
||||
Type 'ResolverResult<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, TFieldValues> | Promise<...>' is not assignable to type 'ResolverResult<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, { ...; }> | Promise<...>'.
|
||||
Type 'ResolverSuccess<TFieldValues>' is not assignable to type 'ResolverResult<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, { ...; }> | Promise<...>'.
|
||||
Type 'ResolverSuccess<TFieldValues>' is not assignable to type 'ResolverSuccess<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }>'.
|
||||
Type 'TFieldValues' is not assignable to type '{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }'.
|
||||
Type 'FieldValues' is missing the following properties from type '{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }': name, teamCount, memberCount, envelopeItemCount, flags
|
||||
app/components/forms/subscription-claim-form.tsx(68,13): error TS2322: Type 'Control<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, TFieldValues>' is not assignable to type 'Control<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, { ...; }>'.
|
||||
The types of '_options.resolver' are incompatible between these types.
|
||||
Type 'Resolver<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, TFieldValues> | undefined' is not assignable to type 'Resolver<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, { ...; }> | undefined'.
|
||||
Type 'Resolver<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, TFieldValues>' is not assignable to type 'Resolver<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, { ...; }>'.
|
||||
Type 'ResolverResult<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, TFieldValues> | Promise<...>' is not assignable to type 'ResolverResult<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, { ...; }> | Promise<...>'.
|
||||
Type 'ResolverSuccess<TFieldValues>' is not assignable to type 'ResolverResult<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, { ...; }> | Promise<...>'.
|
||||
Type 'ResolverSuccess<TFieldValues>' is not assignable to type 'ResolverSuccess<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }>'.
|
||||
Type 'TFieldValues' is not assignable to type '{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }'.
|
||||
Type 'FieldValues' is missing the following properties from type '{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }': name, teamCount, memberCount, envelopeItemCount, flags
|
||||
app/components/forms/subscription-claim-form.tsx(92,13): error TS2322: Type 'Control<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, TFieldValues>' is not assignable to type 'Control<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, { ...; }>'.
|
||||
The types of '_options.resolver' are incompatible between these types.
|
||||
Type 'Resolver<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, TFieldValues> | undefined' is not assignable to type 'Resolver<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, { ...; }> | undefined'.
|
||||
Type 'Resolver<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, TFieldValues>' is not assignable to type 'Resolver<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, { ...; }>'.
|
||||
Type 'ResolverResult<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, TFieldValues> | Promise<...>' is not assignable to type 'ResolverResult<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, { ...; }> | Promise<...>'.
|
||||
Type 'ResolverSuccess<TFieldValues>' is not assignable to type 'ResolverResult<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, { ...; }> | Promise<...>'.
|
||||
Type 'ResolverSuccess<TFieldValues>' is not assignable to type 'ResolverSuccess<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }>'.
|
||||
Type 'TFieldValues' is not assignable to type '{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }'.
|
||||
Type 'FieldValues' is missing the following properties from type '{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }': name, teamCount, memberCount, envelopeItemCount, flags
|
||||
app/components/forms/subscription-claim-form.tsx(116,13): error TS2322: Type 'Control<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, TFieldValues>' is not assignable to type 'Control<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, { ...; }>'.
|
||||
The types of '_options.resolver' are incompatible between these types.
|
||||
Type 'Resolver<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, TFieldValues> | undefined' is not assignable to type 'Resolver<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, { ...; }> | undefined'.
|
||||
Type 'Resolver<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, TFieldValues>' is not assignable to type 'Resolver<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, { ...; }>'.
|
||||
Type 'ResolverResult<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, TFieldValues> | Promise<...>' is not assignable to type 'ResolverResult<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, { ...; }> | Promise<...>'.
|
||||
Type 'ResolverSuccess<TFieldValues>' is not assignable to type 'ResolverResult<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, { ...; }> | Promise<...>'.
|
||||
Type 'ResolverSuccess<TFieldValues>' is not assignable to type 'ResolverSuccess<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }>'.
|
||||
Type 'TFieldValues' is not assignable to type '{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }'.
|
||||
Type 'FieldValues' is missing the following properties from type '{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }': name, teamCount, memberCount, envelopeItemCount, flags
|
||||
app/components/forms/subscription-claim-form.tsx(148,19): error TS2322: Type 'Control<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, TFieldValues>' is not assignable to type 'Control<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, { ...; }>'.
|
||||
The types of '_options.resolver' are incompatible between these types.
|
||||
Type 'Resolver<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, TFieldValues> | undefined' is not assignable to type 'Resolver<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, { ...; }> | undefined'.
|
||||
Type 'Resolver<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, TFieldValues>' is not assignable to type 'Resolver<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, any, { ...; }>'.
|
||||
Type 'ResolverResult<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, TFieldValues> | Promise<...>' is not assignable to type 'ResolverResult<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, { ...; }> | Promise<...>'.
|
||||
Type 'ResolverSuccess<TFieldValues>' is not assignable to type 'ResolverResult<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }, { ...; }> | Promise<...>'.
|
||||
Type 'ResolverSuccess<TFieldValues>' is not assignable to type 'ResolverSuccess<{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }>'.
|
||||
Type 'TFieldValues' is not assignable to type '{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }'.
|
||||
Type 'FieldValues' is missing the following properties from type '{ name: string; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; ... 7 more ...; allowEnvelopes?: boolean | undefined; }; }': name, teamCount, memberCount, envelopeItemCount, flags
|
||||
app/components/general/document-signing/document-signing-field-container.tsx(136,28): error TS2339: Property 'readOnly' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'readOnly' does not exist on type 'string'.
|
||||
app/components/general/document-signing/document-signing-field-container.tsx(178,28): error TS2339: Property 'label' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'label' does not exist on type 'string'.
|
||||
app/components/general/document-signing/document-signing-field-container.tsx(190,32): error TS2339: Property 'label' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'label' does not exist on type 'string'.
|
||||
app/components/general/envelope-editor/envelope-generic-page-renderer.tsx(50,5): error TS2322: Type '{ inserted: boolean; customText: string; recipient: Pick<{ id: number; name: string; token: string; email: string; signingOrder: number | null; envelopeId: string; authOptions: JsonValue; ... 7 more ...; sendStatus: SendStatus; }, "id" | ... 2 more ... | "signingStatus">; ... 11 more ...; envelopeItemId: string; }[]' is not assignable to type 'GenericLocalField[]'.
|
||||
Type '{ inserted: boolean; customText: string; recipient: Pick<{ id: number; name: string; token: string; email: string; signingOrder: number | null; envelopeId: string; authOptions: JsonValue | null; ... 7 more ...; sendStatus: $Enums.SendStatus; }, "id" | ... 2 more ... | "signingStatus">; ... 11 more ...; envelopeItemI...' is not assignable to type 'GenericLocalField'.
|
||||
Type '{ inserted: boolean; customText: string; recipient: Pick<{ id: number; name: string; token: string; email: string; signingOrder: number | null; envelopeId: string; authOptions: JsonValue | null; ... 7 more ...; sendStatus: $Enums.SendStatus; }, "id" | ... 2 more ... | "signingStatus">; ... 11 more ...; envelopeItemI...' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 10 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
app/components/general/envelope-editor/envelope-generic-page-renderer.tsx(74,22): error TS2339: Property 'readOnly' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'readOnly' does not exist on type 'string'.
|
||||
app/components/general/envelope-signing/envelope-signer-page-renderer.tsx(181,69): error TS2339: Property 'readOnly' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'readOnly' does not exist on type 'string'.
|
||||
app/routes/_authenticated+/t.$teamUrl+/documents.$id.legacy_editor.tsx(137,9): error TS2322: Type '{ folder: null; envelopeId: string; internalVersion: number; documentData: { envelopeItemId: string; data: string; type: $Enums.DocumentDataType; id: string; initialData: string; }; ... 31 more ...; documentMetaId: string; }' is not assignable to type '{ id: number; source: "DOCUMENT" | "TEMPLATE" | "TEMPLATE_DIRECT_LINK"; status: "DRAFT" | "PENDING" | "COMPLETED" | "REJECTED"; documentMeta: { id: string; language: string; message: string | null; ... 14 more ...; documentId?: number | undefined; }; ... 20 more ...; templateId?: number | ... 1 more ... | undefined; }'.
|
||||
The types of 'documentMeta.emailSettings' are incompatible between these types.
|
||||
Type 'JsonValue' is not assignable to type '{ recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | null'.
|
||||
Type 'string' is not assignable to type '{ recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; }'.
|
||||
app/routes/_authenticated+/t.$teamUrl+/templates.$id.legacy_editor.tsx(109,9): error TS2322: Type '{ folder: null; envelopeId: string; type: $Enums.TemplateType; templateDocumentDataId: string; templateDocumentData: { envelopeItemId: string; data: string; type: $Enums.DocumentDataType; id: string; initialData: string; }; ... 29 more ...; documentMetaId: string; }' is not assignable to type '{ type: "PUBLIC" | "PRIVATE"; id: number; createdAt: Date; updatedAt: Date; userId: number; user: { id: number; name: string | null; email: string; }; folder: { type: "DOCUMENT" | "TEMPLATE"; ... 8 more ...; parentId: string | null; } | null; ... 15 more ...; templateMeta: { ...; }; }'.
|
||||
Types of property 'fields' are incompatible.
|
||||
Type '{ documentId: null; templateId: number; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; height: Decimal; ... 6 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Type '{ documentId: null; templateId: number; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; secondaryId: string; ... 8 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
app/routes/_internal+/[__htmltopdf]+/certificate.tsx(98,20): error TS18047: 'organisationClaim.flags' is possibly 'null'.
|
||||
app/routes/_internal+/[__htmltopdf]+/certificate.tsx(98,44): error TS2339: Property 'hidePoweredBy' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'hidePoweredBy' does not exist on type 'string'.
|
||||
app/routes/_recipient+/d.$token+/_index.tsx(211,15): error TS2322: Type '{ readonly folder: null; readonly id: number; readonly envelopeId: string; readonly type: $Enums.TemplateType; readonly visibility: $Enums.DocumentVisibility; readonly externalId: string | null; ... 15 more ...; readonly envelopeItems: { ...; }[]; }' is not assignable to type 'Omit<{ type: "PUBLIC" | "PRIVATE"; id: number; createdAt: Date; updatedAt: Date; userId: number; user: { id: number; name: string | null; email: string; }; folder: { type: "DOCUMENT" | "TEMPLATE"; ... 8 more ...; parentId: string | null; } | null; ... 15 more ...; templateMeta: { ...; }; }, "user">'.
|
||||
Types of property 'fields' are incompatible.
|
||||
Type '{ templateId: number; documentId: null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; height: Decimal; ... 6 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Type '{ templateId: number; documentId: null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; secondaryId: string; ... 8 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
app/routes/_unauthenticated+/o.$orgUrl.signin.tsx(76,6): error TS18047: 'organisation.organisationClaim.flags' is possibly 'null'.
|
||||
app/routes/_unauthenticated+/o.$orgUrl.signin.tsx(76,43): error TS2339: Property 'authenticationPortal' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'authenticationPortal' does not exist on type 'string'.
|
||||
app/routes/embed+/_v0+/direct.$token.tsx(45,39): error TS18047: 'organisationClaim.flags' is possibly 'null'.
|
||||
app/routes/embed+/_v0+/direct.$token.tsx(45,63): error TS2339: Property 'embedSigningWhiteLabel' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'embedSigningWhiteLabel' does not exist on type 'string'.
|
||||
app/routes/embed+/_v0+/direct.$token.tsx(46,25): error TS18047: 'organisationClaim.flags' is possibly 'null'.
|
||||
app/routes/embed+/_v0+/direct.$token.tsx(46,49): error TS2339: Property 'hidePoweredBy' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'hidePoweredBy' does not exist on type 'string'.
|
||||
app/routes/embed+/_v0+/direct.$token.tsx(51,32): error TS18047: 'organisationClaim.flags' is possibly 'null'.
|
||||
app/routes/embed+/_v0+/direct.$token.tsx(51,56): error TS2339: Property 'embedSigning' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'embedSigning' does not exist on type 'string'.
|
||||
app/routes/embed+/_v0+/direct.$token.tsx(161,39): error TS18047: 'organisationClaim.flags' is possibly 'null'.
|
||||
app/routes/embed+/_v0+/direct.$token.tsx(161,63): error TS2339: Property 'embedSigningWhiteLabel' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'embedSigningWhiteLabel' does not exist on type 'string'.
|
||||
app/routes/embed+/_v0+/direct.$token.tsx(162,25): error TS18047: 'organisationClaim.flags' is possibly 'null'.
|
||||
app/routes/embed+/_v0+/direct.$token.tsx(162,49): error TS2339: Property 'hidePoweredBy' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'hidePoweredBy' does not exist on type 'string'.
|
||||
app/routes/embed+/_v0+/direct.$token.tsx(164,32): error TS18047: 'organisationClaim.flags' is possibly 'null'.
|
||||
app/routes/embed+/_v0+/direct.$token.tsx(164,56): error TS2339: Property 'embedSigning' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'embedSigning' does not exist on type 'string'.
|
||||
app/routes/embed+/_v0+/sign.$token.tsx(64,39): error TS18047: 'organisationClaim.flags' is possibly 'null'.
|
||||
app/routes/embed+/_v0+/sign.$token.tsx(64,63): error TS2339: Property 'embedSigningWhiteLabel' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'embedSigningWhiteLabel' does not exist on type 'string'.
|
||||
app/routes/embed+/_v0+/sign.$token.tsx(65,25): error TS18047: 'organisationClaim.flags' is possibly 'null'.
|
||||
app/routes/embed+/_v0+/sign.$token.tsx(65,49): error TS2339: Property 'hidePoweredBy' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'hidePoweredBy' does not exist on type 'string'.
|
||||
app/routes/embed+/_v0+/sign.$token.tsx(70,32): error TS18047: 'organisationClaim.flags' is possibly 'null'.
|
||||
app/routes/embed+/_v0+/sign.$token.tsx(70,56): error TS2339: Property 'embedSigning' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'embedSigning' does not exist on type 'string'.
|
||||
app/routes/embed+/_v0+/sign.$token.tsx(197,39): error TS18047: 'organisationClaim.flags' is possibly 'null'.
|
||||
app/routes/embed+/_v0+/sign.$token.tsx(197,63): error TS2339: Property 'embedSigningWhiteLabel' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'embedSigningWhiteLabel' does not exist on type 'string'.
|
||||
app/routes/embed+/_v0+/sign.$token.tsx(198,25): error TS18047: 'organisationClaim.flags' is possibly 'null'.
|
||||
app/routes/embed+/_v0+/sign.$token.tsx(198,49): error TS2339: Property 'hidePoweredBy' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'hidePoweredBy' does not exist on type 'string'.
|
||||
app/routes/embed+/_v0+/sign.$token.tsx(200,32): error TS18047: 'organisationClaim.flags' is possibly 'null'.
|
||||
app/routes/embed+/_v0+/sign.$token.tsx(200,56): error TS2339: Property 'embedSigning' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'embedSigning' does not exist on type 'string'.
|
||||
app/routes/embed+/v1+/authoring+/_layout.tsx(35,37): error TS18047: 'organisationClaim.flags' is possibly 'null'.
|
||||
app/routes/embed+/v1+/authoring+/_layout.tsx(35,61): error TS2339: Property 'embedAuthoringWhiteLabel' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'embedAuthoringWhiteLabel' does not exist on type 'string'.
|
||||
app/routes/embed+/v1+/authoring+/document.edit.$id.tsx(112,88): error TS2345: Argument of type '() => { title: string; documentData: undefined; meta: { subject: string | undefined; message: string | undefined; distributionMethod: $Enums.DocumentDistributionMethod; emailSettings: string | ... 4 more ... | JsonArray; ... 6 more ...; redirectUrl: string | undefined; }; signers: { ...; }[]; }' is not assignable to parameter of type '{ meta: { timezone: string; signingOrder: "PARALLEL" | "SEQUENTIAL"; distributionMethod: "EMAIL" | "NONE"; emailSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; ... 4 more ...; ownerDocumentCompleted: boolean; }; ... 7 more ...; externalId?: string | undefined; }; title: string; signers: { .....'.
|
||||
Type '() => { title: string; documentData: undefined; meta: { subject: string | undefined; message: string | undefined; distributionMethod: $Enums.DocumentDistributionMethod; emailSettings: string | ... 4 more ... | JsonArray; ... 6 more ...; redirectUrl: string | undefined; }; signers: { ...; }[]; }' is not assignable to type '() => { meta: { timezone: string; signingOrder: "PARALLEL" | "SEQUENTIAL"; distributionMethod: "EMAIL" | "NONE"; emailSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; ... 4 more ...; ownerDocumentCompleted: boolean; }; ... 7 more ...; externalId?: string | undefined; }; title: string; signers...'.
|
||||
Call signature return types '{ title: string; documentData: undefined; meta: { subject: string | undefined; message: string | undefined; distributionMethod: DocumentDistributionMethod; ... 7 more ...; redirectUrl: string | undefined; }; signers: { ...; }[]; }' and '{ meta: { timezone: string; signingOrder: "PARALLEL" | "SEQUENTIAL"; distributionMethod: "EMAIL" | "NONE"; emailSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; ... 4 more ...; ownerDocumentCompleted: boolean; }; ... 7 more ...; externalId?: string | undefined; }; title: string; signers: { .....' are incompatible.
|
||||
The types of 'meta.emailSettings' are incompatible between these types.
|
||||
Type 'string | number | boolean | { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | JsonObject | JsonArray' is not assignable to type '{ recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; }'.
|
||||
Type 'string' is not assignable to type '{ recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; }'.
|
||||
app/routes/embed+/v1+/authoring+/document.edit.$id.tsx(144,75): error TS2345: Argument of type '() => { fields: { nativeId: number; formId: string; type: $Enums.FieldType; signerEmail: string; inserted: boolean; recipientId: number; pageNumber: number; pageX: number; pageY: number; pageWidth: number; pageHeight: number; fieldMeta: string | ... 4 more ... | undefined; }[]; }' is not assignable to parameter of type '{ fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; recipientId: number; pageWidth: number; ... 8 more ...; nativeId?: number | undefined; }[]; } | (() => { ...; } | null) | null'.
|
||||
Type '() => { fields: { nativeId: number; formId: string; type: $Enums.FieldType; signerEmail: string; inserted: boolean; recipientId: number; pageNumber: number; pageX: number; pageY: number; pageWidth: number; pageHeight: number; fieldMeta: string | ... 4 more ... | undefined; }[]; }' is not assignable to type '() => { fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; recipientId: number; pageWidth: number; ... 8 more ...; nativeId?: number | undefined; }[]; } | null'.
|
||||
Call signature return types '{ fields: { nativeId: number; formId: string; type: FieldType; signerEmail: string; inserted: boolean; recipientId: number; pageNumber: number; pageX: number; pageY: number; pageWidth: number; pageHeight: number; fieldMeta: string | ... 4 more ... | undefined; }[]; }' and '{ fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; recipientId: number; pageWidth: number; ... 8 more ...; nativeId?: number | undefined; }[]; } | null' are incompatible.
|
||||
The types of 'fields' are incompatible between these types.
|
||||
Type '{ nativeId: number; formId: string; type: FieldType; signerEmail: string; inserted: boolean; recipientId: number; pageNumber: number; pageX: number; pageY: number; pageWidth: number; pageHeight: number; fieldMeta: string | ... 4 more ... | undefined; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; recipientId: number; pageWidth: number; pageHeight: number; ... 7 more ...; nativeId?: number | undefined; }[]'.
|
||||
Type '{ nativeId: number; formId: string; type: $Enums.FieldType; signerEmail: string; inserted: boolean; recipientId: number; pageNumber: number; pageX: number; pageY: number; pageWidth: number; pageHeight: number; fieldMeta: string | ... 4 more ... | undefined; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; recipientId: number; pageWidth: number; pageHeight: number; ... 7 more ...; nativeId?: number | undefined; }'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'string | number | boolean | JsonObject | JsonArray | undefined' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | undefined'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | undefined'.
|
||||
app/routes/embed+/v1+/authoring+/template.edit.$id.tsx(112,88): error TS2345: Argument of type '() => { title: string; documentData: undefined; meta: { subject: string | undefined; message: string | undefined; distributionMethod: $Enums.DocumentDistributionMethod; emailSettings: string | ... 4 more ... | JsonArray; ... 6 more ...; redirectUrl: string | undefined; }; signers: { ...; }[]; }' is not assignable to parameter of type '{ meta: { timezone: string; signingOrder: "PARALLEL" | "SEQUENTIAL"; distributionMethod: "EMAIL" | "NONE"; emailSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; ... 4 more ...; ownerDocumentCompleted: boolean; }; ... 7 more ...; externalId?: string | undefined; }; title: string; signers: { .....'.
|
||||
Type '() => { title: string; documentData: undefined; meta: { subject: string | undefined; message: string | undefined; distributionMethod: $Enums.DocumentDistributionMethod; emailSettings: string | ... 4 more ... | JsonArray; ... 6 more ...; redirectUrl: string | undefined; }; signers: { ...; }[]; }' is not assignable to type '() => { meta: { timezone: string; signingOrder: "PARALLEL" | "SEQUENTIAL"; distributionMethod: "EMAIL" | "NONE"; emailSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; ... 4 more ...; ownerDocumentCompleted: boolean; }; ... 7 more ...; externalId?: string | undefined; }; title: string; signers...'.
|
||||
Call signature return types '{ title: string; documentData: undefined; meta: { subject: string | undefined; message: string | undefined; distributionMethod: DocumentDistributionMethod; ... 7 more ...; redirectUrl: string | undefined; }; signers: { ...; }[]; }' and '{ meta: { timezone: string; signingOrder: "PARALLEL" | "SEQUENTIAL"; distributionMethod: "EMAIL" | "NONE"; emailSettings: { recipientSigningRequest: boolean; recipientRemoved: boolean; ... 4 more ...; ownerDocumentCompleted: boolean; }; ... 7 more ...; externalId?: string | undefined; }; title: string; signers: { .....' are incompatible.
|
||||
The types of 'meta.emailSettings' are incompatible between these types.
|
||||
Type 'string | number | boolean | { recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; } | JsonObject | JsonArray' is not assignable to type '{ recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; }'.
|
||||
Type 'string' is not assignable to type '{ recipientSigningRequest: boolean; recipientRemoved: boolean; recipientSigned: boolean; documentPending: boolean; documentCompleted: boolean; documentDeleted: boolean; ownerDocumentCompleted: boolean; }'.
|
||||
app/routes/embed+/v1+/authoring+/template.edit.$id.tsx(144,75): error TS2345: Argument of type '() => { fields: { nativeId: number; formId: string; type: $Enums.FieldType; signerEmail: string; inserted: boolean; recipientId: number; pageNumber: number; pageX: number; pageY: number; pageWidth: number; pageHeight: number; fieldMeta: string | ... 4 more ... | undefined; }[]; }' is not assignable to parameter of type '{ fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; recipientId: number; pageWidth: number; ... 8 more ...; nativeId?: number | undefined; }[]; } | (() => { ...; } | null) | null'.
|
||||
Type '() => { fields: { nativeId: number; formId: string; type: $Enums.FieldType; signerEmail: string; inserted: boolean; recipientId: number; pageNumber: number; pageX: number; pageY: number; pageWidth: number; pageHeight: number; fieldMeta: string | ... 4 more ... | undefined; }[]; }' is not assignable to type '() => { fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; recipientId: number; pageWidth: number; ... 8 more ...; nativeId?: number | undefined; }[]; } | null'.
|
||||
Call signature return types '{ fields: { nativeId: number; formId: string; type: FieldType; signerEmail: string; inserted: boolean; recipientId: number; pageNumber: number; pageX: number; pageY: number; pageWidth: number; pageHeight: number; fieldMeta: string | ... 4 more ... | undefined; }[]; }' and '{ fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; recipientId: number; pageWidth: number; ... 8 more ...; nativeId?: number | undefined; }[]; } | null' are incompatible.
|
||||
The types of 'fields' are incompatible between these types.
|
||||
Type '{ nativeId: number; formId: string; type: FieldType; signerEmail: string; inserted: boolean; recipientId: number; pageNumber: number; pageX: number; pageY: number; pageWidth: number; pageHeight: number; fieldMeta: string | ... 4 more ... | undefined; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; recipientId: number; pageWidth: number; pageHeight: number; ... 7 more ...; nativeId?: number | undefined; }[]'.
|
||||
Type '{ nativeId: number; formId: string; type: $Enums.FieldType; signerEmail: string; inserted: boolean; recipientId: number; pageNumber: number; pageX: number; pageY: number; pageWidth: number; pageHeight: number; fieldMeta: string | ... 4 more ... | undefined; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; recipientId: number; pageWidth: number; pageHeight: number; ... 7 more ...; nativeId?: number | undefined; }'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'string | number | boolean | JsonObject | JsonArray | undefined' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | undefined'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | undefined'.
|
||||
app/routes/embed+/v1+/multisign+/_index.tsx(56,31): error TS18047: 'organisationClaim.flags' is possibly 'null'.
|
||||
app/routes/embed+/v1+/multisign+/_index.tsx(56,55): error TS2339: Property 'embedSigningWhiteLabel' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'embedSigningWhiteLabel' does not exist on type 'string'.
|
||||
app/routes/embed+/v1+/multisign+/_index.tsx(57,25): error TS18047: 'organisationClaim.flags' is possibly 'null'.
|
||||
app/routes/embed+/v1+/multisign+/_index.tsx(57,49): error TS2339: Property 'hidePoweredBy' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'hidePoweredBy' does not exist on type 'string'.
|
||||
../../packages/api/v1/implementation.ts(488,3): error TS2322: Type '(args: { body: { globalAccessAuth: ("ACCOUNT" | "TWO_FACTOR_AUTH")[]; globalActionAuth: ("ACCOUNT" | "PASSKEY" | "TWO_FACTOR_AUTH" | "PASSWORD")[]; title: string; type?: "PUBLIC" | "PRIVATE" | undefined; ... 6 more ...; attachments?: { ...; }[] | undefined; }; headers: { ...; }; }, { request }: B) => Promise<...>' is not assignable to type 'AppRouteImplementationOrOptions<{ method: "POST"; body: ZodObject<{ title: ZodString; folderId: ZodOptional<ZodString>; externalId: ZodOptional<ZodNullable<ZodString>>; ... 7 more ...; attachments: ZodOptional<...>; }, "strip", ZodTypeAny, { ...; }, { ...; }>; summary: "Create a new template and get a presigned URL"...'.
|
||||
Type '(args: { body: { globalAccessAuth: ("ACCOUNT" | "TWO_FACTOR_AUTH")[]; globalActionAuth: ("ACCOUNT" | "PASSKEY" | "TWO_FACTOR_AUTH" | "PASSWORD")[]; title: string; type?: "PUBLIC" | "PRIVATE" | undefined; ... 6 more ...; attachments?: { ...; }[] | undefined; }; headers: { ...; }; }, { request }: B) => Promise<...>' is not assignable to type 'AppRouteImplementation<{ method: "POST"; body: ZodObject<{ title: ZodString; folderId: ZodOptional<ZodString>; externalId: ZodOptional<ZodNullable<ZodString>>; ... 7 more ...; attachments: ZodOptional<...>; }, "strip", ZodTypeAny, { ...; }, { ...; }>; summary: "Create a new template and get a presigned URL"; path: "...'.
|
||||
Type 'Promise<{ status: 500; body: { message: string; uploadUrl?: undefined; template?: undefined; }; } | { status: 400; body: { message: string; uploadUrl?: undefined; template?: undefined; }; } | { status: 200; body: { ...; }; } | { ...; } | { ...; }>' is not assignable to type 'Promise<Prettify<AppRouteResponses<{ method: "POST"; body: ZodObject<{ title: ZodString; folderId: ZodOptional<ZodString>; externalId: ZodOptional<ZodNullable<ZodString>>; ... 7 more ...; attachments: ZodOptional<...>; }, "strip", ZodTypeAny, { ...; }, { ...; }>; summary: "Create a new template and get a presigned U...'.
|
||||
Type '{ status: 500; body: { message: string; uploadUrl?: undefined; template?: undefined; }; } | { status: 400; body: { message: string; uploadUrl?: undefined; template?: undefined; }; } | { status: 200; body: { ...; }; } | { ...; } | { ...; }' is not assignable to type 'Prettify<AppRouteResponses<{ method: "POST"; body: ZodObject<{ title: ZodString; folderId: ZodOptional<ZodString>; externalId: ZodOptional<ZodNullable<ZodString>>; ... 7 more ...; attachments: ZodOptional<...>; }, "strip", ZodTypeAny, { ...; }, { ...; }>; summary: "Create a new template and get a presigned URL"; pat...'.
|
||||
Type '{ status: 200; body: { uploadUrl: string; template: { envelopeId: string; type: $Enums.TemplateType; templateDocumentDataId: string; templateDocumentData: { envelopeItemId: string; data: string; type: $Enums.DocumentDataType; id: string; initialData: string; }; ... 30 more ...; documentMetaId: string; }; message?: u...' is not assignable to type 'Prettify<AppRouteResponses<{ method: "POST"; body: ZodObject<{ title: ZodString; folderId: ZodOptional<ZodString>; externalId: ZodOptional<ZodNullable<ZodString>>; ... 7 more ...; attachments: ZodOptional<...>; }, "strip", ZodTypeAny, { ...; }, { ...; }>; summary: "Create a new template and get a presigned URL"; pat...'.
|
||||
Type '{ status: 200; body: { uploadUrl: string; template: { envelopeId: string; type: $Enums.TemplateType; templateDocumentDataId: string; templateDocumentData: { envelopeItemId: string; data: string; type: $Enums.DocumentDataType; id: string; initialData: string; }; ... 30 more ...; documentMetaId: string; }; message?: u...' is not assignable to type '{ status: 200; body: { template: { type: "PUBLIC" | "PRIVATE"; id: number; createdAt: Date; updatedAt: Date; userId: number; user: { id: number; name: string | null; email: string; }; folder: { ...; } | null; ... 15 more ...; templateDocumentDataId?: string | undefined; }; uploadUrl: string; }; }'.
|
||||
The types of 'body.template.fields' are incompatible between these types.
|
||||
Type '{ documentId: null; templateId: number; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; height: Decimal; ... 6 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Type '{ documentId: null; templateId: number; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; secondaryId: string; ... 8 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/auth/server/lib/utils/organisation-portal.ts(50,6): error TS18047: 'organisation.organisationClaim.flags' is possibly 'null'.
|
||||
../../packages/auth/server/lib/utils/organisation-portal.ts(50,43): error TS2339: Property 'authenticationPortal' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'authenticationPortal' does not exist on type 'string'.
|
||||
../../packages/ee/server-only/limits/server.ts(83,7): error TS18047: 'organisation.organisationClaim.flags' is possibly 'null'.
|
||||
../../packages/ee/server-only/limits/server.ts(83,44): error TS2339: Property 'unlimitedDocuments' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'unlimitedDocuments' does not exist on type 'string'.
|
||||
../../packages/lib/server-only/email/get-email-context.ts(170,7): error TS18047: 'claims.flags' is possibly 'null'.
|
||||
../../packages/lib/server-only/email/get-email-context.ts(170,20): error TS2339: Property 'hidePoweredBy' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'hidePoweredBy' does not exist on type 'string'.
|
||||
../../packages/lib/server-only/email/get-email-context.ts(221,7): error TS18047: 'claims.flags' is possibly 'null'.
|
||||
../../packages/lib/server-only/email/get-email-context.ts(221,20): error TS2339: Property 'hidePoweredBy' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'hidePoweredBy' does not exist on type 'string'.
|
||||
../../packages/lib/server-only/email/get-email-context.ts(235,8): error TS18047: 'organisation.organisationClaim.flags' is possibly 'null'.
|
||||
../../packages/lib/server-only/email/get-email-context.ts(235,45): error TS2339: Property 'emailDomains' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'emailDomains' does not exist on type 'string'.
|
||||
../../packages/lib/server-only/envelope/create-envelope.ts(216,6): error TS18047: 'team.organisation.organisationClaim.flags' is possibly 'null'.
|
||||
../../packages/lib/server-only/envelope/create-envelope.ts(216,48): error TS2339: Property 'cfr21' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'cfr21' does not exist on type 'string'.
|
||||
../../packages/lib/server-only/envelope/get-envelope-for-direct-template-signing.ts(144,5): error TS2322: Type '{ documentMeta: { id: string; language: string; message: string | null; subject: string | null; timezone: string | null; dateFormat: string | null; redirectUrl: string | null; signingOrder: DocumentSigningOrder; ... 7 more ...; emailId: string | null; }; ... 4 more ...; directLink: { ...; } | null; } & { ...; }' is not assignable to type '{ type: "DOCUMENT" | "TEMPLATE"; id: string; status: "DRAFT" | "PENDING" | "COMPLETED" | "REJECTED"; documentMeta: { language: string; timezone: string | null; dateFormat: string | null; ... 6 more ...; distributionMethod: "EMAIL" | "NONE"; }; ... 12 more ...; recipients: { ...; }[]; }'.
|
||||
Types of property 'authOptions' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ globalAccessAuth: ("ACCOUNT" | "TWO_FACTOR_AUTH")[]; globalActionAuth: ("ACCOUNT" | "PASSKEY" | "TWO_FACTOR_AUTH" | "PASSWORD")[]; } | null'.
|
||||
Type 'string' is not assignable to type '{ globalAccessAuth: ("ACCOUNT" | "TWO_FACTOR_AUTH")[]; globalActionAuth: ("ACCOUNT" | "PASSKEY" | "TWO_FACTOR_AUTH" | "PASSWORD")[]; }'.
|
||||
../../packages/lib/server-only/envelope/get-envelope-for-direct-template-signing.ts(148,7): error TS2322: Type '({ signature: { id: number; recipientId: number; fieldId: number; created: Date; signatureImageAsBase64: string | null; typedSignature: string | null; } | null; } & { type: FieldType; ... 12 more ...; inserted: boolean; })[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 11 more ...; ...'.
|
||||
Type '{ signature: { id: number; recipientId: number; fieldId: number; created: Date; signatureImageAsBase64: string | null; typedSignature: string | null; } | null; } & { type: FieldType; ... 12 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 11 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/lib/server-only/envelope/get-envelope-for-recipient-signing.ts(284,5): error TS2322: Type '{ documentMeta: { id: string; language: string; message: string | null; subject: string | null; timezone: string | null; dateFormat: string | null; redirectUrl: string | null; signingOrder: DocumentSigningOrder; ... 7 more ...; emailId: string | null; }; team: { ...; }; user: { ...; }; envelopeItems: { ...; }[]; rec...' is not assignable to type '{ type: "DOCUMENT" | "TEMPLATE"; id: string; status: "DRAFT" | "PENDING" | "COMPLETED" | "REJECTED"; documentMeta: { language: string; timezone: string | null; dateFormat: string | null; ... 6 more ...; distributionMethod: "EMAIL" | "NONE"; }; ... 12 more ...; recipients: { ...; }[]; }'.
|
||||
Types of property 'authOptions' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ globalAccessAuth: ("ACCOUNT" | "TWO_FACTOR_AUTH")[]; globalActionAuth: ("ACCOUNT" | "PASSKEY" | "TWO_FACTOR_AUTH" | "PASSWORD")[]; } | null'.
|
||||
Type 'string' is not assignable to type '{ globalAccessAuth: ("ACCOUNT" | "TWO_FACTOR_AUTH")[]; globalActionAuth: ("ACCOUNT" | "PASSKEY" | "TWO_FACTOR_AUTH" | "PASSWORD")[]; }'.
|
||||
../../packages/lib/server-only/envelope/get-envelope-for-recipient-signing.ts(285,5): error TS2322: Type '{ fields: ({ signature: { id: number; recipientId: number; fieldId: number; created: Date; signatureImageAsBase64: string | null; typedSignature: string | null; } | null; } & { type: FieldType; ... 12 more ...; inserted: boolean; })[]; } & { ...; }' is not assignable to type '{ id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; ... 13 more ...; signature?: { ...; } | ... 1 more ... | undefined; }[]; ... 10 more ...'.
|
||||
Types of property 'fields' are incompatible.
|
||||
Type '({ signature: { id: number; recipientId: number; fieldId: number; created: Date; signatureImageAsBase64: string | null; typedSignature: string | null; } | null; } & { type: FieldType; ... 12 more ...; inserted: boolean; })[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 11 more ...; ...'.
|
||||
Type '{ signature: { id: number; recipientId: number; fieldId: number; created: Date; signatureImageAsBase64: string | null; typedSignature: string | null; } | null; } & { type: FieldType; ... 12 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 11 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/lib/server-only/envelope/update-envelope.ts(119,42): error TS18047: 'envelope.team.organisation.organisationClaim.flags' is possibly 'null'.
|
||||
../../packages/lib/server-only/envelope/update-envelope.ts(119,93): error TS2339: Property 'cfr21' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'cfr21' does not exist on type 'string'.
|
||||
../../packages/lib/server-only/field/sign-field-with-token.ts(212,24): error TS2339: Property 'readOnly' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'readOnly' does not exist on type 'string'.
|
||||
../../packages/lib/server-only/field/sign-field-with-token.ts(217,42): error TS2589: Type instantiation is excessively deep and possibly infinite.
|
||||
../../packages/lib/server-only/field/sign-field-with-token.ts(223,24): error TS2339: Property 'filter' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'filter' does not exist on type 'string'.
|
||||
../../packages/lib/server-only/field/sign-field-with-token.ts(223,32): error TS7006: Parameter 'v' implicitly has an 'any' type.
|
||||
../../packages/lib/server-only/field/sign-field-with-token.ts(223,54): error TS7006: Parameter 'v' implicitly has an 'any' type.
|
||||
../../packages/lib/server-only/field/sign-field-with-token.ts(226,70): error TS2339: Property 'find' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'find' does not exist on type 'string'.
|
||||
../../packages/lib/server-only/field/sign-field-with-token.ts(226,76): error TS7006: Parameter 'v' implicitly has an 'any' type.
|
||||
../../packages/lib/server-only/field/update-envelope-fields.ts(102,77): error TS2339: Property 'type' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'type' does not exist on type 'string'.
|
||||
../../packages/lib/server-only/organisation/create-organisation.ts(64,7): error TS2322: Type '{ id: string; typedSignatureEnabled: boolean; uploadSignatureEnabled: boolean; drawSignatureEnabled: boolean; emailReplyTo: string | null; emailId: string | null; documentVisibility: $Enums.DocumentVisibility; ... 10 more ...; brandingCompanyDetails: string; }' is not assignable to type '(Without<OrganisationGlobalSettingsCreateInput, OrganisationGlobalSettingsUncheckedCreateInput> & OrganisationGlobalSettingsUncheckedCreateInput) | (Without<...> & OrganisationGlobalSettingsCreateInput)'.
|
||||
Type '{ id: string; typedSignatureEnabled: boolean; uploadSignatureEnabled: boolean; drawSignatureEnabled: boolean; emailReplyTo: string | null; emailId: string | null; documentVisibility: $Enums.DocumentVisibility; ... 10 more ...; brandingCompanyDetails: string; }' is not assignable to type 'Without<OrganisationGlobalSettingsCreateInput, OrganisationGlobalSettingsUncheckedCreateInput> & OrganisationGlobalSettingsUncheckedCreateInput'.
|
||||
Type '{ id: string; typedSignatureEnabled: boolean; uploadSignatureEnabled: boolean; drawSignatureEnabled: boolean; emailReplyTo: string | null; emailId: string | null; documentVisibility: $Enums.DocumentVisibility; ... 10 more ...; brandingCompanyDetails: string; }' is not assignable to type 'OrganisationGlobalSettingsUncheckedCreateInput'.
|
||||
Types of property 'emailDocumentSettings' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type 'JsonNull | InputJsonValue'.
|
||||
Type 'null' is not assignable to type 'JsonNull | InputJsonValue'.
|
||||
../../packages/lib/server-only/organisation/create-organisation.ts(206,7): error TS2698: Spread types may only be created from object types.
|
||||
../../packages/lib/server-only/pdf/insert-field-in-pdf-v2.ts(41,7): error TS2322: Type '{ width: number; height: number; positionX: number; positionY: number; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; ... 8 more ...; renderId: string; }' is not assignable to type 'FieldToRender'.
|
||||
Type '{ width: number; height: number; positionX: number; positionY: number; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; ... 8 more ...; renderId: string; }' is not assignable to type '{ renderId: string; width: number; height: number; positionX: number; positionY: number; fieldMeta?: { type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | u...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 10 more ... | undefined'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 10 more ... | undefined'.
|
||||
../../packages/lib/server-only/recipient/create-envelope-recipients.ts(80,36): error TS18047: 'envelope.team.organisation.organisationClaim.flags' is possibly 'null'.
|
||||
../../packages/lib/server-only/recipient/create-envelope-recipients.ts(80,87): error TS2339: Property 'cfr21' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'cfr21' does not exist on type 'string'.
|
||||
../../packages/lib/server-only/recipient/set-document-recipients.ts(109,36): error TS18047: 'envelope.team.organisation.organisationClaim.flags' is possibly 'null'.
|
||||
../../packages/lib/server-only/recipient/set-document-recipients.ts(109,87): error TS2339: Property 'cfr21' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'cfr21' does not exist on type 'string'.
|
||||
../../packages/lib/server-only/recipient/set-template-recipients.ts(73,36): error TS18047: 'envelope.team.organisation.organisationClaim.flags' is possibly 'null'.
|
||||
../../packages/lib/server-only/recipient/set-template-recipients.ts(73,87): error TS2339: Property 'cfr21' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'cfr21' does not exist on type 'string'.
|
||||
../../packages/lib/server-only/recipient/update-envelope-recipients.ts(88,36): error TS18047: 'envelope.team.organisation.organisationClaim.flags' is possibly 'null'.
|
||||
../../packages/lib/server-only/recipient/update-envelope-recipients.ts(88,87): error TS2339: Property 'cfr21' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'cfr21' does not exist on type 'string'.
|
||||
../../packages/lib/server-only/team/create-team.ts(138,11): error TS2322: Type '{ id: string; typedSignatureEnabled: boolean | null; uploadSignatureEnabled: boolean | null; drawSignatureEnabled: boolean | null; emailReplyTo: string | null; emailId: string | null; ... 11 more ...; brandingCompanyDetails: string | null; }' is not assignable to type '(Without<TeamGlobalSettingsCreateInput, TeamGlobalSettingsUncheckedCreateInput> & TeamGlobalSettingsUncheckedCreateInput) | (Without<...> & TeamGlobalSettingsCreateInput)'.
|
||||
Type '{ id: string; typedSignatureEnabled: boolean | null; uploadSignatureEnabled: boolean | null; drawSignatureEnabled: boolean | null; emailReplyTo: string | null; emailId: string | null; ... 11 more ...; brandingCompanyDetails: string | null; }' is not assignable to type 'Without<TeamGlobalSettingsCreateInput, TeamGlobalSettingsUncheckedCreateInput> & TeamGlobalSettingsUncheckedCreateInput'.
|
||||
Type '{ id: string; typedSignatureEnabled: boolean | null; uploadSignatureEnabled: boolean | null; drawSignatureEnabled: boolean | null; emailReplyTo: string | null; emailId: string | null; ... 11 more ...; brandingCompanyDetails: string | null; }' is not assignable to type 'TeamGlobalSettingsUncheckedCreateInput'.
|
||||
Types of property 'emailDocumentSettings' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type 'NullableJsonNullValueInput | InputJsonValue | undefined'.
|
||||
Type 'null' is not assignable to type 'NullableJsonNullValueInput | InputJsonValue | undefined'.
|
||||
../../packages/lib/server-only/template/create-document-from-direct-template.ts(661,59): error TS2339: Property 'actionAuth' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'actionAuth' does not exist on type 'string'.
|
||||
../../packages/lib/server-only/template/create-document-from-template.ts(150,9): error TS2698: Spread types may only be created from object types.
|
||||
../../packages/lib/server-only/template/create-document-from-template.ts(167,9): error TS2698: Spread types may only be created from object types.
|
||||
../../packages/lib/server-only/template/create-document-from-template.ts(208,9): error TS2698: Spread types may only be created from object types.
|
||||
../../packages/lib/server-only/template/create-document-from-template.ts(253,9): error TS2698: Spread types may only be created from object types.
|
||||
../../packages/lib/server-only/template/create-document-from-template.ts(283,9): error TS2698: Spread types may only be created from object types.
|
||||
../../packages/lib/utils/document.ts(85,5): error TS2322: Type 'JsonValue' is not assignable to type '{ globalAccessAuth: ("ACCOUNT" | "TWO_FACTOR_AUTH")[]; globalActionAuth: ("ACCOUNT" | "PASSKEY" | "TWO_FACTOR_AUTH" | "PASSWORD")[]; } | null'.
|
||||
Type 'string' is not assignable to type '{ globalAccessAuth: ("ACCOUNT" | "TWO_FACTOR_AUTH")[]; globalActionAuth: ("ACCOUNT" | "PASSKEY" | "TWO_FACTOR_AUTH" | "PASSWORD")[]; }'.
|
||||
../../packages/lib/utils/document.ts(86,5): error TS2322: Type 'JsonValue' is not assignable to type 'Record<string, string | number | boolean> | null'.
|
||||
Type 'string' is not assignable to type 'Record<string, string | number | boolean>'.
|
||||
../../packages/lib/utils/document.ts(125,5): error TS2322: Type 'JsonValue' is not assignable to type '{ globalAccessAuth: ("ACCOUNT" | "TWO_FACTOR_AUTH")[]; globalActionAuth: ("ACCOUNT" | "PASSKEY" | "TWO_FACTOR_AUTH" | "PASSWORD")[]; } | null'.
|
||||
Type 'string' is not assignable to type '{ globalAccessAuth: ("ACCOUNT" | "TWO_FACTOR_AUTH")[]; globalActionAuth: ("ACCOUNT" | "PASSKEY" | "TWO_FACTOR_AUTH" | "PASSWORD")[]; }'.
|
||||
../../packages/lib/utils/document.ts(126,5): error TS2322: Type 'JsonValue' is not assignable to type 'Record<string, string | number | boolean> | null'.
|
||||
Type 'string' is not assignable to type 'Record<string, string | number | boolean>'.
|
||||
../../packages/lib/utils/document.ts(146,5): error TS2322: Type '{ documentId: number | null; templateId: number | null; id: number; name: string; token: string; email: string; signingOrder: number | null; envelopeId: string; authOptions: JsonValue; ... 7 more ...; sendStatus: SendStatus; }[]' is not assignable to type '{ id: number; name: string; token: string; email: string; signingOrder: number | null; envelopeId: string; authOptions: { accessAuth: ("ACCOUNT" | "TWO_FACTOR_AUTH")[]; actionAuth: ("ACCOUNT" | "PASSKEY" | "TWO_FACTOR_AUTH" | "PASSWORD" | "EXPLICIT_NONE")[]; } | null; ... 9 more ...; templateId?: number | ... 1 more...'.
|
||||
Type '{ documentId: number | null; templateId: number | null; id: number; name: string; token: string; email: string; signingOrder: number | null; envelopeId: string; authOptions: JsonValue | null; ... 7 more ...; sendStatus: $Enums.SendStatus; }' is not assignable to type '{ id: number; name: string; token: string; email: string; signingOrder: number | null; envelopeId: string; authOptions: { accessAuth: ("ACCOUNT" | "TWO_FACTOR_AUTH")[]; actionAuth: ("ACCOUNT" | "PASSKEY" | "TWO_FACTOR_AUTH" | "PASSWORD" | "EXPLICIT_NONE")[]; } | null; ... 9 more ...; templateId?: number | ... 1 more...'.
|
||||
Types of property 'authOptions' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ accessAuth: ("ACCOUNT" | "TWO_FACTOR_AUTH")[]; actionAuth: ("ACCOUNT" | "PASSKEY" | "TWO_FACTOR_AUTH" | "PASSWORD" | "EXPLICIT_NONE")[]; } | null'.
|
||||
Type 'string' is not assignable to type '{ accessAuth: ("ACCOUNT" | "TWO_FACTOR_AUTH")[]; actionAuth: ("ACCOUNT" | "PASSKEY" | "TWO_FACTOR_AUTH" | "PASSWORD" | "EXPLICIT_NONE")[]; }'.
|
||||
../../packages/lib/utils/templates.ts(61,5): error TS2322: Type 'JsonValue' is not assignable to type '{ globalAccessAuth: ("ACCOUNT" | "TWO_FACTOR_AUTH")[]; globalActionAuth: ("ACCOUNT" | "PASSKEY" | "TWO_FACTOR_AUTH" | "PASSWORD")[]; } | null'.
|
||||
Type 'string' is not assignable to type '{ globalAccessAuth: ("ACCOUNT" | "TWO_FACTOR_AUTH")[]; globalActionAuth: ("ACCOUNT" | "PASSKEY" | "TWO_FACTOR_AUTH" | "PASSWORD")[]; }'.
|
||||
../../packages/trpc/server/admin-router/find-subscription-claims.ts(17,10): error TS2345: Argument of type '({ input }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: SessionUser; session: { id: string; createdAt: Date; updatedAt: Date; userId: number; ipAddress: string | null; userAgent: string | null; sessionToken: string; expiresAt: Date; }; ... 4 more ...; res: Response; }, { ...; }>) => Promise<...>' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: SessionUser; session: { id: string; createdAt: Date; updatedAt: Date; userId: number; ipAddress: string | null; userAgent: string | null; sessionToken: string; expiresAt: Date; }; ... 4 more ...; res: Response; }, { ...; }, { ...; }, unknown>'.
|
||||
Type 'Promise<{ data: { id: string; name: string; createdAt: Date; updatedAt: Date; locked: boolean; teamCount: number; memberCount: number; envelopeItemCount: number; flags: JsonValue; }[]; count: number; currentPage: number; perPage: number; totalPages: number; }>' is not assignable to type 'MaybePromise<{ data: { id: string; name: string; createdAt: Date; updatedAt: Date; locked: boolean; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; ... 9 more ...; allowEnvelopes?: boolean | undefined; }; }[]; count: number; perPage: number; curr...'.
|
||||
Type 'Promise<{ data: { id: string; name: string; createdAt: Date; updatedAt: Date; locked: boolean; teamCount: number; memberCount: number; envelopeItemCount: number; flags: JsonValue; }[]; count: number; currentPage: number; perPage: number; totalPages: number; }>' is not assignable to type 'Promise<{ data: { id: string; name: string; createdAt: Date; updatedAt: Date; locked: boolean; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; ... 9 more ...; allowEnvelopes?: boolean | undefined; }; }[]; count: number; perPage: number; currentPa...'.
|
||||
Type '{ data: { id: string; name: string; createdAt: Date; updatedAt: Date; locked: boolean; teamCount: number; memberCount: number; envelopeItemCount: number; flags: Prisma.JsonValue; }[]; count: number; currentPage: number; perPage: number; totalPages: number; }' is not assignable to type '{ data: { id: string; name: string; createdAt: Date; updatedAt: Date; locked: boolean; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; ... 9 more ...; allowEnvelopes?: boolean | undefined; }; }[]; count: number; perPage: number; currentPage: numb...'.
|
||||
Types of property 'data' are incompatible.
|
||||
Type '{ id: string; name: string; createdAt: Date; updatedAt: Date; locked: boolean; teamCount: number; memberCount: number; envelopeItemCount: number; flags: JsonValue; }[]' is not assignable to type '{ id: string; name: string; createdAt: Date; updatedAt: Date; locked: boolean; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; ... 9 more ...; allowEnvelopes?: boolean | undefined; }; }[]'.
|
||||
Type '{ id: string; name: string; createdAt: Date; updatedAt: Date; locked: boolean; teamCount: number; memberCount: number; envelopeItemCount: number; flags: JsonValue; }' is not assignable to type '{ id: string; name: string; createdAt: Date; updatedAt: Date; locked: boolean; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; ... 9 more ...; allowEnvelopes?: boolean | undefined; }; }'.
|
||||
Types of property 'flags' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; emailDomains?: boolean | undefined; embedAuthoring?: boolean | undefined; ... 5 more ...; allowEnvelopes?: boolean | undefined; }'.
|
||||
Type 'null' is not assignable to type '{ allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; emailDomains?: boolean | undefined; embedAuthoring?: boolean | undefined; ... 5 more ...; allowEnvelopes?: boolean | undefined; }'.
|
||||
../../packages/trpc/server/admin-router/find-subscription-claims.ts(70,5): error TS2322: Type '{ id: string; name: string; createdAt: Date; updatedAt: Date; locked: boolean; teamCount: number; memberCount: number; envelopeItemCount: number; flags: JsonValue; }[]' is not assignable to type '{ id: string; name: string; createdAt: Date; updatedAt: Date; locked: boolean; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; ... 9 more ...; allowEnvelopes?: boolean | undefined; }; }[]'.
|
||||
Type '{ id: string; name: string; createdAt: Date; updatedAt: Date; locked: boolean; teamCount: number; memberCount: number; envelopeItemCount: number; flags: JsonValue; }' is not assignable to type '{ id: string; name: string; createdAt: Date; updatedAt: Date; locked: boolean; teamCount: number; memberCount: number; envelopeItemCount: number; flags: { allowCustomBranding?: boolean | undefined; ... 9 more ...; allowEnvelopes?: boolean | undefined; }; }'.
|
||||
Types of property 'flags' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; emailDomains?: boolean | undefined; embedAuthoring?: boolean | undefined; ... 5 more ...; allowEnvelopes?: boolean | undefined; }'.
|
||||
Type 'null' is not assignable to type '{ allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; emailDomains?: boolean | undefined; embedAuthoring?: boolean | undefined; ... 5 more ...; allowEnvelopes?: boolean | undefined; }'.
|
||||
../../packages/trpc/server/admin-router/get-admin-organisation.ts(13,10): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: SessionUser; session: { id: string; createdAt: Date; updatedAt: Date; userId: number; ipAddress: string | null; userAgent: string | null; sessionToken: string; expiresAt: Date; }; ... 4 more ...; res: Response; }, { ...; }>) => Promise<...>' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: SessionUser; session: { id: string; createdAt: Date; updatedAt: Date; userId: number; ipAddress: string | null; userAgent: string | null; sessionToken: string; expiresAt: Date; }; ... 4 more ...; res: Response; }, { ...; }, { ...; }, unknown>'.
|
||||
Type 'Promise<{ subscription: { id: number; status: SubscriptionStatus; priceId: string; createdAt: Date; updatedAt: Date; customerId: string; organisationId: string; planId: string; periodEnd: Date | null; cancelAtPeriodEnd: boolean; } | null; organisationClaim: { ...; }; organisationGlobalSettings: { ...; }; members: ({...' is not assignable to type 'MaybePromise<{ type: "PERSONAL" | "ORGANISATION"; id: string; name: string; url: string; createdAt: Date; updatedAt: Date; subscription: { id: number; status: "ACTIVE" | "PAST_DUE" | "INACTIVE"; ... 7 more ...; cancelAtPeriodEnd: boolean; } | null; ... 6 more ...; teams: { ...; }[]; }>'.
|
||||
Type 'Promise<{ subscription: { id: number; status: SubscriptionStatus; priceId: string; createdAt: Date; updatedAt: Date; customerId: string; organisationId: string; planId: string; periodEnd: Date | null; cancelAtPeriodEnd: boolean; } | null; organisationClaim: { ...; }; organisationGlobalSettings: { ...; }; members: ({...' is not assignable to type 'Promise<{ type: "PERSONAL" | "ORGANISATION"; id: string; name: string; url: string; createdAt: Date; updatedAt: Date; subscription: { id: number; status: "ACTIVE" | "PAST_DUE" | "INACTIVE"; ... 7 more ...; cancelAtPeriodEnd: boolean; } | null; ... 6 more ...; teams: { ...; }[]; }>'.
|
||||
Type '{ subscription: { id: number; status: SubscriptionStatus; priceId: string; createdAt: Date; updatedAt: Date; customerId: string; organisationId: string; planId: string; periodEnd: Date | null; cancelAtPeriodEnd: boolean; } | null; organisationClaim: { ...; }; organisationGlobalSettings: { ...; }; members: ({ ...; } ...' is not assignable to type '{ type: "PERSONAL" | "ORGANISATION"; id: string; name: string; url: string; createdAt: Date; updatedAt: Date; subscription: { id: number; status: "ACTIVE" | "PAST_DUE" | "INACTIVE"; ... 7 more ...; cancelAtPeriodEnd: boolean; } | null; ... 6 more ...; teams: { ...; }[]; }'.
|
||||
The types of 'organisationClaim.flags' are incompatible between these types.
|
||||
Type 'JsonValue' is not assignable to type '{ allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; emailDomains?: boolean | undefined; embedAuthoring?: boolean | undefined; ... 5 more ...; allowEnvelopes?: boolean | undefined; }'.
|
||||
Type 'null' is not assignable to type '{ allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; emailDomains?: boolean | undefined; embedAuthoring?: boolean | undefined; ... 5 more ...; allowEnvelopes?: boolean | undefined; }'.
|
||||
../../packages/trpc/server/admin-router/update-subscription-claim.ts(30,49): error TS2345: Argument of type 'JsonValue' is not assignable to parameter of type 'Partial<{ allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; emailDomains?: boolean | undefined; embedAuthoring?: boolean | undefined; ... 5 more ...; allowEnvelopes?: boolean | undefined; }>'.
|
||||
Type 'null' is not assignable to type 'Partial<{ allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; emailDomains?: boolean | undefined; embedAuthoring?: boolean | undefined; ... 5 more ...; allowEnvelopes?: boolean | undefined; }>'.
|
||||
../../packages/trpc/server/document-router/attachment/find-attachments.ts(24,10): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ data: { data: string; type: string; id: string; label: string; createdAt: Date; updatedAt: Date; envelopeId: string; }[]; }>' is not assignable to type 'MaybePromise<{ data: { data: string; type: "link"; id: string; label: string; }[]; }>'.
|
||||
Type 'Promise<{ data: { data: string; type: string; id: string; label: string; createdAt: Date; updatedAt: Date; envelopeId: string; }[]; }>' is not assignable to type 'Promise<{ data: { data: string; type: "link"; id: string; label: string; }[]; }>'.
|
||||
Type '{ data: { data: string; type: string; id: string; label: string; createdAt: Date; updatedAt: Date; envelopeId: string; }[]; }' is not assignable to type '{ data: { data: string; type: "link"; id: string; label: string; }[]; }'.
|
||||
Types of property 'data' are incompatible.
|
||||
Type '{ data: string; type: string; id: string; label: string; createdAt: Date; updatedAt: Date; envelopeId: string; }[]' is not assignable to type '{ data: string; type: "link"; id: string; label: string; }[]'.
|
||||
Type '{ data: string; type: string; id: string; label: string; createdAt: Date; updatedAt: Date; envelopeId: string; }' is not assignable to type '{ data: string; type: "link"; id: string; label: string; }'.
|
||||
Types of property 'type' are incompatible.
|
||||
Type 'string' is not assignable to type '"link"'.
|
||||
../../packages/trpc/server/document-router/create-document-temporary.ts(28,13): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ document: { envelopeId: string; documentDataId: string; documentData: { envelopeItemId: string; data: string; type: DocumentDataType; id: string; initialData: string; }; ... 30 more ...; documentMetaId: string; }; folder: { ...; } | null; uploadUrl: string; }>' is not assignable to type 'MaybePromise<{ document: { id: number; source: "DOCUMENT" | "TEMPLATE" | "TEMPLATE_DIRECT_LINK"; status: "DRAFT" | "PENDING" | "COMPLETED" | "REJECTED"; documentMeta: { id: string; language: string; ... 15 more ...; documentId?: number | undefined; }; ... 20 more ...; documentDataId?: string | undefined; }; uploadUr...'.
|
||||
Type 'Promise<{ document: { envelopeId: string; documentDataId: string; documentData: { envelopeItemId: string; data: string; type: DocumentDataType; id: string; initialData: string; }; ... 30 more ...; documentMetaId: string; }; folder: { ...; } | null; uploadUrl: string; }>' is not assignable to type 'Promise<{ document: { id: number; source: "DOCUMENT" | "TEMPLATE" | "TEMPLATE_DIRECT_LINK"; status: "DRAFT" | "PENDING" | "COMPLETED" | "REJECTED"; documentMeta: { id: string; language: string; ... 15 more ...; documentId?: number | undefined; }; ... 20 more ...; documentDataId?: string | undefined; }; uploadUrl: st...'.
|
||||
Type '{ document: { envelopeId: string; documentDataId: string; documentData: { envelopeItemId: string; data: string; type: $Enums.DocumentDataType; id: string; initialData: string; }; ... 30 more ...; documentMetaId: string; }; folder: { ...; } | null; uploadUrl: string; }' is not assignable to type '{ document: { id: number; source: "DOCUMENT" | "TEMPLATE" | "TEMPLATE_DIRECT_LINK"; status: "DRAFT" | "PENDING" | "COMPLETED" | "REJECTED"; documentMeta: { id: string; language: string; ... 15 more ...; documentId?: number | undefined; }; ... 20 more ...; documentDataId?: string | undefined; }; uploadUrl: string; }'.
|
||||
The types of 'document.fields' are incompatible between these types.
|
||||
Type '{ documentId: number; templateId: null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; height: Decimal; ... 6 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Type '{ documentId: number; templateId: null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; secondaryId: string; ... 8 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/document-router/get-document.ts(14,10): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ envelopeId: string; internalVersion: number; documentData: { envelopeItemId: string; data: string; type: DocumentDataType; id: string; initialData: string; }; id: number; ... 31 more ...; documentMetaId: string; }>' is not assignable to type 'MaybePromise<{ id: number; source: "DOCUMENT" | "TEMPLATE" | "TEMPLATE_DIRECT_LINK"; status: "DRAFT" | "PENDING" | "COMPLETED" | "REJECTED"; documentMeta: { id: string; language: string; message: string | null; ... 14 more ...; documentId?: number | undefined; }; ... 20 more ...; documentDataId?: string | undefined;...'.
|
||||
Type 'Promise<{ envelopeId: string; internalVersion: number; documentData: { envelopeItemId: string; data: string; type: DocumentDataType; id: string; initialData: string; }; id: number; ... 31 more ...; documentMetaId: string; }>' is not assignable to type 'Promise<{ id: number; source: "DOCUMENT" | "TEMPLATE" | "TEMPLATE_DIRECT_LINK"; status: "DRAFT" | "PENDING" | "COMPLETED" | "REJECTED"; documentMeta: { id: string; language: string; message: string | null; ... 14 more ...; documentId?: number | undefined; }; ... 20 more ...; documentDataId?: string | undefined; }>'.
|
||||
Type '{ envelopeId: string; internalVersion: number; documentData: { envelopeItemId: string; data: string; type: $Enums.DocumentDataType; id: string; initialData: string; }; ... 32 more ...; documentMetaId: string; }' is not assignable to type '{ id: number; source: "DOCUMENT" | "TEMPLATE" | "TEMPLATE_DIRECT_LINK"; status: "DRAFT" | "PENDING" | "COMPLETED" | "REJECTED"; documentMeta: { id: string; language: string; message: string | null; ... 14 more ...; documentId?: number | undefined; }; ... 20 more ...; documentDataId?: string | undefined; }'.
|
||||
Types of property 'fields' are incompatible.
|
||||
Type '{ documentId: number; templateId: null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; height: Decimal; ... 6 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Type '{ documentId: number; templateId: null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; secondaryId: string; ... 8 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/document-router/update-document.ts(18,13): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ id: number; envelopeId: string; type: EnvelopeType; source: DocumentSource; status: DocumentStatus; createdAt: Date; updatedAt: Date; ... 18 more ...; documentMetaId: string; }>' is not assignable to type 'MaybePromise<{ id: number; source: "DOCUMENT" | "TEMPLATE" | "TEMPLATE_DIRECT_LINK"; status: "DRAFT" | "PENDING" | "COMPLETED" | "REJECTED"; createdAt: Date; updatedAt: Date; userId: number; ... 13 more ...; documentDataId?: string | undefined; }>'.
|
||||
Type 'Promise<{ id: number; envelopeId: string; type: EnvelopeType; source: DocumentSource; status: DocumentStatus; createdAt: Date; updatedAt: Date; ... 18 more ...; documentMetaId: string; }>' is not assignable to type 'Promise<{ id: number; source: "DOCUMENT" | "TEMPLATE" | "TEMPLATE_DIRECT_LINK"; status: "DRAFT" | "PENDING" | "COMPLETED" | "REJECTED"; createdAt: Date; updatedAt: Date; userId: number; ... 13 more ...; documentDataId?: string | undefined; }>'.
|
||||
Type '{ id: number; envelopeId: string; type: $Enums.EnvelopeType; source: $Enums.DocumentSource; status: $Enums.DocumentStatus; ... 20 more ...; documentMetaId: string; }' is not assignable to type '{ id: number; source: "DOCUMENT" | "TEMPLATE" | "TEMPLATE_DIRECT_LINK"; status: "DRAFT" | "PENDING" | "COMPLETED" | "REJECTED"; createdAt: Date; updatedAt: Date; userId: number; ... 13 more ...; documentDataId?: string | undefined; }'.
|
||||
Types of property 'formValues' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type 'Record<string, string | number | boolean> | null'.
|
||||
Type 'string' is not assignable to type 'Record<string, string | number | boolean>'.
|
||||
../../packages/trpc/server/embedding-router/create-embedding-presign-token.ts(47,14): error TS18047: 'organisationClaim.flags' is possibly 'null'.
|
||||
../../packages/trpc/server/embedding-router/create-embedding-presign-token.ts(47,38): error TS2339: Property 'embedAuthoring' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'embedAuthoring' does not exist on type 'string'.
|
||||
../../packages/trpc/server/embedding-router/get-multi-sign-document.ts(17,10): error TS2345: Argument of type '({ input, ctx: { metadata } }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: null; session: null; metadata: ApiRequestMetadata; teamId: number | undefined; logger: Logger<...>; req: Request; res: Response; } | { ...; }, { ...; }>) => Promise<...>' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: null; session: null; metadata: ApiRequestMetadata; teamId: number | undefined; logger: Logger<...>; req: Request; res: Response; } | { ...; }, { ...; }, { ...; }, unknown>'.
|
||||
Type 'Promise<{ folder: null; fields: { recipient: { documentId: number; templateId: null; fields: { type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; ... 8 more ...; inserted: boolean; }[]; ... 14 more ...; sendStatus: SendStatus; }; ... 16 more ...; inserted: boolean; }[]; ... 3...' is not assignable to type 'MaybePromise<{ id: number; source: "DOCUMENT" | "TEMPLATE" | "TEMPLATE_DIRECT_LINK"; status: "DRAFT" | "PENDING" | "COMPLETED" | "REJECTED"; documentMeta: { id: string; language: string; message: string | null; ... 10 more ...; emailSettings?: unknown; } | null; ... 19 more ...; documentDataId?: string | undefined; }>'.
|
||||
Type 'Promise<{ folder: null; fields: { recipient: { documentId: number; templateId: null; fields: { type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; ... 8 more ...; inserted: boolean; }[]; ... 14 more ...; sendStatus: SendStatus; }; ... 16 more ...; inserted: boolean; }[]; ... 3...' is not assignable to type 'Promise<{ id: number; source: "DOCUMENT" | "TEMPLATE" | "TEMPLATE_DIRECT_LINK"; status: "DRAFT" | "PENDING" | "COMPLETED" | "REJECTED"; documentMeta: { id: string; language: string; message: string | null; ... 10 more ...; emailSettings?: unknown; } | null; ... 19 more ...; documentDataId?: string | undefined; }>'.
|
||||
Type '{ folder: null; fields: { recipient: { documentId: number; templateId: null; fields: { type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; ... 10 more ...; inserted: boolean; }[]; ... 14 more ...; sendStatus: $Enums.SendStatus; }; ... 16 more ...; inserted: boolean; }[]; ... 31 more ...; documentMetaId:...' is not assignable to type '{ id: number; source: "DOCUMENT" | "TEMPLATE" | "TEMPLATE_DIRECT_LINK"; status: "DRAFT" | "PENDING" | "COMPLETED" | "REJECTED"; documentMeta: { id: string; language: string; message: string | null; ... 10 more ...; emailSettings?: unknown; } | null; ... 19 more ...; documentDataId?: string | undefined; }'.
|
||||
Types of property 'fields' are incompatible.
|
||||
Type '{ recipient: { documentId: number; templateId: null; fields: { type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]; ... 14 more ...; sendStatus: SendStatus; }; ... 16 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; signature: { id: number; recipientId: number; fieldId: number; created: Date; signatureImageAsBase64: string | null; typedSignature: string | null; } | null; ... 12 mor...'.
|
||||
Type '{ recipient: { documentId: number; templateId: null; fields: { type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; ... 9 more ...; inserted: boolean; }[]; ... 14 more ...; sendStatus: $Enums.SendStatus; }; ... 16 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; signature: { id: number; recipientId: number; fieldId: number; created: Date; signatureImageAsBase64: string | null; typedSignature: string | null; } | null; ... 12 mor...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/enterprise-router/create-organisation-email-domain.ts(50,10): error TS18047: 'organisation.organisationClaim.flags' is possibly 'null'.
|
||||
../../packages/trpc/server/enterprise-router/create-organisation-email-domain.ts(50,47): error TS2339: Property 'emailDomains' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'emailDomains' does not exist on type 'string'.
|
||||
../../packages/trpc/server/enterprise-router/get-organisation-authentication-portal.ts(67,8): error TS18047: 'organisation.organisationClaim.flags' is possibly 'null'.
|
||||
../../packages/trpc/server/enterprise-router/get-organisation-authentication-portal.ts(67,45): error TS2339: Property 'authenticationPortal' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'authenticationPortal' does not exist on type 'string'.
|
||||
../../packages/trpc/server/enterprise-router/update-organisation-authentication-portal.ts(50,10): error TS18047: 'organisation.organisationClaim.flags' is possibly 'null'.
|
||||
../../packages/trpc/server/enterprise-router/update-organisation-authentication-portal.ts(50,47): error TS2339: Property 'authenticationPortal' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'authenticationPortal' does not exist on type 'string'.
|
||||
../../packages/trpc/server/envelope-router/attachment/find-attachments.ts(16,10): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ data: { data: string; type: string; id: string; label: string; createdAt: Date; updatedAt: Date; envelopeId: string; }[]; }>' is not assignable to type 'MaybePromise<{ data: { data: string; type: "link"; id: string; label: string; }[]; }>'.
|
||||
Type 'Promise<{ data: { data: string; type: string; id: string; label: string; createdAt: Date; updatedAt: Date; envelopeId: string; }[]; }>' is not assignable to type 'Promise<{ data: { data: string; type: "link"; id: string; label: string; }[]; }>'.
|
||||
Type '{ data: { data: string; type: string; id: string; label: string; createdAt: Date; updatedAt: Date; envelopeId: string; }[]; }' is not assignable to type '{ data: { data: string; type: "link"; id: string; label: string; }[]; }'.
|
||||
Types of property 'data' are incompatible.
|
||||
Type '{ data: string; type: string; id: string; label: string; createdAt: Date; updatedAt: Date; envelopeId: string; }[]' is not assignable to type '{ data: string; type: "link"; id: string; label: string; }[]'.
|
||||
Type '{ data: string; type: string; id: string; label: string; createdAt: Date; updatedAt: Date; envelopeId: string; }' is not assignable to type '{ data: string; type: "link"; id: string; label: string; }'.
|
||||
Types of property 'type' are incompatible.
|
||||
Type 'string' is not assignable to type '"link"'.
|
||||
../../packages/trpc/server/envelope-router/envelope-fields/create-envelope-fields.ts(14,13): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ data: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]; }>' is not assignable to type 'MaybePromise<{ data: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templat...'.
|
||||
Type 'Promise<{ data: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]; }>' is not assignable to type 'Promise<{ data: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId?:...'.
|
||||
Type '{ data: { documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; ... 10 more ...; inserted: boolean; }[]; }' is not assignable to type '{ data: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId?: number ...'.
|
||||
Types of property 'data' are incompatible.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; ... 9 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/envelope-router/envelope-fields/get-envelope-field.ts(14,10): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }>' is not assignable to type 'MaybePromise<{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 10 more ...; inserted: boole...'.
|
||||
Type 'Promise<{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }>' is not assignable to type 'Promise<{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 10 more ...; inserted: boolean; }>'.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; ... 9 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 10 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/envelope-router/envelope-fields/update-envelope-fields.ts(14,13): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ data: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]; }>' is not assignable to type 'MaybePromise<{ data: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templat...'.
|
||||
Type 'Promise<{ data: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]; }>' is not assignable to type 'Promise<{ data: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId?:...'.
|
||||
Type '{ data: { documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; ... 10 more ...; inserted: boolean; }[]; }' is not assignable to type '{ data: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId?: number ...'.
|
||||
Types of property 'data' are incompatible.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; ... 9 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/envelope-router/envelope-recipients/get-envelope-recipient.ts(16,10): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ fields: { type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; height: Decimal; recipientId: number; ... 5 more ...; inserted: boolean; }[]; } & { ...; }>' is not assignable to type 'MaybePromise<{ id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ...'.
|
||||
Type 'Promise<{ fields: { type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; height: Decimal; recipientId: number; ... 5 more ...; inserted: boolean; }[]; } & { ...; }>' is not assignable to type 'Promise<{ id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ... 9...'.
|
||||
Type '{ fields: { type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; height: Decimal; recipientId: number; ... 5 more ...; inserted: boolean; }[]; } & { ...; }' is not assignable to type '{ id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ... 9 more .....'.
|
||||
Types of property 'fields' are incompatible.
|
||||
Type '{ type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; height: Decimal; recipientId: number; ... 5 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Type '{ type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; height: Decimal; recipientId: number; ... 5 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/envelope-router/get-envelope.ts(14,10): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ user: { id: number; name: string; email: string; }; documentMeta: { id: string; language: string; message: string | null; subject: string | null; timezone: string | null; dateFormat: string | null; ... 9 more ...; emailId: string | null; }; ... 30 more ...; documentMetaId: string; }>' is not assignable to type 'MaybePromise<{ type: "DOCUMENT" | "TEMPLATE"; id: string; source: "DOCUMENT" | "TEMPLATE" | "TEMPLATE_DIRECT_LINK"; status: "DRAFT" | "PENDING" | "COMPLETED" | "REJECTED"; documentMeta: { id: string; ... 14 more ...; emailSettings?: unknown; }; ... 23 more ...; authOptions?: unknown; }>'.
|
||||
Type 'Promise<{ user: { id: number; name: string; email: string; }; documentMeta: { id: string; language: string; message: string | null; subject: string | null; timezone: string | null; dateFormat: string | null; ... 9 more ...; emailId: string | null; }; ... 30 more ...; documentMetaId: string; }>' is not assignable to type 'Promise<{ type: "DOCUMENT" | "TEMPLATE"; id: string; source: "DOCUMENT" | "TEMPLATE" | "TEMPLATE_DIRECT_LINK"; status: "DRAFT" | "PENDING" | "COMPLETED" | "REJECTED"; documentMeta: { id: string; ... 14 more ...; emailSettings?: unknown; }; ... 23 more ...; authOptions?: unknown; }>'.
|
||||
Type '{ user: { id: number; name: string; email: string; }; documentMeta: { id: string; language: string; message: string | null; subject: string | null; timezone: string | null; dateFormat: string | null; ... 9 more ...; emailId: string | null; }; ... 30 more ...; documentMetaId: string; }' is not assignable to type '{ type: "DOCUMENT" | "TEMPLATE"; id: string; source: "DOCUMENT" | "TEMPLATE" | "TEMPLATE_DIRECT_LINK"; status: "DRAFT" | "PENDING" | "COMPLETED" | "REJECTED"; documentMeta: { id: string; ... 14 more ...; emailSettings?: unknown; }; ... 23 more ...; authOptions?: unknown; }'.
|
||||
Types of property 'fields' are incompatible.
|
||||
Type '{ type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; height: Decimal; recipientId: number; ... 5 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 10 more ...; ...'.
|
||||
Type '{ type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; height: Decimal; recipientId: number; ... 5 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 10 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/envelope-router/sign-envelope-field.ts(22,13): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: null; session: null; metadata: ApiRequestMetadata; teamId: number | undefined; logger: Logger<...>; req: Request; res: Response; } | { ...; }, { ...; }>) => Promise<...>' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: null; session: null; metadata: ApiRequestMetadata; teamId: number | undefined; logger: Logger<...>; req: Request; res: Response; } | { ...; }, { ...; }, { ...; }, unknown>'.
|
||||
Type 'Promise<{ signedField: { type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; height: Decimal; recipientId: number; ... 5 more ...; inserted: boolean; }; }>' is not assignable to type 'MaybePromise<{ signedField: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 11 more ...; ...'.
|
||||
Type 'Promise<{ signedField: { type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; height: Decimal; recipientId: number; ... 5 more ...; inserted: boolean; }; }>' is not assignable to type 'Promise<{ signedField: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 11 more ...; signa...'.
|
||||
Type '{ signedField: { type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }; }' is not assignable to type '{ signedField: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 11 more ...; signature?: {...'.
|
||||
The types of 'signedField.fieldMeta' are incompatible between these types.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/envelope-router/sign-envelope-field.ts(123,26): error TS2339: Property 'readOnly' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'readOnly' does not exist on type 'string'.
|
||||
../../packages/trpc/server/envelope-router/update-envelope.ts(14,13): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ type: EnvelopeType; id: string; source: DocumentSource; status: DocumentStatus; createdAt: Date; updatedAt: Date; userId: number; ... 17 more ...; documentMetaId: string; }>' is not assignable to type 'MaybePromise<{ type: "DOCUMENT" | "TEMPLATE"; id: string; source: "DOCUMENT" | "TEMPLATE" | "TEMPLATE_DIRECT_LINK"; status: "DRAFT" | "PENDING" | "COMPLETED" | "REJECTED"; createdAt: Date; ... 15 more ...; authOptions?: unknown; }>'.
|
||||
Type 'Promise<{ type: EnvelopeType; id: string; source: DocumentSource; status: DocumentStatus; createdAt: Date; updatedAt: Date; userId: number; ... 17 more ...; documentMetaId: string; }>' is not assignable to type 'Promise<{ type: "DOCUMENT" | "TEMPLATE"; id: string; source: "DOCUMENT" | "TEMPLATE" | "TEMPLATE_DIRECT_LINK"; status: "DRAFT" | "PENDING" | "COMPLETED" | "REJECTED"; createdAt: Date; ... 15 more ...; authOptions?: unknown; }>'.
|
||||
Type '{ type: EnvelopeType; id: string; source: DocumentSource; status: DocumentStatus; createdAt: Date; updatedAt: Date; userId: number; ... 17 more ...; documentMetaId: string; }' is not assignable to type '{ type: "DOCUMENT" | "TEMPLATE"; id: string; source: "DOCUMENT" | "TEMPLATE" | "TEMPLATE_DIRECT_LINK"; status: "DRAFT" | "PENDING" | "COMPLETED" | "REJECTED"; createdAt: Date; ... 15 more ...; authOptions?: unknown; }'.
|
||||
Types of property 'formValues' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type 'Record<string, string | number | boolean> | null'.
|
||||
Type 'string' is not assignable to type 'Record<string, string | number | boolean>'.
|
||||
../../packages/trpc/server/field-router/router.ts(61,12): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }>' is not assignable to type 'MaybePromise<{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId?: nu...'.
|
||||
Type 'Promise<{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }>' is not assignable to type 'Promise<{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId?: number ...'.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; ... 9 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/field-router/router.ts(94,15): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }>' is not assignable to type 'MaybePromise<{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId?: nu...'.
|
||||
Type 'Promise<{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }>' is not assignable to type 'Promise<{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId?: number ...'.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; ... 9 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/field-router/router.ts(140,15): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ fields: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]; }>' is not assignable to type 'MaybePromise<{ fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templ...'.
|
||||
Type 'Promise<{ fields: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]; }>' is not assignable to type 'Promise<{ fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId...'.
|
||||
Type '{ fields: { documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; ... 10 more ...; inserted: boolean; }[]; }' is not assignable to type '{ fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId?: numbe...'.
|
||||
Types of property 'fields' are incompatible.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; ... 9 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/field-router/router.ts(182,15): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }>' is not assignable to type 'MaybePromise<{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId?: nu...'.
|
||||
Type 'Promise<{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }>' is not assignable to type 'Promise<{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId?: number ...'.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; ... 9 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/field-router/router.ts(222,15): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ fields: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]; }>' is not assignable to type 'MaybePromise<{ fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templ...'.
|
||||
Type 'Promise<{ fields: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]; }>' is not assignable to type 'Promise<{ fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId...'.
|
||||
Type '{ fields: { documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; ... 10 more ...; inserted: boolean; }[]; }' is not assignable to type '{ fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId?: numbe...'.
|
||||
Types of property 'fields' are incompatible.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; ... 9 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/field-router/router.ts(285,15): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ fields: { formId: string | undefined; documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; ... 9 more ...; inserted: boolean; }[]; }>' is not assignable to type 'MaybePromise<{ fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templ...'.
|
||||
Type 'Promise<{ fields: { formId: string | undefined; documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; ... 9 more ...; inserted: boolean; }[]; }>' is not assignable to type 'Promise<{ fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId...'.
|
||||
Type '{ fields: { formId: string | undefined; documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; ... 10 more ...; inserted: boolean; }[]; }' is not assignable to type '{ fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId?: numbe...'.
|
||||
Types of property 'fields' are incompatible.
|
||||
Type '{ formId: string | undefined; documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; ... 8 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Type '{ formId: string | undefined; documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; ... 10 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/field-router/router.ts(333,15): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }>' is not assignable to type 'MaybePromise<{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId?: nu...'.
|
||||
Type 'Promise<{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }>' is not assignable to type 'Promise<{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId?: number ...'.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; ... 9 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/field-router/router.ts(380,12): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }>' is not assignable to type 'MaybePromise<{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId?: nu...'.
|
||||
Type 'Promise<{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }>' is not assignable to type 'Promise<{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId?: number ...'.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; ... 9 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/field-router/router.ts(413,15): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ fields: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]; }>' is not assignable to type 'MaybePromise<{ fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templ...'.
|
||||
Type 'Promise<{ fields: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]; }>' is not assignable to type 'Promise<{ fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId...'.
|
||||
Type '{ fields: { documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; ... 10 more ...; inserted: boolean; }[]; }' is not assignable to type '{ fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId?: numbe...'.
|
||||
Types of property 'fields' are incompatible.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; ... 9 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/field-router/router.ts(455,15): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }>' is not assignable to type 'MaybePromise<{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId?: nu...'.
|
||||
Type 'Promise<{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }>' is not assignable to type 'Promise<{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId?: number ...'.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; ... 9 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/field-router/router.ts(495,15): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ fields: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]; }>' is not assignable to type 'MaybePromise<{ fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templ...'.
|
||||
Type 'Promise<{ fields: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]; }>' is not assignable to type 'Promise<{ fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId...'.
|
||||
Type '{ fields: { documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; ... 10 more ...; inserted: boolean; }[]; }' is not assignable to type '{ fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId?: numbe...'.
|
||||
Types of property 'fields' are incompatible.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; ... 9 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/field-router/router.ts(557,15): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ fields: { formId: string | undefined; documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; ... 9 more ...; inserted: boolean; }[]; }>' is not assignable to type 'MaybePromise<{ fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templ...'.
|
||||
Type 'Promise<{ fields: { formId: string | undefined; documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; ... 9 more ...; inserted: boolean; }[]; }>' is not assignable to type 'Promise<{ fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId...'.
|
||||
Type '{ fields: { formId: string | undefined; documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; ... 10 more ...; inserted: boolean; }[]; }' is not assignable to type '{ fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; ... 5 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; templateId?: numbe...'.
|
||||
Types of property 'fields' are incompatible.
|
||||
Type '{ formId: string | undefined; documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; ... 8 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Type '{ formId: string | undefined; documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; ... 10 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/organisation-router/get-organisation-session.ts(69,3): error TS2322: Type '{ teams: { currentTeamRole: TeamMemberRole; teamGroups: ({ organisationGroup: { type: OrganisationGroupType; id: string; name: string | null; organisationRole: OrganisationMemberRole; organisationId: string; }; } & { ...; })[]; ... 6 more ...; teamGlobalSettingsId: string; }[]; ... 15 more ...; organisationAuthentic...' is not assignable to type '{ type: "PERSONAL" | "ORGANISATION"; id: string; name: string; url: string; createdAt: Date; updatedAt: Date; subscription: { id: number; status: "ACTIVE" | "PAST_DUE" | "INACTIVE"; ... 7 more ...; cancelAtPeriodEnd: boolean; } | null; ... 5 more ...; currentOrganisationRole: "ADMIN" | ... 1 more ... | "MEMBER"; }[]'.
|
||||
Type '{ teams: { currentTeamRole: TeamMemberRole; teamGroups: ({ organisationGroup: { type: $Enums.OrganisationGroupType; id: string; name: string | null; organisationRole: $Enums.OrganisationMemberRole; organisationId: string; }; } & { ...; })[]; ... 6 more ...; teamGlobalSettingsId: string; }[]; ... 15 more ...; organis...' is not assignable to type '{ type: "PERSONAL" | "ORGANISATION"; id: string; name: string; url: string; createdAt: Date; updatedAt: Date; subscription: { id: number; status: "ACTIVE" | "PAST_DUE" | "INACTIVE"; ... 7 more ...; cancelAtPeriodEnd: boolean; } | null; ... 5 more ...; currentOrganisationRole: "ADMIN" | ... 1 more ... | "MEMBER"; }'.
|
||||
The types of 'organisationClaim.flags' are incompatible between these types.
|
||||
Type 'JsonValue' is not assignable to type '{ allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; emailDomains?: boolean | undefined; embedAuthoring?: boolean | undefined; ... 5 more ...; allowEnvelopes?: boolean | undefined; }'.
|
||||
Type 'null' is not assignable to type '{ allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; emailDomains?: boolean | undefined; embedAuthoring?: boolean | undefined; ... 5 more ...; allowEnvelopes?: boolean | undefined; }'.
|
||||
../../packages/trpc/server/organisation-router/get-organisation.ts(14,10): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ teams: { id: number; name: string; url: string; createdAt: Date; avatarImageId: string | null; organisationId: string; teamGlobalSettingsId: string; }[]; subscription: { id: number; status: SubscriptionStatus; ... 7 more ...; cancelAtPeriodEnd: boolean; } | null; ... 14 more ...; organisationAuthentication...' is not assignable to type 'MaybePromise<{ type: "PERSONAL" | "ORGANISATION"; id: string; name: string; url: string; createdAt: Date; updatedAt: Date; subscription: { id: number; status: "ACTIVE" | "PAST_DUE" | "INACTIVE"; ... 7 more ...; cancelAtPeriodEnd: boolean; } | null; ... 6 more ...; teams: { ...; }[]; }>'.
|
||||
Type 'Promise<{ teams: { id: number; name: string; url: string; createdAt: Date; avatarImageId: string | null; organisationId: string; teamGlobalSettingsId: string; }[]; subscription: { id: number; status: SubscriptionStatus; ... 7 more ...; cancelAtPeriodEnd: boolean; } | null; ... 14 more ...; organisationAuthentication...' is not assignable to type 'Promise<{ type: "PERSONAL" | "ORGANISATION"; id: string; name: string; url: string; createdAt: Date; updatedAt: Date; subscription: { id: number; status: "ACTIVE" | "PAST_DUE" | "INACTIVE"; ... 7 more ...; cancelAtPeriodEnd: boolean; } | null; ... 6 more ...; teams: { ...; }[]; }>'.
|
||||
Type '{ teams: { id: number; name: string; url: string; createdAt: Date; avatarImageId: string | null; organisationId: string; teamGlobalSettingsId: string; }[]; subscription: { id: number; status: $Enums.SubscriptionStatus; ... 7 more ...; cancelAtPeriodEnd: boolean; } | null; ... 14 more ...; organisationAuthenticationP...' is not assignable to type '{ type: "PERSONAL" | "ORGANISATION"; id: string; name: string; url: string; createdAt: Date; updatedAt: Date; subscription: { id: number; status: "ACTIVE" | "PAST_DUE" | "INACTIVE"; ... 7 more ...; cancelAtPeriodEnd: boolean; } | null; ... 6 more ...; teams: { ...; }[]; }'.
|
||||
The types of 'organisationClaim.flags' are incompatible between these types.
|
||||
Type 'JsonValue' is not assignable to type '{ allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; emailDomains?: boolean | undefined; embedAuthoring?: boolean | undefined; ... 5 more ...; allowEnvelopes?: boolean | undefined; }'.
|
||||
Type 'null' is not assignable to type '{ allowCustomBranding?: boolean | undefined; hidePoweredBy?: boolean | undefined; unlimitedDocuments?: boolean | undefined; emailDomains?: boolean | undefined; embedAuthoring?: boolean | undefined; ... 5 more ...; allowEnvelopes?: boolean | undefined; }'.
|
||||
../../packages/trpc/server/recipient-router/router.ts(65,12): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ fields: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]; ... 17 more ...; sendStatus: SendStatus; }>' is not assignable to type 'MaybePromise<{ id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ...'.
|
||||
Type 'Promise<{ fields: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]; ... 17 more ...; sendStatus: SendStatus; }>' is not assignable to type 'Promise<{ id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ... 1...'.
|
||||
Type '{ fields: { documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; ... 10 more ...; inserted: boolean; }[]; ... 17 more ...; sendStatus: $Enums.SendStatus; }' is not assignable to type '{ id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ... 11 more ....'.
|
||||
Types of property 'fields' are incompatible.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; ... 9 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/recipient-router/router.ts(174,15): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ fields: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]; ... 16 more ...; sendStatus: SendStatus; }>' is not assignable to type 'MaybePromise<{ id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ...'.
|
||||
Type 'Promise<{ fields: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]; ... 16 more ...; sendStatus: SendStatus; }>' is not assignable to type 'Promise<{ id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ... 1...'.
|
||||
Type '{ fields: { documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; ... 10 more ...; inserted: boolean; }[]; ... 16 more ...; sendStatus: $Enums.SendStatus; }' is not assignable to type '{ id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ... 11 more ....'.
|
||||
Types of property 'fields' are incompatible.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; ... 9 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/recipient-router/router.ts(213,15): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ recipients: { fields: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; ... 8 more ...; inserted: boolean; }[]; ... 16 more ...; sendStatus: SendStatus; }[]; }>' is not assignable to type 'MaybePromise<{ recipients: { id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | ... 4 more ... | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ... 11 more ...'.
|
||||
Type 'Promise<{ recipients: { fields: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; ... 8 more ...; inserted: boolean; }[]; ... 16 more ...; sendStatus: SendStatus; }[]; }>' is not assignable to type 'Promise<{ recipients: { id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | ... 4 more ... | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ... 11 more ...; ...'.
|
||||
Type '{ recipients: { fields: { documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; ... 10 more ...; inserted: boolean; }[]; ... 16 more ...; sendStatus: $Enums.SendStatus; }[]; }' is not assignable to type '{ recipients: { id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | ... 4 more ... | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ... 11 more ...; authOpti...'.
|
||||
Types of property 'recipients' are incompatible.
|
||||
Type '{ fields: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]; ... 16 more ...; sendStatus: SendStatus; }[]' is not assignable to type '{ id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ... 11 more ....'.
|
||||
Type '{ fields: { documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; ... 10 more ...; inserted: boolean; }[]; ... 16 more ...; sendStatus: $Enums.SendStatus; }' is not assignable to type '{ id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ... 11 more ....'.
|
||||
Types of property 'fields' are incompatible.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; ... 9 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/recipient-router/router.ts(320,12): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ fields: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]; ... 17 more ...; sendStatus: SendStatus; }>' is not assignable to type 'MaybePromise<{ id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ...'.
|
||||
Type 'Promise<{ fields: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]; ... 17 more ...; sendStatus: SendStatus; }>' is not assignable to type 'Promise<{ id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ... 1...'.
|
||||
Type '{ fields: { documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; ... 10 more ...; inserted: boolean; }[]; ... 17 more ...; sendStatus: $Enums.SendStatus; }' is not assignable to type '{ id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ... 11 more ....'.
|
||||
Types of property 'fields' are incompatible.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; ... 9 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/recipient-router/router.ts(429,15): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ fields: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]; ... 16 more ...; sendStatus: SendStatus; }>' is not assignable to type 'MaybePromise<{ id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ...'.
|
||||
Type 'Promise<{ fields: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]; ... 16 more ...; sendStatus: SendStatus; }>' is not assignable to type 'Promise<{ id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ... 1...'.
|
||||
Type '{ fields: { documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; ... 10 more ...; inserted: boolean; }[]; ... 16 more ...; sendStatus: $Enums.SendStatus; }' is not assignable to type '{ id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ... 11 more ....'.
|
||||
Types of property 'fields' are incompatible.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; ... 9 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/recipient-router/router.ts(468,15): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ recipients: { fields: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; ... 8 more ...; inserted: boolean; }[]; ... 16 more ...; sendStatus: SendStatus; }[]; }>' is not assignable to type 'MaybePromise<{ recipients: { id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | ... 4 more ... | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ... 11 more ...'.
|
||||
Type 'Promise<{ recipients: { fields: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; ... 8 more ...; inserted: boolean; }[]; ... 16 more ...; sendStatus: SendStatus; }[]; }>' is not assignable to type 'Promise<{ recipients: { id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | ... 4 more ... | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ... 11 more ...; ...'.
|
||||
Type '{ recipients: { fields: { documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; ... 10 more ...; inserted: boolean; }[]; ... 16 more ...; sendStatus: $Enums.SendStatus; }[]; }' is not assignable to type '{ recipients: { id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | ... 4 more ... | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ... 11 more ...; authOpti...'.
|
||||
Types of property 'recipients' are incompatible.
|
||||
Type '{ fields: { documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]; ... 16 more ...; sendStatus: SendStatus; }[]' is not assignable to type '{ id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ... 11 more ....'.
|
||||
Type '{ fields: { documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; ... 10 more ...; inserted: boolean; }[]; ... 16 more ...; sendStatus: $Enums.SendStatus; }' is not assignable to type '{ id: number; name: string; token: string; email: string; signingOrder: number | null; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ... 11 more ....'.
|
||||
Types of property 'fields' are incompatible.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; ... 9 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/template-router/router.ts(74,12): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ data: { id: number; envelopeId: string; type: TemplateType; visibility: DocumentVisibility; externalId: string | null; title: string; userId: number; ... 12 more ...; directLink: { ...; } | null; }[]; count: number; currentPage: number; perPage: number; totalPages: number; }>' is not assignable to type 'MaybePromise<{ data: { type: "PUBLIC" | "PRIVATE"; id: number; team: { id: number; url: string; } | null; createdAt: Date; updatedAt: Date; userId: number; fields: { type: "EMAIL" | "SIGNATURE" | ... 8 more ... | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ... 13 more ...; tem...'.
|
||||
Type 'Promise<{ data: { id: number; envelopeId: string; type: TemplateType; visibility: DocumentVisibility; externalId: string | null; title: string; userId: number; ... 12 more ...; directLink: { ...; } | null; }[]; count: number; currentPage: number; perPage: number; totalPages: number; }>' is not assignable to type 'Promise<{ data: { type: "PUBLIC" | "PRIVATE"; id: number; team: { id: number; url: string; } | null; createdAt: Date; updatedAt: Date; userId: number; fields: { type: "EMAIL" | "SIGNATURE" | ... 8 more ... | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ... 13 more ...; template...'.
|
||||
Type '{ data: { id: number; envelopeId: string; type: $Enums.TemplateType; visibility: $Enums.DocumentVisibility; externalId: string | null; title: string; userId: number; teamId: number; ... 11 more ...; directLink: { ...; } | null; }[]; count: number; currentPage: number; perPage: number; totalPages: number; }' is not assignable to type '{ data: { type: "PUBLIC" | "PRIVATE"; id: number; team: { id: number; url: string; } | null; createdAt: Date; updatedAt: Date; userId: number; fields: { type: "EMAIL" | "SIGNATURE" | ... 8 more ... | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ... 13 more ...; templateDocument...'.
|
||||
Types of property 'data' are incompatible.
|
||||
Type '{ id: number; envelopeId: string; type: TemplateType; visibility: DocumentVisibility; externalId: string | null; title: string; userId: number; teamId: number; ... 11 more ...; directLink: { ...; } | null; }[]' is not assignable to type '{ type: "PUBLIC" | "PRIVATE"; id: number; team: { id: number; url: string; } | null; createdAt: Date; updatedAt: Date; userId: number; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | ... 7 more ... | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ... 13 more ...; templ...'.
|
||||
Type '{ id: number; envelopeId: string; type: $Enums.TemplateType; visibility: $Enums.DocumentVisibility; externalId: string | null; title: string; userId: number; teamId: number; ... 11 more ...; directLink: { ...; } | null; }' is not assignable to type '{ type: "PUBLIC" | "PRIVATE"; id: number; team: { id: number; url: string; } | null; createdAt: Date; updatedAt: Date; userId: number; fields: { type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | ... 7 more ... | "DROPDOWN"; ... 14 more ...; templateId?: number | ... 1 more ... | undefined; }[]; ... 13 more ...; templ...'.
|
||||
Types of property 'fields' are incompatible.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; ... 7 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Type '{ documentId: number | null; templateId: number | null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; ... 9 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/template-router/router.ts(137,12): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ envelopeId: string; type: TemplateType; templateDocumentDataId: string; templateDocumentData: { envelopeItemId: string; data: string; type: DocumentDataType; id: string; initialData: string; }; ... 30 more ...; documentMetaId: string; }>' is not assignable to type 'MaybePromise<{ type: "PUBLIC" | "PRIVATE"; id: number; createdAt: Date; updatedAt: Date; userId: number; user: { id: number; name: string | null; email: string; }; folder: { type: "DOCUMENT" | "TEMPLATE"; ... 8 more ...; parentId: string | null; } | null; ... 15 more ...; templateDocumentDataId?: string | undefined;...'.
|
||||
Type 'Promise<{ envelopeId: string; type: TemplateType; templateDocumentDataId: string; templateDocumentData: { envelopeItemId: string; data: string; type: DocumentDataType; id: string; initialData: string; }; ... 30 more ...; documentMetaId: string; }>' is not assignable to type 'Promise<{ type: "PUBLIC" | "PRIVATE"; id: number; createdAt: Date; updatedAt: Date; userId: number; user: { id: number; name: string | null; email: string; }; folder: { type: "DOCUMENT" | "TEMPLATE"; ... 8 more ...; parentId: string | null; } | null; ... 15 more ...; templateDocumentDataId?: string | undefined; }>'.
|
||||
Type '{ envelopeId: string; type: $Enums.TemplateType; templateDocumentDataId: string; templateDocumentData: { envelopeItemId: string; data: string; type: $Enums.DocumentDataType; id: string; initialData: string; }; ... 30 more ...; documentMetaId: string; }' is not assignable to type '{ type: "PUBLIC" | "PRIVATE"; id: number; createdAt: Date; updatedAt: Date; userId: number; user: { id: number; name: string | null; email: string; }; folder: { type: "DOCUMENT" | "TEMPLATE"; ... 8 more ...; parentId: string | null; } | null; ... 15 more ...; templateDocumentDataId?: string | undefined; }'.
|
||||
Types of property 'fields' are incompatible.
|
||||
Type '{ documentId: null; templateId: number; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; height: Decimal; ... 6 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Type '{ documentId: null; templateId: number; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; secondaryId: string; ... 8 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/template-router/router.ts(253,15): error TS2345: Argument of type '({ input, ctx }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ template: { envelopeId: string; type: TemplateType; templateDocumentDataId: string; templateDocumentData: { envelopeItemId: string; data: string; type: DocumentDataType; id: string; initialData: string; }; ... 30 more ...; documentMetaId: string; }; uploadUrl: string; }>' is not assignable to type 'MaybePromise<{ template: { type: "PUBLIC" | "PRIVATE"; id: number; createdAt: Date; updatedAt: Date; userId: number; user: { id: number; name: string | null; email: string; }; folder: { type: "DOCUMENT" | "TEMPLATE"; ... 8 more ...; parentId: string | null; } | null; ... 15 more ...; templateDocumentDataId?: string ...'.
|
||||
Type 'Promise<{ template: { envelopeId: string; type: TemplateType; templateDocumentDataId: string; templateDocumentData: { envelopeItemId: string; data: string; type: DocumentDataType; id: string; initialData: string; }; ... 30 more ...; documentMetaId: string; }; uploadUrl: string; }>' is not assignable to type 'Promise<{ template: { type: "PUBLIC" | "PRIVATE"; id: number; createdAt: Date; updatedAt: Date; userId: number; user: { id: number; name: string | null; email: string; }; folder: { type: "DOCUMENT" | "TEMPLATE"; ... 8 more ...; parentId: string | null; } | null; ... 15 more ...; templateDocumentDataId?: string | und...'.
|
||||
Type '{ template: { envelopeId: string; type: $Enums.TemplateType; templateDocumentDataId: string; templateDocumentData: { envelopeItemId: string; data: string; type: $Enums.DocumentDataType; id: string; initialData: string; }; ... 30 more ...; documentMetaId: string; }; uploadUrl: string; }' is not assignable to type '{ template: { type: "PUBLIC" | "PRIVATE"; id: number; createdAt: Date; updatedAt: Date; userId: number; user: { id: number; name: string | null; email: string; }; folder: { type: "DOCUMENT" | "TEMPLATE"; ... 8 more ...; parentId: string | null; } | null; ... 15 more ...; templateDocumentDataId?: string | undefined; ...'.
|
||||
The types of 'template.fields' are incompatible between these types.
|
||||
Type '{ documentId: null; templateId: number; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; height: Decimal; ... 6 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Type '{ documentId: null; templateId: number; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; secondaryId: string; ... 8 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/trpc/server/template-router/router.ts(453,15): error TS2345: Argument of type '({ ctx, input }: ProcedureResolverOptions<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "ap...' is not assignable to parameter of type 'ProcedureResolver<TrpcContext, TrpcRouteMeta, { user: { id: number; name: string | null; email: string; disabled: boolean; }; session: null; metadata: { auditUser: { id: null; email: null; name: string; } | { ...; }; auth: "api"; requestMetadata: { ...; }; source: "app" | ... 1 more ... | "apiV2"; }; teamId: number;...'.
|
||||
Type 'Promise<{ envelopeId: string; internalVersion: number; documentData: { envelopeItemId: string; data: string; type: DocumentDataType; id: string; initialData: string; }; id: number; ... 31 more ...; documentMetaId: string; }>' is not assignable to type 'MaybePromise<{ id: number; source: "DOCUMENT" | "TEMPLATE" | "TEMPLATE_DIRECT_LINK"; status: "DRAFT" | "PENDING" | "COMPLETED" | "REJECTED"; documentMeta: { id: string; language: string; message: string | null; ... 14 more ...; documentId?: number | undefined; }; ... 20 more ...; documentDataId?: string | undefined;...'.
|
||||
Type 'Promise<{ envelopeId: string; internalVersion: number; documentData: { envelopeItemId: string; data: string; type: DocumentDataType; id: string; initialData: string; }; id: number; ... 31 more ...; documentMetaId: string; }>' is not assignable to type 'Promise<{ id: number; source: "DOCUMENT" | "TEMPLATE" | "TEMPLATE_DIRECT_LINK"; status: "DRAFT" | "PENDING" | "COMPLETED" | "REJECTED"; documentMeta: { id: string; language: string; message: string | null; ... 14 more ...; documentId?: number | undefined; }; ... 20 more ...; documentDataId?: string | undefined; }>'.
|
||||
Type '{ envelopeId: string; internalVersion: number; documentData: { envelopeItemId: string; data: string; type: $Enums.DocumentDataType; id: string; initialData: string; }; ... 32 more ...; documentMetaId: string; }' is not assignable to type '{ id: number; source: "DOCUMENT" | "TEMPLATE" | "TEMPLATE_DIRECT_LINK"; status: "DRAFT" | "PENDING" | "COMPLETED" | "REJECTED"; documentMeta: { id: string; language: string; message: string | null; ... 14 more ...; documentId?: number | undefined; }; ... 20 more ...; documentDataId?: string | undefined; }'.
|
||||
Types of property 'fields' are incompatible.
|
||||
Type '{ documentId: number; templateId: null; type: FieldType; id: number; fieldMeta: JsonValue; envelopeId: string; secondaryId: string; width: Decimal; height: Decimal; ... 6 more ...; inserted: boolean; }[]' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Type '{ documentId: number; templateId: null; type: $Enums.FieldType; id: number; fieldMeta: JsonValue | null; envelopeId: string; secondaryId: string; ... 8 more ...; inserted: boolean; }' is not assignable to type '{ type: "EMAIL" | "SIGNATURE" | "FREE_SIGNATURE" | "INITIALS" | "NAME" | "DATE" | "TEXT" | "NUMBER" | "RADIO" | "CHECKBOX" | "DROPDOWN"; id: number; fieldMeta: { type: "initials"; label?: string | undefined; ... 4 more ...; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null; ... 12 more ...; ...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 9 more ... | null'.
|
||||
../../packages/ui/components/document/document-read-only-fields.tsx(181,29): error TS2322: Type 'DocumentField' is not assignable to type '{ inserted?: boolean | undefined; customText?: string | undefined; type: FieldType; fieldMeta?: { type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefi...'.
|
||||
Types of property 'fieldMeta' are incompatible.
|
||||
Type 'JsonValue' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 10 more ... | undefined'.
|
||||
Type 'string' is not assignable to type '{ type: "initials"; label?: string | undefined; placeholder?: string | undefined; required?: boolean | undefined; readOnly?: boolean | undefined; fontSize?: number | undefined; textAlign?: "left" | ... 2 more ... | undefined; } | ... 10 more ... | undefined'.
|
||||
../../packages/ui/components/document/envelope-recipient-field-tooltip.tsx(162,33): error TS2339: Property 'readOnly' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'readOnly' does not exist on type 'string'.
|
||||
../../packages/ui/components/document/envelope-recipient-field-tooltip.tsx(169,32): error TS2339: Property 'readOnly' does not exist on type 'string | number | boolean | JsonObject | JsonArray'.
|
||||
Property 'readOnly' does not exist on type 'string'.
|
||||
npm error Lifecycle script `typecheck` failed with error:
|
||||
npm error code 2
|
||||
npm error path /Users/lucas/dev/documenso/apps/remix
|
||||
npm error workspace @documenso/remix@2.0.14
|
||||
npm error location /Users/lucas/dev/documenso/apps/remix
|
||||
npm error command failed
|
||||
npm error command sh -c react-router typegen && tsc
|
||||
npm error Lifecycle script `build:app` failed with error:
|
||||
npm error code 2
|
||||
npm error path /Users/lucas/dev/documenso/apps/remix
|
||||
npm error workspace @documenso/remix@2.0.14
|
||||
npm error location /Users/lucas/dev/documenso/apps/remix
|
||||
npm error command failed
|
||||
npm error command sh -c npm run typecheck && cross-env NODE_ENV=production react-router build
|
||||
npm error Lifecycle script `build` failed with error:
|
||||
npm error code 2
|
||||
npm error path /Users/lucas/dev/documenso/apps/remix
|
||||
npm error workspace @documenso/remix@2.0.14
|
||||
npm error location /Users/lucas/dev/documenso/apps/remix
|
||||
npm error command failed
|
||||
npm error command sh -c ./.bin/build.sh
|
||||
+34
-34
@@ -6,42 +6,41 @@ FROM node:22-alpine3.22 AS base
|
||||
RUN apk add --no-cache openssl
|
||||
RUN apk add --no-cache font-freefont
|
||||
|
||||
RUN npm install -g pnpm
|
||||
|
||||
###########################
|
||||
# BUILDER CONTAINER #
|
||||
###########################
|
||||
FROM base AS builder
|
||||
|
||||
#############################
|
||||
# DEVELOPMENT CONTAINER #
|
||||
#############################
|
||||
FROM base AS development
|
||||
|
||||
ENV HUSKY 0
|
||||
ENV DOCKER_OUTPUT 1
|
||||
|
||||
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
|
||||
RUN apk add --no-cache libc6-compat
|
||||
RUN apk add --no-cache jq
|
||||
WORKDIR /app
|
||||
|
||||
COPY . .
|
||||
|
||||
RUN npm install -g "turbo@^1.9.3"
|
||||
|
||||
# Outputs to the /out folder
|
||||
# source: https://turbo.build/repo/docs/reference/command-line-reference/prune#--docker
|
||||
RUN turbo prune --scope=@documenso/remix --docker
|
||||
|
||||
###########################
|
||||
# INSTALLER CONTAINER #
|
||||
###########################
|
||||
FROM base AS installer
|
||||
|
||||
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
|
||||
RUN apk add --no-cache libc6-compat
|
||||
RUN apk add --no-cache jq
|
||||
# Required for node_modules/aws-crt
|
||||
RUN apk add --no-cache make cmake g++ openssl bash
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Disable husky from installing hooks
|
||||
ENV HUSKY 0
|
||||
ENV DOCKER_OUTPUT 1
|
||||
ENV NEXT_TELEMETRY_DISABLED 1
|
||||
###########################
|
||||
# BUILDER CONTAINER #
|
||||
###########################
|
||||
FROM development AS builder
|
||||
|
||||
COPY . .
|
||||
|
||||
RUN pnpm install --frozen-lockfile
|
||||
|
||||
# Outputs to the /out folder
|
||||
# source: https://turbo.build/repo/docs/reference/command-line-reference/prune#--docker
|
||||
RUN pnpm exec turbo prune @documenso/remix --docker
|
||||
|
||||
###########################
|
||||
# INSTALLER CONTAINER #
|
||||
###########################
|
||||
FROM development AS installer
|
||||
|
||||
# Encryption keys
|
||||
ARG NEXT_PRIVATE_ENCRYPTION_KEY="CAFEBABE"
|
||||
@@ -67,21 +66,20 @@ ENV NEXT_PRIVATE_TELEMETRY_HOST="$NEXT_PRIVATE_TELEMETRY_HOST"
|
||||
# First install the dependencies (as they change less often)
|
||||
COPY .gitignore .gitignore
|
||||
COPY --from=builder /app/out/json/ .
|
||||
COPY --from=builder /app/out/package-lock.json ./package-lock.json
|
||||
COPY --from=builder /app/out/pnpm-lock.yaml ./pnpm-lock.yaml
|
||||
|
||||
COPY --from=builder /app/lingui.config.ts ./lingui.config.ts
|
||||
COPY --from=builder /app/patches ./patches
|
||||
COPY --from=builder /app/pnpm-workspace.yaml ./pnpm-workspace.yaml
|
||||
|
||||
RUN npm ci
|
||||
RUN pnpm install --frozen-lockfile
|
||||
|
||||
# Then copy all the source code (as it changes more often)
|
||||
COPY --from=builder /app/out/full/ .
|
||||
# Finally copy the turbo.json file so that we can run turbo commands
|
||||
COPY turbo.json turbo.json
|
||||
|
||||
RUN npm install -g "turbo@^1.9.3"
|
||||
|
||||
RUN turbo run build --filter=@documenso/remix...
|
||||
RUN pnpm exec turbo run build --filter=@documenso/remix...
|
||||
|
||||
###########################
|
||||
# RUNNER CONTAINER #
|
||||
@@ -111,8 +109,10 @@ COPY --from=builder --chown=nodejs:nodejs /app/out/json/ .
|
||||
COPY --from=builder --chown=nodejs:nodejs /app/out/full/packages/tailwind-config ./packages/tailwind-config
|
||||
# Copy the patches across
|
||||
COPY --from=builder --chown=nodejs:nodejs /app/patches ./patches
|
||||
# Copy workspace config
|
||||
COPY --from=builder --chown=nodejs:nodejs /app/pnpm-workspace.yaml ./pnpm-workspace.yaml
|
||||
|
||||
RUN npm ci --only=production
|
||||
RUN pnpm install --frozen-lockfile --prod
|
||||
|
||||
# Automatically leverage output traces to reduce image size
|
||||
# https://nodejs.org/docs/advanced-features/output-file-tracing
|
||||
@@ -124,7 +124,7 @@ COPY --from=installer --chown=nodejs:nodejs /app/packages/prisma/schema.prisma .
|
||||
COPY --from=installer --chown=nodejs:nodejs /app/packages/prisma/migrations ./packages/prisma/migrations
|
||||
|
||||
# Generate the prisma client again
|
||||
RUN npx prisma generate --schema ./packages/prisma/schema.prisma
|
||||
RUN pnpm exec prisma generate --schema ./packages/prisma/schema.prisma
|
||||
|
||||
|
||||
# Get the start script from docker/
|
||||
|
||||
+1
-1
@@ -25,7 +25,7 @@ printf "📊 Certificate status: http://localhost:3000/api/certificate-status\n"
|
||||
printf "👥 Community: https://github.com/documenso/documenso\n\n"
|
||||
|
||||
printf "🗄️ Running database migrations...\n"
|
||||
npx prisma migrate deploy --schema ../../packages/prisma/schema.prisma
|
||||
pnpm exec prisma migrate deploy --schema ../../packages/prisma/schema.prisma
|
||||
|
||||
printf "🌟 Starting Documenso server...\n"
|
||||
HOSTNAME=0.0.0.0 node build/server/main.js
|
||||
|
||||
Generated
-38127
File diff suppressed because it is too large
Load Diff
+79
-90
@@ -1,13 +1,8 @@
|
||||
{
|
||||
"private": true,
|
||||
"name": "@documenso/root",
|
||||
"workspaces": [
|
||||
"apps/*",
|
||||
"packages/*"
|
||||
],
|
||||
"version": "2.8.0",
|
||||
"version": "2.7.1",
|
||||
"scripts": {
|
||||
"postinstall": "patch-package",
|
||||
"build": "turbo run build",
|
||||
"dev": "npm run translate:compile && turbo run dev --filter=@documenso/remix",
|
||||
"dev:remix": "npm run translate:compile && turbo run dev --filter=@documenso/remix",
|
||||
@@ -20,114 +15,108 @@
|
||||
"prepare": "husky && husky install || true",
|
||||
"commitlint": "commitlint --edit",
|
||||
"clean": "turbo run clean && rimraf node_modules",
|
||||
"d": "npm run dx && npm run translate:compile && npm run dev",
|
||||
"dx": "npm ci && npm run dx:up && npm run prisma:migrate-dev && npm run prisma:seed",
|
||||
"d": "pnpm run dx && pnpm run translate:compile && pnpm run dev",
|
||||
"dx": "pnpm install --frozen-lockfile && pnpm run dx:up && pnpm run prisma:migrate-dev && pnpm run prisma:seed",
|
||||
"dx:up": "docker compose -f docker/development/compose.yml up -d",
|
||||
"dx:down": "docker compose -f docker/development/compose.yml down",
|
||||
"ci": "turbo run build --filter=@documenso/remix && turbo run test:e2e",
|
||||
"prisma:generate": "npm run with:env -- npm run prisma:generate -w @documenso/prisma",
|
||||
"prisma:migrate-dev": "npm run with:env -- npm run prisma:migrate-dev -w @documenso/prisma",
|
||||
"prisma:migrate-deploy": "npm run with:env -- npm run prisma:migrate-deploy -w @documenso/prisma",
|
||||
"prisma:migrate-reset": "npm run with:env -- npm run prisma:migrate-reset -w @documenso/prisma",
|
||||
"prisma:seed": "npm run with:env -- npm run prisma:seed -w @documenso/prisma",
|
||||
"prisma:studio": "npm run with:env -- npm run prisma:studio -w @documenso/prisma",
|
||||
"prisma:generate": "pnpm run with:env pnpm run --filter @documenso/prisma prisma:generate",
|
||||
"prisma:migrate-dev": "pnpm run with:env pnpm run --filter @documenso/prisma prisma:migrate-dev",
|
||||
"prisma:migrate-deploy": "pnpm run with:env pnpm run --filter @documenso/prisma prisma:migrate-deploy",
|
||||
"prisma:migrate-reset": "pnpm run with:env pnpm run --filter @documenso/prisma prisma:migrate-reset",
|
||||
"prisma:seed": "pnpm run with:env pnpm run --filter @documenso/prisma prisma:seed",
|
||||
"prisma:studio": "pnpm run with:env pnpm run --filter @documenso/prisma prisma:studio",
|
||||
"with:env": "dotenv -e .env -e .env.local --",
|
||||
"reset:hard": "npm run clean && npm i && npm run prisma:generate",
|
||||
"precommit": "npm install && git add package.json package-lock.json",
|
||||
"trigger:dev": "npm run with:env -- npx trigger-cli dev --handler-path=\"/api/jobs\"",
|
||||
"reset:hard": "pnpm run clean && pnpm install && pnpm run prisma:generate",
|
||||
"precommit": "pnpm install && git add package.json pnpm-lock.yaml",
|
||||
"trigger:dev": "pnpm run with:env pnpm dlx trigger-cli dev --handler-path=\"/api/jobs\"",
|
||||
"inngest:dev": "inngest dev -u http://localhost:3000/api/jobs",
|
||||
"make:version": "npm version --workspace @documenso/remix --include-workspace-root --no-git-tag-version -m \"v%s\"",
|
||||
"translate": "npm run translate:extract && npm run translate:compile",
|
||||
"make:version": "pnpm version --filter @documenso/remix --include-workspace-root --no-git-tag-version -m \"v%s\"",
|
||||
"translate": "pnpm run translate:extract && pnpm run translate:compile",
|
||||
"translate:extract": "lingui extract --clean",
|
||||
"translate:compile": "lingui compile"
|
||||
},
|
||||
"packageManager": "npm@10.7.0",
|
||||
"packageManager": "pnpm@10.30.3+sha512.c961d1e0a2d8e354ecaa5166b822516668b7f44cb5bd95122d590dd81922f606f5473b6d23ec4a5be05e7fcd18e8488d47d978bbe981872f1145d06e9a740017",
|
||||
"engines": {
|
||||
"npm": ">=10.7.0",
|
||||
"node": ">=22.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.28.5",
|
||||
"@types/babel__core": "^7.20.5",
|
||||
"@commitlint/cli": "^20.1.0",
|
||||
"@commitlint/config-conventional": "^20.0.0",
|
||||
"@datadog/pprof": "^5.13.5",
|
||||
"@lingui/babel-plugin-lingui-macro": "^5.6.0",
|
||||
"@lingui/cli": "^5.6.0",
|
||||
"@lingui/vite-plugin": "^5.6.0",
|
||||
"@prisma/client": "^6.19.0",
|
||||
"@react-router/dev": "^7.12.0",
|
||||
"@react-router/remix-routes-option-adapter": "^7.12.0",
|
||||
"@rolldown/plugin-babel": "^0.2.0",
|
||||
"@trpc/client": "11.8.1",
|
||||
"@trpc/react-query": "11.8.1",
|
||||
"@trpc/server": "11.8.1",
|
||||
"@ts-rest/core": "^3.52.1",
|
||||
"@ts-rest/open-api": "^3.52.1",
|
||||
"@ts-rest/serverless": "^3.52.1",
|
||||
"@types/content-disposition": "^0.5.9",
|
||||
"@types/formidable": "^3.4.6",
|
||||
"@types/luxon": "^3.7.1",
|
||||
"@types/node": "^20",
|
||||
"@types/papaparse": "^5.5.0",
|
||||
"@types/react": "18.3.27",
|
||||
"@types/react-dom": "^18",
|
||||
"@types/ua-parser-js": "^0.7.39",
|
||||
"babel-plugin-macros": "^3.1.0",
|
||||
"cross-env": "^10.1.0",
|
||||
"dotenv": "^17.2.3",
|
||||
"dotenv-cli": "^11.0.0",
|
||||
"esbuild": "^0.27.0",
|
||||
"eslint": "^8.57.0",
|
||||
"@prisma/client": "catalog:",
|
||||
"@trpc/client": "catalog:",
|
||||
"@trpc/react-query": "catalog:",
|
||||
"@trpc/server": "catalog:",
|
||||
"@ts-rest/core": "catalog:",
|
||||
"@ts-rest/open-api": "catalog:",
|
||||
"@ts-rest/serverless": "catalog:",
|
||||
"dotenv": "catalog:",
|
||||
"dotenv-cli": "catalog:",
|
||||
"eslint": "catalog:",
|
||||
"husky": "^9.1.7",
|
||||
"inngest-cli": "^1.16.1",
|
||||
"inngest-cli": "^1.17.2",
|
||||
"lint-staged": "^16.2.7",
|
||||
"nanoid": "^5.1.6",
|
||||
"nodemailer": "^7.0.10",
|
||||
"pdfjs-dist": "5.4.296",
|
||||
"pino": "^9.14.0",
|
||||
"pino-pretty": "^13.1.2",
|
||||
"playwright": "1.56.1",
|
||||
"prettier": "^3.6.2",
|
||||
"prisma": "^6.19.0",
|
||||
"prisma-extension-kysely": "^3.0.0",
|
||||
"prisma-json-types-generator": "^3.6.2",
|
||||
"prisma-kysely": "^2.3.0",
|
||||
"remix-flat-routes": "^0.8.5",
|
||||
"nanoid": "catalog:",
|
||||
"nodemailer": "catalog:",
|
||||
"pdfjs-dist": "catalog:",
|
||||
"pino": "catalog:",
|
||||
"pino-pretty": "catalog:",
|
||||
"playwright": "catalog:",
|
||||
"prettier": "catalog:",
|
||||
"prisma": "catalog:",
|
||||
"prisma-extension-kysely": "catalog:",
|
||||
"prisma-json-types-generator": "catalog:",
|
||||
"prisma-kysely": "catalog:",
|
||||
"rimraf": "^6.1.2",
|
||||
"superjson": "^2.2.5",
|
||||
"syncpack": "^14.0.0-alpha.27",
|
||||
"tsx": "^4.20.6",
|
||||
"turbo": "^1.13.4",
|
||||
"vite": "^8.0.0",
|
||||
"superjson": "catalog:",
|
||||
"turbo": "^2.8.12",
|
||||
"vite": "catalog:",
|
||||
"vite-plugin-static-copy": "^3.1.4",
|
||||
"zod-openapi": "^4.2.4",
|
||||
"zod-prisma-types": "3.3.5"
|
||||
"zod-openapi": "catalog:",
|
||||
"zod-prisma-types": "catalog:"
|
||||
},
|
||||
"dependencies": {
|
||||
"@ai-sdk/google-vertex": "3.0.81",
|
||||
"@documenso/prisma": "*",
|
||||
"@libpdf/core": "^0.3.3",
|
||||
"@ai-sdk/google-vertex": "catalog:",
|
||||
"@documenso/prisma": "workspace:*",
|
||||
"@libpdf/core": "^0.2.12",
|
||||
"@lingui/conf": "^5.6.0",
|
||||
"@lingui/core": "^5.6.0",
|
||||
"@lingui/core": "catalog:",
|
||||
"@prisma/extension-read-replicas": "^0.4.1",
|
||||
"ai": "^5.0.104",
|
||||
"ai": "catalog:",
|
||||
"cron-parser": "^5.5.0",
|
||||
"luxon": "^3.7.2",
|
||||
"patch-package": "^8.0.1",
|
||||
"posthog-node": "4.18.0",
|
||||
"react": "^18",
|
||||
"typescript": "5.6.2",
|
||||
"zod": "^3.25.76"
|
||||
"luxon": "catalog:",
|
||||
"posthog-node": "catalog:",
|
||||
"react": "catalog:",
|
||||
"typescript": "catalog:",
|
||||
"zod": "catalog:"
|
||||
},
|
||||
"overrides": {
|
||||
"lodash": "4.17.23",
|
||||
"pdfjs-dist": "5.4.296",
|
||||
"typescript": "5.6.2",
|
||||
"vite": "$vite",
|
||||
"zod": "$zod",
|
||||
"fumadocs-mdx": {
|
||||
"zod": "^4.3.5"
|
||||
}
|
||||
"pnpm": {
|
||||
"overrides": {
|
||||
"lodash": "4.17.23",
|
||||
"pdfjs-dist": "$pdfjs-dist",
|
||||
"typescript": "5.6.2",
|
||||
"zod": "$zod",
|
||||
"fumadocs-mdx>zod": "^4.3.5",
|
||||
"jiti": "2.6.1",
|
||||
"prisma-kysely>@prisma/internals": "^6.19.0"
|
||||
},
|
||||
"patchedDependencies": {
|
||||
"@ai-sdk/google-vertex@3.0.81": "patches/@ai-sdk__google-vertex@3.0.81.patch"
|
||||
},
|
||||
"onlyBuiltDependencies": [
|
||||
"@playwright/browser-chromium",
|
||||
"@prisma/client",
|
||||
"@prisma/engines",
|
||||
"aws-crt",
|
||||
"core-js",
|
||||
"esbuild",
|
||||
"inngest-cli",
|
||||
"prisma",
|
||||
"protobufjs",
|
||||
"sharp",
|
||||
"skia-canvas",
|
||||
"unrs-resolver"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
+10
-10
@@ -15,15 +15,15 @@
|
||||
"v1/"
|
||||
],
|
||||
"dependencies": {
|
||||
"@documenso/lib": "*",
|
||||
"@documenso/prisma": "*",
|
||||
"@ts-rest/core": "^3.52.1",
|
||||
"@ts-rest/open-api": "^3.52.1",
|
||||
"@ts-rest/serverless": "^3.52.1",
|
||||
"@documenso/lib": "workspace:*",
|
||||
"@documenso/prisma": "workspace:*",
|
||||
"@ts-rest/core": "catalog:",
|
||||
"@ts-rest/open-api": "catalog:",
|
||||
"@ts-rest/serverless": "catalog:",
|
||||
"@types/swagger-ui-react": "^5.18.0",
|
||||
"luxon": "^3.7.2",
|
||||
"superjson": "^2.2.5",
|
||||
"ts-pattern": "^5.9.0",
|
||||
"zod": "^3.25.76"
|
||||
"luxon": "catalog:",
|
||||
"superjson": "catalog:",
|
||||
"ts-pattern": "catalog:",
|
||||
"zod": "catalog:"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,468 +0,0 @@
|
||||
import type { Page } from '@playwright/test';
|
||||
import { expect, test } from '@playwright/test';
|
||||
import { OrganisationMemberRole, TeamMemberRole } from '@prisma/client';
|
||||
|
||||
import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app';
|
||||
import { generateDatabaseId } from '@documenso/lib/universal/id';
|
||||
import { prisma } from '@documenso/prisma';
|
||||
import { DocumentStatus } from '@documenso/prisma/client';
|
||||
import {
|
||||
seedCompletedDocument,
|
||||
seedDocuments,
|
||||
seedPendingDocument,
|
||||
} from '@documenso/prisma/seed/documents';
|
||||
import { seedOrganisationMembers } from '@documenso/prisma/seed/organisations';
|
||||
import { seedTeam, seedTeamMember } from '@documenso/prisma/seed/teams';
|
||||
import { seedUser } from '@documenso/prisma/seed/users';
|
||||
|
||||
import { apiSignin, apiSignout } from '../../fixtures/authentication';
|
||||
|
||||
const WEBAPP_BASE_URL = NEXT_PUBLIC_WEBAPP_URL();
|
||||
|
||||
test.describe.configure({
|
||||
mode: 'parallel',
|
||||
});
|
||||
|
||||
const trpcDocumentSearch = async (page: Page, query: string) => {
|
||||
const inputParam = encodeURIComponent(JSON.stringify({ json: { query } }));
|
||||
const url = `${WEBAPP_BASE_URL}/api/trpc/document.search?input=${inputParam}`;
|
||||
|
||||
const res = await page.context().request.get(url);
|
||||
|
||||
return {
|
||||
res,
|
||||
data: res.ok()
|
||||
? // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
||||
((await res.json()).result.data.json as Array<{
|
||||
title: string;
|
||||
path: string;
|
||||
value: string;
|
||||
}>)
|
||||
: null,
|
||||
};
|
||||
};
|
||||
|
||||
// ─── Visibility ──────────────────────────────────────────────────────────────
|
||||
|
||||
test.describe('Document Search - Visibility', () => {
|
||||
test('should respect team document visibility per role', async ({ page }) => {
|
||||
const { user: owner, organisation, team } = await seedUser();
|
||||
|
||||
const [adminUser, managerUser, memberUser] = await seedOrganisationMembers({
|
||||
organisationId: organisation.id,
|
||||
members: [
|
||||
{ organisationRole: OrganisationMemberRole.ADMIN },
|
||||
{ organisationRole: OrganisationMemberRole.MEMBER },
|
||||
{ organisationRole: OrganisationMemberRole.MEMBER },
|
||||
],
|
||||
});
|
||||
|
||||
const managerTeamGroup = await prisma.teamGroup.findFirstOrThrow({
|
||||
where: { teamId: team.id, teamRole: TeamMemberRole.MANAGER },
|
||||
include: { organisationGroup: true },
|
||||
});
|
||||
|
||||
const managerOrganisationMember = await prisma.organisationMember.findFirstOrThrow({
|
||||
where: { organisationId: organisation.id, userId: managerUser.id },
|
||||
});
|
||||
|
||||
await prisma.organisationGroupMember.create({
|
||||
data: {
|
||||
id: generateDatabaseId('group_member'),
|
||||
groupId: managerTeamGroup.organisationGroupId,
|
||||
organisationMemberId: managerOrganisationMember.id,
|
||||
},
|
||||
});
|
||||
|
||||
await seedDocuments([
|
||||
{
|
||||
sender: owner,
|
||||
teamId: team.id,
|
||||
recipients: [],
|
||||
type: DocumentStatus.COMPLETED,
|
||||
documentOptions: {
|
||||
visibility: 'EVERYONE',
|
||||
title: 'Searchable Document for Everyone',
|
||||
},
|
||||
},
|
||||
{
|
||||
sender: owner,
|
||||
teamId: team.id,
|
||||
recipients: [],
|
||||
type: DocumentStatus.COMPLETED,
|
||||
documentOptions: {
|
||||
visibility: 'MANAGER_AND_ABOVE',
|
||||
title: 'Searchable Document for Managers',
|
||||
},
|
||||
},
|
||||
{
|
||||
sender: owner,
|
||||
teamId: team.id,
|
||||
recipients: [],
|
||||
type: DocumentStatus.COMPLETED,
|
||||
documentOptions: {
|
||||
visibility: 'ADMIN',
|
||||
title: 'Searchable Document for Admins',
|
||||
},
|
||||
},
|
||||
]);
|
||||
|
||||
const testCases = [
|
||||
{ user: adminUser, visibleDocs: 3 },
|
||||
{ user: managerUser, visibleDocs: 2 },
|
||||
{ user: memberUser, visibleDocs: 1 },
|
||||
];
|
||||
|
||||
for (const { user, visibleDocs } of testCases) {
|
||||
await apiSignin({ page, email: user.email });
|
||||
|
||||
const { data } = await trpcDocumentSearch(page, 'Searchable Document');
|
||||
|
||||
expect(data).not.toBeNull();
|
||||
expect(data).toHaveLength(visibleDocs);
|
||||
|
||||
await apiSignout({ page });
|
||||
}
|
||||
});
|
||||
|
||||
test('should respect visibility when searching by recipient email', async ({ page }) => {
|
||||
const { team, owner } = await seedTeam();
|
||||
const adminUser = await seedTeamMember({ teamId: team.id, role: TeamMemberRole.ADMIN });
|
||||
const memberUser = await seedTeamMember({ teamId: team.id, role: TeamMemberRole.MEMBER });
|
||||
|
||||
const { user: uniqueRecipient } = await seedUser();
|
||||
|
||||
await seedDocuments([
|
||||
{
|
||||
sender: owner,
|
||||
recipients: [uniqueRecipient],
|
||||
type: DocumentStatus.COMPLETED,
|
||||
teamId: team.id,
|
||||
documentOptions: {
|
||||
visibility: 'ADMIN',
|
||||
title: 'Admin Document for Unique Recipient',
|
||||
},
|
||||
},
|
||||
]);
|
||||
|
||||
// Admin can find the ADMIN-visibility document by recipient email.
|
||||
await apiSignin({ page, email: adminUser.email });
|
||||
|
||||
const { data: adminData } = await trpcDocumentSearch(page, uniqueRecipient.email);
|
||||
|
||||
expect(adminData).not.toBeNull();
|
||||
expect(adminData).toHaveLength(1);
|
||||
expect(adminData![0].title).toBe('Admin Document for Unique Recipient');
|
||||
|
||||
await apiSignout({ page });
|
||||
|
||||
// Member cannot find the ADMIN-visibility document by recipient email.
|
||||
await apiSignin({ page, email: memberUser.email });
|
||||
|
||||
const { data: memberData } = await trpcDocumentSearch(page, uniqueRecipient.email);
|
||||
|
||||
expect(memberData).not.toBeNull();
|
||||
expect(memberData).toHaveLength(0);
|
||||
|
||||
await apiSignout({ page });
|
||||
});
|
||||
});
|
||||
|
||||
// ─── Cross-Team Isolation ────────────────────────────────────────────────────
|
||||
|
||||
test.describe('Document Search - Cross-Team Isolation', () => {
|
||||
test('should not reveal documents from other teams', async ({ page }) => {
|
||||
const { team: teamA, owner: ownerA } = await seedTeam();
|
||||
const { team: teamB, owner: ownerB } = await seedTeam();
|
||||
|
||||
const memberA = await seedTeamMember({ teamId: teamA.id, role: TeamMemberRole.MEMBER });
|
||||
|
||||
await seedDocuments([
|
||||
{
|
||||
sender: ownerA,
|
||||
teamId: teamA.id,
|
||||
recipients: [],
|
||||
type: DocumentStatus.COMPLETED,
|
||||
documentOptions: {
|
||||
visibility: 'EVERYONE',
|
||||
title: 'Unique Team A Document',
|
||||
},
|
||||
},
|
||||
{
|
||||
sender: ownerB,
|
||||
teamId: teamB.id,
|
||||
recipients: [],
|
||||
type: DocumentStatus.COMPLETED,
|
||||
documentOptions: {
|
||||
visibility: 'EVERYONE',
|
||||
title: 'Unique Team B Document',
|
||||
},
|
||||
},
|
||||
]);
|
||||
|
||||
await apiSignin({ page, email: memberA.email });
|
||||
|
||||
const { data } = await trpcDocumentSearch(page, 'Unique');
|
||||
|
||||
expect(data).not.toBeNull();
|
||||
const titles = data!.map((d) => d.title);
|
||||
|
||||
expect(titles).toContain('Unique Team A Document');
|
||||
expect(titles).not.toContain('Unique Team B Document');
|
||||
|
||||
await apiSignout({ page });
|
||||
});
|
||||
|
||||
test('should not cross team boundaries when searching SQL wildcard "%"', async ({ page }) => {
|
||||
const { team: teamA, owner: ownerA } = await seedTeam();
|
||||
const { team: teamB, owner: ownerB } = await seedTeam();
|
||||
|
||||
await seedDocuments([
|
||||
{
|
||||
sender: ownerA,
|
||||
teamId: teamA.id,
|
||||
recipients: [],
|
||||
type: DocumentStatus.DRAFT,
|
||||
documentOptions: { title: 'Wildcard Doc A' },
|
||||
},
|
||||
]);
|
||||
|
||||
await seedDocuments([
|
||||
{
|
||||
sender: ownerB,
|
||||
teamId: teamB.id,
|
||||
recipients: [],
|
||||
type: DocumentStatus.DRAFT,
|
||||
documentOptions: { title: 'Wildcard Doc B' },
|
||||
},
|
||||
]);
|
||||
|
||||
await apiSignin({ page, email: ownerA.email });
|
||||
|
||||
const { data } = await trpcDocumentSearch(page, '%');
|
||||
|
||||
expect(data).not.toBeNull();
|
||||
expect(data!.map((d) => d.title)).not.toContain('Wildcard Doc B');
|
||||
|
||||
await apiSignout({ page });
|
||||
});
|
||||
|
||||
test('should not cross team boundaries when searching SQL wildcard "_"', async ({ page }) => {
|
||||
const { team: teamA, owner: ownerA } = await seedTeam();
|
||||
const { team: teamB, owner: ownerB } = await seedTeam();
|
||||
|
||||
await seedDocuments([
|
||||
{
|
||||
sender: ownerA,
|
||||
teamId: teamA.id,
|
||||
recipients: [],
|
||||
type: DocumentStatus.DRAFT,
|
||||
documentOptions: { title: 'Underscore A' },
|
||||
},
|
||||
]);
|
||||
|
||||
await seedDocuments([
|
||||
{
|
||||
sender: ownerB,
|
||||
teamId: teamB.id,
|
||||
recipients: [],
|
||||
type: DocumentStatus.DRAFT,
|
||||
documentOptions: { title: 'Underscore B' },
|
||||
},
|
||||
]);
|
||||
|
||||
await apiSignin({ page, email: ownerA.email });
|
||||
|
||||
const { data } = await trpcDocumentSearch(page, '_');
|
||||
|
||||
expect(data).not.toBeNull();
|
||||
expect(data!.map((d) => d.title)).not.toContain('Underscore B');
|
||||
|
||||
await apiSignout({ page });
|
||||
});
|
||||
});
|
||||
|
||||
// ─── Recipient Search ────────────────────────────────────────────────────────
|
||||
|
||||
test.describe('Document Search - Recipient', () => {
|
||||
test('should find documents where user is a recipient', async ({ page }) => {
|
||||
const { team: senderTeam, owner: sender } = await seedTeam();
|
||||
const { user: recipient } = await seedUser();
|
||||
|
||||
await seedPendingDocument(sender, senderTeam.id, [recipient], {
|
||||
createDocumentOptions: { title: 'Recipient Search Test Doc' },
|
||||
});
|
||||
|
||||
await apiSignin({ page, email: recipient.email });
|
||||
|
||||
const { data } = await trpcDocumentSearch(page, 'Recipient Search Test');
|
||||
|
||||
expect(data).not.toBeNull();
|
||||
expect(data!.length).toBeGreaterThanOrEqual(1);
|
||||
|
||||
const result = data!.find((d) => d.title === 'Recipient Search Test Doc');
|
||||
expect(result).toBeDefined();
|
||||
expect(result!.path).toMatch(/^\/sign\/.+/);
|
||||
|
||||
await apiSignout({ page });
|
||||
});
|
||||
});
|
||||
|
||||
// ─── Token Masking ───────────────────────────────────────────────────────────
|
||||
|
||||
test.describe('Document Search - Token Masking', () => {
|
||||
test('should not expose signing token in value field', async ({ page }) => {
|
||||
const { team, owner } = await seedTeam();
|
||||
const { user: recipient } = await seedUser();
|
||||
|
||||
const doc = await seedPendingDocument(owner, team.id, [recipient], {
|
||||
createDocumentOptions: { title: 'Token Leakage Test Document' },
|
||||
});
|
||||
|
||||
const recipientRecord = await prisma.recipient.findFirstOrThrow({
|
||||
where: { envelopeId: doc.id, email: recipient.email },
|
||||
select: { token: true },
|
||||
});
|
||||
|
||||
const signingToken = recipientRecord.token;
|
||||
|
||||
// Owner should see the doc but not any signing token.
|
||||
await apiSignin({ page, email: owner.email });
|
||||
|
||||
const { data } = await trpcDocumentSearch(page, 'Token Leakage Test');
|
||||
|
||||
expect(data).not.toBeNull();
|
||||
expect(data!.length).toBeGreaterThanOrEqual(1);
|
||||
|
||||
const result = data!.find((d) => d.title === 'Token Leakage Test Document');
|
||||
expect(result).toBeDefined();
|
||||
expect(result!.value).not.toContain(signingToken);
|
||||
expect(result!.path).not.toContain('/sign/');
|
||||
|
||||
await apiSignout({ page });
|
||||
|
||||
// Recipient should get their own /sign/ path but token still hidden from value.
|
||||
await apiSignin({ page, email: recipient.email });
|
||||
|
||||
const { data: recipientData } = await trpcDocumentSearch(page, 'Token Leakage Test');
|
||||
|
||||
expect(recipientData).not.toBeNull();
|
||||
expect(recipientData!.length).toBeGreaterThanOrEqual(1);
|
||||
|
||||
const recipientResult = recipientData!.find((d) => d.title === 'Token Leakage Test Document');
|
||||
expect(recipientResult).toBeDefined();
|
||||
expect(recipientResult!.path).toBe(`/sign/${signingToken}`);
|
||||
expect(recipientResult!.value).not.toContain(signingToken);
|
||||
|
||||
await apiSignout({ page });
|
||||
});
|
||||
|
||||
test('should not expose other recipients signing tokens to the owner', async ({ page }) => {
|
||||
const { team, owner } = await seedTeam();
|
||||
const { user: recipientA } = await seedUser();
|
||||
const { user: recipientB } = await seedUser();
|
||||
|
||||
const doc = await seedPendingDocument(owner, team.id, [recipientA, recipientB], {
|
||||
createDocumentOptions: { title: 'Multi Recipient Token Test' },
|
||||
});
|
||||
|
||||
const recipients = await prisma.recipient.findMany({
|
||||
where: { envelopeId: doc.id },
|
||||
select: { token: true, email: true },
|
||||
});
|
||||
|
||||
await apiSignin({ page, email: owner.email });
|
||||
|
||||
const { data } = await trpcDocumentSearch(page, 'Multi Recipient Token');
|
||||
|
||||
expect(data).not.toBeNull();
|
||||
const result = data!.find((d) => d.title === 'Multi Recipient Token Test');
|
||||
expect(result).toBeDefined();
|
||||
|
||||
for (const r of recipients) {
|
||||
expect(result!.value).not.toContain(r.token);
|
||||
expect(result!.path).not.toContain(r.token);
|
||||
}
|
||||
|
||||
await apiSignout({ page });
|
||||
});
|
||||
});
|
||||
|
||||
// ─── Filtering ───────────────────────────────────────────────────────────────
|
||||
|
||||
test.describe('Document Search - Filtering', () => {
|
||||
test('should exclude soft-deleted documents', async ({ page }) => {
|
||||
const { team, owner } = await seedTeam();
|
||||
|
||||
await seedCompletedDocument(owner, team.id, [], {
|
||||
createDocumentOptions: { title: 'Active Deletable Document' },
|
||||
});
|
||||
|
||||
const deletedDoc = await seedCompletedDocument(owner, team.id, [], {
|
||||
createDocumentOptions: { title: 'Deleted Deletable Document' },
|
||||
});
|
||||
|
||||
await prisma.envelope.update({
|
||||
where: { id: deletedDoc.id },
|
||||
data: { deletedAt: new Date() },
|
||||
});
|
||||
|
||||
await apiSignin({ page, email: owner.email });
|
||||
|
||||
const { data } = await trpcDocumentSearch(page, 'Deletable Document');
|
||||
|
||||
expect(data).not.toBeNull();
|
||||
expect(data).toHaveLength(1);
|
||||
expect(data![0].title).toBe('Active Deletable Document');
|
||||
|
||||
await apiSignout({ page });
|
||||
});
|
||||
|
||||
test('should find documents by externalId', async ({ page }) => {
|
||||
const { team, owner } = await seedTeam();
|
||||
|
||||
await seedDocuments([
|
||||
{
|
||||
sender: owner,
|
||||
teamId: team.id,
|
||||
recipients: [],
|
||||
type: DocumentStatus.DRAFT,
|
||||
documentOptions: {
|
||||
title: 'ExternalId Test Doc',
|
||||
externalId: 'ext-unique-abc-123',
|
||||
},
|
||||
},
|
||||
{
|
||||
sender: owner,
|
||||
teamId: team.id,
|
||||
recipients: [],
|
||||
type: DocumentStatus.DRAFT,
|
||||
documentOptions: {
|
||||
title: 'Other Test Doc',
|
||||
externalId: 'ext-other-xyz',
|
||||
},
|
||||
},
|
||||
]);
|
||||
|
||||
await apiSignin({ page, email: owner.email });
|
||||
|
||||
const { data } = await trpcDocumentSearch(page, 'ext-unique-abc');
|
||||
|
||||
expect(data).not.toBeNull();
|
||||
expect(data).toHaveLength(1);
|
||||
expect(data![0].title).toBe('ExternalId Test Doc');
|
||||
|
||||
await apiSignout({ page });
|
||||
});
|
||||
});
|
||||
|
||||
// ─── Authentication ──────────────────────────────────────────────────────────
|
||||
|
||||
test.describe('Document Search - Authentication', () => {
|
||||
test('should reject unauthenticated requests', async ({ page }) => {
|
||||
const { res } = await trpcDocumentSearch(page, 'anything');
|
||||
|
||||
expect(res.ok()).toBeFalsy();
|
||||
expect(res.status()).toBe(401);
|
||||
});
|
||||
});
|
||||
@@ -1,259 +0,0 @@
|
||||
import type { Page } from '@playwright/test';
|
||||
import { expect, test } from '@playwright/test';
|
||||
import { OrganisationMemberRole, TeamMemberRole } from '@prisma/client';
|
||||
|
||||
import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app';
|
||||
import { generateDatabaseId } from '@documenso/lib/universal/id';
|
||||
import { prisma } from '@documenso/prisma';
|
||||
import { seedOrganisationMembers } from '@documenso/prisma/seed/organisations';
|
||||
import { seedTeam, seedTeamMember } from '@documenso/prisma/seed/teams';
|
||||
import { seedBlankTemplate } from '@documenso/prisma/seed/templates';
|
||||
import { seedUser } from '@documenso/prisma/seed/users';
|
||||
|
||||
import { apiSignin, apiSignout } from '../../fixtures/authentication';
|
||||
|
||||
const WEBAPP_BASE_URL = NEXT_PUBLIC_WEBAPP_URL();
|
||||
|
||||
test.describe.configure({
|
||||
mode: 'parallel',
|
||||
});
|
||||
|
||||
const trpcTemplateSearch = async (page: Page, query: string) => {
|
||||
const inputParam = encodeURIComponent(JSON.stringify({ json: { query } }));
|
||||
const url = `${WEBAPP_BASE_URL}/api/trpc/template.search?input=${inputParam}`;
|
||||
|
||||
const res = await page.context().request.get(url);
|
||||
|
||||
return {
|
||||
res,
|
||||
data: res.ok()
|
||||
? // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
||||
((await res.json()).result.data.json as Array<{
|
||||
title: string;
|
||||
path: string;
|
||||
value: string;
|
||||
}>)
|
||||
: null,
|
||||
};
|
||||
};
|
||||
|
||||
// ─── Visibility ──────────────────────────────────────────────────────────────
|
||||
|
||||
test.describe('Template Search - Visibility', () => {
|
||||
test('should respect team template visibility per role', async ({ page }) => {
|
||||
const { user: owner, organisation, team } = await seedUser();
|
||||
|
||||
const [adminUser, managerUser, memberUser] = await seedOrganisationMembers({
|
||||
organisationId: organisation.id,
|
||||
members: [
|
||||
{ organisationRole: OrganisationMemberRole.ADMIN },
|
||||
{ organisationRole: OrganisationMemberRole.MEMBER },
|
||||
{ organisationRole: OrganisationMemberRole.MEMBER },
|
||||
],
|
||||
});
|
||||
|
||||
const managerTeamGroup = await prisma.teamGroup.findFirstOrThrow({
|
||||
where: { teamId: team.id, teamRole: TeamMemberRole.MANAGER },
|
||||
include: { organisationGroup: true },
|
||||
});
|
||||
|
||||
const managerOrganisationMember = await prisma.organisationMember.findFirstOrThrow({
|
||||
where: { organisationId: organisation.id, userId: managerUser.id },
|
||||
});
|
||||
|
||||
await prisma.organisationGroupMember.create({
|
||||
data: {
|
||||
id: generateDatabaseId('group_member'),
|
||||
groupId: managerTeamGroup.organisationGroupId,
|
||||
organisationMemberId: managerOrganisationMember.id,
|
||||
},
|
||||
});
|
||||
|
||||
await seedBlankTemplate(owner, team.id, {
|
||||
createTemplateOptions: {
|
||||
visibility: 'EVERYONE',
|
||||
title: 'Searchable Template for Everyone',
|
||||
},
|
||||
});
|
||||
|
||||
await seedBlankTemplate(owner, team.id, {
|
||||
createTemplateOptions: {
|
||||
visibility: 'MANAGER_AND_ABOVE',
|
||||
title: 'Searchable Template for Managers',
|
||||
},
|
||||
});
|
||||
|
||||
await seedBlankTemplate(owner, team.id, {
|
||||
createTemplateOptions: {
|
||||
visibility: 'ADMIN',
|
||||
title: 'Searchable Template for Admins',
|
||||
},
|
||||
});
|
||||
|
||||
const testCases = [
|
||||
{ user: adminUser, visibleTemplates: 3 },
|
||||
{ user: managerUser, visibleTemplates: 2 },
|
||||
{ user: memberUser, visibleTemplates: 1 },
|
||||
];
|
||||
|
||||
for (const { user, visibleTemplates } of testCases) {
|
||||
await apiSignin({ page, email: user.email });
|
||||
|
||||
const { data } = await trpcTemplateSearch(page, 'Searchable Template');
|
||||
|
||||
expect(data).not.toBeNull();
|
||||
expect(data).toHaveLength(visibleTemplates);
|
||||
|
||||
await apiSignout({ page });
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// ─── Cross-Team Isolation ────────────────────────────────────────────────────
|
||||
|
||||
test.describe('Template Search - Cross-Team Isolation', () => {
|
||||
test('should not reveal templates from other teams', async ({ page }) => {
|
||||
const { team: teamA, owner: ownerA } = await seedTeam();
|
||||
const { team: teamB, owner: ownerB } = await seedTeam();
|
||||
|
||||
const memberA = await seedTeamMember({ teamId: teamA.id, role: TeamMemberRole.MEMBER });
|
||||
|
||||
await seedBlankTemplate(ownerA, teamA.id, {
|
||||
createTemplateOptions: {
|
||||
visibility: 'EVERYONE',
|
||||
title: 'Unique Team A Template',
|
||||
},
|
||||
});
|
||||
|
||||
await seedBlankTemplate(ownerB, teamB.id, {
|
||||
createTemplateOptions: {
|
||||
visibility: 'EVERYONE',
|
||||
title: 'Unique Team B Template',
|
||||
},
|
||||
});
|
||||
|
||||
await apiSignin({ page, email: memberA.email });
|
||||
|
||||
const { data } = await trpcTemplateSearch(page, 'Unique');
|
||||
|
||||
expect(data).not.toBeNull();
|
||||
const titles = data!.map((d) => d.title);
|
||||
|
||||
expect(titles).toContain('Unique Team A Template');
|
||||
expect(titles).not.toContain('Unique Team B Template');
|
||||
|
||||
await apiSignout({ page });
|
||||
});
|
||||
|
||||
test('should not cross team boundaries when searching SQL wildcard "%"', async ({ page }) => {
|
||||
const { team: teamA, owner: ownerA } = await seedTeam();
|
||||
const { team: teamB, owner: ownerB } = await seedTeam();
|
||||
|
||||
await seedBlankTemplate(ownerA, teamA.id, {
|
||||
createTemplateOptions: { title: 'Wildcard Tpl A' },
|
||||
});
|
||||
|
||||
await seedBlankTemplate(ownerB, teamB.id, {
|
||||
createTemplateOptions: { title: 'Wildcard Tpl B' },
|
||||
});
|
||||
|
||||
await apiSignin({ page, email: ownerA.email });
|
||||
|
||||
const { data } = await trpcTemplateSearch(page, '%');
|
||||
|
||||
expect(data).not.toBeNull();
|
||||
expect(data!.map((d) => d.title)).not.toContain('Wildcard Tpl B');
|
||||
|
||||
await apiSignout({ page });
|
||||
});
|
||||
});
|
||||
|
||||
// ─── Recipient Email Search ──────────────────────────────────────────────────
|
||||
|
||||
test.describe('Template Search - Recipient Email', () => {
|
||||
test('should find templates by recipient email within team but not cross-team', async ({
|
||||
page,
|
||||
}) => {
|
||||
const { team: teamA, owner: ownerA } = await seedTeam();
|
||||
const adminUserA = await seedTeamMember({ teamId: teamA.id, role: TeamMemberRole.ADMIN });
|
||||
const { team: teamB, owner: ownerB } = await seedTeam();
|
||||
|
||||
const { user: uniqueRecipient } = await seedUser();
|
||||
|
||||
const template = await seedBlankTemplate(ownerA, teamA.id, {
|
||||
createTemplateOptions: { title: 'Template with Unique Recipient' },
|
||||
});
|
||||
|
||||
await prisma.recipient.create({
|
||||
data: {
|
||||
email: uniqueRecipient.email,
|
||||
name: uniqueRecipient.name ?? '',
|
||||
token: Math.random().toString().slice(2, 7),
|
||||
envelopeId: template.id,
|
||||
},
|
||||
});
|
||||
|
||||
// Team admin can find the template by recipient email.
|
||||
await apiSignin({ page, email: adminUserA.email });
|
||||
|
||||
const { data: adminData } = await trpcTemplateSearch(page, uniqueRecipient.email);
|
||||
|
||||
expect(adminData).not.toBeNull();
|
||||
expect(adminData).toHaveLength(1);
|
||||
expect(adminData![0].title).toBe('Template with Unique Recipient');
|
||||
|
||||
await apiSignout({ page });
|
||||
|
||||
// Owner of a different team cannot find it.
|
||||
await apiSignin({ page, email: ownerB.email });
|
||||
|
||||
const { data: otherTeamData } = await trpcTemplateSearch(page, uniqueRecipient.email);
|
||||
|
||||
expect(otherTeamData).not.toBeNull();
|
||||
expect(otherTeamData).toHaveLength(0);
|
||||
|
||||
await apiSignout({ page });
|
||||
});
|
||||
});
|
||||
|
||||
// ─── Filtering ───────────────────────────────────────────────────────────────
|
||||
|
||||
test.describe('Template Search - Filtering', () => {
|
||||
test('should exclude soft-deleted templates', async ({ page }) => {
|
||||
const { team, owner } = await seedTeam();
|
||||
|
||||
await seedBlankTemplate(owner, team.id, {
|
||||
createTemplateOptions: { title: 'Active Findable Template' },
|
||||
});
|
||||
|
||||
const deletedTemplate = await seedBlankTemplate(owner, team.id, {
|
||||
createTemplateOptions: { title: 'Deleted Findable Template' },
|
||||
});
|
||||
|
||||
await prisma.envelope.update({
|
||||
where: { id: deletedTemplate.id },
|
||||
data: { deletedAt: new Date() },
|
||||
});
|
||||
|
||||
await apiSignin({ page, email: owner.email });
|
||||
|
||||
const { data } = await trpcTemplateSearch(page, 'Findable Template');
|
||||
|
||||
expect(data).not.toBeNull();
|
||||
expect(data).toHaveLength(1);
|
||||
expect(data![0].title).toBe('Active Findable Template');
|
||||
|
||||
await apiSignout({ page });
|
||||
});
|
||||
});
|
||||
|
||||
// ─── Authentication ──────────────────────────────────────────────────────────
|
||||
|
||||
test.describe('Template Search - Authentication', () => {
|
||||
test('should reject unauthenticated requests', async ({ page }) => {
|
||||
const { res } = await trpcTemplateSearch(page, 'anything');
|
||||
|
||||
expect(res.ok()).toBeFalsy();
|
||||
expect(res.status()).toBe(401);
|
||||
});
|
||||
});
|
||||
@@ -197,7 +197,7 @@ test.describe('Template Field Prefill API v1', () => {
|
||||
|
||||
// 7. Navigate to the template
|
||||
await page.goto(
|
||||
`${WEBAPP_BASE_URL}/t/${team.url}/templates/${mapSecondaryIdToTemplateId(template.secondaryId)}`,
|
||||
`${WEBAPP_BASE_URL}/templates/${mapSecondaryIdToTemplateId(template.secondaryId)}`,
|
||||
);
|
||||
|
||||
// 8. Create a document from the template with prefilled fields
|
||||
@@ -488,7 +488,7 @@ test.describe('Template Field Prefill API v1', () => {
|
||||
|
||||
// 7. Navigate to the template
|
||||
await page.goto(
|
||||
`${WEBAPP_BASE_URL}/t/${team.url}/templates/${mapSecondaryIdToTemplateId(template.secondaryId)}`,
|
||||
`${WEBAPP_BASE_URL}/templates/${mapSecondaryIdToTemplateId(template.secondaryId)}`,
|
||||
);
|
||||
|
||||
// 8. Create a document from the template without prefilled fields
|
||||
|
||||
@@ -197,7 +197,7 @@ test.describe('Template Field Prefill API v2', () => {
|
||||
|
||||
// 7. Navigate to the template
|
||||
await page.goto(
|
||||
`${WEBAPP_BASE_URL}/t/${team.url}/templates/${mapSecondaryIdToTemplateId(template.secondaryId)}`,
|
||||
`${WEBAPP_BASE_URL}/templates/${mapSecondaryIdToTemplateId(template.secondaryId)}`,
|
||||
);
|
||||
|
||||
// 8. Create a document from the template with prefilled fields using v2 API
|
||||
@@ -485,7 +485,7 @@ test.describe('Template Field Prefill API v2', () => {
|
||||
|
||||
// 7. Navigate to the template
|
||||
await page.goto(
|
||||
`${WEBAPP_BASE_URL}/t/${team.url}/templates/${mapSecondaryIdToTemplateId(template.secondaryId)}`,
|
||||
`${WEBAPP_BASE_URL}/templates/${mapSecondaryIdToTemplateId(template.secondaryId)}`,
|
||||
);
|
||||
|
||||
// 8. Create a document from the template without prefilled fields using v2 API
|
||||
|
||||
@@ -44,7 +44,7 @@ test('[COMMAND_MENU]: should be able to search by recipient', async ({ page }) =
|
||||
|
||||
await apiSignin({
|
||||
page,
|
||||
email: user.email,
|
||||
email: recipient.email,
|
||||
});
|
||||
|
||||
await page.keyboard.press('Meta+K');
|
||||
|
||||
@@ -7,16 +7,16 @@
|
||||
"scripts": {
|
||||
"test:dev": "NODE_OPTIONS=--experimental-require-module playwright test",
|
||||
"test-ui:dev": "NODE_OPTIONS=--experimental-require-module playwright test --ui",
|
||||
"test:e2e": "NODE_OPTIONS=--experimental-require-module NODE_ENV=test NEXT_PRIVATE_LOGGER_FILE_PATH=./logs.json start-server-and-test \"npm run start -w @documenso/remix\" http://localhost:3000 \"playwright test $E2E_TEST_PATH\""
|
||||
"test:e2e": "NODE_OPTIONS=--experimental-require-module NODE_ENV=test NEXT_PRIVATE_LOGGER_FILE_PATH=./logs.json start-server-and-test \"pnpm run --filter @documenso/remix start\" http://localhost:3000 \"playwright test $E2E_TEST_PATH\""
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"devDependencies": {
|
||||
"@documenso/lib": "*",
|
||||
"@documenso/prisma": "*",
|
||||
"@napi-rs/canvas": "^0.1.83",
|
||||
"@documenso/lib": "workspace:*",
|
||||
"@documenso/prisma": "workspace:*",
|
||||
"@napi-rs/canvas": "catalog:",
|
||||
"@playwright/test": "1.56.1",
|
||||
"@types/node": "^20",
|
||||
"@types/node": "catalog:",
|
||||
"@types/pngjs": "^6.0.5",
|
||||
"pixelmatch": "^7.1.0",
|
||||
"pngjs": "^7.0.0"
|
||||
@@ -24,4 +24,4 @@
|
||||
"dependencies": {
|
||||
"start-server-and-test": "^2.1.3"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+11
-11
@@ -10,17 +10,17 @@
|
||||
"clean": "rimraf node_modules"
|
||||
},
|
||||
"dependencies": {
|
||||
"@documenso/lib": "*",
|
||||
"@documenso/prisma": "*",
|
||||
"@hono/standard-validator": "^0.2.0",
|
||||
"@oslojs/crypto": "^1.0.1",
|
||||
"@oslojs/encoding": "^1.1.0",
|
||||
"@simplewebauthn/server": "^13.2.2",
|
||||
"@documenso/lib": "workspace:*",
|
||||
"@documenso/prisma": "workspace:*",
|
||||
"@hono/standard-validator": "catalog:",
|
||||
"@oslojs/crypto": "catalog:",
|
||||
"@oslojs/encoding": "catalog:",
|
||||
"@simplewebauthn/server": "catalog:",
|
||||
"arctic": "^3.7.0",
|
||||
"hono": "^4.12.5",
|
||||
"luxon": "^3.7.2",
|
||||
"nanoid": "^5.1.6",
|
||||
"ts-pattern": "^5.9.0",
|
||||
"zod": "^3.25.76"
|
||||
"hono": "catalog:",
|
||||
"luxon": "catalog:",
|
||||
"nanoid": "catalog:",
|
||||
"ts-pattern": "catalog:",
|
||||
"zod": "catalog:"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,12 +13,12 @@
|
||||
"clean": "rimraf node_modules"
|
||||
},
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-sesv2": "^3.998.0",
|
||||
"@documenso/lib": "*",
|
||||
"@documenso/prisma": "*",
|
||||
"luxon": "^3.7.2",
|
||||
"react": "^18",
|
||||
"ts-pattern": "^5.9.0",
|
||||
"zod": "^3.25.76"
|
||||
"@aws-sdk/client-sesv2": "catalog:",
|
||||
"@documenso/lib": "workspace:*",
|
||||
"@documenso/prisma": "workspace:*",
|
||||
"luxon": "catalog:",
|
||||
"react": "catalog:",
|
||||
"ts-pattern": "catalog:",
|
||||
"zod": "catalog:"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"clean": "rimraf node_modules"
|
||||
},
|
||||
"dependencies": {
|
||||
"@documenso/tailwind-config": "*",
|
||||
"@documenso/tailwind-config": "workspace:*",
|
||||
"@documenso/nodemailer-resend": "4.0.0",
|
||||
"@react-email/body": "0.2.0",
|
||||
"@react-email/button": "0.2.0",
|
||||
@@ -37,12 +37,12 @@
|
||||
"@react-email/section": "0.0.16",
|
||||
"@react-email/tailwind": "^2.0.1",
|
||||
"@react-email/text": "0.1.5",
|
||||
"nodemailer": "^7.0.10",
|
||||
"nodemailer": "catalog:",
|
||||
"react-email": "^5.0.6",
|
||||
"resend": "^6.5.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@documenso/tsconfig": "*",
|
||||
"@documenso/tsconfig": "workspace:*",
|
||||
"@types/nodemailer": "^7.0.4"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,11 +9,12 @@
|
||||
"dependencies": {
|
||||
"@typescript-eslint/eslint-plugin": "^7.18.0",
|
||||
"@typescript-eslint/parser": "^7.18.0",
|
||||
"eslint": "^8.57.0",
|
||||
"eslint": "catalog:",
|
||||
"eslint-config-next": "^15",
|
||||
"eslint-config-turbo": "^1.13.4",
|
||||
"eslint-config-turbo": "^2.8.12",
|
||||
"eslint-plugin-package-json": "^0.85.0",
|
||||
"eslint-plugin-react": "^7.37.5",
|
||||
"eslint-plugin-unused-imports": "^4.3.0"
|
||||
"eslint-plugin-unused-imports": "^4.3.0",
|
||||
"typescript": "catalog:"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ export const useAutoSave = <T, R = void>(
|
||||
) => {
|
||||
const { delay = 2000 } = options;
|
||||
|
||||
const saveTimeoutRef = useRef<NodeJS.Timeout>();
|
||||
const saveTimeoutRef = useRef<NodeJS.Timeout>(undefined);
|
||||
const saveQueueRef = useRef<SaveRequest<T, R>[]>([]);
|
||||
const isProcessingRef = useRef(false);
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* eslint-disable @typescript-eslint/consistent-type-assertions */
|
||||
import { RefObject, useEffect, useState } from 'react';
|
||||
import { useEffect, useState } from 'react';
|
||||
|
||||
/**
|
||||
* Calculate the width and height of a text element.
|
||||
|
||||
+31
-30
@@ -15,55 +15,56 @@
|
||||
"clean": "rimraf node_modules"
|
||||
},
|
||||
"dependencies": {
|
||||
"@ai-sdk/google-vertex": "3.0.81",
|
||||
"@aws-sdk/client-s3": "^3.998.0",
|
||||
"@aws-sdk/client-sesv2": "^3.998.0",
|
||||
"@aws-sdk/cloudfront-signer": "^3.998.0",
|
||||
"@aws-sdk/s3-request-presigner": "^3.998.0",
|
||||
"@aws-sdk/signature-v4-crt": "^3.998.0",
|
||||
"@documenso/assets": "*",
|
||||
"@documenso/email": "*",
|
||||
"@documenso/prisma": "*",
|
||||
"@documenso/signing": "*",
|
||||
"@lingui/core": "^5.6.0",
|
||||
"@lingui/macro": "^5.6.0",
|
||||
"@lingui/react": "^5.6.0",
|
||||
"@napi-rs/canvas": "^0.1.83",
|
||||
"@ai-sdk/google-vertex": "catalog:",
|
||||
"@aws-sdk/client-s3": "catalog:",
|
||||
"@aws-sdk/client-sesv2": "catalog:",
|
||||
"@aws-sdk/cloudfront-signer": "catalog:",
|
||||
"@aws-sdk/s3-request-presigner": "catalog:",
|
||||
"@aws-sdk/signature-v4-crt": "catalog:",
|
||||
"@documenso/assets": "workspace:*",
|
||||
"@documenso/email": "workspace:*",
|
||||
"@documenso/prisma": "workspace:*",
|
||||
"@documenso/signing": "workspace:*",
|
||||
"@lingui/core": "catalog:",
|
||||
"@lingui/macro": "catalog:",
|
||||
"@lingui/react": "catalog:",
|
||||
"@napi-rs/canvas": "catalog:",
|
||||
"@noble/ciphers": "0.6.0",
|
||||
"@noble/hashes": "1.8.0",
|
||||
"@node-rs/bcrypt": "^1.10.7",
|
||||
"@pdf-lib/fontkit": "^1.1.1",
|
||||
"@scure/base": "^1.2.6",
|
||||
"@simplewebauthn/server": "^13.2.2",
|
||||
"@scure/base": "catalog:",
|
||||
"@simplewebauthn/server": "catalog:",
|
||||
"@sindresorhus/slugify": "^3.0.0",
|
||||
"@team-plain/typescript-sdk": "^5.11.0",
|
||||
"@vvo/tzdb": "^6.196.0",
|
||||
"ai": "^5.0.104",
|
||||
"ai": "catalog:",
|
||||
"csv-parse": "^6.1.0",
|
||||
"inngest": "^3.45.1",
|
||||
"jose": "^6.1.2",
|
||||
"konva": "^10.0.9",
|
||||
"kysely": "0.28.8",
|
||||
"luxon": "^3.7.2",
|
||||
"nanoid": "^5.1.6",
|
||||
"konva": "catalog:",
|
||||
"kysely": "catalog:",
|
||||
"luxon": "catalog:",
|
||||
"nanoid": "catalog:",
|
||||
"oslo": "^0.17.0",
|
||||
"p-map": "^7.0.4",
|
||||
"pg": "^8.16.3",
|
||||
"pino": "^9.14.0",
|
||||
"pino-pretty": "^13.1.2",
|
||||
"playwright": "1.56.1",
|
||||
"posthog-js": "^1.297.2",
|
||||
"posthog-node": "4.18.0",
|
||||
"react": "^18",
|
||||
"remeda": "^2.32.0",
|
||||
"pino": "catalog:",
|
||||
"pino-pretty": "catalog:",
|
||||
"playwright": "catalog:",
|
||||
"posthog-js": "catalog:",
|
||||
"posthog-node": "catalog:",
|
||||
"react": "catalog:",
|
||||
"remeda": "catalog:",
|
||||
"sharp": "0.34.5",
|
||||
"skia-canvas": "^3.0.8",
|
||||
"stripe": "^12.18.0",
|
||||
"ts-pattern": "^5.9.0",
|
||||
"zod": "^3.25.76"
|
||||
"ts-pattern": "catalog:",
|
||||
"zod": "catalog:"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@playwright/browser-chromium": "1.56.1",
|
||||
"@types/luxon": "catalog:",
|
||||
"@types/pg": "^8.15.6"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { type RecipientRole, SigningStatus } from '@prisma/client';
|
||||
import { SigningStatus } from '@prisma/client';
|
||||
|
||||
import { prisma } from '@documenso/prisma';
|
||||
|
||||
@@ -6,10 +6,9 @@ export type UpdateRecipientOptions = {
|
||||
id: number;
|
||||
name: string | undefined;
|
||||
email: string | undefined;
|
||||
role: RecipientRole | undefined;
|
||||
};
|
||||
|
||||
export const updateRecipient = async ({ id, name, email, role }: UpdateRecipientOptions) => {
|
||||
export const updateRecipient = async ({ id, name, email }: UpdateRecipientOptions) => {
|
||||
const recipient = await prisma.recipient.findFirstOrThrow({
|
||||
where: {
|
||||
id,
|
||||
@@ -27,7 +26,6 @@ export const updateRecipient = async ({ id, name, email, role }: UpdateRecipient
|
||||
data: {
|
||||
name,
|
||||
email,
|
||||
role,
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
@@ -1,12 +1,16 @@
|
||||
import type { Prisma } from '@prisma/client';
|
||||
import { DocumentStatus, DocumentVisibility, EnvelopeType, TeamMemberRole } from '@prisma/client';
|
||||
import { DocumentStatus, EnvelopeType } from '@prisma/client';
|
||||
import type { Envelope, Recipient, User } from '@prisma/client';
|
||||
import { DocumentVisibility, TeamMemberRole } from '@prisma/client';
|
||||
import { match } from 'ts-pattern';
|
||||
|
||||
import { formatDocumentsPath, getHighestTeamRoleInGroup } from '@documenso/lib/utils/teams';
|
||||
import {
|
||||
buildTeamWhereQuery,
|
||||
formatDocumentsPath,
|
||||
getHighestTeamRoleInGroup,
|
||||
} from '@documenso/lib/utils/teams';
|
||||
import { prisma } from '@documenso/prisma';
|
||||
|
||||
import { mapSecondaryIdToDocumentId } from '../../utils/envelope';
|
||||
import { getUserTeamGroups } from '../team/get-user-team-groups';
|
||||
|
||||
export type SearchDocumentsWithKeywordOptions = {
|
||||
query: string;
|
||||
@@ -19,83 +23,105 @@ export const searchDocumentsWithKeyword = async ({
|
||||
userId,
|
||||
limit = 20,
|
||||
}: SearchDocumentsWithKeywordOptions) => {
|
||||
if (!query.trim()) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const [user, teamGroupsByTeamId] = await Promise.all([
|
||||
prisma.user.findFirstOrThrow({
|
||||
where: {
|
||||
id: userId,
|
||||
},
|
||||
}),
|
||||
getUserTeamGroups({ userId }),
|
||||
]);
|
||||
|
||||
const teamIds = [...teamGroupsByTeamId.keys()];
|
||||
|
||||
const filters: Prisma.EnvelopeWhereInput[] = [
|
||||
// Documents owned by the user matching title, externalId, or recipient email.
|
||||
{
|
||||
userId,
|
||||
deletedAt: null,
|
||||
OR: [
|
||||
{ title: { contains: query, mode: 'insensitive' } },
|
||||
{ externalId: { contains: query, mode: 'insensitive' } },
|
||||
{
|
||||
recipients: {
|
||||
some: { email: { contains: query, mode: 'insensitive' } },
|
||||
},
|
||||
},
|
||||
],
|
||||
const user = await prisma.user.findFirstOrThrow({
|
||||
where: {
|
||||
id: userId,
|
||||
},
|
||||
// Documents where the user is a recipient (completed or pending).
|
||||
{
|
||||
status: { in: [DocumentStatus.COMPLETED, DocumentStatus.PENDING] },
|
||||
recipients: { some: { email: user.email } },
|
||||
title: { contains: query, mode: 'insensitive' },
|
||||
deletedAt: null,
|
||||
},
|
||||
];
|
||||
|
||||
// Team documents the user has access to.
|
||||
if (teamIds.length > 0) {
|
||||
filters.push({
|
||||
teamId: { in: teamIds },
|
||||
deletedAt: null,
|
||||
OR: [
|
||||
{ title: { contains: query, mode: 'insensitive' } },
|
||||
{ externalId: { contains: query, mode: 'insensitive' } },
|
||||
{
|
||||
recipients: {
|
||||
some: { email: { contains: query, mode: 'insensitive' } },
|
||||
},
|
||||
},
|
||||
],
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
const envelopes = await prisma.envelope.findMany({
|
||||
where: {
|
||||
type: EnvelopeType.DOCUMENT,
|
||||
OR: filters,
|
||||
},
|
||||
select: {
|
||||
id: true,
|
||||
userId: true,
|
||||
teamId: true,
|
||||
title: true,
|
||||
secondaryId: true,
|
||||
visibility: true,
|
||||
recipients: {
|
||||
select: {
|
||||
email: true,
|
||||
token: true,
|
||||
OR: [
|
||||
{
|
||||
title: {
|
||||
contains: query,
|
||||
mode: 'insensitive',
|
||||
},
|
||||
userId: userId,
|
||||
deletedAt: null,
|
||||
},
|
||||
},
|
||||
{
|
||||
externalId: {
|
||||
contains: query,
|
||||
mode: 'insensitive',
|
||||
},
|
||||
userId: userId,
|
||||
deletedAt: null,
|
||||
},
|
||||
{
|
||||
recipients: {
|
||||
some: {
|
||||
email: {
|
||||
contains: query,
|
||||
mode: 'insensitive',
|
||||
},
|
||||
},
|
||||
},
|
||||
userId: userId,
|
||||
deletedAt: null,
|
||||
},
|
||||
{
|
||||
status: DocumentStatus.COMPLETED,
|
||||
recipients: {
|
||||
some: {
|
||||
email: user.email,
|
||||
},
|
||||
},
|
||||
title: {
|
||||
contains: query,
|
||||
mode: 'insensitive',
|
||||
},
|
||||
},
|
||||
{
|
||||
status: DocumentStatus.PENDING,
|
||||
recipients: {
|
||||
some: {
|
||||
email: user.email,
|
||||
},
|
||||
},
|
||||
title: {
|
||||
contains: query,
|
||||
mode: 'insensitive',
|
||||
},
|
||||
deletedAt: null,
|
||||
},
|
||||
{
|
||||
title: {
|
||||
contains: query,
|
||||
mode: 'insensitive',
|
||||
},
|
||||
team: buildTeamWhereQuery({ teamId: undefined, userId }),
|
||||
deletedAt: null,
|
||||
},
|
||||
{
|
||||
externalId: {
|
||||
contains: query,
|
||||
mode: 'insensitive',
|
||||
},
|
||||
team: buildTeamWhereQuery({ teamId: undefined, userId }),
|
||||
deletedAt: null,
|
||||
},
|
||||
],
|
||||
},
|
||||
include: {
|
||||
recipients: true,
|
||||
team: {
|
||||
select: {
|
||||
url: true,
|
||||
teamGroups: {
|
||||
where: {
|
||||
organisationGroup: {
|
||||
organisationGroupMembers: {
|
||||
some: {
|
||||
organisationMember: {
|
||||
userId,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -103,24 +129,29 @@ export const searchDocumentsWithKeyword = async ({
|
||||
orderBy: {
|
||||
createdAt: 'desc',
|
||||
},
|
||||
// Over-fetch to compensate for post-query visibility filtering on team documents.
|
||||
take: limit * 3,
|
||||
take: limit,
|
||||
});
|
||||
|
||||
const results = envelopes
|
||||
const isOwner = (envelope: Envelope, user: User) => envelope.userId === user.id;
|
||||
|
||||
const getSigningLink = (recipients: Recipient[], user: User) =>
|
||||
`/sign/${recipients.find((r) => r.email === user.email)?.token}`;
|
||||
|
||||
const maskedDocuments = envelopes
|
||||
.filter((envelope) => {
|
||||
if (!envelope.teamId || envelope.userId === user.id) {
|
||||
if (!envelope.teamId || isOwner(envelope, user)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
const teamGroups = teamGroupsByTeamId.get(envelope.teamId) ?? [];
|
||||
const teamMemberRole = getHighestTeamRoleInGroup(teamGroups);
|
||||
const teamMemberRole = getHighestTeamRoleInGroup(
|
||||
envelope.team.teamGroups.filter((tg) => tg.teamId === envelope.teamId),
|
||||
);
|
||||
|
||||
if (!teamMemberRole) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return match([envelope.visibility, teamMemberRole])
|
||||
const canAccessDocument = match([envelope.visibility, teamMemberRole])
|
||||
.with([DocumentVisibility.EVERYONE, TeamMemberRole.ADMIN], () => true)
|
||||
.with([DocumentVisibility.EVERYONE, TeamMemberRole.MANAGER], () => true)
|
||||
.with([DocumentVisibility.EVERYONE, TeamMemberRole.MEMBER], () => true)
|
||||
@@ -128,29 +159,34 @@ export const searchDocumentsWithKeyword = async ({
|
||||
.with([DocumentVisibility.MANAGER_AND_ABOVE, TeamMemberRole.MANAGER], () => true)
|
||||
.with([DocumentVisibility.ADMIN, TeamMemberRole.ADMIN], () => true)
|
||||
.otherwise(() => false);
|
||||
|
||||
return canAccessDocument;
|
||||
})
|
||||
.slice(0, limit)
|
||||
.map((envelope) => {
|
||||
const { recipients, ...documentWithoutRecipient } = envelope;
|
||||
|
||||
let documentPath;
|
||||
|
||||
const legacyDocumentId = mapSecondaryIdToDocumentId(envelope.secondaryId);
|
||||
|
||||
let path: string;
|
||||
|
||||
if (
|
||||
envelope.userId === user.id ||
|
||||
(envelope.teamId && teamGroupsByTeamId.has(envelope.teamId))
|
||||
) {
|
||||
path = `${formatDocumentsPath(envelope.team.url)}/${legacyDocumentId}`;
|
||||
if (isOwner(envelope, user)) {
|
||||
documentPath = `${formatDocumentsPath(envelope.team.url)}/${legacyDocumentId}`;
|
||||
} else if (envelope.teamId && envelope.team.teamGroups.length > 0) {
|
||||
documentPath = `${formatDocumentsPath(envelope.team.url)}/${legacyDocumentId}`;
|
||||
} else {
|
||||
const signingToken = envelope.recipients.find((r) => r.email === user.email)?.token;
|
||||
path = `/sign/${signingToken}`;
|
||||
documentPath = getSigningLink(recipients, user);
|
||||
}
|
||||
|
||||
return {
|
||||
title: envelope.title,
|
||||
path,
|
||||
...documentWithoutRecipient,
|
||||
team: {
|
||||
id: envelope.teamId,
|
||||
url: envelope.team.url,
|
||||
},
|
||||
path: documentPath,
|
||||
value: [envelope.id, envelope.title, ...envelope.recipients.map((r) => r.email)].join(' '),
|
||||
};
|
||||
});
|
||||
|
||||
return results;
|
||||
return maskedDocuments;
|
||||
};
|
||||
|
||||
@@ -159,12 +159,10 @@ export const sendDocument = async ({
|
||||
);
|
||||
|
||||
if (recipientsWithMissingFields.length > 0) {
|
||||
const missingRecipientDescriptions = recipientsWithMissingFields
|
||||
.map((r) => (r.name ? `${r.name} (${r.email}, id: ${r.id})` : `${r.email} (id: ${r.id})`))
|
||||
.join(', ');
|
||||
const missingRecipientIds = recipientsWithMissingFields.map((r) => r.id).join(', ');
|
||||
|
||||
throw new AppError(AppErrorCode.INVALID_REQUEST, {
|
||||
message: `The following recipients are missing required fields: ${missingRecipientDescriptions}. Signers must have at least one signature field.`,
|
||||
message: `The following recipients are missing required fields: ${missingRecipientIds}. Signers must have at least one signature field.`,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -1,45 +1,9 @@
|
||||
import { FieldType } from '@prisma/client';
|
||||
import type { Recipient } from '@prisma/client';
|
||||
import path from 'node:path';
|
||||
import { FontLibrary } from 'skia-canvas';
|
||||
import { match } from 'ts-pattern';
|
||||
|
||||
import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error';
|
||||
|
||||
/**
|
||||
* Ensure all required fonts are registered in the skia-canvas FontLibrary.
|
||||
*
|
||||
* Fonts are registered once per process and retained — calling this multiple
|
||||
* times is a no-op after the first invocation.
|
||||
*/
|
||||
export const ensureFontLibrary = () => {
|
||||
const fontPath = path.join(process.cwd(), 'public/fonts');
|
||||
|
||||
if (!FontLibrary.has('Caveat')) {
|
||||
// eslint-disable-next-line react-hooks/rules-of-hooks
|
||||
FontLibrary.use({
|
||||
['Caveat']: [path.join(fontPath, 'caveat.ttf')],
|
||||
});
|
||||
}
|
||||
|
||||
if (!FontLibrary.has('Inter')) {
|
||||
// eslint-disable-next-line react-hooks/rules-of-hooks
|
||||
FontLibrary.use({
|
||||
['Inter']: [path.join(fontPath, 'inter-variablefont_opsz,wght.ttf')],
|
||||
});
|
||||
}
|
||||
|
||||
if (!FontLibrary.has('Noto Sans')) {
|
||||
// eslint-disable-next-line react-hooks/rules-of-hooks
|
||||
FontLibrary.use({
|
||||
['Noto Sans']: [path.join(fontPath, 'noto-sans.ttf')],
|
||||
['Noto Sans Japanese']: [path.join(fontPath, 'noto-sans-japanese.ttf')],
|
||||
['Noto Sans Chinese']: [path.join(fontPath, 'noto-sans-chinese.ttf')],
|
||||
['Noto Sans Korean']: [path.join(fontPath, 'noto-sans-korean.ttf')],
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
type RecipientPlaceholderInfo = {
|
||||
email: string;
|
||||
name: string;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user