@servicetitan/dte-pdf-editor 1.4.0 → 1.6.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 +286 -267
- package/dist/components/{field-config-panel-overlay.d.ts → field-config-panel/field-config-panel-overlay.d.ts} +1 -2
- package/dist/components/field-config-panel/field-config-panel-overlay.d.ts.map +1 -0
- package/dist/components/field-config-panel/field-config-panel-overlay.js.map +1 -0
- package/dist/components/{field-config-panel.d.ts → field-config-panel/field-config-panel.d.ts} +1 -2
- package/dist/components/field-config-panel/field-config-panel.d.ts.map +1 -0
- package/dist/components/{field-config-panel.js → field-config-panel/field-config-panel.js} +11 -8
- package/dist/components/field-config-panel/field-config-panel.js.map +1 -0
- package/dist/components/{data-model-field-type-list.d.ts → field-sidebar/data-model-field-type-list.d.ts} +1 -1
- package/dist/components/field-sidebar/data-model-field-type-list.d.ts.map +1 -0
- package/dist/components/{data-model-field-type-list.js → field-sidebar/data-model-field-type-list.js} +3 -3
- package/dist/components/field-sidebar/data-model-field-type-list.js.map +1 -0
- package/dist/components/{e-sign-field-type-list.d.ts → field-sidebar/e-sign-field-type-list.d.ts} +1 -1
- package/dist/components/field-sidebar/e-sign-field-type-list.d.ts.map +1 -0
- package/dist/components/{e-sign-field-type-list.js → field-sidebar/e-sign-field-type-list.js} +1 -1
- package/dist/components/field-sidebar/e-sign-field-type-list.js.map +1 -0
- package/dist/components/{field-sidebar.d.ts → field-sidebar/field-sidebar.d.ts} +1 -1
- package/dist/components/field-sidebar/field-sidebar.d.ts.map +1 -0
- package/dist/components/field-sidebar/field-sidebar.js +32 -0
- package/dist/components/field-sidebar/field-sidebar.js.map +1 -0
- package/dist/components/field-sidebar/field-type.d.ts.map +1 -0
- package/dist/components/{field-type.js → field-sidebar/field-type.js} +1 -1
- package/dist/components/field-sidebar/field-type.js.map +1 -0
- package/dist/components/{fillable-field-type-list.d.ts → field-sidebar/fillable-field-type-list.d.ts} +1 -1
- package/dist/components/field-sidebar/fillable-field-type-list.d.ts.map +1 -0
- package/dist/components/{fillable-field-type-list.js → field-sidebar/fillable-field-type-list.js} +1 -1
- package/dist/components/field-sidebar/fillable-field-type-list.js.map +1 -0
- package/dist/components/index.d.ts +3 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +3 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/{pdf-canvas.d.ts → pdf-canvas/pdf-canvas.d.ts} +3 -2
- package/dist/components/pdf-canvas/pdf-canvas.d.ts.map +1 -0
- package/dist/components/pdf-canvas/pdf-canvas.js +14 -0
- package/dist/components/pdf-canvas/pdf-canvas.js.map +1 -0
- package/dist/components/pdf-canvas/pdf-document-renderer.d.ts.map +1 -0
- package/dist/components/{pdf-document-renderer.js → pdf-canvas/pdf-document-renderer.js} +2 -3
- package/dist/components/pdf-canvas/pdf-document-renderer.js.map +1 -0
- package/dist/components/{pdf-editor.d.ts → pdf-editor/pdf-editor.d.ts} +2 -7
- package/dist/components/pdf-editor/pdf-editor.d.ts.map +1 -0
- package/dist/components/pdf-editor/pdf-editor.js +27 -0
- package/dist/components/pdf-editor/pdf-editor.js.map +1 -0
- package/dist/components/pdf-fields-overlay/add-handle.d.ts +7 -0
- package/dist/components/pdf-fields-overlay/add-handle.d.ts.map +1 -0
- package/dist/components/pdf-fields-overlay/add-handle.js +5 -0
- package/dist/components/pdf-fields-overlay/add-handle.js.map +1 -0
- package/dist/components/pdf-fields-overlay/pdf-fields-overlay.d.ts +15 -0
- package/dist/components/pdf-fields-overlay/pdf-fields-overlay.d.ts.map +1 -0
- package/dist/components/pdf-fields-overlay/pdf-fields-overlay.js +6 -0
- package/dist/components/pdf-fields-overlay/pdf-fields-overlay.js.map +1 -0
- package/dist/components/pdf-fields-overlay/pdf-overlay-field-data-model.d.ts +8 -0
- package/dist/components/pdf-fields-overlay/pdf-overlay-field-data-model.d.ts.map +1 -0
- package/dist/components/pdf-fields-overlay/pdf-overlay-field-data-model.js +5 -0
- package/dist/components/pdf-fields-overlay/pdf-overlay-field-data-model.js.map +1 -0
- package/dist/components/pdf-fields-overlay/pdf-overlay-field-e-sign.d.ts +8 -0
- package/dist/components/pdf-fields-overlay/pdf-overlay-field-e-sign.d.ts.map +1 -0
- package/dist/components/pdf-fields-overlay/pdf-overlay-field-e-sign.js +5 -0
- package/dist/components/pdf-fields-overlay/pdf-overlay-field-e-sign.js.map +1 -0
- package/dist/components/pdf-fields-overlay/pdf-overlay-field-fillable.d.ts +9 -0
- package/dist/components/pdf-fields-overlay/pdf-overlay-field-fillable.d.ts.map +1 -0
- package/dist/components/pdf-fields-overlay/pdf-overlay-field-fillable.js +25 -0
- package/dist/components/pdf-fields-overlay/pdf-overlay-field-fillable.js.map +1 -0
- package/dist/components/pdf-fields-overlay/pdf-overlay-field.d.ts +16 -0
- package/dist/components/pdf-fields-overlay/pdf-overlay-field.d.ts.map +1 -0
- package/dist/components/pdf-fields-overlay/pdf-overlay-field.js +44 -0
- package/dist/components/pdf-fields-overlay/pdf-overlay-field.js.map +1 -0
- package/dist/components/pdf-fields-overlay/resize-handle.d.ts.map +1 -0
- package/dist/components/pdf-fields-overlay/resize-handle.js.map +1 -0
- package/dist/components/pdf-view/pdf-view-data-model.d.ts +9 -0
- package/dist/components/pdf-view/pdf-view-data-model.d.ts.map +1 -0
- package/dist/components/pdf-view/pdf-view-data-model.js +7 -0
- package/dist/components/pdf-view/pdf-view-data-model.js.map +1 -0
- package/dist/components/pdf-view/pdf-view-e-sign.d.ts +8 -0
- package/dist/components/pdf-view/pdf-view-e-sign.d.ts.map +1 -0
- package/dist/components/pdf-view/pdf-view-e-sign.js +5 -0
- package/dist/components/pdf-view/pdf-view-e-sign.js.map +1 -0
- package/dist/components/pdf-view/pdf-view-fillable.d.ts +13 -0
- package/dist/components/pdf-view/pdf-view-fillable.d.ts.map +1 -0
- package/dist/components/{pdf-view-fields.js → pdf-view/pdf-view-fillable.js} +14 -13
- package/dist/components/pdf-view/pdf-view-fillable.js.map +1 -0
- package/dist/components/{pdf-view.d.ts → pdf-view/pdf-view.d.ts} +1 -2
- package/dist/components/pdf-view/pdf-view.d.ts.map +1 -0
- package/dist/components/{pdf-view.js → pdf-view/pdf-view.js} +8 -6
- package/dist/components/pdf-view/pdf-view.js.map +1 -0
- package/dist/constants/field.constants.d.ts +3 -3
- package/dist/constants/field.constants.d.ts.map +1 -1
- package/dist/constants/field.constants.js +4 -3
- package/dist/constants/field.constants.js.map +1 -1
- package/dist/hooks/index.d.ts +4 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +4 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/useFieldDrag.d.ts +1 -1
- package/dist/hooks/useFieldDrag.d.ts.map +1 -1
- package/dist/hooks/useFieldResize.d.ts +1 -1
- package/dist/hooks/useFieldResize.d.ts.map +1 -1
- package/dist/hooks/useInitializePdfJsWorker.d.ts +2 -0
- package/dist/hooks/useInitializePdfJsWorker.d.ts.map +1 -0
- package/dist/hooks/useInitializePdfJsWorker.js +8 -0
- package/dist/hooks/useInitializePdfJsWorker.js.map +1 -0
- package/dist/hooks/usePdfFieldDnD.d.ts +17 -0
- package/dist/hooks/usePdfFieldDnD.d.ts.map +1 -0
- package/dist/hooks/usePdfFieldDnD.js +78 -0
- package/dist/hooks/usePdfFieldDnD.js.map +1 -0
- package/dist/hooks/usePdfFieldSelection.d.ts +13 -0
- package/dist/hooks/usePdfFieldSelection.d.ts.map +1 -0
- package/dist/hooks/usePdfFieldSelection.js +40 -0
- package/dist/hooks/usePdfFieldSelection.js.map +1 -0
- package/dist/hooks/useToggle.d.ts +8 -0
- package/dist/hooks/useToggle.d.ts.map +1 -0
- package/dist/hooks/useToggle.js +15 -0
- package/dist/hooks/useToggle.js.map +1 -0
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/interface/{pdf-editor.d.ts → types.d.ts} +8 -2
- package/dist/interface/types.d.ts.map +1 -0
- package/dist/interface/{pdf-editor.js → types.js} +1 -1
- package/dist/interface/types.js.map +1 -0
- package/dist/utils/{extract-grouped-fields-from-data-model.utils.d.ts → data-model/extract-fields.utils.d.ts} +2 -2
- package/dist/utils/data-model/extract-fields.utils.d.ts.map +1 -0
- package/dist/utils/{extract-grouped-fields-from-data-model.utils.js → data-model/extract-fields.utils.js} +2 -2
- package/dist/utils/data-model/extract-fields.utils.js.map +1 -0
- package/dist/utils/data-model/index.d.ts +3 -0
- package/dist/utils/data-model/index.d.ts.map +1 -0
- package/dist/utils/data-model/index.js +3 -0
- package/dist/utils/data-model/index.js.map +1 -0
- package/dist/utils/{resolve-pdf-data-values.d.ts → data-model/resolve-values.utils.d.ts} +2 -2
- package/dist/utils/data-model/resolve-values.utils.d.ts.map +1 -0
- package/dist/utils/{resolve-pdf-data-values.js → data-model/resolve-values.utils.js} +1 -1
- package/dist/utils/data-model/resolve-values.utils.js.map +1 -0
- package/dist/utils/{is-drag-over-canvas.utils.d.ts → field/drag-over-canvas.utils.d.ts} +1 -1
- package/dist/utils/field/drag-over-canvas.utils.d.ts.map +1 -0
- package/dist/utils/{is-drag-over-canvas.utils.js → field/drag-over-canvas.utils.js} +1 -1
- package/dist/utils/field/drag-over-canvas.utils.js.map +1 -0
- package/dist/utils/{get-field-background-color.d.ts → field/field-background-color.utils.d.ts} +1 -1
- package/dist/utils/field/field-background-color.utils.d.ts.map +1 -0
- package/dist/utils/{get-field-background-color.js → field/field-background-color.utils.js} +1 -1
- package/dist/utils/field/field-background-color.utils.js.map +1 -0
- package/dist/utils/{calculate-drop-coordinates.utils.d.ts → field/field-coordinates.utils.d.ts} +1 -1
- package/dist/utils/field/field-coordinates.utils.d.ts.map +1 -0
- package/dist/utils/{calculate-drop-coordinates.utils.js → field/field-coordinates.utils.js} +2 -2
- package/dist/utils/field/field-coordinates.utils.js.map +1 -0
- package/dist/utils/{handle-field-drag.utils.d.ts → field/field-drag.utils.d.ts} +11 -2
- package/dist/utils/field/field-drag.utils.d.ts.map +1 -0
- package/dist/utils/field/field-drag.utils.js +73 -0
- package/dist/utils/field/field-drag.utils.js.map +1 -0
- package/dist/utils/field/field-placeholder-text.utils.d.ts +3 -0
- package/dist/utils/field/field-placeholder-text.utils.d.ts.map +1 -0
- package/dist/utils/{get-field-placeholder-text.js → field/field-placeholder-text.utils.js} +1 -1
- package/dist/utils/field/field-placeholder-text.utils.js.map +1 -0
- package/dist/utils/{handle-field-resize.utils.d.ts → field/field-resize.utils.d.ts} +2 -2
- package/dist/utils/field/field-resize.utils.d.ts.map +1 -0
- package/dist/utils/{handle-field-resize.utils.js → field/field-resize.utils.js} +3 -4
- package/dist/utils/field/field-resize.utils.js.map +1 -0
- package/dist/utils/field/index.d.ts +7 -0
- package/dist/utils/field/index.d.ts.map +1 -0
- package/dist/utils/field/index.js +7 -0
- package/dist/utils/field/index.js.map +1 -0
- package/dist/utils/index.d.ts +5 -17
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +5 -17
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/path/generate-e-sign-path.d.ts +3 -0
- package/dist/utils/path/generate-e-sign-path.d.ts.map +1 -0
- package/dist/utils/path/generate-e-sign-path.js.map +1 -0
- package/dist/utils/path/generate-fillable-path.d.ts.map +1 -0
- package/dist/utils/path/generate-fillable-path.js.map +1 -0
- package/dist/utils/path/index.d.ts +4 -0
- package/dist/utils/path/index.d.ts.map +1 -0
- package/dist/utils/path/index.js +4 -0
- package/dist/utils/path/index.js.map +1 -0
- package/dist/utils/path/parse-fillable-path.d.ts.map +1 -0
- package/dist/utils/path/parse-fillable-path.js.map +1 -0
- package/dist/utils/pdf/index.d.ts +3 -0
- package/dist/utils/pdf/index.d.ts.map +1 -0
- package/dist/utils/pdf/index.js +3 -0
- package/dist/utils/pdf/index.js.map +1 -0
- package/dist/utils/pdf/pdf-rendering.utils.d.ts +29 -0
- package/dist/utils/pdf/pdf-rendering.utils.d.ts.map +1 -0
- package/dist/utils/pdf/pdf-rendering.utils.js +75 -0
- package/dist/utils/pdf/pdf-rendering.utils.js.map +1 -0
- package/dist/utils/{pdfjs-init.d.ts → pdf/pdfjs-init.d.ts} +1 -0
- package/dist/utils/pdf/pdfjs-init.d.ts.map +1 -0
- package/dist/utils/{pdfjs-init.js → pdf/pdfjs-init.js} +1 -1
- package/dist/utils/pdf/pdfjs-init.js.map +1 -0
- package/dist/utils/recipients/index.d.ts +2 -0
- package/dist/utils/recipients/index.d.ts.map +1 -0
- package/dist/utils/recipients/index.js +2 -0
- package/dist/utils/recipients/index.js.map +1 -0
- package/dist/utils/recipients/map-colors.d.ts +3 -0
- package/dist/utils/recipients/map-colors.d.ts.map +1 -0
- package/dist/utils/{map-colors-to-recipients.js → recipients/map-colors.js} +1 -1
- package/dist/utils/recipients/map-colors.js.map +1 -0
- package/package.json +1 -1
- package/src/components/{field-config-panel-overlay.tsx → field-config-panel/field-config-panel-overlay.tsx} +1 -2
- package/src/components/{field-config-panel.tsx → field-config-panel/field-config-panel.tsx} +18 -25
- package/src/components/{data-model-field-type-list.tsx → field-sidebar/data-model-field-type-list.tsx} +4 -4
- package/src/components/{e-sign-field-type-list.tsx → field-sidebar/e-sign-field-type-list.tsx} +2 -2
- package/src/components/field-sidebar/field-sidebar.tsx +119 -0
- package/src/components/{field-type.tsx → field-sidebar/field-type.tsx} +1 -1
- package/src/components/{fillable-field-type-list.tsx → field-sidebar/fillable-field-type-list.tsx} +2 -2
- package/src/components/index.ts +2 -0
- package/src/components/{pdf-canvas.tsx → pdf-canvas/pdf-canvas.tsx} +12 -9
- package/src/components/{pdf-document-renderer.tsx → pdf-canvas/pdf-document-renderer.tsx} +3 -4
- package/src/components/pdf-editor/pdf-editor.tsx +109 -0
- package/src/components/pdf-fields-overlay/add-handle.tsx +12 -0
- package/src/components/pdf-fields-overlay/pdf-fields-overlay.tsx +44 -0
- package/src/components/pdf-fields-overlay/pdf-overlay-field-data-model.tsx +15 -0
- package/src/components/pdf-fields-overlay/pdf-overlay-field-e-sign.tsx +15 -0
- package/src/components/pdf-fields-overlay/pdf-overlay-field-fillable.tsx +68 -0
- package/src/components/pdf-fields-overlay/pdf-overlay-field.tsx +87 -0
- package/src/components/pdf-view/pdf-view-data-model.tsx +13 -0
- package/src/components/pdf-view/pdf-view-e-sign.tsx +18 -0
- package/src/components/{pdf-view-fields.tsx → pdf-view/pdf-view-fillable.tsx} +31 -26
- package/src/components/{pdf-view.tsx → pdf-view/pdf-view.tsx} +10 -9
- package/src/constants/field.constants.ts +4 -3
- package/src/hooks/index.ts +4 -0
- package/src/hooks/useFieldDrag.ts +1 -1
- package/src/hooks/useFieldResize.ts +1 -1
- package/src/hooks/useInitializePdfJsWorker.ts +8 -0
- package/src/hooks/usePdfFieldDnD.ts +118 -0
- package/src/hooks/usePdfFieldSelection.ts +55 -0
- package/src/hooks/useToggle.ts +26 -0
- package/src/index.ts +2 -3
- package/src/interface/{pdf-editor.ts → types.ts} +8 -1
- package/src/styles/field-config-panel-overlay.css +3 -1
- package/src/styles/field-sidebar.css +36 -3
- package/src/styles/field-type-list.css +1 -1
- package/src/styles/field-type.css +7 -0
- package/src/styles/pdf-canvas.css +2 -0
- package/src/styles/pdf-editor.css +1 -0
- package/src/styles/pdf-field-overlay.css +23 -3
- package/src/styles/variables.css +11 -1
- package/src/utils/{extract-grouped-fields-from-data-model.utils.ts → data-model/extract-fields.utils.ts} +1 -1
- package/src/utils/data-model/index.ts +2 -0
- package/src/utils/{resolve-pdf-data-values.ts → data-model/resolve-values.utils.ts} +1 -1
- package/src/utils/{calculate-drop-coordinates.utils.ts → field/field-coordinates.utils.ts} +1 -1
- package/src/utils/field/field-drag.utils.ts +102 -0
- package/src/utils/{get-field-placeholder-text.ts → field/field-placeholder-text.utils.ts} +1 -1
- package/src/utils/{handle-field-resize.utils.ts → field/field-resize.utils.ts} +3 -4
- package/src/utils/field/index.ts +6 -0
- package/src/utils/index.ts +5 -17
- package/src/utils/{generate-e-sign-path.ts → path/generate-e-sign-path.ts} +1 -1
- package/src/utils/path/index.ts +3 -0
- package/src/utils/pdf/index.ts +2 -0
- package/src/utils/pdf/pdf-rendering.utils.ts +98 -0
- package/src/utils/{pdfjs-init.ts → pdf/pdfjs-init.ts} +1 -2
- package/src/utils/recipients/index.ts +1 -0
- package/src/utils/{map-colors-to-recipients.ts → recipients/map-colors.ts} +1 -1
- package/dist/components/data-model-field-type-list.d.ts.map +0 -1
- package/dist/components/data-model-field-type-list.js.map +0 -1
- package/dist/components/e-sign-field-type-list.d.ts.map +0 -1
- package/dist/components/e-sign-field-type-list.js.map +0 -1
- package/dist/components/field-config-panel-overlay.d.ts.map +0 -1
- package/dist/components/field-config-panel-overlay.js.map +0 -1
- package/dist/components/field-config-panel.d.ts.map +0 -1
- package/dist/components/field-config-panel.js.map +0 -1
- package/dist/components/field-sidebar.d.ts.map +0 -1
- package/dist/components/field-sidebar.js +0 -25
- package/dist/components/field-sidebar.js.map +0 -1
- package/dist/components/field-type.d.ts.map +0 -1
- package/dist/components/field-type.js.map +0 -1
- package/dist/components/fillable-field-type-list.d.ts.map +0 -1
- package/dist/components/fillable-field-type-list.js.map +0 -1
- package/dist/components/pdf-canvas.d.ts.map +0 -1
- package/dist/components/pdf-canvas.js +0 -14
- package/dist/components/pdf-canvas.js.map +0 -1
- package/dist/components/pdf-document-renderer.d.ts.map +0 -1
- package/dist/components/pdf-document-renderer.js.map +0 -1
- package/dist/components/pdf-editor.d.ts.map +0 -1
- package/dist/components/pdf-editor.js +0 -114
- package/dist/components/pdf-editor.js.map +0 -1
- package/dist/components/pdf-field-overlay.d.ts +0 -24
- package/dist/components/pdf-field-overlay.d.ts.map +0 -1
- package/dist/components/pdf-field-overlay.js +0 -60
- package/dist/components/pdf-field-overlay.js.map +0 -1
- package/dist/components/pdf-view-fields.d.ts +0 -17
- package/dist/components/pdf-view-fields.d.ts.map +0 -1
- package/dist/components/pdf-view-fields.js.map +0 -1
- package/dist/components/pdf-view.d.ts.map +0 -1
- package/dist/components/pdf-view.js.map +0 -1
- package/dist/components/resize-handle.d.ts.map +0 -1
- package/dist/components/resize-handle.js.map +0 -1
- package/dist/interface/pdf-editor.d.ts.map +0 -1
- package/dist/interface/pdf-editor.js.map +0 -1
- package/dist/utils/calculate-drop-coordinates.utils.d.ts.map +0 -1
- package/dist/utils/calculate-drop-coordinates.utils.js.map +0 -1
- package/dist/utils/extract-grouped-fields-from-data-model.utils.d.ts.map +0 -1
- package/dist/utils/extract-grouped-fields-from-data-model.utils.js.map +0 -1
- package/dist/utils/generate-e-sign-path.d.ts +0 -3
- package/dist/utils/generate-e-sign-path.d.ts.map +0 -1
- package/dist/utils/generate-e-sign-path.js.map +0 -1
- package/dist/utils/generate-fillable-path.d.ts.map +0 -1
- package/dist/utils/generate-fillable-path.js.map +0 -1
- package/dist/utils/get-field-background-color.d.ts.map +0 -1
- package/dist/utils/get-field-background-color.js.map +0 -1
- package/dist/utils/get-field-placeholder-text.d.ts +0 -3
- package/dist/utils/get-field-placeholder-text.d.ts.map +0 -1
- package/dist/utils/get-field-placeholder-text.js.map +0 -1
- package/dist/utils/get-page-dimensions.utils.d.ts +0 -12
- package/dist/utils/get-page-dimensions.utils.d.ts.map +0 -1
- package/dist/utils/get-page-dimensions.utils.js +0 -31
- package/dist/utils/get-page-dimensions.utils.js.map +0 -1
- package/dist/utils/get-page-number-from-client-y.utils.d.ts +0 -9
- package/dist/utils/get-page-number-from-client-y.utils.d.ts.map +0 -1
- package/dist/utils/get-page-number-from-client-y.utils.js +0 -24
- package/dist/utils/get-page-number-from-client-y.utils.js.map +0 -1
- package/dist/utils/get-page-position.utils.d.ts +0 -12
- package/dist/utils/get-page-position.utils.d.ts.map +0 -1
- package/dist/utils/get-page-position.utils.js +0 -22
- package/dist/utils/get-page-position.utils.js.map +0 -1
- package/dist/utils/handle-field-drag-start.utils.d.ts +0 -16
- package/dist/utils/handle-field-drag-start.utils.d.ts.map +0 -1
- package/dist/utils/handle-field-drag-start.utils.js +0 -41
- package/dist/utils/handle-field-drag-start.utils.js.map +0 -1
- package/dist/utils/handle-field-drag.utils.d.ts.map +0 -1
- package/dist/utils/handle-field-drag.utils.js +0 -36
- package/dist/utils/handle-field-drag.utils.js.map +0 -1
- package/dist/utils/handle-field-resize.utils.d.ts.map +0 -1
- package/dist/utils/handle-field-resize.utils.js.map +0 -1
- package/dist/utils/is-drag-over-canvas.utils.d.ts.map +0 -1
- package/dist/utils/is-drag-over-canvas.utils.js.map +0 -1
- package/dist/utils/map-colors-to-recipients.d.ts +0 -3
- package/dist/utils/map-colors-to-recipients.d.ts.map +0 -1
- package/dist/utils/map-colors-to-recipients.js.map +0 -1
- package/dist/utils/parse-fillable-path.d.ts.map +0 -1
- package/dist/utils/parse-fillable-path.js.map +0 -1
- package/dist/utils/pdfjs-init.d.ts.map +0 -1
- package/dist/utils/pdfjs-init.js.map +0 -1
- package/dist/utils/resolve-pdf-data-values.d.ts.map +0 -1
- package/dist/utils/resolve-pdf-data-values.js.map +0 -1
- package/src/components/field-sidebar.tsx +0 -93
- package/src/components/pdf-editor.tsx +0 -223
- package/src/components/pdf-field-overlay.tsx +0 -182
- package/src/utils/get-page-dimensions.utils.ts +0 -39
- package/src/utils/get-page-number-from-client-y.utils.ts +0 -31
- package/src/utils/get-page-position.utils.ts +0 -30
- package/src/utils/handle-field-drag-start.utils.ts +0 -52
- package/src/utils/handle-field-drag.utils.ts +0 -55
- /package/dist/components/{field-config-panel-overlay.js → field-config-panel/field-config-panel-overlay.js} +0 -0
- /package/dist/components/{field-type.d.ts → field-sidebar/field-type.d.ts} +0 -0
- /package/dist/components/{pdf-document-renderer.d.ts → pdf-canvas/pdf-document-renderer.d.ts} +0 -0
- /package/dist/components/{resize-handle.d.ts → pdf-fields-overlay/resize-handle.d.ts} +0 -0
- /package/dist/components/{resize-handle.js → pdf-fields-overlay/resize-handle.js} +0 -0
- /package/dist/utils/{generate-e-sign-path.js → path/generate-e-sign-path.js} +0 -0
- /package/dist/utils/{generate-fillable-path.d.ts → path/generate-fillable-path.d.ts} +0 -0
- /package/dist/utils/{generate-fillable-path.js → path/generate-fillable-path.js} +0 -0
- /package/dist/utils/{parse-fillable-path.d.ts → path/parse-fillable-path.d.ts} +0 -0
- /package/dist/utils/{parse-fillable-path.js → path/parse-fillable-path.js} +0 -0
- /package/src/components/{resize-handle.tsx → pdf-fields-overlay/resize-handle.tsx} +0 -0
- /package/src/utils/{is-drag-over-canvas.utils.ts → field/drag-over-canvas.utils.ts} +0 -0
- /package/src/utils/{get-field-background-color.ts → field/field-background-color.utils.ts} +0 -0
- /package/src/utils/{generate-fillable-path.ts → path/generate-fillable-path.ts} +0 -0
- /package/src/utils/{parse-fillable-path.ts → path/parse-fillable-path.ts} +0 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gets the dimensions of a PDF page (width and height)
|
|
3
|
+
* @param pageNumber - The page number to get dimensions for
|
|
4
|
+
* @param pdfWrapperRef - Reference to the PDF wrapper element
|
|
5
|
+
* @returns Dimensions object with width and height, or { width: 0, height: 0 } if not found
|
|
6
|
+
*/
|
|
7
|
+
export const getPageDimensions = (pageNumber, pdfWrapperRef) => {
|
|
8
|
+
if (!pdfWrapperRef.current) {
|
|
9
|
+
return { width: 0, height: 0 };
|
|
10
|
+
}
|
|
11
|
+
const pageElement = pdfWrapperRef.current.querySelector(`[data-page-number="${pageNumber}"]`);
|
|
12
|
+
if (!pageElement) {
|
|
13
|
+
return { width: 0, height: 0 };
|
|
14
|
+
}
|
|
15
|
+
// Get the canvas element inside the page to get actual PDF dimensions
|
|
16
|
+
const canvas = pageElement.querySelector('canvas');
|
|
17
|
+
if (canvas) {
|
|
18
|
+
const canvasRect = canvas.getBoundingClientRect();
|
|
19
|
+
return {
|
|
20
|
+
width: canvasRect.width,
|
|
21
|
+
height: canvasRect.height,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
// Fallback to page element dimensions
|
|
25
|
+
const pageRect = pageElement.getBoundingClientRect();
|
|
26
|
+
return {
|
|
27
|
+
width: pageRect.width,
|
|
28
|
+
height: pageRect.height,
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Determines which page number a client Y coordinate falls within
|
|
33
|
+
* @param clientY - The client Y coordinate to check
|
|
34
|
+
* @param pdfWrapperRef - Reference to the PDF wrapper element
|
|
35
|
+
* @returns The page number (defaults to 1 if not found or wrapper is null)
|
|
36
|
+
*/
|
|
37
|
+
export const getPageNumberFromClientY = (clientY, pdfWrapperRef) => {
|
|
38
|
+
if (!pdfWrapperRef.current) {
|
|
39
|
+
return 1;
|
|
40
|
+
}
|
|
41
|
+
const pageElements = pdfWrapperRef.current.querySelectorAll('[data-page-number]');
|
|
42
|
+
let targetPage = 1;
|
|
43
|
+
pageElements.forEach(pageElement => {
|
|
44
|
+
const rect = pageElement.getBoundingClientRect();
|
|
45
|
+
if (clientY >= rect.top && clientY <= rect.bottom) {
|
|
46
|
+
const pageNumber = pageElement.getAttribute('data-page-number');
|
|
47
|
+
if (pageNumber) {
|
|
48
|
+
targetPage = parseInt(pageNumber, 10);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
return targetPage;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Gets the position of a PDF page relative to the wrapper element
|
|
56
|
+
* @param pageNumber - The page number to get the position for
|
|
57
|
+
* @param pdfWrapperRef - Reference to the PDF wrapper element
|
|
58
|
+
* @returns Position object with top and left coordinates, or { top: 0, left: 0 } if not found
|
|
59
|
+
*/
|
|
60
|
+
export const getPagePosition = (pageNumber, pdfWrapperRef) => {
|
|
61
|
+
if (!pdfWrapperRef.current) {
|
|
62
|
+
return { top: 0, left: 0 };
|
|
63
|
+
}
|
|
64
|
+
const pageElement = pdfWrapperRef.current.querySelector(`[data-page-number="${pageNumber}"]`);
|
|
65
|
+
if (!pageElement) {
|
|
66
|
+
return { top: 0, left: 0 };
|
|
67
|
+
}
|
|
68
|
+
const wrapperRect = pdfWrapperRef.current.getBoundingClientRect();
|
|
69
|
+
const pageRect = pageElement.getBoundingClientRect();
|
|
70
|
+
return {
|
|
71
|
+
top: pageRect.top - wrapperRect.top,
|
|
72
|
+
left: pageRect.left - wrapperRect.left,
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=pdf-rendering.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-rendering.utils.js","sourceRoot":"","sources":["../../../src/utils/pdf/pdf-rendering.utils.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC7B,UAAkB,EAClB,aAAwC,EACP,EAAE;IACnC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;QACzB,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACnC,CAAC;IAED,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,sBAAsB,UAAU,IAAI,CAAC,CAAC;IAE9F,IAAI,CAAC,WAAW,EAAE,CAAC;QACf,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACnC,CAAC;IAED,sEAAsE;IACtE,MAAM,MAAM,GAAG,WAAW,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,MAAM,EAAE,CAAC;QACT,MAAM,UAAU,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;QAClD,OAAO;YACH,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,MAAM,EAAE,UAAU,CAAC,MAAM;SAC5B,CAAC;IACN,CAAC;IAED,sCAAsC;IACtC,MAAM,QAAQ,GAAG,WAAW,CAAC,qBAAqB,EAAE,CAAC;IACrD,OAAO;QACH,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;KAC1B,CAAC;AACN,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACpC,OAAe,EACf,aAAwC,EAClC,EAAE;IACR,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;QACzB,OAAO,CAAC,CAAC;IACb,CAAC;IAED,MAAM,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;IAClF,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;QAC/B,MAAM,IAAI,GAAG,WAAW,CAAC,qBAAqB,EAAE,CAAC;QACjD,IAAI,OAAO,IAAI,IAAI,CAAC,GAAG,IAAI,OAAO,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChD,MAAM,UAAU,GAAG,WAAW,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;YAChE,IAAI,UAAU,EAAE,CAAC;gBACb,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC1C,CAAC;QACL,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC;AACtB,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAC3B,UAAkB,EAClB,aAAwC,EACX,EAAE;IAC/B,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;QACzB,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAC/B,CAAC;IAED,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,sBAAsB,UAAU,IAAI,CAAC,CAAC;IAE9F,IAAI,CAAC,WAAW,EAAE,CAAC;QACf,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAC/B,CAAC;IAED,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAClE,MAAM,QAAQ,GAAG,WAAW,CAAC,qBAAqB,EAAE,CAAC;IAErD,OAAO;QACH,GAAG,EAAE,QAAQ,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG;QACnC,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI;KACzC,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Initializes PDF.js worker if not already initialized
|
|
3
3
|
* Safe to call multiple times - will only initialize once
|
|
4
|
+
* Should be called in a useEffect hook within React components
|
|
4
5
|
*/
|
|
5
6
|
export declare const initializePdfJsWorker: () => void;
|
|
6
7
|
//# sourceMappingURL=pdfjs-init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdfjs-init.d.ts","sourceRoot":"","sources":["../../../src/utils/pdf/pdfjs-init.ts"],"names":[],"mappings":"AASA;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAAO,IAWxC,CAAC"}
|
|
@@ -8,6 +8,7 @@ let isInitialized = false;
|
|
|
8
8
|
/**
|
|
9
9
|
* Initializes PDF.js worker if not already initialized
|
|
10
10
|
* Safe to call multiple times - will only initialize once
|
|
11
|
+
* Should be called in a useEffect hook within React components
|
|
11
12
|
*/
|
|
12
13
|
export const initializePdfJsWorker = () => {
|
|
13
14
|
if (isInitialized || typeof window === 'undefined') {
|
|
@@ -21,5 +22,4 @@ export const initializePdfJsWorker = () => {
|
|
|
21
22
|
throw new Error('Failed to initialize PDF.js worker:' + error.message);
|
|
22
23
|
}
|
|
23
24
|
};
|
|
24
|
-
initializePdfJsWorker();
|
|
25
25
|
//# sourceMappingURL=pdfjs-init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdfjs-init.js","sourceRoot":"","sources":["../../../src/utils/pdf/pdfjs-init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AACvC,OAAO,SAAS,MAAM,wCAAwC,CAAC;AAE/D,IAAI,aAAa,GAAG,KAAK,CAAC;AAE1B;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAS,EAAE;IAC5C,IAAI,aAAa,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QACjD,OAAO;IACX,CAAC;IAED,IAAI,CAAC;QACD,QAAQ,CAAC,mBAAmB,CAAC,SAAS,GAAG,SAAS,CAAC;QACnD,aAAa,GAAG,IAAI,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,qCAAqC,GAAI,KAAe,CAAC,OAAO,CAAC,CAAC;IACtF,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/recipients/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/recipients/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-colors.d.ts","sourceRoot":"","sources":["../../../src/utils/recipients/map-colors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AA4BtD,eAAO,MAAM,qBAAqB,GAAI,aAAa,aAAa,EAAE,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAQzF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-colors.js","sourceRoot":"","sources":["../../../src/utils/recipients/map-colors.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,GAAG;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;CACd,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,UAA4B,EAA0B,EAAE;IAC1F,IAAI,CAAC,UAAU,EAAE,CAAC;QACd,OAAO,EAAE,CAAC;IACd,CAAC;IACD,OAAO,UAAU,CAAC,MAAM,CAAyB,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE;QAC9D,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3B,OAAO,GAAG,CAAC;IACf,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { Button, Flex, Text } from '@servicetitan/anvil2';
|
|
2
2
|
import IconClose from '@servicetitan/anvil2/assets/icons/material/round/close.svg';
|
|
3
3
|
import { FC } from 'react';
|
|
4
|
-
import { PdfField } from '
|
|
4
|
+
import { PdfField, RecipientInfo } from '../../interface/types';
|
|
5
5
|
import { FieldConfigPanel } from './field-config-panel';
|
|
6
|
-
import { RecipientInfo } from './pdf-editor';
|
|
7
6
|
|
|
8
7
|
interface FieldConfigPanelOverlayProps {
|
|
9
8
|
selectedField: PdfField;
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { Button, Checkbox, Combobox, Flex, TextField } from '@servicetitan/anvil2';
|
|
1
|
+
import { Button, Checkbox, Combobox, Flex, Textarea, TextField } from '@servicetitan/anvil2';
|
|
2
2
|
import { FC, useMemo } from 'react';
|
|
3
|
-
import { E_SIGN_FIELD_TYPE_OPTIONS } from '
|
|
4
|
-
import { ESignFieldType, FieldTypeEnum, PdfField } from '
|
|
5
|
-
import { generateESignPath
|
|
6
|
-
import { RecipientInfo } from './pdf-editor';
|
|
3
|
+
import { E_SIGN_FIELD_TYPE_OPTIONS } from '../../constants';
|
|
4
|
+
import { ESignFieldType, FieldTypeEnum, PdfField, RecipientInfo } from '../../interface/types';
|
|
5
|
+
import { generateESignPath } from '../../utils';
|
|
7
6
|
|
|
8
7
|
interface FieldConfigPanelProps {
|
|
9
8
|
field: PdfField;
|
|
@@ -79,11 +78,7 @@ export const FieldConfigPanel: FC<FieldConfigPanelProps> = ({
|
|
|
79
78
|
onChange={handleRecipientChange}
|
|
80
79
|
selectedItem={selectedRecipient}
|
|
81
80
|
>
|
|
82
|
-
<Combobox.SearchField
|
|
83
|
-
placeholder=""
|
|
84
|
-
label="Recipient"
|
|
85
|
-
labelProps={{ required: true }}
|
|
86
|
-
/>
|
|
81
|
+
<Combobox.SearchField placeholder="" label="Recipient" />
|
|
87
82
|
<Combobox.Content>
|
|
88
83
|
{({ items }) => (
|
|
89
84
|
<Combobox.List>
|
|
@@ -105,7 +100,7 @@ export const FieldConfigPanel: FC<FieldConfigPanelProps> = ({
|
|
|
105
100
|
onChange={handleESignFieldTypeChange}
|
|
106
101
|
selectedItem={selectedESignFieldType}
|
|
107
102
|
>
|
|
108
|
-
<Combobox.SearchField label="Field Type"
|
|
103
|
+
<Combobox.SearchField label="Field Type" />
|
|
109
104
|
<Combobox.Content>
|
|
110
105
|
{({ items }) => (
|
|
111
106
|
<Combobox.List>
|
|
@@ -120,20 +115,8 @@ export const FieldConfigPanel: FC<FieldConfigPanelProps> = ({
|
|
|
120
115
|
</Combobox>
|
|
121
116
|
)}
|
|
122
117
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
)}
|
|
126
|
-
{field.type === FieldTypeEnum.fillable && (
|
|
127
|
-
<TextField
|
|
128
|
-
label="Input Name"
|
|
129
|
-
value={parseFillablePathName(field.path)}
|
|
130
|
-
onChange={e =>
|
|
131
|
-
onFieldConfigChange({
|
|
132
|
-
path: generateFillablePath(field.recipient!, e.target.value),
|
|
133
|
-
})
|
|
134
|
-
}
|
|
135
|
-
/>
|
|
136
|
-
)}
|
|
118
|
+
<TextField label="Data Path" value={field.path} disabled />
|
|
119
|
+
|
|
137
120
|
{field.type === FieldTypeEnum.fillable && (
|
|
138
121
|
<Checkbox
|
|
139
122
|
label="Required"
|
|
@@ -146,6 +129,16 @@ export const FieldConfigPanel: FC<FieldConfigPanelProps> = ({
|
|
|
146
129
|
/>
|
|
147
130
|
)}
|
|
148
131
|
|
|
132
|
+
<Textarea
|
|
133
|
+
label="Description"
|
|
134
|
+
value={field.description}
|
|
135
|
+
onChange={e =>
|
|
136
|
+
onFieldConfigChange({
|
|
137
|
+
description: e?.target.value ?? '',
|
|
138
|
+
})
|
|
139
|
+
}
|
|
140
|
+
/>
|
|
141
|
+
|
|
149
142
|
<Button className="full-width" onClick={onDeleteField}>
|
|
150
143
|
Delete Field
|
|
151
144
|
</Button>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Flex, Text } from '@servicetitan/anvil2';
|
|
2
2
|
import { FC, Fragment, useMemo } from 'react';
|
|
3
|
-
import { DataModelFieldGroup, FieldTypeOption } from '
|
|
3
|
+
import { DataModelFieldGroup, FieldTypeOption } from '../../interface/types';
|
|
4
4
|
import { FieldType } from './field-type';
|
|
5
5
|
|
|
6
6
|
interface DataModelFieldTypeListProps {
|
|
@@ -25,16 +25,16 @@ export const DataModelFieldTypeList: FC<DataModelFieldTypeListProps> = ({
|
|
|
25
25
|
return dataModelGroups
|
|
26
26
|
.map(group => ({
|
|
27
27
|
...group,
|
|
28
|
-
|
|
28
|
+
fields: group.fields.filter(({ label }) =>
|
|
29
29
|
label.toLowerCase().includes(searchLower),
|
|
30
30
|
),
|
|
31
31
|
}))
|
|
32
|
-
.filter(group => group.
|
|
32
|
+
.filter(group => group.fields.length > 0);
|
|
33
33
|
}, [dataModelGroups, searchText]);
|
|
34
34
|
return (
|
|
35
35
|
<Fragment>
|
|
36
36
|
{searchedFieldGroups.map(group => (
|
|
37
|
-
<div key={group.groupName} className="dte-field-type-group
|
|
37
|
+
<div key={group.groupName} className="dte-field-type-group">
|
|
38
38
|
<Flex alignItems="center" gap={1} className="dte-field-type-group-header">
|
|
39
39
|
<Text variant="headline" el="h6" size="small">
|
|
40
40
|
{group.groupName}
|
package/src/components/{e-sign-field-type-list.tsx → field-sidebar/e-sign-field-type-list.tsx}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { FC, Fragment } from 'react';
|
|
2
|
-
import { E_SIGN_FIELD_TYPES } from '
|
|
3
|
-
import { FieldTypeOption } from '
|
|
2
|
+
import { E_SIGN_FIELD_TYPES } from '../../constants';
|
|
3
|
+
import { FieldTypeOption } from '../../interface/types';
|
|
4
4
|
import { FieldType } from './field-type';
|
|
5
5
|
|
|
6
6
|
interface ESignFieldTypeListProps {
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { Button, Flex, Icon, SearchField, Text } from '@servicetitan/anvil2';
|
|
2
|
+
import IconBorderColor from '@servicetitan/anvil2/assets/icons/material/round/border_color.svg';
|
|
3
|
+
import IconMenuOpen from '@servicetitan/anvil2/assets/icons/material/round/menu_open.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
|
+
|
|
7
|
+
import { FC, useState } from 'react';
|
|
8
|
+
import { useToggle } from '../../hooks';
|
|
9
|
+
import { DataModelFieldGroup, FieldTypeEnum, FieldTypeOption } from '../../interface/types';
|
|
10
|
+
import { DataModelFieldTypeList } from './data-model-field-type-list';
|
|
11
|
+
import { ESignFieldTypeList } from './e-sign-field-type-list';
|
|
12
|
+
import { FillableFieldTypeList } from './fillable-field-type-list';
|
|
13
|
+
|
|
14
|
+
interface FieldSidebarProps {
|
|
15
|
+
dataModelGroups?: DataModelFieldGroup[];
|
|
16
|
+
onDragEnd(): void;
|
|
17
|
+
onDragStart(fieldOption: FieldTypeOption): void;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const menuGroups: { svgIcon: any; label: string; key: FieldTypeEnum }[] = [
|
|
21
|
+
{ svgIcon: IconEstimate, label: 'Merge Tags', key: FieldTypeEnum.dataModel },
|
|
22
|
+
{ svgIcon: IconBorderColor, label: 'E-Sign', key: FieldTypeEnum.eSign },
|
|
23
|
+
{
|
|
24
|
+
svgIcon: IconPhotoSizeSelectSmall,
|
|
25
|
+
label: 'Fillable Fields',
|
|
26
|
+
key: FieldTypeEnum.fillable,
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
export const FieldSidebar: FC<FieldSidebarProps> = ({
|
|
31
|
+
dataModelGroups = [],
|
|
32
|
+
onDragEnd,
|
|
33
|
+
onDragStart,
|
|
34
|
+
}) => {
|
|
35
|
+
const [activeFieldType, setActiveFieldType] = useState<FieldTypeEnum>(FieldTypeEnum.dataModel);
|
|
36
|
+
const [searchText, setSearchText] = useState('');
|
|
37
|
+
const { isOpen, open, toggle } = useToggle(true);
|
|
38
|
+
|
|
39
|
+
const handleActiveFieldTypeChange = (activeFieldType: FieldTypeEnum) => {
|
|
40
|
+
setActiveFieldType(activeFieldType);
|
|
41
|
+
open();
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<Flex className="dte-field-sidebar-container skeleton-item">
|
|
46
|
+
<Flex className="dte-field-sidebar-menu" shrink={0} direction="column" gap="3">
|
|
47
|
+
{menuGroups.map(({ key, label, svgIcon }) => (
|
|
48
|
+
<Flex
|
|
49
|
+
key={key}
|
|
50
|
+
alignItems="center"
|
|
51
|
+
justifyContent="center"
|
|
52
|
+
direction="column"
|
|
53
|
+
className={`dte-field-sidebar-menu-item cursor-pointer ${key === activeFieldType ? '--active' : ''}`}
|
|
54
|
+
onClick={() => handleActiveFieldTypeChange(key)}
|
|
55
|
+
>
|
|
56
|
+
<Icon
|
|
57
|
+
svg={svgIcon}
|
|
58
|
+
size="large"
|
|
59
|
+
className="dte-field-sidebar-menu-item-icon"
|
|
60
|
+
/>
|
|
61
|
+
<Text
|
|
62
|
+
variant="body"
|
|
63
|
+
size="small"
|
|
64
|
+
className="dte-field-sidebar-menu-item-text"
|
|
65
|
+
>
|
|
66
|
+
{label}
|
|
67
|
+
</Text>
|
|
68
|
+
</Flex>
|
|
69
|
+
))}
|
|
70
|
+
</Flex>
|
|
71
|
+
|
|
72
|
+
<Flex
|
|
73
|
+
className={`dte-field-sidebar-content skeleton-item ${isOpen ? '--open' : ''}`}
|
|
74
|
+
shrink={0}
|
|
75
|
+
>
|
|
76
|
+
<Flex className="dte-field-sidebar-content-inner">
|
|
77
|
+
<Text variant="headline" el="h1" size="medium">
|
|
78
|
+
Merge Tags
|
|
79
|
+
</Text>
|
|
80
|
+
|
|
81
|
+
{activeFieldType !== FieldTypeEnum.eSign && (
|
|
82
|
+
<SearchField
|
|
83
|
+
placeholder="Search"
|
|
84
|
+
size="small"
|
|
85
|
+
className="dte-field-sidebar-search"
|
|
86
|
+
onChange={e => setSearchText(e.target.value ?? '')}
|
|
87
|
+
/>
|
|
88
|
+
)}
|
|
89
|
+
{activeFieldType === FieldTypeEnum.fillable && (
|
|
90
|
+
<FillableFieldTypeList
|
|
91
|
+
searchText={searchText}
|
|
92
|
+
onDragStart={onDragStart}
|
|
93
|
+
onDragEnd={onDragEnd}
|
|
94
|
+
/>
|
|
95
|
+
)}
|
|
96
|
+
{activeFieldType === FieldTypeEnum.eSign && (
|
|
97
|
+
<ESignFieldTypeList onDragEnd={onDragEnd} onDragStart={onDragStart} />
|
|
98
|
+
)}
|
|
99
|
+
{activeFieldType === FieldTypeEnum.dataModel && (
|
|
100
|
+
<DataModelFieldTypeList
|
|
101
|
+
searchText={searchText}
|
|
102
|
+
dataModelGroups={dataModelGroups}
|
|
103
|
+
onDragStart={onDragStart}
|
|
104
|
+
onDragEnd={onDragEnd}
|
|
105
|
+
/>
|
|
106
|
+
)}
|
|
107
|
+
</Flex>
|
|
108
|
+
</Flex>
|
|
109
|
+
<Button
|
|
110
|
+
size="small"
|
|
111
|
+
appearance="ghost"
|
|
112
|
+
onClick={toggle}
|
|
113
|
+
className="dte-field-sidebar-toggler"
|
|
114
|
+
>
|
|
115
|
+
<Icon svg={IconMenuOpen} size="medium" />
|
|
116
|
+
</Button>
|
|
117
|
+
</Flex>
|
|
118
|
+
);
|
|
119
|
+
};
|
|
@@ -19,7 +19,7 @@ export const FieldType: FC<FieldTypeProps> = ({ label, onDragEnd, onDragStart })
|
|
|
19
19
|
e.dataTransfer.setData('text/plain', 'new-field-type');
|
|
20
20
|
}}
|
|
21
21
|
onDragEnd={onDragEnd}
|
|
22
|
-
className="dte-field-type-item
|
|
22
|
+
className="dte-field-type-item"
|
|
23
23
|
>
|
|
24
24
|
<Icon svg={IconDragIndicator} size="medium" />
|
|
25
25
|
<Text size="small">{label}</Text>
|
package/src/components/{fillable-field-type-list.tsx → field-sidebar/fillable-field-type-list.tsx}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { FC, Fragment, useMemo } from 'react';
|
|
2
|
-
import { FILLABLE_FIELD_TYPES } from '
|
|
3
|
-
import { FieldTypeOption } from '
|
|
2
|
+
import { FILLABLE_FIELD_TYPES } from '../../constants';
|
|
3
|
+
import { FieldTypeOption } from '../../interface/types';
|
|
4
4
|
import { FieldType } from './field-type';
|
|
5
5
|
|
|
6
6
|
interface FillableFieldTypeListProps {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Flex } from '@servicetitan/anvil2';
|
|
2
2
|
import { DragEvent, FC, MouseEvent, ReactNode, RefObject, useState } from 'react';
|
|
3
|
-
import { BASE_PAGE_WIDTH } from '
|
|
4
|
-
import { PdfField } from '
|
|
3
|
+
import { BASE_PAGE_WIDTH } from '../../constants';
|
|
4
|
+
import { PdfField } from '../../interface/types';
|
|
5
|
+
import { PdfFieldsOverlay } from '../pdf-fields-overlay/pdf-fields-overlay';
|
|
5
6
|
import { PdfDocumentRenderer } from './pdf-document-renderer';
|
|
6
|
-
import { PdfFieldOverlay } from './pdf-field-overlay';
|
|
7
7
|
|
|
8
8
|
interface PdfCanvasProps {
|
|
9
9
|
pdfUrl: string;
|
|
@@ -11,10 +11,11 @@ interface PdfCanvasProps {
|
|
|
11
11
|
loadingPlaceholder?: ReactNode;
|
|
12
12
|
fields: PdfField[];
|
|
13
13
|
loading: boolean;
|
|
14
|
-
selectedField:
|
|
14
|
+
selectedField: PdfField | null;
|
|
15
15
|
pdfContainerRef: RefObject<HTMLDivElement>;
|
|
16
16
|
pdfWrapperRef: RefObject<HTMLDivElement>;
|
|
17
17
|
recipientsColors: Record<string, string>;
|
|
18
|
+
handleAddNewField(field: PdfField): void;
|
|
18
19
|
onDragOver(e: DragEvent<HTMLDivElement>): void;
|
|
19
20
|
onDrop(e: DragEvent<HTMLDivElement>, pageNumber: number): void;
|
|
20
21
|
onFieldClick(fieldId: string, e: MouseEvent): void;
|
|
@@ -26,6 +27,7 @@ interface PdfCanvasProps {
|
|
|
26
27
|
export const PdfCanvas: FC<PdfCanvasProps> = ({
|
|
27
28
|
errorPlaceholder,
|
|
28
29
|
fields,
|
|
30
|
+
handleAddNewField,
|
|
29
31
|
loading,
|
|
30
32
|
loadingPlaceholder,
|
|
31
33
|
onDeselectField,
|
|
@@ -53,7 +55,7 @@ export const PdfCanvas: FC<PdfCanvasProps> = ({
|
|
|
53
55
|
className="dte-pdf-canvas-container"
|
|
54
56
|
onClick={onDeselectField}
|
|
55
57
|
>
|
|
56
|
-
<div ref={pdfWrapperRef} className="dte-pdf-wrapper">
|
|
58
|
+
<div ref={pdfWrapperRef} className="dte-pdf-wrapper" style={{ width: BASE_PAGE_WIDTH }}>
|
|
57
59
|
<PdfDocumentRenderer
|
|
58
60
|
pdfUrl={pdfUrl}
|
|
59
61
|
onDrop={onDrop}
|
|
@@ -65,14 +67,15 @@ export const PdfCanvas: FC<PdfCanvasProps> = ({
|
|
|
65
67
|
onDocumentLoadSuccess={onDocumentLoadSuccess}
|
|
66
68
|
/>
|
|
67
69
|
{isPdfLoaded && fields && (
|
|
68
|
-
<
|
|
70
|
+
<PdfFieldsOverlay
|
|
69
71
|
fields={fields}
|
|
72
|
+
handleAddNewField={handleAddNewField}
|
|
70
73
|
pdfWrapperRef={pdfWrapperRef}
|
|
71
74
|
recipientsColors={recipientsColors}
|
|
72
75
|
selectedField={selectedField ?? null}
|
|
73
|
-
onFieldClick={onFieldClick
|
|
74
|
-
onFieldMove={onFieldMove
|
|
75
|
-
onFieldResize={onFieldResize
|
|
76
|
+
onFieldClick={onFieldClick}
|
|
77
|
+
onFieldMove={onFieldMove}
|
|
78
|
+
onFieldResize={onFieldResize}
|
|
76
79
|
/>
|
|
77
80
|
)}
|
|
78
81
|
</div>
|
|
@@ -2,10 +2,7 @@ import { DragEvent, FC, ReactNode } from 'react';
|
|
|
2
2
|
import { Document, Page } from 'react-pdf';
|
|
3
3
|
import 'react-pdf/dist/Page/AnnotationLayer.css';
|
|
4
4
|
import 'react-pdf/dist/Page/TextLayer.css';
|
|
5
|
-
import { usePdfDocumentRenderer } from '
|
|
6
|
-
import { initializePdfJsWorker } from '../utils';
|
|
7
|
-
|
|
8
|
-
initializePdfJsWorker();
|
|
5
|
+
import { useInitializePdfJsWorker, usePdfDocumentRenderer } from '../../hooks';
|
|
9
6
|
|
|
10
7
|
interface PdfDocumentRendererProps {
|
|
11
8
|
pdfUrl: string;
|
|
@@ -28,6 +25,8 @@ export const PdfDocumentRenderer: FC<PdfDocumentRendererProps> = ({
|
|
|
28
25
|
pageWidth,
|
|
29
26
|
pdfUrl,
|
|
30
27
|
}) => {
|
|
28
|
+
useInitializePdfJsWorker();
|
|
29
|
+
|
|
31
30
|
const { handleDocumentLoadSuccess: handleLoadSuccess, pages } = usePdfDocumentRenderer();
|
|
32
31
|
|
|
33
32
|
const handleDocumentLoadSuccess = ({ numPages }: { numPages: number }) => {
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { Flex } from '@servicetitan/anvil2';
|
|
2
|
+
import { FC, ReactNode, useCallback, useMemo, useRef } from 'react';
|
|
3
|
+
import { useInitializePdfJsWorker, usePdfFieldDnD, usePdfFieldSelection } from '../../hooks';
|
|
4
|
+
import { PdfField, RecipientInfo, SchemaObject } from '../../interface/types';
|
|
5
|
+
import { extractGroupedFieldsFromDataModel, mapColorsToRecipients } from '../../utils';
|
|
6
|
+
import { FieldConfigPanelOverlay } from '../field-config-panel/field-config-panel-overlay';
|
|
7
|
+
import { FieldSidebar } from '../field-sidebar/field-sidebar';
|
|
8
|
+
import { PdfCanvas } from '../pdf-canvas/pdf-canvas';
|
|
9
|
+
|
|
10
|
+
import '../../styles/index.css';
|
|
11
|
+
|
|
12
|
+
interface PdfEditorProps {
|
|
13
|
+
pdfUrl: string;
|
|
14
|
+
loading?: boolean;
|
|
15
|
+
loadingPlaceholder?: ReactNode;
|
|
16
|
+
errorPlaceholder?: ReactNode;
|
|
17
|
+
dataModel?: SchemaObject;
|
|
18
|
+
recipients?: RecipientInfo[];
|
|
19
|
+
fields?: PdfField[];
|
|
20
|
+
onFieldsChange(fields: PdfField[]): void;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export const PdfEditor: FC<PdfEditorProps> = ({
|
|
24
|
+
dataModel,
|
|
25
|
+
errorPlaceholder,
|
|
26
|
+
fields = [],
|
|
27
|
+
loading = false,
|
|
28
|
+
loadingPlaceholder,
|
|
29
|
+
onFieldsChange,
|
|
30
|
+
pdfUrl,
|
|
31
|
+
recipients = [],
|
|
32
|
+
}) => {
|
|
33
|
+
const pdfContainerRef = useRef<HTMLDivElement>(null);
|
|
34
|
+
const pdfWrapperRef = useRef<HTMLDivElement>(null);
|
|
35
|
+
useInitializePdfJsWorker();
|
|
36
|
+
const {
|
|
37
|
+
deleteSelectedField,
|
|
38
|
+
deselectField,
|
|
39
|
+
moveField,
|
|
40
|
+
resizeField,
|
|
41
|
+
selectField,
|
|
42
|
+
selectedField,
|
|
43
|
+
setSelectedFieldId,
|
|
44
|
+
updateField,
|
|
45
|
+
} = usePdfFieldSelection(fields, onFieldsChange);
|
|
46
|
+
|
|
47
|
+
const pdfFieldDnd = usePdfFieldDnD({
|
|
48
|
+
fields,
|
|
49
|
+
recipients,
|
|
50
|
+
onFieldsChange,
|
|
51
|
+
pdfWrapperRef,
|
|
52
|
+
onSelectField: setSelectedFieldId,
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
const dataModelGroups = useMemo(
|
|
56
|
+
() => (dataModel ? extractGroupedFieldsFromDataModel(dataModel) : []),
|
|
57
|
+
[dataModel],
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
const handleAddNewField = useCallback(
|
|
61
|
+
(field: PdfField) => onFieldsChange([...fields, field]),
|
|
62
|
+
[fields, onFieldsChange],
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
const recipientsColors = mapColorsToRecipients(recipients);
|
|
66
|
+
|
|
67
|
+
return (
|
|
68
|
+
<Flex flex={1} className={`dte-pdf-editor ${loading ? 'skeleton' : ''}`}>
|
|
69
|
+
{selectedField && (
|
|
70
|
+
<FieldConfigPanelOverlay
|
|
71
|
+
selectedField={selectedField}
|
|
72
|
+
onFieldConfigChange={updateField}
|
|
73
|
+
onDeleteField={deleteSelectedField}
|
|
74
|
+
recipients={recipients}
|
|
75
|
+
onDeselectField={deselectField}
|
|
76
|
+
/>
|
|
77
|
+
)}
|
|
78
|
+
|
|
79
|
+
<Flex className="dte-pdf-editor-sidebar-container">
|
|
80
|
+
<FieldSidebar
|
|
81
|
+
dataModelGroups={dataModelGroups}
|
|
82
|
+
onDragStart={pdfFieldDnd.handleDragStart}
|
|
83
|
+
onDragEnd={pdfFieldDnd.handleDragEnd}
|
|
84
|
+
/>
|
|
85
|
+
</Flex>
|
|
86
|
+
|
|
87
|
+
<Flex gap={12} flex={1} className="dte-pdf-editor-content-container skeleton-item">
|
|
88
|
+
<PdfCanvas
|
|
89
|
+
pdfUrl={pdfUrl}
|
|
90
|
+
fields={fields}
|
|
91
|
+
loading={loading}
|
|
92
|
+
recipientsColors={recipientsColors}
|
|
93
|
+
selectedField={selectedField}
|
|
94
|
+
pdfContainerRef={pdfContainerRef}
|
|
95
|
+
pdfWrapperRef={pdfWrapperRef}
|
|
96
|
+
errorPlaceholder={errorPlaceholder}
|
|
97
|
+
loadingPlaceholder={loadingPlaceholder}
|
|
98
|
+
handleAddNewField={handleAddNewField}
|
|
99
|
+
onDrop={pdfFieldDnd.handleDrop}
|
|
100
|
+
onDragOver={pdfFieldDnd.handleDragOver}
|
|
101
|
+
onFieldClick={selectField}
|
|
102
|
+
onFieldMove={moveField}
|
|
103
|
+
onFieldResize={resizeField}
|
|
104
|
+
onDeselectField={deselectField}
|
|
105
|
+
/>
|
|
106
|
+
</Flex>
|
|
107
|
+
</Flex>
|
|
108
|
+
);
|
|
109
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
|
|
3
|
+
interface AddHandleProps {
|
|
4
|
+
onClick(): void;
|
|
5
|
+
}
|
|
6
|
+
export const AddHandle: FC<AddHandleProps> = ({ onClick }) => {
|
|
7
|
+
return (
|
|
8
|
+
<button className="dte-add-field-button" onClick={onClick} title="Add Field to This Group">
|
|
9
|
+
+
|
|
10
|
+
</button>
|
|
11
|
+
);
|
|
12
|
+
};
|