@servicetitan/dte-pdf-editor 1.9.0 → 1.11.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/dist/components/pdf-canvas/pdf-document-renderer.d.ts.map +1 -1
- package/dist/components/pdf-canvas/pdf-document-renderer.js +6 -9
- package/dist/components/pdf-canvas/pdf-document-renderer.js.map +1 -1
- package/dist/components/pdf-view/pdf-view-field-container.d.ts +10 -0
- package/dist/components/pdf-view/pdf-view-field-container.d.ts.map +1 -0
- package/dist/components/pdf-view/pdf-view-field-container.js +18 -0
- package/dist/components/pdf-view/pdf-view-field-container.js.map +1 -0
- package/dist/components/pdf-view/pdf-view-fillable.d.ts +3 -4
- package/dist/components/pdf-view/pdf-view-fillable.d.ts.map +1 -1
- package/dist/components/pdf-view/pdf-view-fillable.js +15 -16
- package/dist/components/pdf-view/pdf-view-fillable.js.map +1 -1
- package/dist/components/pdf-view/pdf-view.d.ts +3 -4
- package/dist/components/pdf-view/pdf-view.d.ts.map +1 -1
- package/dist/components/pdf-view/pdf-view.js +15 -18
- package/dist/components/pdf-view/pdf-view.js.map +1 -1
- package/dist/hooks/usePdfDocumentRenderer.d.ts +1 -0
- package/dist/hooks/usePdfDocumentRenderer.d.ts.map +1 -1
- package/dist/hooks/usePdfDocumentRenderer.js +1 -0
- package/dist/hooks/usePdfDocumentRenderer.js.map +1 -1
- package/dist/interface/types.d.ts +4 -0
- package/dist/interface/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/pdf-canvas/pdf-document-renderer.tsx +11 -9
- package/src/components/pdf-view/pdf-view-field-container.tsx +36 -0
- package/src/components/pdf-view/pdf-view-fillable.tsx +26 -32
- package/src/components/pdf-view/pdf-view.tsx +55 -42
- package/src/hooks/usePdfDocumentRenderer.ts +2 -0
- package/src/interface/types.ts +19 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdf-document-renderer.d.ts","sourceRoot":"","sources":["../../../src/components/pdf-canvas/pdf-document-renderer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEjD,OAAO,yCAAyC,CAAC;AACjD,OAAO,mCAAmC,CAAC;AAG3C,UAAU,wBAAwB;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,kBAAkB,CAAC,EAAE,SAAS,CAAC;IAC/B,qBAAqB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IAChD,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CACnE;AAED,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC,wBAAwB,
|
|
1
|
+
{"version":3,"file":"pdf-document-renderer.d.ts","sourceRoot":"","sources":["../../../src/components/pdf-canvas/pdf-document-renderer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEjD,OAAO,yCAAyC,CAAC;AACjD,OAAO,mCAAmC,CAAC;AAG3C,UAAU,wBAAwB;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,kBAAkB,CAAC,EAAE,SAAS,CAAC;IAC/B,qBAAqB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IAChD,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CACnE;AAED,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC,wBAAwB,CAoE5D,CAAC"}
|
|
@@ -5,16 +5,9 @@ import 'react-pdf/dist/Page/TextLayer.css';
|
|
|
5
5
|
import { useInitializePdfJsWorker, usePdfDocumentRenderer } from '../../hooks';
|
|
6
6
|
export const PdfDocumentRenderer = ({ errorPlaceholder, loading, loadingPlaceholder, onDocumentLoadSuccess, onDragOver, onDrop, pageWidth, pdfUrl, }) => {
|
|
7
7
|
useInitializePdfJsWorker();
|
|
8
|
-
const { handleDocumentLoadSuccess: handleLoadSuccess, pages } = usePdfDocumentRenderer();
|
|
8
|
+
const { handleDocumentLoadSuccess: handleLoadSuccess, numPages, pages, } = usePdfDocumentRenderer();
|
|
9
9
|
const handleDocumentLoadSuccess = ({ numPages }) => {
|
|
10
10
|
handleLoadSuccess({ numPages });
|
|
11
|
-
/*
|
|
12
|
-
* Delay setting PDF as loaded to ensure form fields render
|
|
13
|
-
* correctly even when the PDF contains empty values
|
|
14
|
-
*/
|
|
15
|
-
setTimeout(() => {
|
|
16
|
-
onDocumentLoadSuccess === null || onDocumentLoadSuccess === void 0 ? void 0 : onDocumentLoadSuccess(numPages);
|
|
17
|
-
}, 300);
|
|
18
11
|
};
|
|
19
12
|
const handlePageDrop = (e, pageNumber) => {
|
|
20
13
|
e.preventDefault();
|
|
@@ -27,7 +20,11 @@ export const PdfDocumentRenderer = ({ errorPlaceholder, loading, loadingPlacehol
|
|
|
27
20
|
onDragOver === null || onDragOver === void 0 ? void 0 : onDragOver(e);
|
|
28
21
|
};
|
|
29
22
|
return (_jsx(Document, { file: pdfUrl, error: errorPlaceholder, loading: loadingPlaceholder, onLoadSuccess: handleDocumentLoadSuccess, noData: loading ? loadingPlaceholder : undefined, children: pages.map(pageNumber => {
|
|
30
|
-
return (_jsx("div", { "data-page-number": pageNumber, className: "dte-pdf-document-renderer-page", onDragOver: handlePageDragOver, onDrop: e => handlePageDrop(e, pageNumber), children: _jsx(Page, { loading:
|
|
23
|
+
return (_jsx("div", { "data-page-number": pageNumber, className: "dte-pdf-document-renderer-page", onDragOver: handlePageDragOver, onDrop: e => handlePageDrop(e, pageNumber), children: _jsx(Page, { loading: loadingPlaceholder, onLoadSuccess: e => {
|
|
24
|
+
if (e._pageIndex + 1 === numPages) {
|
|
25
|
+
onDocumentLoadSuccess === null || onDocumentLoadSuccess === void 0 ? void 0 : onDocumentLoadSuccess(numPages);
|
|
26
|
+
}
|
|
27
|
+
}, pageNumber: pageNumber, width: pageWidth, renderTextLayer: false, renderAnnotationLayer: false }) }, `page_${pageNumber}`));
|
|
31
28
|
}) }));
|
|
32
29
|
};
|
|
33
30
|
//# sourceMappingURL=pdf-document-renderer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdf-document-renderer.js","sourceRoot":"","sources":["../../../src/components/pdf-canvas/pdf-document-renderer.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,yCAAyC,CAAC;AACjD,OAAO,mCAAmC,CAAC;AAC3C,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAa/E,MAAM,CAAC,MAAM,mBAAmB,GAAiC,CAAC,EAC9D,gBAAgB,EAChB,OAAO,EACP,kBAAkB,EAClB,qBAAqB,EACrB,UAAU,EACV,MAAM,EACN,SAAS,EACT,MAAM,GACT,EAAE,EAAE;IACD,wBAAwB,EAAE,CAAC;IAE3B,MAAM,
|
|
1
|
+
{"version":3,"file":"pdf-document-renderer.js","sourceRoot":"","sources":["../../../src/components/pdf-canvas/pdf-document-renderer.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,yCAAyC,CAAC;AACjD,OAAO,mCAAmC,CAAC;AAC3C,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAa/E,MAAM,CAAC,MAAM,mBAAmB,GAAiC,CAAC,EAC9D,gBAAgB,EAChB,OAAO,EACP,kBAAkB,EAClB,qBAAqB,EACrB,UAAU,EACV,MAAM,EACN,SAAS,EACT,MAAM,GACT,EAAE,EAAE;IACD,wBAAwB,EAAE,CAAC;IAE3B,MAAM,EACF,yBAAyB,EAAE,iBAAiB,EAC5C,QAAQ,EACR,KAAK,GACR,GAAG,sBAAsB,EAAE,CAAC;IAE7B,MAAM,yBAAyB,GAAG,CAAC,EAAE,QAAQ,EAAwB,EAAE,EAAE;QACrE,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,CAA4B,EAAE,UAAkB,EAAE,EAAE;QACxE,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,eAAe,EAAE,CAAC;QACpB,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,CAAC,EAAE,UAAU,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,CAAC,CAA4B,EAAE,EAAE;QACxD,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,eAAe,EAAE,CAAC;QACpB,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAG,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,OAAO,CACH,KAAC,QAAQ,IACL,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,kBAAkB,EAC3B,aAAa,EAAE,yBAAyB,EACxC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,YAE/C,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;YACpB,OAAO,CACH,kCAEsB,UAAU,EAC5B,SAAS,EAAC,gCAAgC,EAC1C,UAAU,EAAE,kBAAkB,EAC9B,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,UAAU,CAAC,YAE1C,KAAC,IAAI,IACD,OAAO,EAAE,kBAAkB,EAC3B,aAAa,EAAE,CAAC,CAAC,EAAE;wBACf,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC;4BAChC,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAG,QAAQ,CAAC,CAAC;wBACtC,CAAC;oBACL,CAAC,EACD,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,SAAS,EAChB,eAAe,EAAE,KAAK,EACtB,qBAAqB,EAAE,KAAK,GAC9B,IAjBG,QAAQ,UAAU,EAAE,CAkBvB,CACT,CAAC;QACN,CAAC,CAAC,GACK,CACd,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { FC, PropsWithChildren, RefObject } from 'react';
|
|
2
|
+
import { PdfField } from '../../interface/types';
|
|
3
|
+
interface PdfViewFieldContainer {
|
|
4
|
+
pdfWrapperRef: RefObject<HTMLDivElement>;
|
|
5
|
+
field: PdfField;
|
|
6
|
+
recipientsColors: Record<string, string>;
|
|
7
|
+
}
|
|
8
|
+
export declare const PdfViewFieldContainer: FC<PropsWithChildren<PdfViewFieldContainer>>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=pdf-view-field-container.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-view-field-container.d.ts","sourceRoot":"","sources":["../../../src/components/pdf-view/pdf-view-field-container.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGjD,UAAU,qBAAqB;IAC3B,aAAa,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;IACzC,KAAK,EAAE,QAAQ,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5C;AAED,eAAO,MAAM,qBAAqB,EAAE,EAAE,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,CAyB9E,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { getFieldBackgroundColor, getPagePosition } from '../../utils';
|
|
3
|
+
export const PdfViewFieldContainer = ({ children, field, pdfWrapperRef, recipientsColors, }) => {
|
|
4
|
+
const pagePos = getPagePosition(field.page, pdfWrapperRef);
|
|
5
|
+
const bgColor = getFieldBackgroundColor(field.recipient, recipientsColors);
|
|
6
|
+
return (_jsx("div", { style: {
|
|
7
|
+
display: 'flex',
|
|
8
|
+
alignItems: 'center',
|
|
9
|
+
position: 'absolute',
|
|
10
|
+
padding: '4px',
|
|
11
|
+
background: bgColor,
|
|
12
|
+
left: `${pagePos.left + field.x}px`,
|
|
13
|
+
top: `${pagePos.top + field.y}px`,
|
|
14
|
+
width: `${field.width}px`,
|
|
15
|
+
height: `${field.height}px`,
|
|
16
|
+
}, children: children }));
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=pdf-view-field-container.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-view-field-container.js","sourceRoot":"","sources":["../../../src/components/pdf-view/pdf-view-field-container.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAQvE,MAAM,CAAC,MAAM,qBAAqB,GAAiD,CAAC,EAChF,QAAQ,EACR,KAAK,EACL,aAAa,EACb,gBAAgB,GACnB,EAAE,EAAE;IACD,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAC3E,OAAO,CACH,cACI,KAAK,EAAE;YACH,OAAO,EAAE,MAAM;YACf,UAAU,EAAE,QAAQ;YACpB,QAAQ,EAAE,UAAU;YACpB,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,OAAO;YACnB,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI;YACnC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,IAAI;YACjC,KAAK,EAAE,GAAG,KAAK,CAAC,KAAK,IAAI;YACzB,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI;SAC9B,YAEA,QAAQ,GACP,CACT,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { FC } from 'react';
|
|
2
|
-
import { DataModelValues, PdfField } from '../../interface/types';
|
|
2
|
+
import { DataChangePayload, DataModelValues, PdfField, PreviewMode } from '../../interface/types';
|
|
3
3
|
interface PdfViewFillableProps {
|
|
4
4
|
field: PdfField;
|
|
5
5
|
data?: DataModelValues;
|
|
6
6
|
fillingBy?: string[];
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}): void;
|
|
7
|
+
previewMode?: PreviewMode;
|
|
8
|
+
onDataChange?(changedData: DataChangePayload, field: PdfField): void;
|
|
10
9
|
}
|
|
11
10
|
export declare const PdfViewFillable: FC<PdfViewFillableProps>;
|
|
12
11
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdf-view-fillable.d.ts","sourceRoot":"","sources":["../../../src/components/pdf-view/pdf-view-fillable.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"pdf-view-fillable.d.ts","sourceRoot":"","sources":["../../../src/components/pdf-view/pdf-view-fillable.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGlG,UAAU,oBAAoB;IAC1B,KAAK,EAAE,QAAQ,CAAC;IAChB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,YAAY,CAAC,CAAC,WAAW,EAAE,iBAAiB,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;CACxE;AAED,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CA4HpD,CAAC"}
|
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { getFieldPlaceholderText } from '../../utils';
|
|
3
|
-
export const PdfViewFillable = ({ data, field, fillingBy, onDataChange, }) => {
|
|
3
|
+
export const PdfViewFillable = ({ data, field, fillingBy, onDataChange, previewMode, }) => {
|
|
4
4
|
const resolvedValue = data === null || data === void 0 ? void 0 : data[field.path];
|
|
5
5
|
const isViewByCurrentRecipient = fillingBy === null || fillingBy === void 0 ? void 0 : fillingBy.includes(field.recipient);
|
|
6
|
+
const isFillable = previewMode === 'fillable'
|
|
7
|
+
? true
|
|
8
|
+
: previewMode === 'view'
|
|
9
|
+
? false
|
|
10
|
+
: isViewByCurrentRecipient;
|
|
11
|
+
const handleDataChange = (fieldValue) => {
|
|
12
|
+
const changedData = { [field.path]: fieldValue };
|
|
13
|
+
onDataChange === null || onDataChange === void 0 ? void 0 : onDataChange(changedData, field);
|
|
14
|
+
};
|
|
6
15
|
if (field.subType === 'checkbox') {
|
|
7
16
|
return (_jsxs("div", { style: {
|
|
8
17
|
display: 'flex',
|
|
@@ -10,9 +19,7 @@ export const PdfViewFillable = ({ data, field, fillingBy, onDataChange, }) => {
|
|
|
10
19
|
background: 'inherit',
|
|
11
20
|
width: 'inherit',
|
|
12
21
|
height: 'inherit',
|
|
13
|
-
}, children: [_jsx("input", { style: { width: 'inherit', height: 'inherit', margin: 0 }, type: "checkbox", checked: resolvedValue !== null && resolvedValue !== void 0 ? resolvedValue : false, disabled: !
|
|
14
|
-
[field.path]: e.target.checked,
|
|
15
|
-
}) }), field.label] }));
|
|
22
|
+
}, children: [_jsx("input", { style: { width: 'inherit', height: 'inherit', margin: 0 }, type: "checkbox", checked: resolvedValue !== null && resolvedValue !== void 0 ? resolvedValue : false, disabled: !isFillable, name: field.path, onChange: e => handleDataChange === null || handleDataChange === void 0 ? void 0 : handleDataChange(e.target.checked) }), field.label] }));
|
|
16
23
|
}
|
|
17
24
|
if (field.subType === 'radio') {
|
|
18
25
|
return (_jsxs("div", { style: {
|
|
@@ -21,34 +28,26 @@ export const PdfViewFillable = ({ data, field, fillingBy, onDataChange, }) => {
|
|
|
21
28
|
background: 'inherit',
|
|
22
29
|
width: 'inherit',
|
|
23
30
|
height: 'inherit',
|
|
24
|
-
}, children: [_jsx("input", { style: { width: 'inherit', height: 'inherit', margin: 0 }, type: "radio", value: field.id, checked: resolvedValue === field.id, disabled: !
|
|
25
|
-
[field.path]: field.id,
|
|
26
|
-
}) }), field.label] }));
|
|
31
|
+
}, children: [_jsx("input", { style: { width: 'inherit', height: 'inherit', margin: 0 }, type: "radio", value: field.id, checked: resolvedValue === field.id, disabled: !isFillable, name: field.path, onChange: () => handleDataChange(field.id) }), field.label] }));
|
|
27
32
|
}
|
|
28
33
|
if (field.subType === 'date') {
|
|
29
34
|
return (_jsx("input", { type: "date", style: {
|
|
30
35
|
background: 'inherit',
|
|
31
36
|
width: 'inherit',
|
|
32
37
|
height: 'inherit',
|
|
33
|
-
}, disabled: !
|
|
34
|
-
[field.path]: e.target.value,
|
|
35
|
-
}), placeholder: getFieldPlaceholderText(field, 'mm/dd/yyyy') }));
|
|
38
|
+
}, disabled: !isFillable, id: field.path, name: field.path, value: resolvedValue !== null && resolvedValue !== void 0 ? resolvedValue : '', onChange: e => handleDataChange(e.target.value), placeholder: getFieldPlaceholderText(field, 'mm/dd/yyyy') }));
|
|
36
39
|
}
|
|
37
40
|
if (field.subType === 'number') {
|
|
38
41
|
return (_jsx("input", { type: "number", style: {
|
|
39
42
|
background: 'inherit',
|
|
40
43
|
width: 'inherit',
|
|
41
44
|
height: 'inherit',
|
|
42
|
-
}, disabled: !
|
|
43
|
-
[field.path]: e.target.value,
|
|
44
|
-
}), placeholder: getFieldPlaceholderText(field) }));
|
|
45
|
+
}, disabled: !isFillable, id: field.path, name: field.path, value: resolvedValue !== null && resolvedValue !== void 0 ? resolvedValue : '', onChange: e => handleDataChange(e.target.value), placeholder: getFieldPlaceholderText(field) }));
|
|
45
46
|
}
|
|
46
47
|
return (_jsx("input", { type: "text", style: {
|
|
47
48
|
background: 'inherit',
|
|
48
49
|
width: 'inherit',
|
|
49
50
|
height: 'inherit',
|
|
50
|
-
}, disabled: !
|
|
51
|
-
[field.path]: e.target.value,
|
|
52
|
-
}), placeholder: getFieldPlaceholderText(field) }));
|
|
51
|
+
}, disabled: !isFillable, id: field.path, name: field.path, value: resolvedValue !== null && resolvedValue !== void 0 ? resolvedValue : '', onChange: e => handleDataChange(e.target.value), placeholder: getFieldPlaceholderText(field) }));
|
|
53
52
|
};
|
|
54
53
|
//# sourceMappingURL=pdf-view-fillable.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdf-view-fillable.js","sourceRoot":"","sources":["../../../src/components/pdf-view/pdf-view-fillable.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"pdf-view-fillable.js","sourceRoot":"","sources":["../../../src/components/pdf-view/pdf-view-fillable.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { FC, ReactNode } from 'react';
|
|
2
|
-
import { DataModelValues, PdfField, RecipientInfo } from '../../interface/types';
|
|
2
|
+
import { DataChangePayload, DataModelValues, PdfField, PreviewMode, RecipientInfo } from '../../interface/types';
|
|
3
3
|
interface PdfViewProps {
|
|
4
4
|
fields: PdfField[];
|
|
5
|
+
previewMode?: PreviewMode;
|
|
5
6
|
data?: DataModelValues;
|
|
6
7
|
pdfUrl: string;
|
|
7
8
|
loading?: boolean;
|
|
@@ -9,9 +10,7 @@ interface PdfViewProps {
|
|
|
9
10
|
loadingPlaceholder?: ReactNode;
|
|
10
11
|
errorPlaceholder?: ReactNode;
|
|
11
12
|
recipients?: RecipientInfo[];
|
|
12
|
-
onDataChange?(changedData:
|
|
13
|
-
[path: string]: string | boolean;
|
|
14
|
-
}): void;
|
|
13
|
+
onDataChange?(changedData: DataChangePayload, field: PdfField): void;
|
|
15
14
|
}
|
|
16
15
|
export declare const PdfView: FC<PdfViewProps>;
|
|
17
16
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdf-view.d.ts","sourceRoot":"","sources":["../../../src/components/pdf-view/pdf-view.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,SAAS,EAAoB,MAAM,OAAO,CAAC;AAExD,OAAO,
|
|
1
|
+
{"version":3,"file":"pdf-view.d.ts","sourceRoot":"","sources":["../../../src/components/pdf-view/pdf-view.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,SAAS,EAAoB,MAAM,OAAO,CAAC;AAExD,OAAO,EACH,iBAAiB,EACjB,eAAe,EAEf,QAAQ,EACR,WAAW,EACX,aAAa,EAChB,MAAM,uBAAuB,CAAC;AAQ/B,UAAU,YAAY;IAClB,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAOlB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,kBAAkB,CAAC,EAAE,SAAS,CAAC;IAC/B,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B,YAAY,CAAC,CAAC,WAAW,EAAE,iBAAiB,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;CACxE;AAED,eAAO,MAAM,OAAO,EAAE,EAAE,CAAC,YAAY,CA2EpC,CAAC"}
|
|
@@ -2,33 +2,30 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { Flex } from '@servicetitan/anvil2';
|
|
3
3
|
import { useRef, useState } from 'react';
|
|
4
4
|
import { BASE_PAGE_WIDTH } from '../../constants';
|
|
5
|
-
import { FieldTypeEnum } from '../../interface/types';
|
|
6
|
-
import {
|
|
5
|
+
import { FieldTypeEnum, } from '../../interface/types';
|
|
6
|
+
import { mapColorsToRecipients } from '../../utils';
|
|
7
7
|
import { PdfDocumentRenderer } from '../pdf-canvas/pdf-document-renderer';
|
|
8
8
|
import { PdfViewDataModel } from './pdf-view-data-model';
|
|
9
9
|
import { PdfViewESign } from './pdf-view-e-sign';
|
|
10
|
+
import { PdfViewFieldContainer } from './pdf-view-field-container';
|
|
10
11
|
import { PdfViewFillable } from './pdf-view-fillable';
|
|
11
|
-
export const PdfView = ({ data, errorPlaceholder, fields, fillingBy, loading = false, loadingPlaceholder, onDataChange, pdfUrl, recipients, }) => {
|
|
12
|
+
export const PdfView = ({ data, errorPlaceholder, fields, fillingBy, loading = false, loadingPlaceholder, onDataChange, pdfUrl, previewMode, recipients, }) => {
|
|
12
13
|
const [isPdfLoaded, setIsPdfLoaded] = useState(false);
|
|
14
|
+
const [previewData, setPreviewData] = useState(data !== null && data !== void 0 ? data : {});
|
|
13
15
|
const pdfWrapperRef = useRef(null);
|
|
14
16
|
const onDocumentLoadSuccess = (_) => {
|
|
15
17
|
setIsPdfLoaded(true);
|
|
16
18
|
};
|
|
19
|
+
const handleDataChange = (data, field) => {
|
|
20
|
+
if (previewMode === 'fillable') {
|
|
21
|
+
setPreviewData(prev => ({
|
|
22
|
+
...prev,
|
|
23
|
+
...data,
|
|
24
|
+
}));
|
|
25
|
+
}
|
|
26
|
+
onDataChange === null || onDataChange === void 0 ? void 0 : onDataChange(data, field);
|
|
27
|
+
};
|
|
17
28
|
const recipientsColors = mapColorsToRecipients(recipients);
|
|
18
|
-
return (_jsx(Flex, { flex: 1, className: "dte-pdf-view-container", style: { maxWidth: BASE_PAGE_WIDTH }, children: _jsxs("div", { ref: pdfWrapperRef, className: "dte-pdf-wrapper", children: [_jsx(PdfDocumentRenderer, { pdfUrl: pdfUrl, loading: loading, pageWidth: BASE_PAGE_WIDTH, errorPlaceholder: errorPlaceholder, loadingPlaceholder: loadingPlaceholder, onDocumentLoadSuccess: onDocumentLoadSuccess }), isPdfLoaded && (_jsx("div", { className: "dte-pdf-field-overlay --view-mode", children: fields.map(field => {
|
|
19
|
-
const pagePos = getPagePosition(field.page, pdfWrapperRef);
|
|
20
|
-
const bgColor = getFieldBackgroundColor(field.recipient, recipientsColors);
|
|
21
|
-
return (_jsxs("div", { style: {
|
|
22
|
-
display: 'flex',
|
|
23
|
-
alignItems: 'center',
|
|
24
|
-
position: 'absolute',
|
|
25
|
-
padding: '4px',
|
|
26
|
-
background: bgColor,
|
|
27
|
-
left: `${pagePos.left + field.x}px`,
|
|
28
|
-
top: `${pagePos.top + field.y}px`,
|
|
29
|
-
width: `${field.width}px`,
|
|
30
|
-
height: `${field.height}px`,
|
|
31
|
-
}, children: [field.type === FieldTypeEnum.dataModel && (_jsx(PdfViewDataModel, { field: field, data: data })), field.type === FieldTypeEnum.eSign && (_jsx(PdfViewESign, { field: field })), field.type === FieldTypeEnum.fillable && (_jsx(PdfViewFillable, { data: data, field: field, fillingBy: fillingBy, onDataChange: onDataChange }))] }, field.id));
|
|
32
|
-
}) }))] }) }));
|
|
29
|
+
return (_jsx(Flex, { flex: 1, className: "dte-pdf-view-container", style: { maxWidth: BASE_PAGE_WIDTH }, children: _jsxs("div", { ref: pdfWrapperRef, className: "dte-pdf-wrapper", children: [_jsx(PdfDocumentRenderer, { pdfUrl: pdfUrl, loading: loading, pageWidth: BASE_PAGE_WIDTH, errorPlaceholder: errorPlaceholder, loadingPlaceholder: loadingPlaceholder, onDocumentLoadSuccess: onDocumentLoadSuccess }), isPdfLoaded && (_jsx("div", { className: "dte-pdf-field-overlay --view-mode", children: fields.map(field => (_jsxs(PdfViewFieldContainer, { field: field, recipientsColors: recipientsColors, pdfWrapperRef: pdfWrapperRef, children: [field.type === FieldTypeEnum.dataModel && (_jsx(PdfViewDataModel, { field: field, data: data })), field.type === FieldTypeEnum.eSign && (_jsx(PdfViewESign, { field: field })), field.type === FieldTypeEnum.fillable && (_jsx(PdfViewFillable, { data: previewMode === 'fillable' ? previewData : data, field: field, fillingBy: fillingBy, previewMode: previewMode, onDataChange: handleDataChange }))] }, field.id))) }))] }) }));
|
|
33
30
|
};
|
|
34
31
|
//# sourceMappingURL=pdf-view.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdf-view.js","sourceRoot":"","sources":["../../../src/components/pdf-view/pdf-view.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAiB,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,
|
|
1
|
+
{"version":3,"file":"pdf-view.js","sourceRoot":"","sources":["../../../src/components/pdf-view/pdf-view.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePdfDocumentRenderer.d.ts","sourceRoot":"","sources":["../../src/hooks/usePdfDocumentRenderer.ts"],"names":[],"mappings":"AAEA,UAAU,4BAA4B;IAClC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,yBAAyB,EAAE,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACnE;AAED,eAAO,MAAM,sBAAsB,QAAO,
|
|
1
|
+
{"version":3,"file":"usePdfDocumentRenderer.d.ts","sourceRoot":"","sources":["../../src/hooks/usePdfDocumentRenderer.ts"],"names":[],"mappings":"AAEA,UAAU,4BAA4B;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,yBAAyB,EAAE,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACnE;AAED,eAAO,MAAM,sBAAsB,QAAO,4BAczC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePdfDocumentRenderer.js","sourceRoot":"","sources":["../../src/hooks/usePdfDocumentRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"usePdfDocumentRenderer.js","sourceRoot":"","sources":["../../src/hooks/usePdfDocumentRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAQ1C,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAiC,EAAE;IACrE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAS,CAAC,CAAC,CAAC;IAEpD,MAAM,yBAAyB,GAAG,CAAC,EAAE,QAAQ,EAAwB,EAAE,EAAE;QACrE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE3F,OAAO;QACH,QAAQ;QACR,KAAK;QACL,yBAAyB;KAC5B,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -67,5 +67,9 @@ export interface RecipientInfo {
|
|
|
67
67
|
name: string;
|
|
68
68
|
displayName: string;
|
|
69
69
|
}
|
|
70
|
+
export interface DataChangePayload {
|
|
71
|
+
[fieldId: string]: string | boolean;
|
|
72
|
+
}
|
|
73
|
+
export type PreviewMode = 'fillable' | 'view';
|
|
70
74
|
export {};
|
|
71
75
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/interface/types.ts"],"names":[],"mappings":"AAAA,oBAAY,aAAa;IACrB,SAAS,cAAc;IACvB,KAAK,UAAU;IACf,QAAQ,aAAa;CACxB;AAED,oBAAY,cAAc;IACtB,SAAS,cAAc;IACvB,QAAQ,aAAa;IACrB,UAAU,eAAe;IACzB,QAAQ,aAAa;CACxB;AAED,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAElF,MAAM,WAAW,QAAQ;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,CAAC,EAAE,iBAAiB,GAAG,cAAc,CAAC;IAC7C,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,CAAC,EAAE,iBAAiB,GAAG,cAAc,CAAC;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,sBAAsB;IACnC,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,UAAU,eAAe;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,sBAAsB,CAAC;CACpC;AAED,MAAM,WAAW,YAAa,SAAQ,eAAe;IACjD,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CAC1C;AAED,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,CAAC;AAEnE,MAAM,WAAW,WAAY,SAAQ,eAAe;IAChD,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,UAAU,CAAC;CACrB;AACD,MAAM,MAAM,wBAAwB,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE5E,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IACvD,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,CAAC,EAAE,wBAAwB,CAAC;CACtC;AAED,MAAM,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAE9C,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAElD,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACvB"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/interface/types.ts"],"names":[],"mappings":"AAAA,oBAAY,aAAa;IACrB,SAAS,cAAc;IACvB,KAAK,UAAU;IACf,QAAQ,aAAa;CACxB;AAED,oBAAY,cAAc;IACtB,SAAS,cAAc;IACvB,QAAQ,aAAa;IACrB,UAAU,eAAe;IACzB,QAAQ,aAAa;CACxB;AAED,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAElF,MAAM,WAAW,QAAQ;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,CAAC,EAAE,iBAAiB,GAAG,cAAc,CAAC;IAC7C,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,CAAC,EAAE,iBAAiB,GAAG,cAAc,CAAC;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,sBAAsB;IACnC,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,UAAU,eAAe;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,sBAAsB,CAAC;CACpC;AAED,MAAM,WAAW,YAAa,SAAQ,eAAe;IACjD,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CAC1C;AAED,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,CAAC;AAEnE,MAAM,WAAW,WAAY,SAAQ,eAAe;IAChD,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,UAAU,CAAC;CACrB;AACD,MAAM,MAAM,wBAAwB,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE5E,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IACvD,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,CAAC,EAAE,wBAAwB,CAAC;CACtC;AAED,MAAM,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAE9C,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAElD,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAC9B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;CACvC;AAeD,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,MAAM,CAAC"}
|
package/package.json
CHANGED
|
@@ -27,17 +27,14 @@ export const PdfDocumentRenderer: FC<PdfDocumentRendererProps> = ({
|
|
|
27
27
|
}) => {
|
|
28
28
|
useInitializePdfJsWorker();
|
|
29
29
|
|
|
30
|
-
const {
|
|
30
|
+
const {
|
|
31
|
+
handleDocumentLoadSuccess: handleLoadSuccess,
|
|
32
|
+
numPages,
|
|
33
|
+
pages,
|
|
34
|
+
} = usePdfDocumentRenderer();
|
|
31
35
|
|
|
32
36
|
const handleDocumentLoadSuccess = ({ numPages }: { numPages: number }) => {
|
|
33
37
|
handleLoadSuccess({ numPages });
|
|
34
|
-
/*
|
|
35
|
-
* Delay setting PDF as loaded to ensure form fields render
|
|
36
|
-
* correctly even when the PDF contains empty values
|
|
37
|
-
*/
|
|
38
|
-
setTimeout(() => {
|
|
39
|
-
onDocumentLoadSuccess?.(numPages);
|
|
40
|
-
}, 300);
|
|
41
38
|
};
|
|
42
39
|
|
|
43
40
|
const handlePageDrop = (e: DragEvent<HTMLDivElement>, pageNumber: number) => {
|
|
@@ -70,7 +67,12 @@ export const PdfDocumentRenderer: FC<PdfDocumentRendererProps> = ({
|
|
|
70
67
|
onDrop={e => handlePageDrop(e, pageNumber)}
|
|
71
68
|
>
|
|
72
69
|
<Page
|
|
73
|
-
loading={
|
|
70
|
+
loading={loadingPlaceholder}
|
|
71
|
+
onLoadSuccess={e => {
|
|
72
|
+
if (e._pageIndex + 1 === numPages) {
|
|
73
|
+
onDocumentLoadSuccess?.(numPages);
|
|
74
|
+
}
|
|
75
|
+
}}
|
|
74
76
|
pageNumber={pageNumber}
|
|
75
77
|
width={pageWidth}
|
|
76
78
|
renderTextLayer={false}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { FC, PropsWithChildren, RefObject } from 'react';
|
|
2
|
+
import { PdfField } from '../../interface/types';
|
|
3
|
+
import { getFieldBackgroundColor, getPagePosition } from '../../utils';
|
|
4
|
+
|
|
5
|
+
interface PdfViewFieldContainer {
|
|
6
|
+
pdfWrapperRef: RefObject<HTMLDivElement>;
|
|
7
|
+
field: PdfField;
|
|
8
|
+
recipientsColors: Record<string, string>;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const PdfViewFieldContainer: FC<PropsWithChildren<PdfViewFieldContainer>> = ({
|
|
12
|
+
children,
|
|
13
|
+
field,
|
|
14
|
+
pdfWrapperRef,
|
|
15
|
+
recipientsColors,
|
|
16
|
+
}) => {
|
|
17
|
+
const pagePos = getPagePosition(field.page, pdfWrapperRef);
|
|
18
|
+
const bgColor = getFieldBackgroundColor(field.recipient, recipientsColors);
|
|
19
|
+
return (
|
|
20
|
+
<div
|
|
21
|
+
style={{
|
|
22
|
+
display: 'flex',
|
|
23
|
+
alignItems: 'center',
|
|
24
|
+
position: 'absolute',
|
|
25
|
+
padding: '4px',
|
|
26
|
+
background: bgColor,
|
|
27
|
+
left: `${pagePos.left + field.x}px`,
|
|
28
|
+
top: `${pagePos.top + field.y}px`,
|
|
29
|
+
width: `${field.width}px`,
|
|
30
|
+
height: `${field.height}px`,
|
|
31
|
+
}}
|
|
32
|
+
>
|
|
33
|
+
{children}
|
|
34
|
+
</div>
|
|
35
|
+
);
|
|
36
|
+
};
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { FC } from 'react';
|
|
2
|
-
import { DataModelValues, PdfField } from '../../interface/types';
|
|
2
|
+
import { DataChangePayload, DataModelValues, PdfField, PreviewMode } from '../../interface/types';
|
|
3
3
|
import { getFieldPlaceholderText } from '../../utils';
|
|
4
4
|
|
|
5
5
|
interface PdfViewFillableProps {
|
|
6
6
|
field: PdfField;
|
|
7
7
|
data?: DataModelValues;
|
|
8
8
|
fillingBy?: string[];
|
|
9
|
-
|
|
9
|
+
previewMode?: PreviewMode;
|
|
10
|
+
onDataChange?(changedData: DataChangePayload, field: PdfField): void;
|
|
10
11
|
}
|
|
11
12
|
|
|
12
13
|
export const PdfViewFillable: FC<PdfViewFillableProps> = ({
|
|
@@ -14,9 +15,22 @@ export const PdfViewFillable: FC<PdfViewFillableProps> = ({
|
|
|
14
15
|
field,
|
|
15
16
|
fillingBy,
|
|
16
17
|
onDataChange,
|
|
18
|
+
previewMode,
|
|
17
19
|
}) => {
|
|
18
20
|
const resolvedValue = data?.[field.path!];
|
|
19
21
|
const isViewByCurrentRecipient = fillingBy?.includes(field.recipient!);
|
|
22
|
+
const isFillable =
|
|
23
|
+
previewMode === 'fillable'
|
|
24
|
+
? true
|
|
25
|
+
: previewMode === 'view'
|
|
26
|
+
? false
|
|
27
|
+
: isViewByCurrentRecipient;
|
|
28
|
+
|
|
29
|
+
const handleDataChange = (fieldValue: DataChangePayload[string]) => {
|
|
30
|
+
const changedData = { [field.path!]: fieldValue };
|
|
31
|
+
onDataChange?.(changedData, field);
|
|
32
|
+
};
|
|
33
|
+
|
|
20
34
|
if (field.subType === 'checkbox') {
|
|
21
35
|
return (
|
|
22
36
|
<div
|
|
@@ -32,13 +46,9 @@ export const PdfViewFillable: FC<PdfViewFillableProps> = ({
|
|
|
32
46
|
style={{ width: 'inherit', height: 'inherit', margin: 0 }}
|
|
33
47
|
type="checkbox"
|
|
34
48
|
checked={resolvedValue ?? false}
|
|
35
|
-
disabled={!
|
|
49
|
+
disabled={!isFillable}
|
|
36
50
|
name={field.path}
|
|
37
|
-
onChange={e =>
|
|
38
|
-
onDataChange?.({
|
|
39
|
-
[field.path!]: e!.target.checked,
|
|
40
|
-
})
|
|
41
|
-
}
|
|
51
|
+
onChange={e => handleDataChange?.(e!.target.checked)}
|
|
42
52
|
/>
|
|
43
53
|
{field.label}
|
|
44
54
|
</div>
|
|
@@ -61,13 +71,9 @@ export const PdfViewFillable: FC<PdfViewFillableProps> = ({
|
|
|
61
71
|
type="radio"
|
|
62
72
|
value={field.id}
|
|
63
73
|
checked={resolvedValue === field.id}
|
|
64
|
-
disabled={!
|
|
74
|
+
disabled={!isFillable}
|
|
65
75
|
name={field.path}
|
|
66
|
-
onChange={() =>
|
|
67
|
-
onDataChange?.({
|
|
68
|
-
[field.path!]: field.id,
|
|
69
|
-
})
|
|
70
|
-
}
|
|
76
|
+
onChange={() => handleDataChange(field.id)}
|
|
71
77
|
/>
|
|
72
78
|
{field.label}
|
|
73
79
|
</div>
|
|
@@ -83,15 +89,11 @@ export const PdfViewFillable: FC<PdfViewFillableProps> = ({
|
|
|
83
89
|
width: 'inherit',
|
|
84
90
|
height: 'inherit',
|
|
85
91
|
}}
|
|
86
|
-
disabled={!
|
|
92
|
+
disabled={!isFillable}
|
|
87
93
|
id={field.path}
|
|
88
94
|
name={field.path}
|
|
89
95
|
value={resolvedValue ?? ''}
|
|
90
|
-
onChange={e =>
|
|
91
|
-
onDataChange?.({
|
|
92
|
-
[field.path!]: e.target.value,
|
|
93
|
-
})
|
|
94
|
-
}
|
|
96
|
+
onChange={e => handleDataChange(e.target.value)}
|
|
95
97
|
placeholder={getFieldPlaceholderText(field, 'mm/dd/yyyy')}
|
|
96
98
|
/>
|
|
97
99
|
);
|
|
@@ -106,15 +108,11 @@ export const PdfViewFillable: FC<PdfViewFillableProps> = ({
|
|
|
106
108
|
width: 'inherit',
|
|
107
109
|
height: 'inherit',
|
|
108
110
|
}}
|
|
109
|
-
disabled={!
|
|
111
|
+
disabled={!isFillable}
|
|
110
112
|
id={field.path}
|
|
111
113
|
name={field.path}
|
|
112
114
|
value={resolvedValue ?? ''}
|
|
113
|
-
onChange={e =>
|
|
114
|
-
onDataChange?.({
|
|
115
|
-
[field.path!]: e.target.value,
|
|
116
|
-
})
|
|
117
|
-
}
|
|
115
|
+
onChange={e => handleDataChange(e.target.value)}
|
|
118
116
|
placeholder={getFieldPlaceholderText(field)}
|
|
119
117
|
/>
|
|
120
118
|
);
|
|
@@ -128,15 +126,11 @@ export const PdfViewFillable: FC<PdfViewFillableProps> = ({
|
|
|
128
126
|
width: 'inherit',
|
|
129
127
|
height: 'inherit',
|
|
130
128
|
}}
|
|
131
|
-
disabled={!
|
|
129
|
+
disabled={!isFillable}
|
|
132
130
|
id={field.path}
|
|
133
131
|
name={field.path}
|
|
134
132
|
value={resolvedValue ?? ''}
|
|
135
|
-
onChange={e =>
|
|
136
|
-
onDataChange?.({
|
|
137
|
-
[field.path!]: e.target.value,
|
|
138
|
-
})
|
|
139
|
-
}
|
|
133
|
+
onChange={e => handleDataChange(e.target.value)}
|
|
140
134
|
placeholder={getFieldPlaceholderText(field)}
|
|
141
135
|
/>
|
|
142
136
|
);
|
|
@@ -1,23 +1,38 @@
|
|
|
1
1
|
import { Flex } from '@servicetitan/anvil2';
|
|
2
2
|
import { FC, ReactNode, useRef, useState } from 'react';
|
|
3
3
|
import { BASE_PAGE_WIDTH } from '../../constants';
|
|
4
|
-
import {
|
|
5
|
-
|
|
4
|
+
import {
|
|
5
|
+
DataChangePayload,
|
|
6
|
+
DataModelValues,
|
|
7
|
+
FieldTypeEnum,
|
|
8
|
+
PdfField,
|
|
9
|
+
PreviewMode,
|
|
10
|
+
RecipientInfo,
|
|
11
|
+
} from '../../interface/types';
|
|
12
|
+
import { mapColorsToRecipients } from '../../utils';
|
|
6
13
|
import { PdfDocumentRenderer } from '../pdf-canvas/pdf-document-renderer';
|
|
7
14
|
import { PdfViewDataModel } from './pdf-view-data-model';
|
|
8
15
|
import { PdfViewESign } from './pdf-view-e-sign';
|
|
16
|
+
import { PdfViewFieldContainer } from './pdf-view-field-container';
|
|
9
17
|
import { PdfViewFillable } from './pdf-view-fillable';
|
|
10
18
|
|
|
11
19
|
interface PdfViewProps {
|
|
12
20
|
fields: PdfField[];
|
|
21
|
+
previewMode?: PreviewMode;
|
|
13
22
|
data?: DataModelValues;
|
|
14
23
|
pdfUrl: string;
|
|
15
24
|
loading?: boolean;
|
|
25
|
+
/*
|
|
26
|
+
* fillingBy defines the list of recipient names
|
|
27
|
+
* who are allowed to fill this field.
|
|
28
|
+
* This restriction is enforced only when PreviewMode
|
|
29
|
+
* is NOT active (i.e., during actual form filling).
|
|
30
|
+
*/
|
|
16
31
|
fillingBy?: string[];
|
|
17
32
|
loadingPlaceholder?: ReactNode;
|
|
18
33
|
errorPlaceholder?: ReactNode;
|
|
19
34
|
recipients?: RecipientInfo[];
|
|
20
|
-
onDataChange?(changedData:
|
|
35
|
+
onDataChange?(changedData: DataChangePayload, field: PdfField): void;
|
|
21
36
|
}
|
|
22
37
|
|
|
23
38
|
export const PdfView: FC<PdfViewProps> = ({
|
|
@@ -29,15 +44,28 @@ export const PdfView: FC<PdfViewProps> = ({
|
|
|
29
44
|
loadingPlaceholder,
|
|
30
45
|
onDataChange,
|
|
31
46
|
pdfUrl,
|
|
47
|
+
previewMode,
|
|
32
48
|
recipients,
|
|
33
49
|
}) => {
|
|
34
50
|
const [isPdfLoaded, setIsPdfLoaded] = useState<boolean>(false);
|
|
51
|
+
const [previewData, setPreviewData] = useState<DataModelValues>(data ?? {});
|
|
52
|
+
|
|
35
53
|
const pdfWrapperRef = useRef<HTMLDivElement>(null);
|
|
36
54
|
|
|
37
55
|
const onDocumentLoadSuccess = (_: number) => {
|
|
38
56
|
setIsPdfLoaded(true);
|
|
39
57
|
};
|
|
40
58
|
|
|
59
|
+
const handleDataChange = (data: DataChangePayload, field: PdfField) => {
|
|
60
|
+
if (previewMode === 'fillable') {
|
|
61
|
+
setPreviewData(prev => ({
|
|
62
|
+
...prev,
|
|
63
|
+
...data,
|
|
64
|
+
}));
|
|
65
|
+
}
|
|
66
|
+
onDataChange?.(data, field);
|
|
67
|
+
};
|
|
68
|
+
|
|
41
69
|
const recipientsColors = mapColorsToRecipients(recipients);
|
|
42
70
|
|
|
43
71
|
return (
|
|
@@ -53,45 +81,30 @@ export const PdfView: FC<PdfViewProps> = ({
|
|
|
53
81
|
/>
|
|
54
82
|
{isPdfLoaded && (
|
|
55
83
|
<div className="dte-pdf-field-overlay --view-mode">
|
|
56
|
-
{fields.map(field =>
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
field
|
|
60
|
-
recipientsColors
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
)}
|
|
81
|
-
{field.type === FieldTypeEnum.eSign && (
|
|
82
|
-
<PdfViewESign field={field} />
|
|
83
|
-
)}
|
|
84
|
-
{field.type === FieldTypeEnum.fillable && (
|
|
85
|
-
<PdfViewFillable
|
|
86
|
-
data={data}
|
|
87
|
-
field={field}
|
|
88
|
-
fillingBy={fillingBy}
|
|
89
|
-
onDataChange={onDataChange}
|
|
90
|
-
/>
|
|
91
|
-
)}
|
|
92
|
-
</div>
|
|
93
|
-
);
|
|
94
|
-
})}
|
|
84
|
+
{fields.map(field => (
|
|
85
|
+
<PdfViewFieldContainer
|
|
86
|
+
key={field.id}
|
|
87
|
+
field={field}
|
|
88
|
+
recipientsColors={recipientsColors}
|
|
89
|
+
pdfWrapperRef={pdfWrapperRef}
|
|
90
|
+
>
|
|
91
|
+
{field.type === FieldTypeEnum.dataModel && (
|
|
92
|
+
<PdfViewDataModel field={field} data={data} />
|
|
93
|
+
)}
|
|
94
|
+
{field.type === FieldTypeEnum.eSign && (
|
|
95
|
+
<PdfViewESign field={field} />
|
|
96
|
+
)}
|
|
97
|
+
{field.type === FieldTypeEnum.fillable && (
|
|
98
|
+
<PdfViewFillable
|
|
99
|
+
data={previewMode === 'fillable' ? previewData : data}
|
|
100
|
+
field={field}
|
|
101
|
+
fillingBy={fillingBy}
|
|
102
|
+
previewMode={previewMode}
|
|
103
|
+
onDataChange={handleDataChange}
|
|
104
|
+
/>
|
|
105
|
+
)}
|
|
106
|
+
</PdfViewFieldContainer>
|
|
107
|
+
))}
|
|
95
108
|
</div>
|
|
96
109
|
)}
|
|
97
110
|
</div>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { useMemo, useState } from 'react';
|
|
2
2
|
|
|
3
3
|
interface UsePdfDocumentRendererReturn {
|
|
4
|
+
numPages: number;
|
|
4
5
|
pages: number[];
|
|
5
6
|
handleDocumentLoadSuccess: (data: { numPages: number }) => void;
|
|
6
7
|
}
|
|
@@ -15,6 +16,7 @@ export const usePdfDocumentRenderer = (): UsePdfDocumentRendererReturn => {
|
|
|
15
16
|
const pages = useMemo(() => Array.from({ length: numPages }, (_, i) => i + 1), [numPages]);
|
|
16
17
|
|
|
17
18
|
return {
|
|
19
|
+
numPages,
|
|
18
20
|
pages,
|
|
19
21
|
handleDocumentLoadSuccess,
|
|
20
22
|
};
|
package/src/interface/types.ts
CHANGED
|
@@ -81,3 +81,22 @@ export interface RecipientInfo {
|
|
|
81
81
|
name: string;
|
|
82
82
|
displayName: string;
|
|
83
83
|
}
|
|
84
|
+
|
|
85
|
+
export interface DataChangePayload {
|
|
86
|
+
[fieldId: string]: string | boolean;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/*
|
|
90
|
+
* PreviewMode controls how the form is displayed:
|
|
91
|
+
*
|
|
92
|
+
* - 'fillable':
|
|
93
|
+
* Allows the user to fill all fillable fields,
|
|
94
|
+
* but the data is NOT saved — it’s only for previewing
|
|
95
|
+
* how the form will look when filled.
|
|
96
|
+
*
|
|
97
|
+
* - 'view':
|
|
98
|
+
* Does NOT allow editing any fields.
|
|
99
|
+
* Fields are shown as read-only, and if a value exists,
|
|
100
|
+
* it is displayed.
|
|
101
|
+
*/
|
|
102
|
+
export type PreviewMode = 'fillable' | 'view';
|