@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.
Files changed (77) hide show
  1. package/dist/components/field-config-panel/field-config-panel.d.ts.map +1 -1
  2. package/dist/components/field-config-panel/field-config-panel.js +7 -2
  3. package/dist/components/field-config-panel/field-config-panel.js.map +1 -1
  4. package/dist/components/field-sidebar/data-model-field-type-list.js +1 -1
  5. package/dist/components/field-sidebar/data-model-field-type-list.js.map +1 -1
  6. package/dist/components/field-sidebar/field-sidebar.d.ts.map +1 -1
  7. package/dist/components/field-sidebar/field-sidebar.js +9 -2
  8. package/dist/components/field-sidebar/field-sidebar.js.map +1 -1
  9. package/dist/components/field-sidebar/field-type.js +1 -1
  10. package/dist/components/field-sidebar/field-type.js.map +1 -1
  11. package/dist/components/pdf-canvas/pdf-canvas.js +1 -1
  12. package/dist/components/pdf-canvas/pdf-canvas.js.map +1 -1
  13. package/dist/components/pdf-editor/pdf-editor.d.ts.map +1 -1
  14. package/dist/components/pdf-editor/pdf-editor.js +16 -106
  15. package/dist/components/pdf-editor/pdf-editor.js.map +1 -1
  16. package/dist/components/pdf-fields-overlay/pdf-overlay-field-fillable.d.ts.map +1 -1
  17. package/dist/components/pdf-fields-overlay/pdf-overlay-field-fillable.js +2 -0
  18. package/dist/components/pdf-fields-overlay/pdf-overlay-field-fillable.js.map +1 -1
  19. package/dist/components/pdf-fields-overlay/pdf-overlay-field.d.ts.map +1 -1
  20. package/dist/components/pdf-fields-overlay/pdf-overlay-field.js +1 -1
  21. package/dist/components/pdf-fields-overlay/pdf-overlay-field.js.map +1 -1
  22. package/dist/components/pdf-view/pdf-view-e-sign.d.ts +1 -2
  23. package/dist/components/pdf-view/pdf-view-e-sign.d.ts.map +1 -1
  24. package/dist/components/pdf-view/pdf-view-e-sign.js +2 -4
  25. package/dist/components/pdf-view/pdf-view-e-sign.js.map +1 -1
  26. package/dist/components/pdf-view/pdf-view-fillable.d.ts.map +1 -1
  27. package/dist/components/pdf-view/pdf-view-fillable.js +9 -0
  28. package/dist/components/pdf-view/pdf-view-fillable.js.map +1 -1
  29. package/dist/components/pdf-view/pdf-view.js +1 -1
  30. package/dist/components/pdf-view/pdf-view.js.map +1 -1
  31. package/dist/constants/field.constants.d.ts.map +1 -1
  32. package/dist/constants/field.constants.js +1 -0
  33. package/dist/constants/field.constants.js.map +1 -1
  34. package/dist/hooks/index.d.ts +3 -0
  35. package/dist/hooks/index.d.ts.map +1 -1
  36. package/dist/hooks/index.js +3 -0
  37. package/dist/hooks/index.js.map +1 -1
  38. package/dist/hooks/usePdfFieldDnD.d.ts +17 -0
  39. package/dist/hooks/usePdfFieldDnD.d.ts.map +1 -0
  40. package/dist/hooks/usePdfFieldDnD.js +78 -0
  41. package/dist/hooks/usePdfFieldDnD.js.map +1 -0
  42. package/dist/hooks/usePdfFieldSelection.d.ts +13 -0
  43. package/dist/hooks/usePdfFieldSelection.d.ts.map +1 -0
  44. package/dist/hooks/usePdfFieldSelection.js +40 -0
  45. package/dist/hooks/usePdfFieldSelection.js.map +1 -0
  46. package/dist/hooks/useToggle.d.ts +8 -0
  47. package/dist/hooks/useToggle.d.ts.map +1 -0
  48. package/dist/hooks/useToggle.js +15 -0
  49. package/dist/hooks/useToggle.js.map +1 -0
  50. package/dist/interface/types.d.ts +2 -1
  51. package/dist/interface/types.d.ts.map +1 -1
  52. package/package.json +3 -2
  53. package/src/components/field-config-panel/field-config-panel.tsx +11 -1
  54. package/src/components/field-sidebar/data-model-field-type-list.tsx +1 -1
  55. package/src/components/field-sidebar/field-sidebar.tsx +60 -34
  56. package/src/components/field-sidebar/field-type.tsx +1 -1
  57. package/src/components/pdf-canvas/pdf-canvas.tsx +1 -1
  58. package/src/components/pdf-editor/pdf-editor.tsx +54 -171
  59. package/src/components/pdf-fields-overlay/pdf-overlay-field-fillable.tsx +10 -0
  60. package/src/components/pdf-fields-overlay/pdf-overlay-field.tsx +1 -0
  61. package/src/components/pdf-view/pdf-view-e-sign.tsx +6 -7
  62. package/src/components/pdf-view/pdf-view-fillable.tsx +23 -0
  63. package/src/components/pdf-view/pdf-view.tsx +1 -1
  64. package/src/constants/field.constants.ts +1 -0
  65. package/src/hooks/index.ts +3 -0
  66. package/src/hooks/usePdfFieldDnD.ts +118 -0
  67. package/src/hooks/usePdfFieldSelection.ts +55 -0
  68. package/src/hooks/useToggle.ts +26 -0
  69. package/src/interface/types.ts +2 -1
  70. package/src/styles/field-config-panel-overlay.css +3 -1
  71. package/src/styles/field-sidebar.css +36 -3
  72. package/src/styles/field-type-list.css +1 -1
  73. package/src/styles/field-type.css +7 -0
  74. package/src/styles/pdf-canvas.css +2 -0
  75. package/src/styles/pdf-editor.css +1 -0
  76. package/src/styles/variables.css +11 -1
  77. 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":"AAAA,OAAO,EAAwB,QAAQ,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAEH,aAAa,GAIhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACH,wBAAwB,EACxB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,GACnB,MAAM,UAAU,CAAC;AAUlB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAC3B,MAAM,EACN,cAAc,EACd,aAAa,EACb,aAAa,EACb,UAAU,GACQ,EAAE,EAAE;IACtB,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAyB,IAAI,CAAC,CAAC;IAE3F,MAAM,eAAe,GAAG,CAAC,WAA4B,EAAE,EAAE;QACrD,qBAAqB,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,GAAG,EAAE;QACvB,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,CAA4B,EAAE,EAAE;QACpD,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACtB,CAAC,CAAC,YAAY,CAAC,UAAU,GAAG,MAAM,CAAC;YACnC,OAAO;QACX,CAAC;QAED,IAAI,gBAAgB,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC;YACrC,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,CAAC,CAAC,eAAe,EAAE,CAAC;YACpB,CAAC,CAAC,YAAY,CAAC,UAAU,GAAG,MAAM,CAAC;QACvC,CAAC;aAAM,CAAC;YACJ,CAAC,CAAC,YAAY,CAAC,UAAU,GAAG,MAAM,CAAC;QACvC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,CAA4B,EAAE,UAAkB,EAAE,EAAE;;QACpE,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,eAAe,EAAE,CAAC;QAEpB,IAAI,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,gBAAgB,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACnF,OAAO;QACX,CAAC;QAED,MAAM,WAAW,GAAG,wBAAwB,CAAC,CAAC,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QAC3E,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAC5B,OAAO;QACX,CAAC;QAED,MAAM,QAAQ,GAAa;YACvB,EAAE,EAAE,MAAM,EAAE;YACZ,IAAI,EAAE,kBAAkB,CAAC,IAAI;YAC7B,OAAO,EAAE,kBAAkB,CAAC,OAAO;YACnC,CAAC,EAAE,WAAW,CAAC,CAAC;YAChB,CAAC,EAAE,WAAW,CAAC,CAAC;YAChB,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,kBAAkB,CAAC,KAAK;YAC/B,KAAK,EAAE,eAAe,CAAC,YAAY;YACnC,MAAM,EAAE,eAAe,CAAC,aAAa;YACrC,IAAI,EAAE,kBAAkB,CAAC,IAAI;SAChC,CAAC;QAEF,MAAM,aAAa,GAAG,MAAA,MAAA,UAAU,CAAC,CAAC,CAAC,0CAAE,IAAI,mCAAI,EAAE,CAAC;QAEhD,IAAI,QAAQ,CAAC,IAAI,KAAK,aAAa,CAAC,KAAK,EAAE,CAAC;YACxC,QAAQ,CAAC,SAAS,GAAG,aAAa,CAAC;YACnC,QAAQ,CAAC,IAAI,GAAG,iBAAiB,CAC7B,aAAa,EACb,kBAAkB,CAAC,OAAyB,CAC/C,CAAC;QACN,CAAC;QAED,IAAI,QAAQ,CAAC,IAAI,KAAK,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC3C,MAAM,WAAW,GAAG,4BAA4B,CAAC,QAAQ,CAAC,OAAQ,CAAC,CAAC;YACpE,QAAQ,CAAC,SAAS,GAAG,aAAa,CAAC;YACnC,QAAQ,CAAC,QAAQ,GAAG,KAAK,CAAC;YAC1B,QAAQ,CAAC,IAAI,GAAG,oBAAoB,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;YAE9D,IAAI,WAAW,EAAE,CAAC;gBACd,QAAQ,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;gBACnC,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;YACzC,CAAC;QACL,CAAC;QAED,cAAc,CAAC,CAAC,GAAG,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;QACtC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC3B,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,OAAO;QACH,eAAe;QACf,aAAa;QACb,cAAc;QACd,UAAU;KACb,CAAC;AACN,CAAC,CAAC"}
@@ -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,8 @@
1
+ export interface UseToggleReturn {
2
+ isOpen: boolean;
3
+ toggle: () => void;
4
+ open: () => void;
5
+ close: () => void;
6
+ }
7
+ export declare const useToggle: (initialValue?: boolean) => UseToggleReturn;
8
+ //# sourceMappingURL=useToggle.d.ts.map
@@ -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;AAEvE,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;CACtB;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"}
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@servicetitan/dte-pdf-editor",
3
- "version": "1.5.0",
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 m-t-1">
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="dte-field-sidebar-menu-item cursor-pointer"
46
- onClick={() => setActiveFieldType(key)}
53
+ className={`dte-field-sidebar-menu-item cursor-pointer ${key === activeFieldType ? '--active' : ''}`}
54
+ onClick={() => handleActiveFieldTypeChange(key)}
47
55
  >
48
- <Icon svg={svgIcon} size="large" />
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
- {activeFieldType !== FieldTypeEnum.eSign && (
65
- <SearchField
66
- placeholder="Search"
67
- size="small"
68
- className="dte-field-sidebar-search"
69
- onChange={e => setSearchText(e.target.value ?? '')}
70
- />
71
- )}
72
- {activeFieldType === FieldTypeEnum.fillable && (
73
- <FillableFieldTypeList
74
- searchText={searchText}
75
- onDragStart={onDragStart}
76
- onDragEnd={onDragEnd}
77
- />
78
- )}
79
- {activeFieldType === FieldTypeEnum.eSign && (
80
- <ESignFieldTypeList onDragEnd={onDragEnd} onDragStart={onDragStart} />
81
- )}
82
- {activeFieldType === FieldTypeEnum.dataModel && (
83
- <DataModelFieldTypeList
84
- searchText={searchText}
85
- dataModelGroups={dataModelGroups}
86
- onDragStart={onDragStart}
87
- onDragEnd={onDragEnd}
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 border m-t-1"
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}