@servicetitan/dte-pdf-editor 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +356 -0
- package/dist/components/data-model-field-type-list.d.ts +11 -0
- package/dist/components/data-model-field-type-list.d.ts.map +1 -0
- package/dist/components/data-model-field-type-list.js +23 -0
- package/dist/components/data-model-field-type-list.js.map +1 -0
- package/dist/components/e-sign-field-type-list.d.ts +9 -0
- package/dist/components/e-sign-field-type-list.d.ts.map +1 -0
- package/dist/components/e-sign-field-type-list.js +12 -0
- package/dist/components/e-sign-field-type-list.js.map +1 -0
- package/dist/components/field-config-panel-overlay.d.ts +13 -0
- package/dist/components/field-config-panel-overlay.d.ts.map +1 -0
- package/dist/components/field-config-panel-overlay.js +8 -0
- package/dist/components/field-config-panel-overlay.js.map +1 -0
- package/dist/components/field-config-panel.d.ts +12 -0
- package/dist/components/field-config-panel.d.ts.map +1 -0
- package/dist/components/field-config-panel.js +38 -0
- package/dist/components/field-config-panel.js.map +1 -0
- package/dist/components/field-sidebar.d.ts +10 -0
- package/dist/components/field-sidebar.d.ts.map +1 -0
- package/dist/components/field-sidebar.js +25 -0
- package/dist/components/field-sidebar.js.map +1 -0
- package/dist/components/field-type.d.ts +9 -0
- package/dist/components/field-type.d.ts.map +1 -0
- package/dist/components/field-type.js +12 -0
- package/dist/components/field-type.js.map +1 -0
- package/dist/components/fillable-field-type-list.d.ts +10 -0
- package/dist/components/fillable-field-type-list.d.ts.map +1 -0
- package/dist/components/fillable-field-type-list.js +17 -0
- package/dist/components/fillable-field-type-list.js.map +1 -0
- package/dist/components/pdf-canvas.d.ts +22 -0
- package/dist/components/pdf-canvas.d.ts.map +1 -0
- package/dist/components/pdf-canvas.js +14 -0
- package/dist/components/pdf-canvas.js.map +1 -0
- package/dist/components/pdf-document-renderer.d.ts +16 -0
- package/dist/components/pdf-document-renderer.d.ts.map +1 -0
- package/dist/components/pdf-document-renderer.js +28 -0
- package/dist/components/pdf-document-renderer.js.map +1 -0
- package/dist/components/pdf-editor.d.ts +21 -0
- package/dist/components/pdf-editor.d.ts.map +1 -0
- package/dist/components/pdf-editor.js +108 -0
- package/dist/components/pdf-editor.js.map +1 -0
- package/dist/components/pdf-field-overlay.d.ts +14 -0
- package/dist/components/pdf-field-overlay.d.ts.map +1 -0
- package/dist/components/pdf-field-overlay.js +32 -0
- package/dist/components/pdf-field-overlay.js.map +1 -0
- package/dist/constants/field.constants.d.ts +16 -0
- package/dist/constants/field.constants.d.ts.map +1 -0
- package/dist/constants/field.constants.js +28 -0
- package/dist/constants/field.constants.js.map +1 -0
- package/dist/constants/index.d.ts +3 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +3 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/constants/pdf-editor.constants.d.ts +2 -0
- package/dist/constants/pdf-editor.constants.d.ts.map +1 -0
- package/dist/constants/pdf-editor.constants.js +2 -0
- package/dist/constants/pdf-editor.constants.js.map +1 -0
- package/dist/hooks/index.d.ts +4 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +4 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useFieldDrag.d.ts +24 -0
- package/dist/hooks/useFieldDrag.d.ts.map +1 -0
- package/dist/hooks/useFieldDrag.js +34 -0
- package/dist/hooks/useFieldDrag.js.map +1 -0
- package/dist/hooks/useFieldResize.d.ts +17 -0
- package/dist/hooks/useFieldResize.d.ts.map +1 -0
- package/dist/hooks/useFieldResize.js +58 -0
- package/dist/hooks/useFieldResize.js.map +1 -0
- package/dist/hooks/usePdfDocumentRenderer.d.ts +9 -0
- package/dist/hooks/usePdfDocumentRenderer.d.ts.map +1 -0
- package/dist/hooks/usePdfDocumentRenderer.js +13 -0
- package/dist/hooks/usePdfDocumentRenderer.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/interface/pdf-editor.d.ts +64 -0
- package/dist/interface/pdf-editor.d.ts.map +1 -0
- package/dist/interface/pdf-editor.js +14 -0
- package/dist/interface/pdf-editor.js.map +1 -0
- package/dist/utils/calculate-drop-coordinates.utils.d.ts +15 -0
- package/dist/utils/calculate-drop-coordinates.utils.d.ts.map +1 -0
- package/dist/utils/calculate-drop-coordinates.utils.js +48 -0
- package/dist/utils/calculate-drop-coordinates.utils.js.map +1 -0
- package/dist/utils/extract-grouped-fields-from-data-model.utils.d.ts +7 -0
- package/dist/utils/extract-grouped-fields-from-data-model.utils.d.ts.map +1 -0
- package/dist/utils/extract-grouped-fields-from-data-model.utils.js +57 -0
- package/dist/utils/extract-grouped-fields-from-data-model.utils.js.map +1 -0
- package/dist/utils/generate-e-sign-path.d.ts +3 -0
- package/dist/utils/generate-e-sign-path.d.ts.map +1 -0
- package/dist/utils/generate-e-sign-path.js +4 -0
- package/dist/utils/generate-e-sign-path.js.map +1 -0
- package/dist/utils/get-page-dimensions.utils.d.ts +12 -0
- package/dist/utils/get-page-dimensions.utils.d.ts.map +1 -0
- package/dist/utils/get-page-dimensions.utils.js +31 -0
- package/dist/utils/get-page-dimensions.utils.js.map +1 -0
- package/dist/utils/get-page-number-from-client-y.utils.d.ts +9 -0
- package/dist/utils/get-page-number-from-client-y.utils.d.ts.map +1 -0
- package/dist/utils/get-page-number-from-client-y.utils.js +24 -0
- package/dist/utils/get-page-number-from-client-y.utils.js.map +1 -0
- package/dist/utils/get-page-position.utils.d.ts +12 -0
- package/dist/utils/get-page-position.utils.d.ts.map +1 -0
- package/dist/utils/get-page-position.utils.js +22 -0
- package/dist/utils/get-page-position.utils.js.map +1 -0
- package/dist/utils/handle-field-drag-start.utils.d.ts +16 -0
- package/dist/utils/handle-field-drag-start.utils.d.ts.map +1 -0
- package/dist/utils/handle-field-drag-start.utils.js +41 -0
- package/dist/utils/handle-field-drag-start.utils.js.map +1 -0
- package/dist/utils/handle-field-drag.utils.d.ts +19 -0
- package/dist/utils/handle-field-drag.utils.d.ts.map +1 -0
- package/dist/utils/handle-field-drag.utils.js +36 -0
- package/dist/utils/handle-field-drag.utils.js.map +1 -0
- package/dist/utils/handle-field-resize.utils.d.ts +35 -0
- package/dist/utils/handle-field-resize.utils.d.ts.map +1 -0
- package/dist/utils/handle-field-resize.utils.js +66 -0
- package/dist/utils/handle-field-resize.utils.js.map +1 -0
- package/dist/utils/index.d.ts +13 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +13 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/is-drag-over-canvas.utils.d.ts +9 -0
- package/dist/utils/is-drag-over-canvas.utils.d.ts.map +1 -0
- package/dist/utils/is-drag-over-canvas.utils.js +26 -0
- package/dist/utils/is-drag-over-canvas.utils.js.map +1 -0
- package/dist/utils/map-colors-to-recipients.d.ts +3 -0
- package/dist/utils/map-colors-to-recipients.d.ts.map +1 -0
- package/dist/utils/map-colors-to-recipients.js +35 -0
- package/dist/utils/map-colors-to-recipients.js.map +1 -0
- package/dist/utils/pdfjs-init.d.ts +6 -0
- package/dist/utils/pdfjs-init.d.ts.map +1 -0
- package/dist/utils/pdfjs-init.js +25 -0
- package/dist/utils/pdfjs-init.js.map +1 -0
- package/package.json +28 -0
- package/src/components/data-model-field-type-list.tsx +58 -0
- package/src/components/e-sign-field-type-list.tsx +27 -0
- package/src/components/field-config-panel-overlay.tsx +51 -0
- package/src/components/field-config-panel.tsx +142 -0
- package/src/components/field-sidebar.tsx +93 -0
- package/src/components/field-type.tsx +28 -0
- package/src/components/fillable-field-type-list.tsx +42 -0
- package/src/components/pdf-canvas.tsx +81 -0
- package/src/components/pdf-document-renderer.tsx +78 -0
- package/src/components/pdf-editor.tsx +216 -0
- package/src/components/pdf-field-overlay.tsx +83 -0
- package/src/constants/field.constants.ts +31 -0
- package/src/constants/index.ts +2 -0
- package/src/constants/pdf-editor.constants.ts +1 -0
- package/src/hooks/index.ts +3 -0
- package/src/hooks/useFieldDrag.ts +56 -0
- package/src/hooks/useFieldResize.ts +95 -0
- package/src/hooks/usePdfDocumentRenderer.ts +21 -0
- package/src/index.ts +2 -0
- package/src/interface/pdf-editor.ts +74 -0
- package/src/styles/field-config-panel-overlay.css +33 -0
- package/src/styles/field-sidebar.css +31 -0
- package/src/styles/field-type-list.css +8 -0
- package/src/styles/field-type.css +10 -0
- package/src/styles/generic.css +3 -0
- package/src/styles/index.css +10 -0
- package/src/styles/pdf-canvas.css +9 -0
- package/src/styles/pdf-document-renderer.css +4 -0
- package/src/styles/pdf-editor.css +14 -0
- package/src/styles/pdf-field-overlay.css +54 -0
- package/src/styles/variables.css +26 -0
- package/src/utils/calculate-drop-coordinates.utils.ts +68 -0
- package/src/utils/extract-grouped-fields-from-data-model.utils.ts +73 -0
- package/src/utils/generate-e-sign-path.ts +5 -0
- package/src/utils/get-page-dimensions.utils.ts +39 -0
- package/src/utils/get-page-number-from-client-y.utils.ts +31 -0
- package/src/utils/get-page-position.utils.ts +30 -0
- package/src/utils/handle-field-drag-start.utils.ts +52 -0
- package/src/utils/handle-field-drag.utils.ts +55 -0
- package/src/utils/handle-field-resize.utils.ts +102 -0
- package/src/utils/index.ts +12 -0
- package/src/utils/is-drag-over-canvas.utils.ts +35 -0
- package/src/utils/map-colors-to-recipients.ts +37 -0
- package/src/utils/pdfjs-init.ts +27 -0
- package/src/vite-env.d.ts +16 -0
package/README.md
ADDED
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
# PDF Editor Component
|
|
2
|
+
|
|
3
|
+
A comprehensive React component library for editing PDF documents with drag-and-drop field placement, data model integration, e-signature fields, and fillable form fields.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The PDF Editor is a powerful, interactive component that allows users to:
|
|
8
|
+
- View PDF documents page by page
|
|
9
|
+
- Drag and drop various field types onto PDF pages
|
|
10
|
+
- Configure field properties (labels, recipients, requirements)
|
|
11
|
+
- Position, resize, and move fields on PDF pages
|
|
12
|
+
- Integrate with data models for dynamic content merging
|
|
13
|
+
- Support e-signature workflows with recipient assignment
|
|
14
|
+
|
|
15
|
+
## Features
|
|
16
|
+
|
|
17
|
+
### Core Functionality
|
|
18
|
+
- **PDF Rendering**: Multi-page PDF viewing using `react-pdf` and `pdfjs-dist`
|
|
19
|
+
- **Drag & Drop**: Intuitive drag-and-drop interface for placing fields on PDF pages
|
|
20
|
+
- **Field Management**: Create, edit, move, resize, and delete fields
|
|
21
|
+
- **Field Selection**: Click to select and configure individual fields
|
|
22
|
+
- **Multi-page Support**: Handle PDFs with multiple pages
|
|
23
|
+
|
|
24
|
+
### Field Types
|
|
25
|
+
|
|
26
|
+
#### 1. Data Model Fields (Merge Tags)
|
|
27
|
+
- Extract fields from JSON schema objects
|
|
28
|
+
- Group fields by schema structure
|
|
29
|
+
- Search and filter data model fields
|
|
30
|
+
- Generate paths for data replacement (e.g., `{{customer.name}}`)
|
|
31
|
+
|
|
32
|
+
#### 2. E-Signature Fields
|
|
33
|
+
- **Signature**: Digital signature field
|
|
34
|
+
- **Initials**: Initials field
|
|
35
|
+
- **Date Signed**: Date signature field
|
|
36
|
+
- **Full Name**: Full name field
|
|
37
|
+
- Recipient assignment with color coding
|
|
38
|
+
|
|
39
|
+
#### 3. Fillable Fields
|
|
40
|
+
- **Text Field**: Single-line text input
|
|
41
|
+
- **Date Field**: Date picker input
|
|
42
|
+
- **Checkbox**: Boolean checkbox input
|
|
43
|
+
- Required field marking
|
|
44
|
+
- Recipient assignment
|
|
45
|
+
|
|
46
|
+
### Visual Features
|
|
47
|
+
- Color-coded fields by recipient
|
|
48
|
+
- Visual field overlays on PDF pages
|
|
49
|
+
- Resize handles for selected fields
|
|
50
|
+
- Drag indicators and visual feedback
|
|
51
|
+
- Loading and error states
|
|
52
|
+
|
|
53
|
+
## Installation
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npm install @servicetitan/dte-pdf-editor
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Peer Dependencies
|
|
60
|
+
|
|
61
|
+
The component requires the following peer dependencies:
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"@servicetitan/anvil2": "^1.46.9",
|
|
66
|
+
"react": "~18.3.1",
|
|
67
|
+
"react-dom": "~18.3.1"
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Dependencies
|
|
72
|
+
|
|
73
|
+
- `pdfjs-dist`: ^3.11.0
|
|
74
|
+
- `react-pdf`: ^7.5.0
|
|
75
|
+
- `uuid`: ^9.0.0
|
|
76
|
+
|
|
77
|
+
## Usage
|
|
78
|
+
|
|
79
|
+
### Basic Example
|
|
80
|
+
|
|
81
|
+
```tsx
|
|
82
|
+
import { PdfEditor } from '@servicetitan/dte-pdf-editor';
|
|
83
|
+
import '@servicetitan/dte-pdf-editor/dist/styles/index.css';
|
|
84
|
+
|
|
85
|
+
function App() {
|
|
86
|
+
const [fields, setFields] = useState([]);
|
|
87
|
+
|
|
88
|
+
return (
|
|
89
|
+
<PdfEditor
|
|
90
|
+
pdfUrl="/path/to/document.pdf"
|
|
91
|
+
fields={fields}
|
|
92
|
+
onFieldsChange={setFields}
|
|
93
|
+
recipients={[
|
|
94
|
+
{ id: 1, name: 'recipient1', displayName: 'John Doe' },
|
|
95
|
+
{ id: 2, name: 'recipient2', displayName: 'Jane Smith' }
|
|
96
|
+
]}
|
|
97
|
+
dataModel={{
|
|
98
|
+
type: 'object',
|
|
99
|
+
properties: {
|
|
100
|
+
customer: {
|
|
101
|
+
type: 'object',
|
|
102
|
+
properties: {
|
|
103
|
+
name: { type: 'string', title: 'Customer Name' },
|
|
104
|
+
email: { type: 'string', title: 'Email' }
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}}
|
|
109
|
+
/>
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## API Reference
|
|
115
|
+
|
|
116
|
+
### PdfEditor Props
|
|
117
|
+
|
|
118
|
+
| Prop | Type | Required | Description |
|
|
119
|
+
|------|------|----------|-------------|
|
|
120
|
+
| `pdfUrl` | `string` | Yes | URL or path to the PDF file |
|
|
121
|
+
| `fields` | `PdfField[]` | No | Array of field objects (default: `[]`) |
|
|
122
|
+
| `onFieldsChange` | `(fields: PdfField[]) => void` | Yes | Callback when fields are modified |
|
|
123
|
+
| `dataModel` | `SchemaObject` | No | JSON schema object for data model fields |
|
|
124
|
+
| `recipients` | `RecipientInfo[]` | No | Array of recipient information (default: `[]`) |
|
|
125
|
+
| `loading` | `boolean` | No | Loading state (default: `false`) |
|
|
126
|
+
| `loadingPlaceholder` | `ReactNode` | No | Custom loading placeholder |
|
|
127
|
+
| `errorPlaceholder` | `ReactNode` | No | Custom error placeholder |
|
|
128
|
+
|
|
129
|
+
### PdfField Interface
|
|
130
|
+
|
|
131
|
+
```typescript
|
|
132
|
+
interface PdfField {
|
|
133
|
+
id: string; // Unique identifier (UUID)
|
|
134
|
+
type: FieldTypeEnum; // 'data-model' | 'e-sign' | 'fillable'
|
|
135
|
+
subType?: string; // Field subtype (e.g., 'text', 'date', 'signature')
|
|
136
|
+
x: number; // X coordinate on page
|
|
137
|
+
y: number; // Y coordinate on page
|
|
138
|
+
page: number; // Page number (1-indexed)
|
|
139
|
+
label: string; // Display label
|
|
140
|
+
width: number; // Field width in pixels
|
|
141
|
+
height: number; // Field height in pixels
|
|
142
|
+
required?: boolean; // Whether field is required (fillable fields)
|
|
143
|
+
path?: string; // Data path for merge tags
|
|
144
|
+
recipient?: string; // Recipient name for e-sign/fillable fields
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### RecipientInfo Interface
|
|
149
|
+
|
|
150
|
+
```typescript
|
|
151
|
+
interface RecipientInfo {
|
|
152
|
+
id: number;
|
|
153
|
+
name: string; // Internal recipient identifier
|
|
154
|
+
displayName: string; // Display name for UI
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### SchemaObject Interface
|
|
159
|
+
|
|
160
|
+
The data model follows a JSON Schema-like structure:
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
interface SchemaObject {
|
|
164
|
+
type: 'object';
|
|
165
|
+
properties: Record<string, SchemaNode>;
|
|
166
|
+
title?: string;
|
|
167
|
+
options?: {
|
|
168
|
+
placeholder?: any;
|
|
169
|
+
description?: any;
|
|
170
|
+
sampleData?: any;
|
|
171
|
+
showInEditor?: boolean;
|
|
172
|
+
isHighlighted?: boolean;
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Component Architecture
|
|
178
|
+
|
|
179
|
+
### Main Components
|
|
180
|
+
|
|
181
|
+
#### `PdfEditor`
|
|
182
|
+
The root component that orchestrates the entire editor experience.
|
|
183
|
+
|
|
184
|
+
**Key Responsibilities:**
|
|
185
|
+
- Manages field state and selection
|
|
186
|
+
- Handles drag and drop operations
|
|
187
|
+
- Coordinates between sidebar and canvas
|
|
188
|
+
- Manages recipient color mapping
|
|
189
|
+
|
|
190
|
+
#### `FieldSidebar`
|
|
191
|
+
Left sidebar containing field type lists and search functionality.
|
|
192
|
+
|
|
193
|
+
**Features:**
|
|
194
|
+
- Three tabs: Merge Tags, E-Sign, Fillable Fields
|
|
195
|
+
- Search functionality for data model and fillable fields
|
|
196
|
+
- Drag source for new fields
|
|
197
|
+
|
|
198
|
+
#### `PdfCanvas`
|
|
199
|
+
Main canvas area displaying PDF pages with field overlays.
|
|
200
|
+
|
|
201
|
+
**Features:**
|
|
202
|
+
- PDF rendering with `react-pdf`
|
|
203
|
+
- Drop zone for new fields
|
|
204
|
+
- Click-to-deselect functionality
|
|
205
|
+
- Page dimension calculations
|
|
206
|
+
|
|
207
|
+
#### `PdfDocumentRenderer`
|
|
208
|
+
PDF document renderer using `react-pdf` library.
|
|
209
|
+
|
|
210
|
+
**Features:**
|
|
211
|
+
- Multi-page rendering
|
|
212
|
+
- Drag and drop event handling
|
|
213
|
+
- Loading and error states
|
|
214
|
+
|
|
215
|
+
#### `PdfFieldOverlay`
|
|
216
|
+
Overlay component rendering field visualizations on PDF pages.
|
|
217
|
+
|
|
218
|
+
**Features:**
|
|
219
|
+
- Field positioning and rendering
|
|
220
|
+
- Drag and drop for existing fields
|
|
221
|
+
- Resize handles for selected fields
|
|
222
|
+
- Color coding by recipient
|
|
223
|
+
|
|
224
|
+
#### `FieldConfigPanelOverlay`
|
|
225
|
+
Configuration panel that appears when a field is selected.
|
|
226
|
+
|
|
227
|
+
**Features:**
|
|
228
|
+
- Field property editing
|
|
229
|
+
- Recipient assignment
|
|
230
|
+
- Field deletion
|
|
231
|
+
- E-sign field type selection
|
|
232
|
+
|
|
233
|
+
### Supporting Components
|
|
234
|
+
|
|
235
|
+
- **`FieldType`**: Draggable field type item in sidebar
|
|
236
|
+
- **`DataModelFieldTypeList`**: List of data model fields grouped by schema
|
|
237
|
+
- **`ESignFieldTypeList`**: List of e-signature field types
|
|
238
|
+
- **`FillableFieldTypeList`**: List of fillable field types
|
|
239
|
+
- **`FieldConfigPanel`**: Form for editing field properties
|
|
240
|
+
|
|
241
|
+
## Utilities
|
|
242
|
+
|
|
243
|
+
The component includes several utility functions:
|
|
244
|
+
|
|
245
|
+
- **`calculateDropCoordinates`**: Calculates field position from drop event
|
|
246
|
+
- **`extractGroupedFieldsFromDataModel`**: Extracts fields from JSON schema
|
|
247
|
+
- **`generateESignPath`**: Generates path for e-signature fields
|
|
248
|
+
- **`getPagePosition`**: Gets page position relative to container
|
|
249
|
+
- **`getPageDimensions`**: Gets page dimensions
|
|
250
|
+
- **`handleFieldDrag`**: Handles field dragging logic
|
|
251
|
+
- **`handleFieldResize`**: Handles field resizing logic
|
|
252
|
+
- **`isDragOverCanvas`**: Checks if drag is over PDF canvas
|
|
253
|
+
- **`mapColorsToRecipients`**: Assigns colors to recipients
|
|
254
|
+
|
|
255
|
+
## Styling
|
|
256
|
+
|
|
257
|
+
The component includes CSS modules for styling. Import the main stylesheet:
|
|
258
|
+
|
|
259
|
+
```tsx
|
|
260
|
+
import '@servicetitan/dte-pdf-editor/dist/styles/index.css';
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### CSS Classes
|
|
264
|
+
|
|
265
|
+
- `.dte-pdf-editor`: Main editor container
|
|
266
|
+
- `.dte-pdf-editor-sidebar-container`: Sidebar container
|
|
267
|
+
- `.dte-pdf-editor-content-container`: Main content area
|
|
268
|
+
- `.dte-pdf-canvas-container`: PDF canvas container
|
|
269
|
+
- `.dte-pdf-field`: Individual field overlay
|
|
270
|
+
- `.dte-pdf-field-selected`: Selected field state
|
|
271
|
+
- `.dte-field-sidebar-container`: Sidebar styling
|
|
272
|
+
- `.dte-field-config-panel-overlay`: Config panel overlay
|
|
273
|
+
|
|
274
|
+
## Field Types Details
|
|
275
|
+
|
|
276
|
+
### Data Model Fields
|
|
277
|
+
|
|
278
|
+
Data model fields are extracted from a JSON Schema structure. The component:
|
|
279
|
+
- Groups fields by parent objects
|
|
280
|
+
- Handles nested objects and arrays
|
|
281
|
+
- Generates paths like `customer.name` or `items[].description`
|
|
282
|
+
- Supports search and filtering
|
|
283
|
+
|
|
284
|
+
### E-Signature Fields
|
|
285
|
+
|
|
286
|
+
E-signature fields support four subtypes:
|
|
287
|
+
- **Signature**: Full signature field
|
|
288
|
+
- **Initials**: Initials only
|
|
289
|
+
- **Date Signed**: Date of signing
|
|
290
|
+
- **Full Name**: Signer's full name
|
|
291
|
+
|
|
292
|
+
Each e-sign field is assigned to a recipient and generates a unique path.
|
|
293
|
+
|
|
294
|
+
### Fillable Fields
|
|
295
|
+
|
|
296
|
+
Fillable fields support three input types:
|
|
297
|
+
- **Text**: Single-line text input
|
|
298
|
+
- **Date**: Date picker
|
|
299
|
+
- **Checkbox**: Boolean checkbox
|
|
300
|
+
|
|
301
|
+
Fillable fields can be marked as required and assigned to recipients.
|
|
302
|
+
|
|
303
|
+
## Constants
|
|
304
|
+
|
|
305
|
+
- **`BASE_PAGE_WIDTH`**: 980px - Base width for PDF page rendering
|
|
306
|
+
|
|
307
|
+
## Development
|
|
308
|
+
|
|
309
|
+
### Project Structure
|
|
310
|
+
|
|
311
|
+
```
|
|
312
|
+
src/
|
|
313
|
+
├── components/ # React components
|
|
314
|
+
│ ├── pdf-editor.tsx # Main editor component
|
|
315
|
+
│ ├── pdf-document-renderer.tsx # PDF renderer
|
|
316
|
+
│ ├── pdf-canvas.tsx # Canvas with overlays
|
|
317
|
+
│ ├── field-sidebar.tsx
|
|
318
|
+
│ └── ...
|
|
319
|
+
├── interface/ # TypeScript interfaces
|
|
320
|
+
├── utils/ # Utility functions
|
|
321
|
+
├── constants/ # Constants and enums
|
|
322
|
+
└── styles/ # CSS stylesheets
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
### Building
|
|
326
|
+
|
|
327
|
+
The project uses TypeScript and compiles to the `dist/` directory.
|
|
328
|
+
|
|
329
|
+
### TypeScript
|
|
330
|
+
|
|
331
|
+
The project extends `@servicetitan/startup/tsconfig/base` and includes:
|
|
332
|
+
- Strict type checking
|
|
333
|
+
- Composite project support
|
|
334
|
+
- Source maps generation
|
|
335
|
+
|
|
336
|
+
## Browser Support
|
|
337
|
+
|
|
338
|
+
The component requires modern browsers with support for:
|
|
339
|
+
- ES6+ JavaScript
|
|
340
|
+
- CSS Grid and Flexbox
|
|
341
|
+
- HTML5 Drag and Drop API
|
|
342
|
+
- Canvas API
|
|
343
|
+
|
|
344
|
+
## License
|
|
345
|
+
|
|
346
|
+
This package is part of the ServiceTitan Document Template Engine components.
|
|
347
|
+
|
|
348
|
+
## Contributing
|
|
349
|
+
|
|
350
|
+
When contributing to this package:
|
|
351
|
+
1. Follow TypeScript best practices
|
|
352
|
+
2. Maintain component prop interfaces
|
|
353
|
+
3. Update this README for API changes
|
|
354
|
+
4. Ensure styles are scoped to component classes
|
|
355
|
+
5. Test drag-and-drop functionality across browsers
|
|
356
|
+
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { DataModelFieldGroup, FieldTypeOption } from '../interface/pdf-editor';
|
|
3
|
+
interface DataModelFieldTypeListProps {
|
|
4
|
+
searchText?: string;
|
|
5
|
+
dataModelGroups?: DataModelFieldGroup[];
|
|
6
|
+
onDragStart(fieldOption: FieldTypeOption): void;
|
|
7
|
+
onDragEnd(): void;
|
|
8
|
+
}
|
|
9
|
+
export declare const DataModelFieldTypeList: FC<DataModelFieldTypeListProps>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=data-model-field-type-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-model-field-type-list.d.ts","sourceRoot":"","sources":["../../src/components/data-model-field-type-list.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAqB,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/E,UAAU,2BAA2B;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACxC,WAAW,CAAC,WAAW,EAAE,eAAe,GAAG,IAAI,CAAC;IAChD,SAAS,IAAI,IAAI,CAAC;CACrB;AAED,eAAO,MAAM,sBAAsB,EAAE,EAAE,CAAC,2BAA2B,CA6ClE,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Flex, Text } from '@servicetitan/anvil2';
|
|
3
|
+
import { Fragment, useMemo } from 'react';
|
|
4
|
+
import { FieldType } from './field-type';
|
|
5
|
+
export const DataModelFieldTypeList = ({ dataModelGroups = [], onDragEnd, onDragStart, searchText, }) => {
|
|
6
|
+
const searchedFieldGroups = useMemo(() => {
|
|
7
|
+
if (!searchText) {
|
|
8
|
+
return dataModelGroups;
|
|
9
|
+
}
|
|
10
|
+
const searchLower = searchText.toLowerCase();
|
|
11
|
+
return dataModelGroups
|
|
12
|
+
.map(group => ({
|
|
13
|
+
...group,
|
|
14
|
+
fieldTypes: group.fields.filter(({ label }) => label.toLowerCase().includes(searchLower)),
|
|
15
|
+
}))
|
|
16
|
+
.filter(group => group.fieldTypes.length > 0);
|
|
17
|
+
}, [dataModelGroups, searchText]);
|
|
18
|
+
return (_jsx(Fragment, { children: searchedFieldGroups.map(group => (_jsxs("div", { className: "dte-field-type-group m-t-1", children: [_jsx(Flex, { alignItems: "center", gap: 1, className: "dte-field-type-group-header", children: _jsx(Text, { variant: "headline", el: "h6", size: "small", children: group.groupName }) }), group.fields.map(fieldOption => {
|
|
19
|
+
const key = `${fieldOption.type}-${group.groupName}-${fieldOption.path}`;
|
|
20
|
+
return (_jsx(FieldType, { label: fieldOption.label, onDragEnd: onDragEnd, onDragStart: () => onDragStart(fieldOption) }, key));
|
|
21
|
+
})] }, group.groupName))) }));
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=data-model-field-type-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-model-field-type-list.js","sourceRoot":"","sources":["../../src/components/data-model-field-type-list.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAM,QAAQ,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AASzC,MAAM,CAAC,MAAM,sBAAsB,GAAoC,CAAC,EACpE,eAAe,GAAG,EAAE,EACpB,SAAS,EACT,WAAW,EACX,UAAU,GACb,EAAE,EAAE;IACD,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG,EAAE;QACrC,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,OAAO,eAAe,CAAC;QAC3B,CAAC;QAED,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;QAC7C,OAAO,eAAe;aACjB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACX,GAAG,KAAK;YACR,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAC1C,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC5C;SACJ,CAAC,CAAC;aACF,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtD,CAAC,EAAE,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC;IAClC,OAAO,CACH,KAAC,QAAQ,cACJ,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAC9B,eAA2B,SAAS,EAAC,4BAA4B,aAC7D,KAAC,IAAI,IAAC,UAAU,EAAC,QAAQ,EAAC,GAAG,EAAE,CAAC,EAAE,SAAS,EAAC,6BAA6B,YACrE,KAAC,IAAI,IAAC,OAAO,EAAC,UAAU,EAAC,EAAE,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,YACxC,KAAK,CAAC,SAAS,GACb,GACJ,EACN,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;oBAC5B,MAAM,GAAG,GAAG,GAAG,WAAW,CAAC,IAAI,IAAI,KAAK,CAAC,SAAS,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;oBACzE,OAAO,CACH,KAAC,SAAS,IAEN,KAAK,EAAE,WAAW,CAAC,KAAK,EACxB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,IAHtC,GAAG,CAIV,CACL,CAAC;gBACN,CAAC,CAAC,KAhBI,KAAK,CAAC,SAAS,CAiBnB,CACT,CAAC,GACK,CACd,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { FieldTypeOption } from '../interface/pdf-editor';
|
|
3
|
+
interface ESignFieldTypeListProps {
|
|
4
|
+
onDragStart(fieldOption: FieldTypeOption): void;
|
|
5
|
+
onDragEnd(): void;
|
|
6
|
+
}
|
|
7
|
+
export declare const ESignFieldTypeList: FC<ESignFieldTypeListProps>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=e-sign-field-type-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"e-sign-field-type-list.d.ts","sourceRoot":"","sources":["../../src/components/e-sign-field-type-list.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAY,MAAM,OAAO,CAAC;AAErC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG1D,UAAU,uBAAuB;IAC7B,WAAW,CAAC,WAAW,EAAE,eAAe,GAAG,IAAI,CAAC;IAChD,SAAS,IAAI,IAAI,CAAC;CACrB;AAED,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,uBAAuB,CAgB1D,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Fragment } from 'react';
|
|
3
|
+
import { E_SIGN_FIELD_TYPES } from '../constants';
|
|
4
|
+
import { FieldType } from './field-type';
|
|
5
|
+
export const ESignFieldTypeList = ({ onDragEnd, onDragStart }) => {
|
|
6
|
+
return (_jsx(Fragment, { children: E_SIGN_FIELD_TYPES.map(fieldOption => {
|
|
7
|
+
var _a;
|
|
8
|
+
const key = `${fieldOption.type}-${(_a = fieldOption.path) !== null && _a !== void 0 ? _a : fieldOption.label}`;
|
|
9
|
+
return (_jsx(FieldType, { label: fieldOption.label, onDragEnd: onDragEnd, onDragStart: () => onDragStart(fieldOption) }, key));
|
|
10
|
+
}) }));
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=e-sign-field-type-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"e-sign-field-type-list.js","sourceRoot":"","sources":["../../src/components/e-sign-field-type-list.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAM,QAAQ,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAOzC,MAAM,CAAC,MAAM,kBAAkB,GAAgC,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,EAAE;IAC1F,OAAO,CACH,KAAC,QAAQ,cACJ,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;;YAClC,MAAM,GAAG,GAAG,GAAG,WAAW,CAAC,IAAI,IAAI,MAAA,WAAW,CAAC,IAAI,mCAAI,WAAW,CAAC,KAAK,EAAE,CAAC;YAC3E,OAAO,CACH,KAAC,SAAS,IAEN,KAAK,EAAE,WAAW,CAAC,KAAK,EACxB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,IAHtC,GAAG,CAIV,CACL,CAAC;QACN,CAAC,CAAC,GACK,CACd,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { PdfField } from '../interface/pdf-editor';
|
|
3
|
+
import { RecipientInfo } from './pdf-editor';
|
|
4
|
+
interface FieldConfigPanelOverlayProps {
|
|
5
|
+
selectedField: PdfField;
|
|
6
|
+
recipients?: RecipientInfo[];
|
|
7
|
+
onFieldConfigChange(updates: Partial<PdfField>): void;
|
|
8
|
+
onDeleteField(): void;
|
|
9
|
+
onDeselectField?(): void;
|
|
10
|
+
}
|
|
11
|
+
export declare const FieldConfigPanelOverlay: FC<FieldConfigPanelOverlayProps>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=field-config-panel-overlay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-config-panel-overlay.d.ts","sourceRoot":"","sources":["../../src/components/field-config-panel-overlay.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAC3B,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,UAAU,4BAA4B;IAClC,aAAa,EAAE,QAAQ,CAAC;IACxB,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IACtD,aAAa,IAAI,IAAI,CAAC;IACtB,eAAe,CAAC,IAAI,IAAI,CAAC;CAC5B;AAED,eAAO,MAAM,uBAAuB,EAAE,EAAE,CAAC,4BAA4B,CAmCpE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button, Flex, Text } from '@servicetitan/anvil2';
|
|
3
|
+
import IconClose from '@servicetitan/anvil2/assets/icons/material/round/close.svg';
|
|
4
|
+
import { FieldConfigPanel } from './field-config-panel';
|
|
5
|
+
export const FieldConfigPanelOverlay = ({ onDeleteField, onDeselectField, onFieldConfigChange, recipients, selectedField, }) => {
|
|
6
|
+
return (_jsxs(Flex, { className: "dte-field-config-panel-overlay", onClick: e => e.stopPropagation(), children: [_jsxs(Flex, { className: "dte-field-config-panel-header", alignItems: "center", justifyContent: "space-between", children: [_jsx(Text, { variant: "headline", el: "h6", size: "small", children: "Field Configuration" }), _jsx(Button, { appearance: "ghost", size: "small", onClick: onDeselectField, "aria-label": "Close", icon: IconClose })] }), _jsx("div", { className: "dte-field-config-panel-content", children: _jsx(FieldConfigPanel, { field: selectedField, recipients: recipients, onFieldConfigChange: onFieldConfigChange, onDeleteField: onDeleteField }) })] }));
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=field-config-panel-overlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-config-panel-overlay.js","sourceRoot":"","sources":["../../src/components/field-config-panel-overlay.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,SAAS,MAAM,4DAA4D,CAAC;AAGnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAWxD,MAAM,CAAC,MAAM,uBAAuB,GAAqC,CAAC,EACtE,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,UAAU,EACV,aAAa,GAChB,EAAE,EAAE;IACD,OAAO,CACH,MAAC,IAAI,IAAC,SAAS,EAAC,gCAAgC,EAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,aAC9E,MAAC,IAAI,IACD,SAAS,EAAC,+BAA+B,EACzC,UAAU,EAAC,QAAQ,EACnB,cAAc,EAAC,eAAe,aAE9B,KAAC,IAAI,IAAC,OAAO,EAAC,UAAU,EAAC,EAAE,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,oCAEtC,EACP,KAAC,MAAM,IACH,UAAU,EAAC,OAAO,EAClB,IAAI,EAAC,OAAO,EACZ,OAAO,EAAE,eAAe,gBACb,OAAO,EAClB,IAAI,EAAE,SAAS,GACjB,IACC,EACP,cAAK,SAAS,EAAC,gCAAgC,YAC3C,KAAC,gBAAgB,IACb,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,UAAU,EACtB,mBAAmB,EAAE,mBAAmB,EACxC,aAAa,EAAE,aAAa,GAC9B,GACA,IACH,CACV,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { PdfField } from '../interface/pdf-editor';
|
|
3
|
+
import { RecipientInfo } from './pdf-editor';
|
|
4
|
+
interface FieldConfigPanelProps {
|
|
5
|
+
field: PdfField;
|
|
6
|
+
recipients?: RecipientInfo[];
|
|
7
|
+
onDeleteField(): void;
|
|
8
|
+
onFieldConfigChange(updates: Partial<PdfField>): void;
|
|
9
|
+
}
|
|
10
|
+
export declare const FieldConfigPanel: FC<FieldConfigPanelProps>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=field-config-panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-config-panel.d.ts","sourceRoot":"","sources":["../../src/components/field-config-panel.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAW,MAAM,OAAO,CAAC;AAEpC,OAAO,EAAiC,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAElF,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,UAAU,qBAAqB;IAC3B,KAAK,EAAE,QAAQ,CAAC;IAChB,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B,aAAa,IAAI,IAAI,CAAC;IACtB,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;CACzD;AAED,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CA+HtD,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button, Checkbox, Combobox, Flex, TextField } from '@servicetitan/anvil2';
|
|
3
|
+
import { useMemo } from 'react';
|
|
4
|
+
import { E_SIGN_FIELD_TYPE_OPTIONS } from '../constants';
|
|
5
|
+
import { FieldTypeEnum } from '../interface/pdf-editor';
|
|
6
|
+
import { generateESignPath } from '../utils';
|
|
7
|
+
export const FieldConfigPanel = ({ field, onDeleteField, onFieldConfigChange, recipients = [], }) => {
|
|
8
|
+
const recipientOptions = useMemo(() => recipients.map(recipient => ({
|
|
9
|
+
id: recipient.name,
|
|
10
|
+
name: recipient.displayName,
|
|
11
|
+
})), [recipients]);
|
|
12
|
+
const selectedRecipient = useMemo(() => { var _a; return (_a = recipientOptions.find(option => option.id === field.recipient)) !== null && _a !== void 0 ? _a : null; }, [recipientOptions, field.recipient]);
|
|
13
|
+
const handleRecipientChange = (item) => {
|
|
14
|
+
if (item) {
|
|
15
|
+
onFieldConfigChange({
|
|
16
|
+
recipient: item.id,
|
|
17
|
+
path: field.type === FieldTypeEnum.eSign
|
|
18
|
+
? generateESignPath(item.id, field.subType)
|
|
19
|
+
: field.path,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
const selectedESignFieldType = useMemo(() => { var _a; return (_a = E_SIGN_FIELD_TYPE_OPTIONS.find(option => option.id === field.subType)) !== null && _a !== void 0 ? _a : null; }, [field]);
|
|
24
|
+
const handleESignFieldTypeChange = (item) => {
|
|
25
|
+
if (item) {
|
|
26
|
+
onFieldConfigChange({
|
|
27
|
+
subType: item.id,
|
|
28
|
+
path: generateESignPath(field.recipient, item.id),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
return (_jsxs(Flex, { direction: "column", gap: "4", children: [(field.type === FieldTypeEnum.fillable || field.type === FieldTypeEnum.eSign) && (_jsx(TextField, { label: "Label", value: field.label, onChange: e => onFieldConfigChange({
|
|
33
|
+
label: e.target.value,
|
|
34
|
+
}) })), (field.type === FieldTypeEnum.fillable || field.type === FieldTypeEnum.eSign) && (_jsxs(Combobox, { items: recipientOptions, itemToString: item => { var _a; return (_a = item === null || item === void 0 ? void 0 : item.name) !== null && _a !== void 0 ? _a : ''; }, onChange: handleRecipientChange, selectedItem: selectedRecipient, children: [_jsx(Combobox.SearchField, { placeholder: "", label: "Recipient", labelProps: { required: true } }), _jsx(Combobox.Content, { children: ({ items }) => (_jsx(Combobox.List, { children: items.map((item, i) => (_jsx(Combobox.Item, { item: item, index: i, children: item.name }, item.id))) })) })] })), field.type === FieldTypeEnum.eSign && (_jsxs(Combobox, { items: E_SIGN_FIELD_TYPE_OPTIONS, itemToString: item => { var _a; return (_a = item === null || item === void 0 ? void 0 : item.name) !== null && _a !== void 0 ? _a : ''; }, onChange: handleESignFieldTypeChange, selectedItem: selectedESignFieldType, children: [_jsx(Combobox.SearchField, { label: "Field Type", labelProps: { required: true } }), _jsx(Combobox.Content, { children: ({ items }) => (_jsx(Combobox.List, { children: items.map((item, i) => (_jsx(Combobox.Item, { item: item, index: i, children: item.name }, item.id))) })) })] })), field.type === FieldTypeEnum.dataModel && field.path && (_jsx(TextField, { label: "Data Path", value: field.path, disabled: true })), field.type === FieldTypeEnum.fillable && (_jsx(Checkbox, { label: "Required", checked: field.required, onChange: () => onFieldConfigChange({
|
|
35
|
+
required: !field.required,
|
|
36
|
+
}) })), _jsx(Button, { className: "full-width", onClick: onDeleteField, children: "Delete Field" })] }));
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=field-config-panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-config-panel.js","sourceRoot":"","sources":["../../src/components/field-config-panel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { DataModelFieldGroup, FieldTypeOption } from '../interface/pdf-editor';
|
|
3
|
+
interface FieldSidebarProps {
|
|
4
|
+
dataModelGroups?: DataModelFieldGroup[];
|
|
5
|
+
onDragEnd(): void;
|
|
6
|
+
onDragStart(fieldOption: FieldTypeOption): void;
|
|
7
|
+
}
|
|
8
|
+
export declare const FieldSidebar: FC<FieldSidebarProps>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=field-sidebar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-sidebar.d.ts","sourceRoot":"","sources":["../../src/components/field-sidebar.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,EAAE,EAAY,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAiB,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAK9F,UAAU,iBAAiB;IACvB,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACxC,SAAS,IAAI,IAAI,CAAC;IAClB,WAAW,CAAC,WAAW,EAAE,eAAe,GAAG,IAAI,CAAC;CACnD;AAYD,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC,iBAAiB,CAiE9C,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Flex, Icon, SearchField, Text } from '@servicetitan/anvil2';
|
|
3
|
+
import IconBorderColor from '@servicetitan/anvil2/assets/icons/material/round/border_color.svg';
|
|
4
|
+
import IconPhotoSizeSelectSmall from '@servicetitan/anvil2/assets/icons/material/round/photo_size_select_small.svg';
|
|
5
|
+
import IconEstimate from '@servicetitan/anvil2/assets/icons/st/estimate.svg';
|
|
6
|
+
import { useState } from 'react';
|
|
7
|
+
import { FieldTypeEnum } from '../interface/pdf-editor';
|
|
8
|
+
import { DataModelFieldTypeList } from './data-model-field-type-list';
|
|
9
|
+
import { ESignFieldTypeList } from './e-sign-field-type-list';
|
|
10
|
+
import { FillableFieldTypeList } from './fillable-field-type-list';
|
|
11
|
+
const menuGroups = [
|
|
12
|
+
{ svgIcon: IconEstimate, label: 'Merge Tags', key: FieldTypeEnum.dataModel },
|
|
13
|
+
{ svgIcon: IconBorderColor, label: 'E-Sign', key: FieldTypeEnum.eSign },
|
|
14
|
+
{
|
|
15
|
+
svgIcon: IconPhotoSizeSelectSmall,
|
|
16
|
+
label: 'Fillable Fields',
|
|
17
|
+
key: FieldTypeEnum.fillable,
|
|
18
|
+
},
|
|
19
|
+
];
|
|
20
|
+
export const FieldSidebar = ({ dataModelGroups = [], onDragEnd, onDragStart, }) => {
|
|
21
|
+
const [activeFieldType, setActiveFieldType] = useState(FieldTypeEnum.dataModel);
|
|
22
|
+
const [searchText, setSearchText] = useState('');
|
|
23
|
+
return (_jsxs(Flex, { className: "dte-field-sidebar-container skeleton-item", children: [_jsx(Flex, { className: "dte-field-sidebar-menu", shrink: 0, direction: "column", gap: "3", children: menuGroups.map(({ key, label, svgIcon }) => (_jsxs(Flex, { alignItems: "center", justifyContent: "center", direction: "column", className: "dte-field-sidebar-menu-item cursor-pointer", onClick: () => setActiveFieldType(key), children: [_jsx(Icon, { svg: svgIcon, size: "large" }), _jsx(Text, { variant: "body", size: "small", className: "dte-field-sidebar-menu-item-text", children: label })] }, key))) }), _jsxs(Flex, { className: "dte-field-sidebar-content skeleton-item", shrink: 0, children: [_jsx(Text, { variant: "headline", el: "h1", size: "medium", children: "Merge Tags" }), activeFieldType !== FieldTypeEnum.eSign && (_jsx(SearchField, { placeholder: "Search", size: "small", className: "dte-field-sidebar-search", onChange: e => { var _a; return setSearchText((_a = e.target.value) !== null && _a !== void 0 ? _a : ''); } })), activeFieldType === FieldTypeEnum.fillable && (_jsx(FillableFieldTypeList, { searchText: searchText, onDragStart: onDragStart, onDragEnd: onDragEnd })), activeFieldType === FieldTypeEnum.eSign && (_jsx(ESignFieldTypeList, { onDragEnd: onDragEnd, onDragStart: onDragStart })), activeFieldType === FieldTypeEnum.dataModel && (_jsx(DataModelFieldTypeList, { searchText: searchText, dataModelGroups: dataModelGroups, onDragStart: onDragStart, onDragEnd: onDragEnd }))] })] }));
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=field-sidebar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-sidebar.js","sourceRoot":"","sources":["../../src/components/field-sidebar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-type.d.ts","sourceRoot":"","sources":["../../src/components/field-type.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAE3B,UAAU,cAAc;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,IAAI,IAAI,CAAC;IAClB,WAAW,IAAI,IAAI,CAAC;CACvB;AAED,eAAO,MAAM,SAAS,EAAE,EAAE,CAAC,cAAc,CAiBxC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Icon, Text } from '@servicetitan/anvil2';
|
|
3
|
+
import IconDragIndicator from '@servicetitan/anvil2/assets/icons/material/round/drag_indicator.svg';
|
|
4
|
+
export const FieldType = ({ label, onDragEnd, onDragStart }) => {
|
|
5
|
+
return (_jsxs("div", { draggable: true, onDragStart: e => {
|
|
6
|
+
onDragStart();
|
|
7
|
+
// Mark that we're dragging a new field type, not an existing field
|
|
8
|
+
e.dataTransfer.effectAllowed = 'copy';
|
|
9
|
+
e.dataTransfer.setData('text/plain', 'new-field-type');
|
|
10
|
+
}, onDragEnd: onDragEnd, className: "dte-field-type-item border m-t-1", children: [_jsx(Icon, { svg: IconDragIndicator, size: "medium" }), _jsx(Text, { size: "small", children: label })] }));
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=field-type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-type.js","sourceRoot":"","sources":["../../src/components/field-type.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,iBAAiB,MAAM,qEAAqE,CAAC;AASpG,MAAM,CAAC,MAAM,SAAS,GAAuB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,EAAE;IAC/E,OAAO,CACH,eACI,SAAS,QACT,WAAW,EAAE,CAAC,CAAC,EAAE;YACb,WAAW,EAAE,CAAC;YACd,mEAAmE;YACnE,CAAC,CAAC,YAAY,CAAC,aAAa,GAAG,MAAM,CAAC;YACtC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;QAC3D,CAAC,EACD,SAAS,EAAE,SAAS,EACpB,SAAS,EAAC,kCAAkC,aAE5C,KAAC,IAAI,IAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAC,QAAQ,GAAG,EAC9C,KAAC,IAAI,IAAC,IAAI,EAAC,OAAO,YAAE,KAAK,GAAQ,IAC/B,CACT,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { FieldTypeOption } from '../interface/pdf-editor';
|
|
3
|
+
interface FillableFieldTypeListProps {
|
|
4
|
+
searchText?: string;
|
|
5
|
+
onDragStart(fieldOption: FieldTypeOption): void;
|
|
6
|
+
onDragEnd(): void;
|
|
7
|
+
}
|
|
8
|
+
export declare const FillableFieldTypeList: FC<FillableFieldTypeListProps>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=fillable-field-type-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fillable-field-type-list.d.ts","sourceRoot":"","sources":["../../src/components/fillable-field-type-list.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAqB,MAAM,OAAO,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG1D,UAAU,0BAA0B;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,WAAW,EAAE,eAAe,GAAG,IAAI,CAAC;IAChD,SAAS,IAAI,IAAI,CAAC;CACrB;AAED,eAAO,MAAM,qBAAqB,EAAE,EAAE,CAAC,0BAA0B,CA8BhE,CAAC"}
|