@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.
Files changed (179) hide show
  1. package/README.md +356 -0
  2. package/dist/components/data-model-field-type-list.d.ts +11 -0
  3. package/dist/components/data-model-field-type-list.d.ts.map +1 -0
  4. package/dist/components/data-model-field-type-list.js +23 -0
  5. package/dist/components/data-model-field-type-list.js.map +1 -0
  6. package/dist/components/e-sign-field-type-list.d.ts +9 -0
  7. package/dist/components/e-sign-field-type-list.d.ts.map +1 -0
  8. package/dist/components/e-sign-field-type-list.js +12 -0
  9. package/dist/components/e-sign-field-type-list.js.map +1 -0
  10. package/dist/components/field-config-panel-overlay.d.ts +13 -0
  11. package/dist/components/field-config-panel-overlay.d.ts.map +1 -0
  12. package/dist/components/field-config-panel-overlay.js +8 -0
  13. package/dist/components/field-config-panel-overlay.js.map +1 -0
  14. package/dist/components/field-config-panel.d.ts +12 -0
  15. package/dist/components/field-config-panel.d.ts.map +1 -0
  16. package/dist/components/field-config-panel.js +38 -0
  17. package/dist/components/field-config-panel.js.map +1 -0
  18. package/dist/components/field-sidebar.d.ts +10 -0
  19. package/dist/components/field-sidebar.d.ts.map +1 -0
  20. package/dist/components/field-sidebar.js +25 -0
  21. package/dist/components/field-sidebar.js.map +1 -0
  22. package/dist/components/field-type.d.ts +9 -0
  23. package/dist/components/field-type.d.ts.map +1 -0
  24. package/dist/components/field-type.js +12 -0
  25. package/dist/components/field-type.js.map +1 -0
  26. package/dist/components/fillable-field-type-list.d.ts +10 -0
  27. package/dist/components/fillable-field-type-list.d.ts.map +1 -0
  28. package/dist/components/fillable-field-type-list.js +17 -0
  29. package/dist/components/fillable-field-type-list.js.map +1 -0
  30. package/dist/components/pdf-canvas.d.ts +22 -0
  31. package/dist/components/pdf-canvas.d.ts.map +1 -0
  32. package/dist/components/pdf-canvas.js +14 -0
  33. package/dist/components/pdf-canvas.js.map +1 -0
  34. package/dist/components/pdf-document-renderer.d.ts +16 -0
  35. package/dist/components/pdf-document-renderer.d.ts.map +1 -0
  36. package/dist/components/pdf-document-renderer.js +28 -0
  37. package/dist/components/pdf-document-renderer.js.map +1 -0
  38. package/dist/components/pdf-editor.d.ts +21 -0
  39. package/dist/components/pdf-editor.d.ts.map +1 -0
  40. package/dist/components/pdf-editor.js +108 -0
  41. package/dist/components/pdf-editor.js.map +1 -0
  42. package/dist/components/pdf-field-overlay.d.ts +14 -0
  43. package/dist/components/pdf-field-overlay.d.ts.map +1 -0
  44. package/dist/components/pdf-field-overlay.js +32 -0
  45. package/dist/components/pdf-field-overlay.js.map +1 -0
  46. package/dist/constants/field.constants.d.ts +16 -0
  47. package/dist/constants/field.constants.d.ts.map +1 -0
  48. package/dist/constants/field.constants.js +28 -0
  49. package/dist/constants/field.constants.js.map +1 -0
  50. package/dist/constants/index.d.ts +3 -0
  51. package/dist/constants/index.d.ts.map +1 -0
  52. package/dist/constants/index.js +3 -0
  53. package/dist/constants/index.js.map +1 -0
  54. package/dist/constants/pdf-editor.constants.d.ts +2 -0
  55. package/dist/constants/pdf-editor.constants.d.ts.map +1 -0
  56. package/dist/constants/pdf-editor.constants.js +2 -0
  57. package/dist/constants/pdf-editor.constants.js.map +1 -0
  58. package/dist/hooks/index.d.ts +4 -0
  59. package/dist/hooks/index.d.ts.map +1 -0
  60. package/dist/hooks/index.js +4 -0
  61. package/dist/hooks/index.js.map +1 -0
  62. package/dist/hooks/useFieldDrag.d.ts +24 -0
  63. package/dist/hooks/useFieldDrag.d.ts.map +1 -0
  64. package/dist/hooks/useFieldDrag.js +34 -0
  65. package/dist/hooks/useFieldDrag.js.map +1 -0
  66. package/dist/hooks/useFieldResize.d.ts +17 -0
  67. package/dist/hooks/useFieldResize.d.ts.map +1 -0
  68. package/dist/hooks/useFieldResize.js +58 -0
  69. package/dist/hooks/useFieldResize.js.map +1 -0
  70. package/dist/hooks/usePdfDocumentRenderer.d.ts +9 -0
  71. package/dist/hooks/usePdfDocumentRenderer.d.ts.map +1 -0
  72. package/dist/hooks/usePdfDocumentRenderer.js +13 -0
  73. package/dist/hooks/usePdfDocumentRenderer.js.map +1 -0
  74. package/dist/index.d.ts +3 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +2 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/interface/pdf-editor.d.ts +64 -0
  79. package/dist/interface/pdf-editor.d.ts.map +1 -0
  80. package/dist/interface/pdf-editor.js +14 -0
  81. package/dist/interface/pdf-editor.js.map +1 -0
  82. package/dist/utils/calculate-drop-coordinates.utils.d.ts +15 -0
  83. package/dist/utils/calculate-drop-coordinates.utils.d.ts.map +1 -0
  84. package/dist/utils/calculate-drop-coordinates.utils.js +48 -0
  85. package/dist/utils/calculate-drop-coordinates.utils.js.map +1 -0
  86. package/dist/utils/extract-grouped-fields-from-data-model.utils.d.ts +7 -0
  87. package/dist/utils/extract-grouped-fields-from-data-model.utils.d.ts.map +1 -0
  88. package/dist/utils/extract-grouped-fields-from-data-model.utils.js +57 -0
  89. package/dist/utils/extract-grouped-fields-from-data-model.utils.js.map +1 -0
  90. package/dist/utils/generate-e-sign-path.d.ts +3 -0
  91. package/dist/utils/generate-e-sign-path.d.ts.map +1 -0
  92. package/dist/utils/generate-e-sign-path.js +4 -0
  93. package/dist/utils/generate-e-sign-path.js.map +1 -0
  94. package/dist/utils/get-page-dimensions.utils.d.ts +12 -0
  95. package/dist/utils/get-page-dimensions.utils.d.ts.map +1 -0
  96. package/dist/utils/get-page-dimensions.utils.js +31 -0
  97. package/dist/utils/get-page-dimensions.utils.js.map +1 -0
  98. package/dist/utils/get-page-number-from-client-y.utils.d.ts +9 -0
  99. package/dist/utils/get-page-number-from-client-y.utils.d.ts.map +1 -0
  100. package/dist/utils/get-page-number-from-client-y.utils.js +24 -0
  101. package/dist/utils/get-page-number-from-client-y.utils.js.map +1 -0
  102. package/dist/utils/get-page-position.utils.d.ts +12 -0
  103. package/dist/utils/get-page-position.utils.d.ts.map +1 -0
  104. package/dist/utils/get-page-position.utils.js +22 -0
  105. package/dist/utils/get-page-position.utils.js.map +1 -0
  106. package/dist/utils/handle-field-drag-start.utils.d.ts +16 -0
  107. package/dist/utils/handle-field-drag-start.utils.d.ts.map +1 -0
  108. package/dist/utils/handle-field-drag-start.utils.js +41 -0
  109. package/dist/utils/handle-field-drag-start.utils.js.map +1 -0
  110. package/dist/utils/handle-field-drag.utils.d.ts +19 -0
  111. package/dist/utils/handle-field-drag.utils.d.ts.map +1 -0
  112. package/dist/utils/handle-field-drag.utils.js +36 -0
  113. package/dist/utils/handle-field-drag.utils.js.map +1 -0
  114. package/dist/utils/handle-field-resize.utils.d.ts +35 -0
  115. package/dist/utils/handle-field-resize.utils.d.ts.map +1 -0
  116. package/dist/utils/handle-field-resize.utils.js +66 -0
  117. package/dist/utils/handle-field-resize.utils.js.map +1 -0
  118. package/dist/utils/index.d.ts +13 -0
  119. package/dist/utils/index.d.ts.map +1 -0
  120. package/dist/utils/index.js +13 -0
  121. package/dist/utils/index.js.map +1 -0
  122. package/dist/utils/is-drag-over-canvas.utils.d.ts +9 -0
  123. package/dist/utils/is-drag-over-canvas.utils.d.ts.map +1 -0
  124. package/dist/utils/is-drag-over-canvas.utils.js +26 -0
  125. package/dist/utils/is-drag-over-canvas.utils.js.map +1 -0
  126. package/dist/utils/map-colors-to-recipients.d.ts +3 -0
  127. package/dist/utils/map-colors-to-recipients.d.ts.map +1 -0
  128. package/dist/utils/map-colors-to-recipients.js +35 -0
  129. package/dist/utils/map-colors-to-recipients.js.map +1 -0
  130. package/dist/utils/pdfjs-init.d.ts +6 -0
  131. package/dist/utils/pdfjs-init.d.ts.map +1 -0
  132. package/dist/utils/pdfjs-init.js +25 -0
  133. package/dist/utils/pdfjs-init.js.map +1 -0
  134. package/package.json +28 -0
  135. package/src/components/data-model-field-type-list.tsx +58 -0
  136. package/src/components/e-sign-field-type-list.tsx +27 -0
  137. package/src/components/field-config-panel-overlay.tsx +51 -0
  138. package/src/components/field-config-panel.tsx +142 -0
  139. package/src/components/field-sidebar.tsx +93 -0
  140. package/src/components/field-type.tsx +28 -0
  141. package/src/components/fillable-field-type-list.tsx +42 -0
  142. package/src/components/pdf-canvas.tsx +81 -0
  143. package/src/components/pdf-document-renderer.tsx +78 -0
  144. package/src/components/pdf-editor.tsx +216 -0
  145. package/src/components/pdf-field-overlay.tsx +83 -0
  146. package/src/constants/field.constants.ts +31 -0
  147. package/src/constants/index.ts +2 -0
  148. package/src/constants/pdf-editor.constants.ts +1 -0
  149. package/src/hooks/index.ts +3 -0
  150. package/src/hooks/useFieldDrag.ts +56 -0
  151. package/src/hooks/useFieldResize.ts +95 -0
  152. package/src/hooks/usePdfDocumentRenderer.ts +21 -0
  153. package/src/index.ts +2 -0
  154. package/src/interface/pdf-editor.ts +74 -0
  155. package/src/styles/field-config-panel-overlay.css +33 -0
  156. package/src/styles/field-sidebar.css +31 -0
  157. package/src/styles/field-type-list.css +8 -0
  158. package/src/styles/field-type.css +10 -0
  159. package/src/styles/generic.css +3 -0
  160. package/src/styles/index.css +10 -0
  161. package/src/styles/pdf-canvas.css +9 -0
  162. package/src/styles/pdf-document-renderer.css +4 -0
  163. package/src/styles/pdf-editor.css +14 -0
  164. package/src/styles/pdf-field-overlay.css +54 -0
  165. package/src/styles/variables.css +26 -0
  166. package/src/utils/calculate-drop-coordinates.utils.ts +68 -0
  167. package/src/utils/extract-grouped-fields-from-data-model.utils.ts +73 -0
  168. package/src/utils/generate-e-sign-path.ts +5 -0
  169. package/src/utils/get-page-dimensions.utils.ts +39 -0
  170. package/src/utils/get-page-number-from-client-y.utils.ts +31 -0
  171. package/src/utils/get-page-position.utils.ts +30 -0
  172. package/src/utils/handle-field-drag-start.utils.ts +52 -0
  173. package/src/utils/handle-field-drag.utils.ts +55 -0
  174. package/src/utils/handle-field-resize.utils.ts +102 -0
  175. package/src/utils/index.ts +12 -0
  176. package/src/utils/is-drag-over-canvas.utils.ts +35 -0
  177. package/src/utils/map-colors-to-recipients.ts +37 -0
  178. package/src/utils/pdfjs-init.ts +27 -0
  179. 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,9 @@
1
+ import { FC } from 'react';
2
+ interface FieldTypeProps {
3
+ label: string;
4
+ onDragEnd(): void;
5
+ onDragStart(): void;
6
+ }
7
+ export declare const FieldType: FC<FieldTypeProps>;
8
+ export {};
9
+ //# sourceMappingURL=field-type.d.ts.map
@@ -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"}