@servicetitan/dte-pdf-editor 1.5.0 → 1.7.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/field-config-panel/field-config-panel.d.ts.map +1 -1
- package/dist/components/field-config-panel/field-config-panel.js +7 -2
- package/dist/components/field-config-panel/field-config-panel.js.map +1 -1
- package/dist/components/field-sidebar/data-model-field-type-list.js +1 -1
- package/dist/components/field-sidebar/data-model-field-type-list.js.map +1 -1
- package/dist/components/field-sidebar/field-sidebar.d.ts.map +1 -1
- package/dist/components/field-sidebar/field-sidebar.js +9 -2
- package/dist/components/field-sidebar/field-sidebar.js.map +1 -1
- package/dist/components/field-sidebar/field-type.js +1 -1
- package/dist/components/field-sidebar/field-type.js.map +1 -1
- package/dist/components/pdf-canvas/pdf-canvas.js +1 -1
- package/dist/components/pdf-canvas/pdf-canvas.js.map +1 -1
- package/dist/components/pdf-editor/pdf-editor.d.ts.map +1 -1
- package/dist/components/pdf-editor/pdf-editor.js +16 -106
- package/dist/components/pdf-editor/pdf-editor.js.map +1 -1
- package/dist/components/pdf-fields-overlay/pdf-overlay-field-fillable.d.ts.map +1 -1
- package/dist/components/pdf-fields-overlay/pdf-overlay-field-fillable.js +2 -0
- package/dist/components/pdf-fields-overlay/pdf-overlay-field-fillable.js.map +1 -1
- package/dist/components/pdf-fields-overlay/pdf-overlay-field.d.ts.map +1 -1
- package/dist/components/pdf-fields-overlay/pdf-overlay-field.js +1 -1
- package/dist/components/pdf-fields-overlay/pdf-overlay-field.js.map +1 -1
- package/dist/components/pdf-view/pdf-view-e-sign.d.ts +1 -2
- package/dist/components/pdf-view/pdf-view-e-sign.d.ts.map +1 -1
- package/dist/components/pdf-view/pdf-view-e-sign.js +2 -4
- package/dist/components/pdf-view/pdf-view-e-sign.js.map +1 -1
- package/dist/components/pdf-view/pdf-view-fillable.d.ts.map +1 -1
- package/dist/components/pdf-view/pdf-view-fillable.js +9 -0
- package/dist/components/pdf-view/pdf-view-fillable.js.map +1 -1
- package/dist/components/pdf-view/pdf-view.js +1 -1
- package/dist/components/pdf-view/pdf-view.js.map +1 -1
- package/dist/constants/field.constants.d.ts.map +1 -1
- package/dist/constants/field.constants.js +1 -0
- package/dist/constants/field.constants.js.map +1 -1
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +3 -0
- package/dist/hooks/index.js.map +1 -1
- 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/interface/types.d.ts +2 -1
- package/dist/interface/types.d.ts.map +1 -1
- package/package.json +3 -2
- package/src/components/field-config-panel/field-config-panel.tsx +11 -1
- package/src/components/field-sidebar/data-model-field-type-list.tsx +1 -1
- package/src/components/field-sidebar/field-sidebar.tsx +60 -34
- package/src/components/field-sidebar/field-type.tsx +1 -1
- package/src/components/pdf-canvas/pdf-canvas.tsx +1 -1
- package/src/components/pdf-editor/pdf-editor.tsx +54 -171
- package/src/components/pdf-fields-overlay/pdf-overlay-field-fillable.tsx +10 -0
- package/src/components/pdf-fields-overlay/pdf-overlay-field.tsx +1 -0
- package/src/components/pdf-view/pdf-view-e-sign.tsx +6 -7
- package/src/components/pdf-view/pdf-view-fillable.tsx +23 -0
- package/src/components/pdf-view/pdf-view.tsx +1 -1
- package/src/constants/field.constants.ts +1 -0
- package/src/hooks/index.ts +3 -0
- package/src/hooks/usePdfFieldDnD.ts +118 -0
- package/src/hooks/usePdfFieldSelection.ts +55 -0
- package/src/hooks/useToggle.ts +26 -0
- package/src/interface/types.ts +2 -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/variables.css +11 -1
- package/webpack.config.js +112 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePdfFieldDnD.d.ts","sourceRoot":"","sources":["../../src/hooks/usePdfFieldDnD.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAY,MAAM,OAAO,CAAC;AAGvD,OAAO,EAGH,eAAe,EACf,QAAQ,EACR,aAAa,EAChB,MAAM,oBAAoB,CAAC;AAQ5B,UAAU,mBAAmB;IACzB,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,cAAc,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC;IAC7C,aAAa,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;IACzC,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAED,eAAO,MAAM,cAAc,GAAI,uEAM5B,mBAAmB;mCAGoB,eAAe;;wBAQ1B,SAAS,CAAC,cAAc,CAAC;oBAe7B,SAAS,CAAC,cAAc,CAAC,cAAc,MAAM;CA4DvE,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
3
|
+
import { FIELD_CONSTANTS, FILLABLE_FIELD_DEFAULT_SIZES } from '../constants';
|
|
4
|
+
import { FieldTypeEnum, } from '../interface/types';
|
|
5
|
+
import { calculateDropCoordinates, generateESignPath, generateFillablePath, isDragOverCanvas, } from '../utils';
|
|
6
|
+
export const usePdfFieldDnD = ({ fields, onFieldsChange, onSelectField, pdfWrapperRef, recipients, }) => {
|
|
7
|
+
const [draggedFieldOption, setDraggedFieldOption] = useState(null);
|
|
8
|
+
const handleDragStart = (fieldOption) => {
|
|
9
|
+
setDraggedFieldOption(fieldOption);
|
|
10
|
+
};
|
|
11
|
+
const handleDragEnd = () => {
|
|
12
|
+
setDraggedFieldOption(null);
|
|
13
|
+
};
|
|
14
|
+
const handleDragOver = (e) => {
|
|
15
|
+
if (!draggedFieldOption) {
|
|
16
|
+
e.dataTransfer.dropEffect = 'none';
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (isDragOverCanvas(e, pdfWrapperRef)) {
|
|
20
|
+
e.preventDefault();
|
|
21
|
+
e.stopPropagation();
|
|
22
|
+
e.dataTransfer.dropEffect = 'copy';
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
e.dataTransfer.dropEffect = 'none';
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
const handleDrop = (e, pageNumber) => {
|
|
29
|
+
var _a, _b;
|
|
30
|
+
e.preventDefault();
|
|
31
|
+
e.stopPropagation();
|
|
32
|
+
if (e.dataTransfer.getData('text/plain') === 'existing-field' || !draggedFieldOption) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const coordinates = calculateDropCoordinates(e, pageNumber, pdfWrapperRef);
|
|
36
|
+
if (!coordinates) {
|
|
37
|
+
setDraggedFieldOption(null);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const newField = {
|
|
41
|
+
id: uuidv4(),
|
|
42
|
+
type: draggedFieldOption.type,
|
|
43
|
+
subType: draggedFieldOption.subType,
|
|
44
|
+
x: coordinates.x,
|
|
45
|
+
y: coordinates.y,
|
|
46
|
+
page: pageNumber,
|
|
47
|
+
label: draggedFieldOption.label,
|
|
48
|
+
width: FIELD_CONSTANTS.defaultWidth,
|
|
49
|
+
height: FIELD_CONSTANTS.defaultHeight,
|
|
50
|
+
path: draggedFieldOption.path,
|
|
51
|
+
};
|
|
52
|
+
const recipientName = (_b = (_a = recipients[0]) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : '';
|
|
53
|
+
if (newField.type === FieldTypeEnum.eSign) {
|
|
54
|
+
newField.recipient = recipientName;
|
|
55
|
+
newField.path = generateESignPath(recipientName, draggedFieldOption.subType);
|
|
56
|
+
}
|
|
57
|
+
if (newField.type === FieldTypeEnum.fillable) {
|
|
58
|
+
const defaultSize = FILLABLE_FIELD_DEFAULT_SIZES[newField.subType];
|
|
59
|
+
newField.recipient = recipientName;
|
|
60
|
+
newField.required = false;
|
|
61
|
+
newField.path = generateFillablePath(recipientName, uuidv4());
|
|
62
|
+
if (defaultSize) {
|
|
63
|
+
newField.width = defaultSize.width;
|
|
64
|
+
newField.height = defaultSize.height;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
onFieldsChange([...fields, newField]);
|
|
68
|
+
onSelectField(newField.id);
|
|
69
|
+
setDraggedFieldOption(null);
|
|
70
|
+
};
|
|
71
|
+
return {
|
|
72
|
+
handleDragStart,
|
|
73
|
+
handleDragEnd,
|
|
74
|
+
handleDragOver,
|
|
75
|
+
handleDrop,
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=usePdfFieldDnD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePdfFieldDnD.js","sourceRoot":"","sources":["../../src/hooks/usePdfFieldDnD.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { MouseEvent } from 'react';
|
|
2
|
+
import { PdfField } from '../interface/types';
|
|
3
|
+
export declare const usePdfFieldSelection: (fields: PdfField[], onFieldsChange: (fields: PdfField[]) => void) => {
|
|
4
|
+
selectedField: PdfField | null;
|
|
5
|
+
selectField: (fieldId: string, e?: MouseEvent) => void;
|
|
6
|
+
deselectField: () => void;
|
|
7
|
+
updateField: (updates: Partial<PdfField>) => void;
|
|
8
|
+
deleteSelectedField: () => void;
|
|
9
|
+
moveField: (id: string, x: number, y: number, page: number) => void;
|
|
10
|
+
resizeField: (id: string, width: number, height: number, page: number) => void;
|
|
11
|
+
setSelectedFieldId: import("react").Dispatch<import("react").SetStateAction<string | null>>;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=usePdfFieldSelection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePdfFieldSelection.d.ts","sourceRoot":"","sources":["../../src/hooks/usePdfFieldSelection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAqB,MAAM,OAAO,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,eAAO,MAAM,oBAAoB,GAC7B,QAAQ,QAAQ,EAAE,EAClB,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,IAAI;;2BASd,MAAM,MAAM,UAAU;;2BAOtB,OAAO,CAAC,QAAQ,CAAC;;oBAexB,MAAM,KAAK,MAAM,KAAK,MAAM,QAAQ,MAAM;sBAIxC,MAAM,SAAS,MAAM,UAAU,MAAM,QAAQ,MAAM;;CAc/E,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { useMemo, useState } from 'react';
|
|
2
|
+
export const usePdfFieldSelection = (fields, onFieldsChange) => {
|
|
3
|
+
const [selectedFieldId, setSelectedFieldId] = useState(null);
|
|
4
|
+
const selectedField = useMemo(() => { var _a; return (_a = fields.find(f => f.id === selectedFieldId)) !== null && _a !== void 0 ? _a : null; }, [fields, selectedFieldId]);
|
|
5
|
+
const selectField = (fieldId, e) => {
|
|
6
|
+
e === null || e === void 0 ? void 0 : e.stopPropagation();
|
|
7
|
+
setSelectedFieldId(fieldId);
|
|
8
|
+
};
|
|
9
|
+
const deselectField = () => setSelectedFieldId(null);
|
|
10
|
+
const updateField = (updates) => {
|
|
11
|
+
if (!selectedFieldId) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
onFieldsChange(fields.map(f => (f.id === selectedFieldId ? { ...f, ...updates } : f)));
|
|
15
|
+
};
|
|
16
|
+
const deleteSelectedField = () => {
|
|
17
|
+
if (!selectedFieldId) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
onFieldsChange(fields.filter(f => f.id !== selectedFieldId));
|
|
21
|
+
setSelectedFieldId(null);
|
|
22
|
+
};
|
|
23
|
+
const moveField = (id, x, y, page) => {
|
|
24
|
+
onFieldsChange(fields.map(f => (f.id === id ? { ...f, x, y, page } : f)));
|
|
25
|
+
};
|
|
26
|
+
const resizeField = (id, width, height, page) => {
|
|
27
|
+
onFieldsChange(fields.map(f => (f.id === id ? { ...f, width, height, page } : f)));
|
|
28
|
+
};
|
|
29
|
+
return {
|
|
30
|
+
selectedField,
|
|
31
|
+
selectField,
|
|
32
|
+
deselectField,
|
|
33
|
+
updateField,
|
|
34
|
+
deleteSelectedField,
|
|
35
|
+
moveField,
|
|
36
|
+
resizeField,
|
|
37
|
+
setSelectedFieldId,
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=usePdfFieldSelection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePdfFieldSelection.js","sourceRoot":"","sources":["../../src/hooks/usePdfFieldSelection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGtD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAChC,MAAkB,EAClB,cAA4C,EAC9C,EAAE;IACA,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAE5E,MAAM,aAAa,GAAG,OAAO,CACzB,GAAG,EAAE,WAAC,OAAA,MAAA,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,eAAe,CAAC,mCAAI,IAAI,CAAA,EAAA,EACxD,CAAC,MAAM,EAAE,eAAe,CAAC,CAC5B,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,CAAc,EAAE,EAAE;QACpD,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,eAAe,EAAE,CAAC;QACrB,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAErD,MAAM,WAAW,GAAG,CAAC,OAA0B,EAAE,EAAE;QAC/C,IAAI,CAAC,eAAe,EAAE,CAAC;YACnB,OAAO;QACX,CAAC;QACD,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,eAAe,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3F,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAG,GAAG,EAAE;QAC7B,IAAI,CAAC,eAAe,EAAE,CAAC;YACnB,OAAO;QACX,CAAC;QACD,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,eAAe,CAAC,CAAC,CAAC;QAC7D,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,EAAU,EAAE,CAAS,EAAE,CAAS,EAAE,IAAY,EAAE,EAAE;QACjE,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,EAAU,EAAE,KAAa,EAAE,MAAc,EAAE,IAAY,EAAE,EAAE;QAC5E,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,CAAC,CAAC;IAEF,OAAO;QACH,aAAa;QACb,WAAW;QACX,aAAa;QACb,WAAW;QACX,mBAAmB;QACnB,SAAS;QACT,WAAW;QACX,kBAAkB;KACrB,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useToggle.d.ts","sourceRoot":"","sources":["../../src/hooks/useToggle.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,eAAO,MAAM,SAAS,GAAI,eAAc,OAAe,KAAG,eAgBzD,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { useCallback, useState } from 'react';
|
|
2
|
+
export const useToggle = (initialValue = false) => {
|
|
3
|
+
const [isOpen, setIsOpen] = useState(initialValue);
|
|
4
|
+
const toggle = useCallback(() => {
|
|
5
|
+
setIsOpen(v => !v);
|
|
6
|
+
}, []);
|
|
7
|
+
const open = useCallback(() => {
|
|
8
|
+
setIsOpen(true);
|
|
9
|
+
}, []);
|
|
10
|
+
const close = useCallback(() => {
|
|
11
|
+
setIsOpen(false);
|
|
12
|
+
}, []);
|
|
13
|
+
return { isOpen, toggle, open, close };
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=useToggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useToggle.js","sourceRoot":"","sources":["../../src/hooks/useToggle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAS9C,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,eAAwB,KAAK,EAAmB,EAAE;IACxE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAU,YAAY,CAAC,CAAC;IAE5D,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5B,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE;QAC1B,SAAS,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC3B,SAAS,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC3C,CAAC,CAAC"}
|
|
@@ -9,7 +9,7 @@ export declare enum ESignFieldType {
|
|
|
9
9
|
dateSigned = "dateSigned",
|
|
10
10
|
fullName = "fullName"
|
|
11
11
|
}
|
|
12
|
-
export type FillableFieldType = 'text' | 'date' | 'checkbox' | 'radio';
|
|
12
|
+
export type FillableFieldType = 'text' | 'date' | 'checkbox' | 'radio' | 'number';
|
|
13
13
|
export interface PdfField {
|
|
14
14
|
id: string;
|
|
15
15
|
type: FieldTypeEnum;
|
|
@@ -23,6 +23,7 @@ export interface PdfField {
|
|
|
23
23
|
required?: boolean;
|
|
24
24
|
path?: string;
|
|
25
25
|
recipient?: string;
|
|
26
|
+
description?: string;
|
|
26
27
|
}
|
|
27
28
|
export interface FieldTypeOption {
|
|
28
29
|
label: string;
|
|
@@ -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,CAAC;
|
|
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"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@servicetitan/dte-pdf-editor",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"typings": "./dist/index.d.ts",
|
|
7
7
|
"files": [
|
|
8
8
|
"dist",
|
|
9
|
-
"src"
|
|
9
|
+
"src",
|
|
10
|
+
"webpack.config.js"
|
|
10
11
|
],
|
|
11
12
|
"publishConfig": {
|
|
12
13
|
"access": "public",
|
|
@@ -1,4 +1,4 @@
|
|
|
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
3
|
import { E_SIGN_FIELD_TYPE_OPTIONS } from '../../constants';
|
|
4
4
|
import { ESignFieldType, FieldTypeEnum, PdfField, RecipientInfo } from '../../interface/types';
|
|
@@ -129,6 +129,16 @@ export const FieldConfigPanel: FC<FieldConfigPanelProps> = ({
|
|
|
129
129
|
/>
|
|
130
130
|
)}
|
|
131
131
|
|
|
132
|
+
<Textarea
|
|
133
|
+
label="Description"
|
|
134
|
+
value={field.description}
|
|
135
|
+
onChange={e =>
|
|
136
|
+
onFieldConfigChange({
|
|
137
|
+
description: e?.target.value ?? '',
|
|
138
|
+
})
|
|
139
|
+
}
|
|
140
|
+
/>
|
|
141
|
+
|
|
132
142
|
<Button className="full-width" onClick={onDeleteField}>
|
|
133
143
|
Delete Field
|
|
134
144
|
</Button>
|
|
@@ -34,7 +34,7 @@ export const DataModelFieldTypeList: FC<DataModelFieldTypeListProps> = ({
|
|
|
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}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { Flex, Icon, SearchField, Text } from '@servicetitan/anvil2';
|
|
1
|
+
import { Button, Flex, Icon, SearchField, Text } from '@servicetitan/anvil2';
|
|
2
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';
|
|
3
4
|
import IconPhotoSizeSelectSmall from '@servicetitan/anvil2/assets/icons/material/round/photo_size_select_small.svg';
|
|
4
5
|
import IconEstimate from '@servicetitan/anvil2/assets/icons/st/estimate.svg';
|
|
5
6
|
|
|
6
7
|
import { FC, useState } from 'react';
|
|
8
|
+
import { useToggle } from '../../hooks';
|
|
7
9
|
import { DataModelFieldGroup, FieldTypeEnum, FieldTypeOption } from '../../interface/types';
|
|
8
10
|
import { DataModelFieldTypeList } from './data-model-field-type-list';
|
|
9
11
|
import { ESignFieldTypeList } from './e-sign-field-type-list';
|
|
@@ -32,6 +34,12 @@ export const FieldSidebar: FC<FieldSidebarProps> = ({
|
|
|
32
34
|
}) => {
|
|
33
35
|
const [activeFieldType, setActiveFieldType] = useState<FieldTypeEnum>(FieldTypeEnum.dataModel);
|
|
34
36
|
const [searchText, setSearchText] = useState('');
|
|
37
|
+
const { isOpen, open, toggle } = useToggle(true);
|
|
38
|
+
|
|
39
|
+
const handleActiveFieldTypeChange = (activeFieldType: FieldTypeEnum) => {
|
|
40
|
+
setActiveFieldType(activeFieldType);
|
|
41
|
+
open();
|
|
42
|
+
};
|
|
35
43
|
|
|
36
44
|
return (
|
|
37
45
|
<Flex className="dte-field-sidebar-container skeleton-item">
|
|
@@ -42,10 +50,14 @@ export const FieldSidebar: FC<FieldSidebarProps> = ({
|
|
|
42
50
|
alignItems="center"
|
|
43
51
|
justifyContent="center"
|
|
44
52
|
direction="column"
|
|
45
|
-
className=
|
|
46
|
-
onClick={() =>
|
|
53
|
+
className={`dte-field-sidebar-menu-item cursor-pointer ${key === activeFieldType ? '--active' : ''}`}
|
|
54
|
+
onClick={() => handleActiveFieldTypeChange(key)}
|
|
47
55
|
>
|
|
48
|
-
<Icon
|
|
56
|
+
<Icon
|
|
57
|
+
svg={svgIcon}
|
|
58
|
+
size="large"
|
|
59
|
+
className="dte-field-sidebar-menu-item-icon"
|
|
60
|
+
/>
|
|
49
61
|
<Text
|
|
50
62
|
variant="body"
|
|
51
63
|
size="small"
|
|
@@ -56,38 +68,52 @@ export const FieldSidebar: FC<FieldSidebarProps> = ({
|
|
|
56
68
|
</Flex>
|
|
57
69
|
))}
|
|
58
70
|
</Flex>
|
|
59
|
-
<Flex className="dte-field-sidebar-content skeleton-item" shrink={0}>
|
|
60
|
-
<Text variant="headline" el="h1" size="medium">
|
|
61
|
-
Merge Tags
|
|
62
|
-
</Text>
|
|
63
71
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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>
|
|
90
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>
|
|
91
117
|
</Flex>
|
|
92
118
|
);
|
|
93
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>
|
|
@@ -55,7 +55,7 @@ export const PdfCanvas: FC<PdfCanvasProps> = ({
|
|
|
55
55
|
className="dte-pdf-canvas-container"
|
|
56
56
|
onClick={onDeselectField}
|
|
57
57
|
>
|
|
58
|
-
<div ref={pdfWrapperRef} className="dte-pdf-wrapper">
|
|
58
|
+
<div ref={pdfWrapperRef} className="dte-pdf-wrapper" style={{ width: BASE_PAGE_WIDTH }}>
|
|
59
59
|
<PdfDocumentRenderer
|
|
60
60
|
pdfUrl={pdfUrl}
|
|
61
61
|
onDrop={onDrop}
|