@servicetitan/dte-pdf-editor 1.92.2 → 1.92.3

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 (120) hide show
  1. package/dist/components/field-sidebar/calculated-field-type-list.d.ts.map +1 -1
  2. package/dist/components/field-sidebar/calculated-field-type-list.js +1 -1
  3. package/dist/components/field-sidebar/calculated-field-type-list.js.map +1 -1
  4. package/dist/components/field-sidebar/e-sign-field-type-list.d.ts.map +1 -1
  5. package/dist/components/field-sidebar/e-sign-field-type-list.js +1 -1
  6. package/dist/components/field-sidebar/e-sign-field-type-list.js.map +1 -1
  7. package/dist/components/field-sidebar/field-type.d.ts +2 -0
  8. package/dist/components/field-sidebar/field-type.d.ts.map +1 -1
  9. package/dist/components/field-sidebar/field-type.js +2 -2
  10. package/dist/components/field-sidebar/field-type.js.map +1 -1
  11. package/dist/components/field-sidebar/fillable-field-type-list.d.ts.map +1 -1
  12. package/dist/components/field-sidebar/fillable-field-type-list.js +1 -1
  13. package/dist/components/field-sidebar/fillable-field-type-list.js.map +1 -1
  14. package/dist/components/field-sidebar/generic-field-type-list.d.ts.map +1 -1
  15. package/dist/components/field-sidebar/generic-field-type-list.js +1 -1
  16. package/dist/components/field-sidebar/generic-field-type-list.js.map +1 -1
  17. package/dist/components/pdf-canvas/canvas-controls.d.ts +9 -15
  18. package/dist/components/pdf-canvas/canvas-controls.d.ts.map +1 -1
  19. package/dist/components/pdf-canvas/canvas-controls.js +4 -14
  20. package/dist/components/pdf-canvas/canvas-controls.js.map +1 -1
  21. package/dist/components/pdf-canvas/pdf-canvas.d.ts +6 -2
  22. package/dist/components/pdf-canvas/pdf-canvas.d.ts.map +1 -1
  23. package/dist/components/pdf-canvas/pdf-canvas.js +11 -5
  24. package/dist/components/pdf-canvas/pdf-canvas.js.map +1 -1
  25. package/dist/components/pdf-editor/pdf-editor.d.ts +2 -0
  26. package/dist/components/pdf-editor/pdf-editor.d.ts.map +1 -1
  27. package/dist/components/pdf-editor/pdf-editor.js +2 -2
  28. package/dist/components/pdf-editor/pdf-editor.js.map +1 -1
  29. package/dist/components/pdf-fields-overlay/pdf-fields-overlay.js +4 -1
  30. package/dist/components/pdf-fields-overlay/pdf-fields-overlay.js.map +1 -1
  31. package/dist/components/pdf-fields-overlay/pdf-overlay-field-e-sign.d.ts.map +1 -1
  32. package/dist/components/pdf-fields-overlay/pdf-overlay-field-e-sign.js +3 -2
  33. package/dist/components/pdf-fields-overlay/pdf-overlay-field-e-sign.js.map +1 -1
  34. package/dist/components/pdf-fields-overlay/pdf-overlay-field.d.ts.map +1 -1
  35. package/dist/components/pdf-fields-overlay/pdf-overlay-field.js +4 -2
  36. package/dist/components/pdf-fields-overlay/pdf-overlay-field.js.map +1 -1
  37. package/dist/components/pdf-view/pdf-view-e-sign.d.ts.map +1 -1
  38. package/dist/components/pdf-view/pdf-view-e-sign.js +3 -2
  39. package/dist/components/pdf-view/pdf-view-e-sign.js.map +1 -1
  40. package/dist/components/pdf-view/pdf-view-field-container.d.ts.map +1 -1
  41. package/dist/components/pdf-view/pdf-view-field-container.js +10 -3
  42. package/dist/components/pdf-view/pdf-view-field-container.js.map +1 -1
  43. package/dist/components/pdf-view/pdf-view-fillable.js +1 -1
  44. package/dist/components/pdf-view/pdf-view-fillable.js.map +1 -1
  45. package/dist/components/pdf-view/pdf-view.d.ts +5 -0
  46. package/dist/components/pdf-view/pdf-view.d.ts.map +1 -1
  47. package/dist/components/pdf-view/pdf-view.js +51 -24
  48. package/dist/components/pdf-view/pdf-view.js.map +1 -1
  49. package/dist/constants/field.constants.d.ts.map +1 -1
  50. package/dist/constants/field.constants.js +27 -6
  51. package/dist/constants/field.constants.js.map +1 -1
  52. package/dist/hooks/index.d.ts +1 -0
  53. package/dist/hooks/index.d.ts.map +1 -1
  54. package/dist/hooks/index.js +1 -0
  55. package/dist/hooks/index.js.map +1 -1
  56. package/dist/hooks/usePinchZoom.d.ts +14 -0
  57. package/dist/hooks/usePinchZoom.d.ts.map +1 -0
  58. package/dist/hooks/usePinchZoom.js +58 -0
  59. package/dist/hooks/usePinchZoom.js.map +1 -0
  60. package/dist/hooks/useZoom.d.ts +2 -0
  61. package/dist/hooks/useZoom.d.ts.map +1 -1
  62. package/dist/hooks/useZoom.js +18 -6
  63. package/dist/hooks/useZoom.js.map +1 -1
  64. package/dist/interface/types.d.ts +2 -0
  65. package/dist/interface/types.d.ts.map +1 -1
  66. package/dist/interface/types.js.map +1 -1
  67. package/dist/styles/pdf-canvas.css +91 -15
  68. package/dist/styles/pdf-editor.css +1 -0
  69. package/dist/styles/pdf-field-overlay.css +109 -78
  70. package/dist/styles/variables.css +3 -0
  71. package/dist/utils/field/get-field-type-option.utils.d.ts +3 -0
  72. package/dist/utils/field/get-field-type-option.utils.d.ts.map +1 -0
  73. package/dist/utils/field/get-field-type-option.utils.js +10 -0
  74. package/dist/utils/field/get-field-type-option.utils.js.map +1 -0
  75. package/dist/utils/field/get-navigable-fields.utils.js +1 -1
  76. package/dist/utils/field/get-navigable-fields.utils.js.map +1 -1
  77. package/dist/utils/field/index.d.ts +1 -0
  78. package/dist/utils/field/index.d.ts.map +1 -1
  79. package/dist/utils/field/index.js +1 -0
  80. package/dist/utils/field/index.js.map +1 -1
  81. package/dist/utils/pdf/index.d.ts +1 -0
  82. package/dist/utils/pdf/index.d.ts.map +1 -1
  83. package/dist/utils/pdf/index.js +1 -0
  84. package/dist/utils/pdf/index.js.map +1 -1
  85. package/dist/utils/pdf/pinch-zoom.utils.d.ts +6 -0
  86. package/dist/utils/pdf/pinch-zoom.utils.d.ts.map +1 -0
  87. package/dist/utils/pdf/pinch-zoom.utils.js +18 -0
  88. package/dist/utils/pdf/pinch-zoom.utils.js.map +1 -0
  89. package/package.json +1 -1
  90. package/src/components/field-sidebar/calculated-field-type-list.tsx +1 -0
  91. package/src/components/field-sidebar/e-sign-field-type-list.tsx +1 -0
  92. package/src/components/field-sidebar/field-type.tsx +13 -3
  93. package/src/components/field-sidebar/fillable-field-type-list.tsx +1 -0
  94. package/src/components/field-sidebar/generic-field-type-list.tsx +1 -0
  95. package/src/components/pdf-canvas/canvas-controls.tsx +30 -128
  96. package/src/components/pdf-canvas/pdf-canvas.tsx +18 -8
  97. package/src/components/pdf-editor/pdf-editor.tsx +4 -1
  98. package/src/components/pdf-fields-overlay/pdf-fields-overlay.tsx +1 -1
  99. package/src/components/pdf-fields-overlay/pdf-overlay-field-e-sign.tsx +8 -6
  100. package/src/components/pdf-fields-overlay/pdf-overlay-field.tsx +17 -1
  101. package/src/components/pdf-view/pdf-view-e-sign.tsx +8 -6
  102. package/src/components/pdf-view/pdf-view-field-container.tsx +21 -1
  103. package/src/components/pdf-view/pdf-view-fillable.tsx +1 -1
  104. package/src/components/pdf-view/pdf-view.tsx +156 -95
  105. package/src/constants/field.constants.ts +28 -6
  106. package/src/hooks/index.ts +1 -0
  107. package/src/hooks/usePinchZoom.ts +86 -0
  108. package/src/hooks/useZoom.ts +20 -8
  109. package/src/interface/types.ts +3 -0
  110. package/src/styles/pdf-canvas.css +91 -15
  111. package/src/styles/pdf-editor.css +1 -0
  112. package/src/styles/pdf-field-overlay.css +109 -78
  113. package/src/styles/variables.css +3 -0
  114. package/src/utils/field/__tests__/get-field-type-option.utils.test.ts +53 -0
  115. package/src/utils/field/get-field-type-option.utils.ts +16 -0
  116. package/src/utils/field/get-navigable-fields.utils.ts +1 -1
  117. package/src/utils/field/index.ts +1 -0
  118. package/src/utils/pdf/__tests__/pinch-zoom.utils.test.ts +58 -0
  119. package/src/utils/pdf/index.ts +1 -0
  120. package/src/utils/pdf/pinch-zoom.utils.ts +30 -0
@@ -1,23 +1,32 @@
1
1
  import { Button, Divider, Flex, Icon, Text } from '@servicetitan/anvil2';
2
- import IconNavigateDown from '@servicetitan/anvil2/assets/icons/material/round/arrow_downward.svg';
3
- import IconNavigateUp from '@servicetitan/anvil2/assets/icons/material/round/arrow_upward.svg';
4
- import IconNavigateBefore from '@servicetitan/anvil2/assets/icons/material/round/navigate_before.svg';
5
- import IconNavigateNext from '@servicetitan/anvil2/assets/icons/material/round/navigate_next.svg';
6
2
  import IconZoomIn from '@servicetitan/anvil2/assets/icons/material/round/zoom_in.svg';
7
3
  import IconZoomOut from '@servicetitan/anvil2/assets/icons/material/round/zoom_out.svg';
8
4
  import { FC } from 'react';
9
5
  import { ZOOM_MAX, ZOOM_MIN } from '../../constants';
10
6
 
11
- interface ZoomControlsProps {
7
+ export interface ZoomControlsProps {
12
8
  zoom: number;
9
+ vertical?: boolean;
10
+ position?: 'right-center' | 'right-bottom';
13
11
  onZoomIn(): void;
14
12
  onZoomOut(): void;
15
13
  onResetZoom(): void;
16
14
  }
17
15
 
18
- const ZoomControls: FC<ZoomControlsProps> = ({ onResetZoom, onZoomIn, onZoomOut, zoom }) => {
16
+ export const ZoomControls: FC<ZoomControlsProps> = ({
17
+ onResetZoom,
18
+ onZoomIn,
19
+ onZoomOut,
20
+ position = 'right-center',
21
+ vertical,
22
+ zoom,
23
+ }) => {
19
24
  return (
20
- <Flex alignItems="center" gap={1} className="dte-pdf-zoom-controls">
25
+ <Flex
26
+ alignItems="center"
27
+ gap={1}
28
+ className={`dte-pdf-zoom-controls ${vertical ? '--vertical' : '--horizontal'} --${position}`}
29
+ >
21
30
  <Button
22
31
  size="xsmall"
23
32
  appearance="ghost"
@@ -28,7 +37,7 @@ const ZoomControls: FC<ZoomControlsProps> = ({ onResetZoom, onZoomIn, onZoomOut,
28
37
  >
29
38
  <Icon svg={IconZoomOut} size="medium" />
30
39
  </Button>
31
-
40
+ <Divider vertical={!vertical} style={vertical ? { width: 20 } : { height: 20 }} />
32
41
  <Text
33
42
  variant="body"
34
43
  size="small"
@@ -38,7 +47,7 @@ const ZoomControls: FC<ZoomControlsProps> = ({ onResetZoom, onZoomIn, onZoomOut,
38
47
  >
39
48
  {Math.round(zoom * 100)}%
40
49
  </Text>
41
-
50
+ <Divider vertical={!vertical} style={vertical ? { width: 20 } : { height: 20 }} />
42
51
  <Button
43
52
  size="xsmall"
44
53
  appearance="ghost"
@@ -54,130 +63,23 @@ const ZoomControls: FC<ZoomControlsProps> = ({ onResetZoom, onZoomIn, onZoomOut,
54
63
  };
55
64
 
56
65
  interface FieldNavigationControlsProps {
57
- disabledNext: boolean;
58
- disabledOnFirstField: boolean;
59
- disabledOnLastField: boolean;
60
- disabledPrev: boolean;
66
+ isStarted: boolean;
67
+ disabled?: boolean;
61
68
  onNextField(): void;
62
- onPrevField(): void;
63
- onFirstField(): void;
64
- onLastField(): void;
65
69
  }
66
70
 
67
- const FieldNavigationControls: FC<FieldNavigationControlsProps> = ({
68
- disabledNext,
69
- disabledOnFirstField,
70
- disabledOnLastField,
71
- disabledPrev,
72
- onFirstField,
73
- onLastField,
71
+ export const FieldNavigationControls: FC<FieldNavigationControlsProps> = ({
72
+ disabled,
73
+ isStarted,
74
74
  onNextField,
75
- onPrevField,
76
75
  }) => {
77
76
  return (
78
- <Flex alignItems="center" gap="2" className="dte-pdf-field-navigation-controls">
79
- <Button
80
- size="xsmall"
81
- appearance="ghost"
82
- onClick={onPrevField}
83
- disabled={disabledPrev}
84
- aria-label="Go to previous field"
85
- title="Go to previous field"
86
- >
87
- <Icon svg={IconNavigateBefore} size="medium" />
88
- </Button>
89
- <Button
90
- size="xsmall"
91
- appearance="ghost"
92
- onClick={onNextField}
93
- disabled={disabledNext}
94
- aria-label="Go to next field"
95
- title="Go to next field"
96
- >
97
- <Icon svg={IconNavigateNext} size="medium" />
98
- </Button>
99
- <Divider vertical style={{ height: '100%' }} />
100
- <Button
101
- size="xsmall"
102
- appearance="ghost"
103
- onClick={onFirstField}
104
- disabled={disabledOnFirstField}
105
- aria-label="Go to first field"
106
- title="Go to first field"
107
- >
108
- <Icon svg={IconNavigateUp} size="medium" />
109
- </Button>
110
- <Button
111
- size="xsmall"
112
- appearance="ghost"
113
- onClick={onLastField}
114
- disabled={disabledOnLastField}
115
- aria-label="Go to last field"
116
- title="Go to last field"
117
- >
118
- <Icon svg={IconNavigateDown} size="medium" />
119
- </Button>
120
- </Flex>
121
- );
122
- };
123
-
124
- export interface CanvasControlsProps extends ZoomControlsProps {
125
- /** Show the zoom in/out/reset controls. */
126
- zoomable?: boolean;
127
- /** Show the previous/next fillable-field navigation controls. */
128
- enableInputNavigation?: boolean;
129
- disabledNext?: boolean;
130
- disabledPrev?: boolean;
131
- disabledOnFirstField?: boolean;
132
- disabledOnLastField?: boolean;
133
- onNextField?(): void;
134
- onPrevField?(): void;
135
- onFirstField?(): void;
136
- onLastField?(): void;
137
- }
138
-
139
- export const CanvasControls: FC<CanvasControlsProps> = ({
140
- disabledNext = false,
141
- disabledOnFirstField = false,
142
- disabledOnLastField = false,
143
- disabledPrev = false,
144
- enableInputNavigation = false,
145
- onFirstField = () => {},
146
- onLastField = () => {},
147
- onNextField = () => {},
148
- onPrevField = () => {},
149
- onResetZoom,
150
- onZoomIn,
151
- onZoomOut,
152
- zoom,
153
- zoomable = false,
154
- }) => {
155
- if (!zoomable && !enableInputNavigation) {
156
- return null;
157
- }
158
-
159
- return (
160
- <Flex justifyContent="center" gap={2} className="dte-pdf-canvas-controls">
161
- {zoomable && (
162
- <ZoomControls
163
- zoom={zoom}
164
- onZoomIn={onZoomIn}
165
- onZoomOut={onZoomOut}
166
- onResetZoom={onResetZoom}
167
- />
168
- )}
169
- {enableInputNavigation && (
170
- <FieldNavigationControls
171
- disabledOnFirstField={disabledOnFirstField}
172
- disabledOnLastField={disabledOnLastField}
173
- onFirstField={onFirstField}
174
- onLastField={onLastField}
175
- disabledNext={disabledNext}
176
- disabledPrev={disabledPrev}
177
- onNextField={onNextField}
178
- onPrevField={onPrevField}
179
- />
180
- )}
181
- </Flex>
77
+ <div
78
+ className={`dte-pdf-field-next-controls-button ${disabled && '--disabled'} ${isStarted && '--started'}`}
79
+ role="button"
80
+ onClick={onNextField}
81
+ >
82
+ <span>{isStarted ? 'Next' : 'Start'}</span>
83
+ </div>
182
84
  );
183
85
  };
@@ -10,13 +10,13 @@ import {
10
10
  useState,
11
11
  } from 'react';
12
12
  import { BASE_PAGE_WIDTH } from '../../constants';
13
- import { useZoom } from '../../hooks';
13
+ import { usePinchZoom, useZoom } from '../../hooks';
14
14
  import { type PdfField } from '../../interface/types';
15
15
  import { PdfFieldsOverlay } from '../pdf-fields-overlay/pdf-fields-overlay';
16
- import { CanvasControls } from './canvas-controls';
16
+ import { ZoomControls, ZoomControlsProps } from './canvas-controls';
17
17
  import { PdfDocumentRenderer } from './pdf-document-renderer';
18
18
 
19
- interface PdfCanvasProps {
19
+ export interface PdfCanvasProps {
20
20
  pdfUrl: string;
21
21
  zoomable: boolean;
22
22
  errorPlaceholder?: ReactNode;
@@ -29,6 +29,10 @@ interface PdfCanvasProps {
29
29
  pdfWrapperRef: RefObject<HTMLDivElement>;
30
30
  recipientsColors: Record<string, string>;
31
31
  fieldWrapperClassNames?: string;
32
+ zoomProps?: {
33
+ vertical: ZoomControlsProps['vertical'];
34
+ position: ZoomControlsProps['position'];
35
+ };
32
36
  onLoadSuccess?(pageNums: number): void;
33
37
  handleAddNewField(field: PdfField): void;
34
38
  onDragOver(e: DragEvent<HTMLDivElement>): void;
@@ -61,10 +65,17 @@ export const PdfCanvas: FC<PdfCanvasProps> = ({
61
65
  pdfWrapperRef,
62
66
  recipientsColors,
63
67
  selectedField,
68
+ zoomProps,
64
69
  zoomable,
65
70
  }) => {
66
71
  const [isPdfLoaded, setIsPdfLoaded] = useState<boolean>(false);
67
- const { resetZoom, zoom, zoomIn, zoomOut } = useZoom();
72
+ const { resetZoom, setZoomValue, zoom, zoomByFactor, zoomIn, zoomOut } = useZoom();
73
+ usePinchZoom(pdfContainerRef, {
74
+ enabled: zoomable,
75
+ setZoomValue,
76
+ zoom,
77
+ zoomByFactor,
78
+ });
68
79
 
69
80
  const onDocumentLoadSuccess = (pageNum: number) => {
70
81
  setIsPdfLoaded(true);
@@ -77,10 +88,9 @@ export const PdfCanvas: FC<PdfCanvasProps> = ({
77
88
 
78
89
  return (
79
90
  <Fragment>
80
- {isPdfLoaded && (
81
- <CanvasControls
82
- enableInputNavigation={false}
83
- zoomable={zoomable}
91
+ {isPdfLoaded && zoomable && (
92
+ <ZoomControls
93
+ {...zoomProps}
84
94
  zoom={zoom}
85
95
  onZoomIn={zoomIn}
86
96
  onZoomOut={zoomOut}
@@ -12,7 +12,7 @@ import {
12
12
  import { extractGroupedFieldsFromDataModel, mapColorsToRecipients } from '../../utils';
13
13
  import { FieldConfigPanelOverlay } from '../field-config-panel/field-config-panel-overlay';
14
14
  import { FieldSidebar } from '../field-sidebar/field-sidebar';
15
- import { PdfCanvas } from '../pdf-canvas/pdf-canvas';
15
+ import { PdfCanvas, PdfCanvasProps } from '../pdf-canvas/pdf-canvas';
16
16
 
17
17
  import '../../styles/index.css';
18
18
 
@@ -29,6 +29,7 @@ export interface PdfEditorProps {
29
29
  hideFields?: FieldTypeEnum[];
30
30
  hideConditionalLogic?: boolean;
31
31
  forms?: FormInfo[];
32
+ zoomProps?: PdfCanvasProps['zoomProps'];
32
33
  onFormSelect?: (
33
34
  formIds: number[],
34
35
  sendFormFields: (formFieldsByFormId: FormFieldsByFormIdI) => void,
@@ -52,6 +53,7 @@ export const PdfEditor: FC<PdfEditorProps> = ({
52
53
  onLoadSuccess,
53
54
  pdfUrl,
54
55
  recipients = [],
56
+ zoomProps,
55
57
  zoomable = true,
56
58
  }) => {
57
59
  const pdfContainerRef = useRef<HTMLDivElement>(null);
@@ -122,6 +124,7 @@ export const PdfEditor: FC<PdfEditorProps> = ({
122
124
  className="dte-pdf-editor-content-container skeleton-item"
123
125
  >
124
126
  <PdfCanvas
127
+ zoomProps={zoomProps}
125
128
  zoomable={zoomable}
126
129
  pdfUrl={pdfUrl}
127
130
  fields={fields}
@@ -49,7 +49,7 @@ export const PdfFieldsOverlay: FC<PdfFieldsOverlayProps> = ({
49
49
  field={field}
50
50
  fieldWrapperClassNames={fieldWrapperClassNames}
51
51
  onFieldConfigChange={onFieldConfigChange}
52
- error={errors[field.id]}
52
+ error={errors[field.id] ?? errors[field.path ?? '']}
53
53
  handleAddNewField={handleAddNewField}
54
54
  onFieldMove={onFieldMove}
55
55
  onFieldClick={onFieldClick}
@@ -1,3 +1,4 @@
1
+ import { Flex } from '@servicetitan/anvil2';
1
2
  import { FC } from 'react';
2
3
  import { type PdfField } from '../../interface/types';
3
4
 
@@ -7,11 +8,12 @@ interface PdfOverlayFieldESignProps {
7
8
 
8
9
  export const PdfOverlayFieldESign: FC<PdfOverlayFieldESignProps> = ({ field }) => {
9
10
  return (
10
- <span>
11
- {field.label} {field.required ? '*' : ''}
12
- <div className="dte-pdf-field-value" style={{ fontSize: '8px' }}>
13
- {field.path}
14
- </div>
15
- </span>
11
+ <Flex
12
+ alignItems="center"
13
+ className="dte-pdf-field-value"
14
+ style={{ fontSize: '8px', height: '100%' }}
15
+ >
16
+ {field.path} {field.required ? '*' : ''}
17
+ </Flex>
16
18
  );
17
19
  };
@@ -1,8 +1,14 @@
1
+ import { Icon } from '@servicetitan/anvil2';
1
2
  import { FC, MouseEvent, RefObject } from 'react';
2
3
  import { DISABLE_FIELD_RESIZE } from '../../constants';
3
4
  import { useFieldDrag, useFieldResize } from '../../hooks';
4
5
  import { FieldTypeEnum, type PdfField } from '../../interface/types';
5
- import { getFieldBackgroundColor, getFieldBoundsStyle, getPagePosition } from '../../utils';
6
+ import {
7
+ getFieldBackgroundColor,
8
+ getFieldBoundsStyle,
9
+ getFieldTypeOption,
10
+ getPagePosition,
11
+ } from '../../utils';
6
12
  import { PdfOverlayFieldCalculated } from './pdf-overlay-field-calculated';
7
13
  import { PdfOverlayFieldDataModel } from './pdf-overlay-field-data-model';
8
14
  import { PdfOverlayFieldESign } from './pdf-overlay-field-e-sign';
@@ -85,6 +91,8 @@ export const PdfOverlayField: FC<PdfOverlayFieldProps> = ({
85
91
  .filter(Boolean)
86
92
  .join(' ');
87
93
 
94
+ const fieldTypeOption = getFieldTypeOption(field);
95
+
88
96
  return (
89
97
  <div
90
98
  title={field.description}
@@ -96,6 +104,14 @@ export const PdfOverlayField: FC<PdfOverlayFieldProps> = ({
96
104
  className={className}
97
105
  style={style}
98
106
  >
107
+ {fieldTypeOption && (
108
+ <div className="dte-pdf-field-label">
109
+ {fieldTypeOption.icon && (
110
+ <Icon svg={fieldTypeOption.icon} size="small" color="inherit" />
111
+ )}
112
+ {fieldTypeOption.label}
113
+ </div>
114
+ )}
99
115
  {field.type === FieldTypeEnum.calculated && (
100
116
  <PdfOverlayFieldCalculated field={field} pathToLabel={pathToLabel} />
101
117
  )}
@@ -1,3 +1,4 @@
1
+ import { Flex } from '@servicetitan/anvil2';
1
2
  import { FC } from 'react';
2
3
  import { type PdfField } from '../../interface/types';
3
4
 
@@ -7,11 +8,12 @@ interface PdfViewESignProps {
7
8
 
8
9
  export const PdfViewESign: FC<PdfViewESignProps> = ({ field }) => {
9
10
  return (
10
- <span>
11
- {field.label} {field.required ? '*' : ''}
12
- <div className="dte-pdf-field-value" style={{ fontSize: '8px' }}>
13
- {field.path}
14
- </div>
15
- </span>
11
+ <Flex
12
+ alignItems="center"
13
+ className="dte-pdf-field-value"
14
+ style={{ fontSize: '8px', height: '100%' }}
15
+ >
16
+ {field.path} {field.required ? '*' : ''}
17
+ </Flex>
16
18
  );
17
19
  };
@@ -1,9 +1,11 @@
1
+ import { Icon } from '@servicetitan/anvil2';
1
2
  import { FC, Fragment, PropsWithChildren, RefObject } from 'react';
2
3
  import { type DataModelValues, type PdfField } from '../../interface/types';
3
4
  import {
4
5
  evaluateDisplayCondition,
5
6
  getFieldBackgroundColor,
6
7
  getFieldBoundsStyle,
8
+ getFieldTypeOption,
7
9
  getPagePosition,
8
10
  } from '../../utils';
9
11
 
@@ -36,6 +38,8 @@ export const PdfViewFieldContainer: FC<PropsWithChildren<PdfViewFieldContainer>>
36
38
 
37
39
  const pagePos = getPagePosition(field.page, pdfWrapperRef);
38
40
  const bgColor = getFieldBackgroundColor(field.recipient, recipientsColors);
41
+ const fieldTypeOption = getFieldTypeOption(field);
42
+
39
43
  return (
40
44
  <Fragment>
41
45
  <div
@@ -45,13 +49,28 @@ export const PdfViewFieldContainer: FC<PropsWithChildren<PdfViewFieldContainer>>
45
49
  style={getFieldBoundsStyle(field, {
46
50
  pageOffset: pagePos,
47
51
  backgroundColor: bgColor,
48
- borderColor: error ? 'red' : undefined,
52
+ borderColor: error ? 'red' : bgColor.replace('1f', '7d'),
49
53
  zoom,
50
54
  })}
51
55
  onFocus={() => onFocus?.(field.id)}
52
56
  >
53
57
  {children}
54
58
  </div>
59
+ {fieldTypeOption && (
60
+ <div
61
+ className="dte-pdf-field-label"
62
+ style={{
63
+ top: pagePos.top + field.y * zoom - 10,
64
+ left: pagePos.left + field.x * zoom + 3,
65
+ position: 'absolute',
66
+ }}
67
+ >
68
+ {fieldTypeOption.icon && (
69
+ <Icon svg={fieldTypeOption.icon} size="small" color="inherit" />
70
+ )}
71
+ {fieldTypeOption.label}
72
+ </div>
73
+ )}
55
74
  {error && (
56
75
  <span
57
76
  style={{
@@ -59,6 +78,7 @@ export const PdfViewFieldContainer: FC<PropsWithChildren<PdfViewFieldContainer>>
59
78
  top: pagePos.top + (field.y + field.height) * zoom + 8,
60
79
  left: pagePos.left + field.x * zoom,
61
80
  minWidth: '100px',
81
+ fontSize: '10px',
62
82
  position: 'absolute',
63
83
  }}
64
84
  >
@@ -31,7 +31,7 @@ interface FillableTextInputProps {
31
31
  }
32
32
 
33
33
  const fillableTextStyles = {
34
- background: 'inherit',
34
+ background: 'transparent',
35
35
  width: '100%',
36
36
  height: '100%',
37
37
  border: 'none',