@servicetitan/dte-pdf-editor 1.97.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -31,6 +31,8 @@ formulas.
31
31
 
32
32
  ### Recent changes
33
33
 
34
+ - **DTE-4849** (Date Signed Offset Rules) — Save Changes stays disabled after Clear Rules when the field has no saved
35
+ rules. See [RELEASE_NOTES.md](./RELEASE_NOTES.md).
34
36
  - **DTE-4581** (schedule UI shared with Unlayer) — deleting a schedule moves every
35
37
  field bound to it to the default schedule; "Calculated Signing Date" label typo fixed. See
36
38
  [RELEASE_NOTES.md](./RELEASE_NOTES.md).
@@ -1 +1 @@
1
- {"version":3,"file":"e-sign-date-signed-offset-modal.d.ts","sourceRoot":"","sources":["../../../src/components/field-config-panel/e-sign-date-signed-offset-modal.tsx"],"names":[],"mappings":"AAmBA,OAAO,EAAE,EAAE,EAAkC,MAAM,OAAO,CAAC;AAE3D,OAAO,KAAK,EACR,sCAAsC,EACtC,iCAAiC,EACjC,mBAAmB,EACnB,QAAQ,EACR,QAAQ,EACR,YAAY,EACf,MAAM,uBAAuB,CAAC;AAc/B,MAAM,WAAW,+BAA+B;IAC5C,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,CACJ,KAAK,EAAE,iCAAiC,EAAE,EAC1C,SAAS,EAAE,sCAAsC,KAChD,IAAI,CAAC;IACV,YAAY,EAAE,iCAAiC,EAAE,CAAC;IAClD,SAAS,EAAE,sCAAsC,CAAC;IAClD,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,kBAAkB,CAAC,EAAE,mBAAmB,CAAC;IACzC,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3C;AAED,eAAO,MAAM,0BAA0B,EAAE,EAAE,CAAC,+BAA+B,CA0K1E,CAAC"}
1
+ {"version":3,"file":"e-sign-date-signed-offset-modal.d.ts","sourceRoot":"","sources":["../../../src/components/field-config-panel/e-sign-date-signed-offset-modal.tsx"],"names":[],"mappings":"AAmBA,OAAO,EAAE,EAAE,EAAkC,MAAM,OAAO,CAAC;AAE3D,OAAO,KAAK,EACR,sCAAsC,EACtC,iCAAiC,EACjC,mBAAmB,EACnB,QAAQ,EACR,QAAQ,EACR,YAAY,EACf,MAAM,uBAAuB,CAAC;AAc/B,MAAM,WAAW,+BAA+B;IAC5C,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,CACJ,KAAK,EAAE,iCAAiC,EAAE,EAC1C,SAAS,EAAE,sCAAsC,KAChD,IAAI,CAAC;IACV,YAAY,EAAE,iCAAiC,EAAE,CAAC;IAClD,SAAS,EAAE,sCAAsC,CAAC;IAClD,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,kBAAkB,CAAC,EAAE,mBAAmB,CAAC;IACzC,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3C;AAED,eAAO,MAAM,0BAA0B,EAAE,EAAE,CAAC,+BAA+B,CA6K1E,CAAC"}
@@ -58,12 +58,14 @@ export const ESignDateSignedOffsetModal = ({ documentFields, finalRule, formFiel
58
58
  const handleUpdateRule = useCallback((index, rule) => {
59
59
  setRules(prev => updateESignOffsetRule(prev, index, rule));
60
60
  }, []);
61
+ const hasSavedRules = initialState.length > 0;
61
62
  const canSave = useMemo(() => {
63
+ // Clearing is only a change worth saving when it removes rules that were saved before.
62
64
  if (hasClearedRules && !hasConfiguredRules) {
63
- return true;
65
+ return hasSavedRules;
64
66
  }
65
67
  return rules.every(rule => isValidConditionGroups(rule.condition.groups, conditionValidationDeps));
66
- }, [conditionValidationDeps, hasClearedRules, hasConfiguredRules, rules]);
68
+ }, [conditionValidationDeps, hasClearedRules, hasConfiguredRules, hasSavedRules, rules]);
67
69
  return (_jsxs(Dialog, { open: true, onClose: handleClose, size: "xlarge", children: [_jsx(Dialog.Header, { children: "Date Signed Offset Rules" }), _jsx(Dialog.Content, { children: _jsxs(Flex, { direction: "column", gap: "4", flex: 1, style: {
68
70
  maxHeight: MODAL_CONTENT_MAX_HEIGHT,
69
71
  overflowY: 'auto',
@@ -1 +1 @@
1
- {"version":3,"file":"e-sign-date-signed-offset-modal.js","sourceRoot":"","sources":["../../../src/components/field-config-panel/e-sign-date-signed-offset-modal.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"e-sign-date-signed-offset-modal.js","sourceRoot":"","sources":["../../../src/components/field-config-panel/e-sign-date-signed-offset-modal.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/dte-pdf-editor",
3
- "version": "1.97.0",
3
+ "version": "2.1.0",
4
4
  "description": "",
5
5
  "main": "./dist/index.js",
6
6
  "typings": "./dist/index.d.ts",
@@ -0,0 +1,135 @@
1
+ /*
2
+ * "Clear Rules" resets the modal to one blank rule. Saving that is only a change when the field
3
+ * had saved rules to remove; with none saved, Save stays disabled as it is on first open.
4
+ */
5
+ import { TextDecoder, TextEncoder } from 'util';
6
+
7
+ // jsdom has no TextEncoder; anvil2 reads it when it is loaded, so this must run before it is imported.
8
+ Object.assign(globalThis, { TextEncoder, TextDecoder });
9
+
10
+ import { act } from 'react';
11
+ import { createRoot, type Root } from 'react-dom/client';
12
+ import type { ESignDateSignedOffsetSettingsRule } from '../../../interface/types';
13
+ import { ESignDateSignedOffsetModal } from '../e-sign-date-signed-offset-modal';
14
+
15
+ // jsdom has no matchMedia, ResizeObserver, IntersectionObserver, popover or dialog API; anvil2 uses them.
16
+ Object.defineProperty(window, 'matchMedia', {
17
+ writable: true,
18
+ value: (query: string) => ({
19
+ matches: false,
20
+ media: query,
21
+ onchange: null,
22
+ addListener: () => {},
23
+ removeListener: () => {},
24
+ addEventListener: () => {},
25
+ removeEventListener: () => {},
26
+ dispatchEvent: () => false,
27
+ }),
28
+ });
29
+ class ObserverMock {
30
+ observe() {}
31
+ unobserve() {}
32
+ disconnect() {}
33
+ }
34
+ global.ResizeObserver = ObserverMock as unknown as typeof ResizeObserver;
35
+ global.IntersectionObserver = ObserverMock as unknown as typeof IntersectionObserver;
36
+ HTMLElement.prototype.showPopover ??= () => {};
37
+ HTMLElement.prototype.hidePopover ??= () => {};
38
+ HTMLElement.prototype.togglePopover ??= () => false;
39
+ HTMLDialogElement.prototype.showModal ??= function showModal(this: HTMLDialogElement) {
40
+ this.open = true;
41
+ };
42
+ HTMLDialogElement.prototype.close ??= function close(this: HTMLDialogElement) {
43
+ this.open = false;
44
+ };
45
+
46
+ const savedRule: ESignDateSignedOffsetSettingsRule = {
47
+ days: 2,
48
+ condition: {
49
+ behavior: 'show',
50
+ groups: [
51
+ {
52
+ id: 'group-1',
53
+ conditions: [
54
+ {
55
+ id: 'condition-1',
56
+ dataPointKey: 'Customer.Name',
57
+ operator: 'is_not_empty',
58
+ value: '',
59
+ },
60
+ ],
61
+ },
62
+ ],
63
+ },
64
+ };
65
+
66
+ describe('ESignDateSignedOffsetModal', () => {
67
+ let container: HTMLDivElement;
68
+ let root: Root;
69
+ const onSave = jest.fn();
70
+
71
+ const render = (initialState: ESignDateSignedOffsetSettingsRule[]) =>
72
+ act(async () => {
73
+ root.render(
74
+ <ESignDateSignedOffsetModal
75
+ initialState={initialState}
76
+ finalRule={{ days: 5 }}
77
+ onClose={() => {}}
78
+ onSave={onSave}
79
+ />,
80
+ );
81
+ });
82
+
83
+ // The dialog may portal out of the container, so search the whole document.
84
+ const getButton = (label: string): HTMLButtonElement => {
85
+ const button = [...document.querySelectorAll('button')].find(
86
+ candidate => candidate.textContent?.trim() === label,
87
+ );
88
+ if (!button) {
89
+ throw new Error(`No "${label}" button`);
90
+ }
91
+ return button;
92
+ };
93
+
94
+ const click = (label: string) => act(async () => getButton(label).click());
95
+
96
+ beforeAll(() => {
97
+ (globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true;
98
+ });
99
+
100
+ beforeEach(() => {
101
+ onSave.mockClear();
102
+ container = document.createElement('div');
103
+ document.body.appendChild(container);
104
+ root = createRoot(container);
105
+ });
106
+
107
+ afterEach(async () => {
108
+ await act(async () => root.unmount());
109
+ container.remove();
110
+ });
111
+
112
+ describe('with no saved rules', () => {
113
+ test('keeps Save disabled after Clear Rules', async () => {
114
+ await render([]);
115
+ // A second rule is enough to bring up Clear Rules without filling in a condition.
116
+ await click('Add Else Condition');
117
+
118
+ await click('Clear Rules');
119
+
120
+ expect(getButton('Save Changes').disabled).toBe(true);
121
+ });
122
+ });
123
+
124
+ describe('with saved rules', () => {
125
+ test('enables Save after Clear Rules and saves no rules', async () => {
126
+ await render([savedRule]);
127
+
128
+ await click('Clear Rules');
129
+ expect(getButton('Save Changes').disabled).toBe(false);
130
+ await click('Save Changes');
131
+
132
+ expect(onSave).toHaveBeenCalledWith([], { days: 0 });
133
+ });
134
+ });
135
+ });
@@ -133,15 +133,18 @@ export const ESignDateSignedOffsetModal: FC<ESignDateSignedOffsetModalProps> = (
133
133
  [],
134
134
  );
135
135
 
136
+ const hasSavedRules = initialState.length > 0;
137
+
136
138
  const canSave = useMemo(() => {
139
+ // Clearing is only a change worth saving when it removes rules that were saved before.
137
140
  if (hasClearedRules && !hasConfiguredRules) {
138
- return true;
141
+ return hasSavedRules;
139
142
  }
140
143
 
141
144
  return rules.every(rule =>
142
145
  isValidConditionGroups(rule.condition.groups, conditionValidationDeps),
143
146
  );
144
- }, [conditionValidationDeps, hasClearedRules, hasConfiguredRules, rules]);
147
+ }, [conditionValidationDeps, hasClearedRules, hasConfiguredRules, hasSavedRules, rules]);
145
148
 
146
149
  return (
147
150
  <Dialog open onClose={handleClose} size="xlarge">