@servicetitan/dte-pdf-editor 2.0.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 +2 -0
- package/dist/components/field-config-panel/e-sign-date-signed-offset-modal.d.ts.map +1 -1
- package/dist/components/field-config-panel/e-sign-date-signed-offset-modal.js +4 -2
- package/dist/components/field-config-panel/e-sign-date-signed-offset-modal.js.map +1 -1
- package/package.json +1 -1
- package/src/components/field-config-panel/__tests__/e-sign-date-signed-offset-modal.test.tsx +135 -0
- package/src/components/field-config-panel/e-sign-date-signed-offset-modal.tsx +5 -2
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,
|
|
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
|
|
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
|
@@ -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
|
|
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">
|