@servicetitan/dte-pdf-editor 1.17.0 → 1.18.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 +35 -7
- package/dist/components/field-config-panel/advanced-settings.d.ts +9 -0
- package/dist/components/field-config-panel/advanced-settings.d.ts.map +1 -0
- package/dist/components/field-config-panel/advanced-settings.js +17 -0
- package/dist/components/field-config-panel/advanced-settings.js.map +1 -0
- package/dist/components/field-config-panel/field-config-panel-overlay.d.ts +4 -1
- package/dist/components/field-config-panel/field-config-panel-overlay.d.ts.map +1 -1
- package/dist/components/field-config-panel/field-config-panel-overlay.js +2 -2
- package/dist/components/field-config-panel/field-config-panel-overlay.js.map +1 -1
- package/dist/components/field-config-panel/field-config-panel.d.ts +4 -1
- package/dist/components/field-config-panel/field-config-panel.d.ts.map +1 -1
- package/dist/components/field-config-panel/field-config-panel.js +11 -5
- package/dist/components/field-config-panel/field-config-panel.js.map +1 -1
- package/dist/components/field-config-panel/field-sidebar.d.ts +13 -0
- package/dist/components/field-config-panel/field-sidebar.d.ts.map +1 -0
- package/dist/components/field-config-panel/field-sidebar.js +20 -0
- package/dist/components/field-config-panel/field-sidebar.js.map +1 -0
- package/dist/components/field-config-panel/formula-generator.d.ts +11 -0
- package/dist/components/field-config-panel/formula-generator.d.ts.map +1 -0
- package/dist/components/field-config-panel/formula-generator.js +51 -0
- package/dist/components/field-config-panel/formula-generator.js.map +1 -0
- package/dist/components/field-config-panel/formula-modal.d.ts +12 -0
- package/dist/components/field-config-panel/formula-modal.d.ts.map +1 -0
- package/dist/components/field-config-panel/formula-modal.js +99 -0
- package/dist/components/field-config-panel/formula-modal.js.map +1 -0
- package/dist/components/field-config-panel/formula-workspace.d.ts +23 -0
- package/dist/components/field-config-panel/formula-workspace.d.ts.map +1 -0
- package/dist/components/field-config-panel/formula-workspace.js +28 -0
- package/dist/components/field-config-panel/formula-workspace.js.map +1 -0
- package/dist/components/field-config-panel/result-type-selector.d.ts +9 -0
- package/dist/components/field-config-panel/result-type-selector.d.ts.map +1 -0
- package/dist/components/field-config-panel/result-type-selector.js +10 -0
- package/dist/components/field-config-panel/result-type-selector.js.map +1 -0
- package/dist/components/field-sidebar/calculated-field-type-list.d.ts +9 -0
- package/dist/components/field-sidebar/calculated-field-type-list.d.ts.map +1 -0
- package/dist/components/field-sidebar/calculated-field-type-list.js +12 -0
- package/dist/components/field-sidebar/calculated-field-type-list.js.map +1 -0
- package/dist/components/field-sidebar/data-model-field-type-list.d.ts +0 -1
- package/dist/components/field-sidebar/data-model-field-type-list.d.ts.map +1 -1
- package/dist/components/field-sidebar/data-model-field-type-list.js +8 -7
- package/dist/components/field-sidebar/data-model-field-type-list.js.map +1 -1
- package/dist/components/field-sidebar/field-menu-group.d.ts +11 -0
- package/dist/components/field-sidebar/field-menu-group.d.ts.map +1 -0
- package/dist/components/field-sidebar/field-menu-group.js +6 -0
- package/dist/components/field-sidebar/field-menu-group.js.map +1 -0
- package/dist/components/field-sidebar/field-sidebar.d.ts.map +1 -1
- package/dist/components/field-sidebar/field-sidebar.js +6 -15
- package/dist/components/field-sidebar/field-sidebar.js.map +1 -1
- package/dist/components/field-sidebar/fillable-field-type-list.d.ts +0 -1
- package/dist/components/field-sidebar/fillable-field-type-list.d.ts.map +1 -1
- package/dist/components/field-sidebar/fillable-field-type-list.js +8 -9
- package/dist/components/field-sidebar/fillable-field-type-list.js.map +1 -1
- package/dist/components/pdf-editor/pdf-editor.d.ts.map +1 -1
- package/dist/components/pdf-editor/pdf-editor.js +1 -1
- package/dist/components/pdf-editor/pdf-editor.js.map +1 -1
- package/dist/components/pdf-fields-overlay/pdf-overlay-field-calculated.d.ts +8 -0
- package/dist/components/pdf-fields-overlay/pdf-overlay-field-calculated.d.ts.map +1 -0
- package/dist/components/pdf-fields-overlay/pdf-overlay-field-calculated.js +5 -0
- package/dist/components/pdf-fields-overlay/pdf-overlay-field-calculated.js.map +1 -0
- package/dist/components/pdf-fields-overlay/pdf-overlay-field.d.ts.map +1 -1
- package/dist/components/pdf-fields-overlay/pdf-overlay-field.js +2 -1
- package/dist/components/pdf-fields-overlay/pdf-overlay-field.js.map +1 -1
- package/dist/components/pdf-view/pdf-view-calculated.d.ts +9 -0
- package/dist/components/pdf-view/pdf-view-calculated.d.ts.map +1 -0
- package/dist/components/pdf-view/pdf-view-calculated.js +18 -0
- package/dist/components/pdf-view/pdf-view-calculated.js.map +1 -0
- package/dist/components/pdf-view/pdf-view.d.ts.map +1 -1
- package/dist/components/pdf-view/pdf-view.js +2 -1
- package/dist/components/pdf-view/pdf-view.js.map +1 -1
- package/dist/constants/field.constants.d.ts +3 -2
- package/dist/constants/field.constants.d.ts.map +1 -1
- package/dist/constants/field.constants.js +6 -0
- package/dist/constants/field.constants.js.map +1 -1
- package/dist/constants/menu-group.d.ts +8 -0
- package/dist/constants/menu-group.d.ts.map +1 -0
- package/dist/constants/menu-group.js +20 -0
- package/dist/constants/menu-group.js.map +1 -0
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/useFormulaEditor.d.ts +22 -0
- package/dist/hooks/useFormulaEditor.d.ts.map +1 -0
- package/dist/hooks/useFormulaEditor.js +290 -0
- package/dist/hooks/useFormulaEditor.js.map +1 -0
- package/dist/hooks/usePdfFieldDnD.d.ts.map +1 -1
- package/dist/hooks/usePdfFieldDnD.js +3 -0
- package/dist/hooks/usePdfFieldDnD.js.map +1 -1
- package/dist/interface/types.d.ts +45 -3
- package/dist/interface/types.d.ts.map +1 -1
- package/dist/interface/types.js +3 -0
- package/dist/interface/types.js.map +1 -1
- package/dist/utils/data-model/extract-fields.utils.d.ts +5 -5
- package/dist/utils/data-model/extract-fields.utils.d.ts.map +1 -1
- package/dist/utils/data-model/extract-fields.utils.js +42 -8
- package/dist/utils/data-model/extract-fields.utils.js.map +1 -1
- package/dist/utils/formula/caret.utils.d.ts +3 -0
- package/dist/utils/formula/caret.utils.d.ts.map +1 -0
- package/dist/utils/formula/caret.utils.js +123 -0
- package/dist/utils/formula/caret.utils.js.map +1 -0
- package/dist/utils/formula/dom.utils.d.ts +4 -0
- package/dist/utils/formula/dom.utils.d.ts.map +1 -0
- package/dist/utils/formula/dom.utils.js +34 -0
- package/dist/utils/formula/dom.utils.js.map +1 -0
- package/dist/utils/formula/evaluate-formula.utils.d.ts +13 -0
- package/dist/utils/formula/evaluate-formula.utils.d.ts.map +1 -0
- package/dist/utils/formula/evaluate-formula.utils.js +134 -0
- package/dist/utils/formula/evaluate-formula.utils.js.map +1 -0
- package/dist/utils/formula/expression.utils.d.ts +18 -0
- package/dist/utils/formula/expression.utils.d.ts.map +1 -0
- package/dist/utils/formula/expression.utils.js +84 -0
- package/dist/utils/formula/expression.utils.js.map +1 -0
- package/dist/utils/formula/format-calculated-result.utils.d.ts +7 -0
- package/dist/utils/formula/format-calculated-result.utils.d.ts.map +1 -0
- package/dist/utils/formula/format-calculated-result.utils.js +50 -0
- package/dist/utils/formula/format-calculated-result.utils.js.map +1 -0
- package/dist/utils/formula/formula-types.d.ts +3 -0
- package/dist/utils/formula/formula-types.d.ts.map +1 -0
- package/dist/utils/formula/formula-types.js +2 -0
- package/dist/utils/formula/formula-types.js.map +1 -0
- package/dist/utils/formula/index.d.ts +11 -0
- package/dist/utils/formula/index.d.ts.map +1 -0
- package/dist/utils/formula/index.js +11 -0
- package/dist/utils/formula/index.js.map +1 -0
- package/dist/utils/formula/referenced-paths.utils.d.ts +7 -0
- package/dist/utils/formula/referenced-paths.utils.d.ts.map +1 -0
- package/dist/utils/formula/referenced-paths.utils.js +18 -0
- package/dist/utils/formula/referenced-paths.utils.js.map +1 -0
- package/dist/utils/formula/render-formula.utils.d.ts +8 -0
- package/dist/utils/formula/render-formula.utils.d.ts.map +1 -0
- package/dist/utils/formula/render-formula.utils.js +39 -0
- package/dist/utils/formula/render-formula.utils.js.map +1 -0
- package/dist/utils/formula/serialize-formula.utils.d.ts +14 -0
- package/dist/utils/formula/serialize-formula.utils.d.ts.map +1 -0
- package/dist/utils/formula/serialize-formula.utils.js +33 -0
- package/dist/utils/formula/serialize-formula.utils.js.map +1 -0
- package/dist/utils/formula/validate-formula.utils.d.ts +11 -0
- package/dist/utils/formula/validate-formula.utils.d.ts.map +1 -0
- package/dist/utils/formula/validate-formula.utils.js +79 -0
- package/dist/utils/formula/validate-formula.utils.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/package.json +2 -2
- package/src/components/field-config-panel/advanced-settings.tsx +113 -0
- package/src/components/field-config-panel/field-config-panel-overlay.tsx +8 -1
- package/src/components/field-config-panel/field-config-panel.tsx +43 -15
- package/src/components/field-config-panel/field-sidebar.tsx +91 -0
- package/src/components/field-config-panel/formula-generator.tsx +122 -0
- package/src/components/field-config-panel/formula-modal.tsx +229 -0
- package/src/components/field-config-panel/formula-workspace.tsx +116 -0
- package/src/components/field-config-panel/result-type-selector.tsx +34 -0
- package/src/components/field-sidebar/calculated-field-type-list.tsx +29 -0
- package/src/components/field-sidebar/data-model-field-type-list.tsx +10 -4
- package/src/components/field-sidebar/field-menu-group.tsx +36 -0
- package/src/components/field-sidebar/field-sidebar.tsx +14 -55
- package/src/components/field-sidebar/fillable-field-type-list.tsx +11 -9
- package/src/components/pdf-editor/pdf-editor.tsx +2 -0
- package/src/components/pdf-fields-overlay/pdf-overlay-field-calculated.tsx +15 -0
- package/src/components/pdf-fields-overlay/pdf-overlay-field.tsx +2 -0
- package/src/components/pdf-view/pdf-view-calculated.tsx +23 -0
- package/src/components/pdf-view/pdf-view.tsx +4 -0
- package/src/constants/field.constants.ts +9 -2
- package/src/constants/menu-group.ts +26 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useFormulaEditor.ts +336 -0
- package/src/hooks/usePdfFieldDnD.ts +4 -0
- package/src/interface/types.ts +38 -2
- package/src/styles/formula-modal.css +307 -0
- package/src/styles/index.css +1 -0
- package/src/utils/data-model/extract-fields.utils.ts +65 -7
- package/src/utils/formula/caret.utils.ts +125 -0
- package/src/utils/formula/dom.utils.ts +35 -0
- package/src/utils/formula/evaluate-formula.utils.ts +159 -0
- package/src/utils/formula/expression.utils.ts +99 -0
- package/src/utils/formula/format-calculated-result.utils.ts +79 -0
- package/src/utils/formula/formula-types.ts +2 -0
- package/src/utils/formula/index.ts +10 -0
- package/src/utils/formula/referenced-paths.utils.ts +18 -0
- package/src/utils/formula/render-formula.utils.ts +40 -0
- package/src/utils/formula/serialize-formula.utils.ts +40 -0
- package/src/utils/formula/validate-formula.utils.ts +94 -0
- package/src/utils/index.ts +1 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { placeCaretAtEnd, readExpressionFromEditor } from './dom.utils';
|
|
2
|
+
function getExpressionBeforeCaret(element) {
|
|
3
|
+
var _a, _b;
|
|
4
|
+
const selection = window.getSelection();
|
|
5
|
+
if (!selection || selection.rangeCount === 0) {
|
|
6
|
+
return readExpressionFromEditor(element);
|
|
7
|
+
}
|
|
8
|
+
const range = selection.getRangeAt(0);
|
|
9
|
+
const endContainer = range.endContainer;
|
|
10
|
+
const endOffset = range.endOffset;
|
|
11
|
+
const parts = [];
|
|
12
|
+
const appendNode = (node) => {
|
|
13
|
+
var _a, _b;
|
|
14
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
15
|
+
parts.push((_a = node.textContent) !== null && _a !== void 0 ? _a : '');
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (node instanceof HTMLElement && node.dataset.field) {
|
|
19
|
+
parts.push(node.dataset.field);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
parts.push((_b = node.textContent) !== null && _b !== void 0 ? _b : '');
|
|
23
|
+
};
|
|
24
|
+
const getTopLevelChild = (node) => {
|
|
25
|
+
let current = node;
|
|
26
|
+
while (current && current.parentNode !== element) {
|
|
27
|
+
current = current.parentNode;
|
|
28
|
+
}
|
|
29
|
+
return current && current.parentNode === element ? current : null;
|
|
30
|
+
};
|
|
31
|
+
if (endContainer === element) {
|
|
32
|
+
element.childNodes.forEach((node, index) => {
|
|
33
|
+
if (index < endOffset) {
|
|
34
|
+
appendNode(node);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
return parts.join('').replace(/\u00a0/g, ' ');
|
|
38
|
+
}
|
|
39
|
+
const topChild = getTopLevelChild(endContainer);
|
|
40
|
+
if (!topChild) {
|
|
41
|
+
return readExpressionFromEditor(element);
|
|
42
|
+
}
|
|
43
|
+
for (const node of Array.from(element.childNodes)) {
|
|
44
|
+
if (node === topChild) {
|
|
45
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
46
|
+
parts.push(((_a = node.textContent) !== null && _a !== void 0 ? _a : '').slice(0, endOffset));
|
|
47
|
+
}
|
|
48
|
+
else if (node instanceof HTMLElement && node.dataset.field) {
|
|
49
|
+
if (endOffset > 0) {
|
|
50
|
+
parts.push(node.dataset.field);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
parts.push(((_b = node.textContent) !== null && _b !== void 0 ? _b : '').slice(0, endOffset));
|
|
55
|
+
}
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
appendNode(node);
|
|
59
|
+
}
|
|
60
|
+
return parts.join('').replace(/\u00a0/g, ' ');
|
|
61
|
+
}
|
|
62
|
+
export function getCaretExpressionIndex(element) {
|
|
63
|
+
return getExpressionBeforeCaret(element).length;
|
|
64
|
+
}
|
|
65
|
+
export function setCaretByExpressionIndex(element, index) {
|
|
66
|
+
var _a, _b;
|
|
67
|
+
const selection = window.getSelection();
|
|
68
|
+
if (!selection) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
let remaining = index;
|
|
72
|
+
let targetNode = null;
|
|
73
|
+
let targetOffset = 0;
|
|
74
|
+
const getNodeLength = (node) => {
|
|
75
|
+
var _a, _b, _c, _d, _e, _f;
|
|
76
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
77
|
+
return (_b = (_a = node.textContent) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0;
|
|
78
|
+
}
|
|
79
|
+
if (node instanceof HTMLElement && node.dataset.field) {
|
|
80
|
+
return (_d = (_c = node.dataset.field) === null || _c === void 0 ? void 0 : _c.length) !== null && _d !== void 0 ? _d : 0;
|
|
81
|
+
}
|
|
82
|
+
return (_f = (_e = node.textContent) === null || _e === void 0 ? void 0 : _e.length) !== null && _f !== void 0 ? _f : 0;
|
|
83
|
+
};
|
|
84
|
+
for (const node of Array.from(element.childNodes)) {
|
|
85
|
+
const len = getNodeLength(node);
|
|
86
|
+
if (remaining <= len) {
|
|
87
|
+
targetNode = node;
|
|
88
|
+
targetOffset = remaining;
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
remaining -= len;
|
|
92
|
+
}
|
|
93
|
+
if (!targetNode) {
|
|
94
|
+
placeCaretAtEnd(element);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const range = document.createRange();
|
|
98
|
+
if (targetNode.nodeType === Node.TEXT_NODE) {
|
|
99
|
+
range.setStart(targetNode, targetOffset);
|
|
100
|
+
}
|
|
101
|
+
else if (targetNode instanceof HTMLElement && targetNode.dataset.field) {
|
|
102
|
+
range.setStartAfter(targetNode);
|
|
103
|
+
}
|
|
104
|
+
else if (targetNode instanceof HTMLElement) {
|
|
105
|
+
const textNode = Array.from(targetNode.childNodes).find(n => n.nodeType === Node.TEXT_NODE);
|
|
106
|
+
if (textNode) {
|
|
107
|
+
range.setStart(textNode, Math.min(targetOffset, (_b = (_a = textNode.textContent) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0));
|
|
108
|
+
}
|
|
109
|
+
else if (targetOffset > 0) {
|
|
110
|
+
range.setStartAfter(targetNode);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
range.setStartBefore(targetNode);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
range.setStart(targetNode, targetOffset);
|
|
118
|
+
}
|
|
119
|
+
range.collapse(true);
|
|
120
|
+
selection.removeAllRanges();
|
|
121
|
+
selection.addRange(range);
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=caret.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caret.utils.js","sourceRoot":"","sources":["../../../src/utils/formula/caret.utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom.utils.d.ts","sourceRoot":"","sources":["../../../src/utils/formula/dom.utils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,MAMX,CAAC;AAEjC,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAclE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAU1D"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export const escapeHtml = (value) => value
|
|
2
|
+
.replace(/&/g, '&')
|
|
3
|
+
.replace(/</g, '<')
|
|
4
|
+
.replace(/>/g, '>')
|
|
5
|
+
.replace(/"/g, '"')
|
|
6
|
+
.replace(/'/g, ''');
|
|
7
|
+
export function readExpressionFromEditor(node) {
|
|
8
|
+
const parts = [];
|
|
9
|
+
node.childNodes.forEach(child => {
|
|
10
|
+
var _a, _b;
|
|
11
|
+
if (child.nodeType === Node.TEXT_NODE) {
|
|
12
|
+
parts.push((_a = child.textContent) !== null && _a !== void 0 ? _a : '');
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (child instanceof HTMLElement && child.dataset.field) {
|
|
16
|
+
parts.push(child.dataset.field);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
parts.push((_b = child.textContent) !== null && _b !== void 0 ? _b : '');
|
|
20
|
+
});
|
|
21
|
+
return parts.join('').replace(/\u00a0/g, ' ');
|
|
22
|
+
}
|
|
23
|
+
export function placeCaretAtEnd(element) {
|
|
24
|
+
const selection = window.getSelection();
|
|
25
|
+
if (!selection) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const range = document.createRange();
|
|
29
|
+
range.selectNodeContents(element);
|
|
30
|
+
range.collapse(false);
|
|
31
|
+
selection.removeAllRanges();
|
|
32
|
+
selection.addRange(range);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=dom.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom.utils.js","sourceRoot":"","sources":["../../../src/utils/formula/dom.utils.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAU,EAAE,CAChD,KAAK;KACA,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;KACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;KACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;KACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;KACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAEjC,MAAM,UAAU,wBAAwB,CAAC,IAAiB;IACtD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;;QAC5B,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,MAAA,KAAK,CAAC,WAAW,mCAAI,EAAE,CAAC,CAAC;YACpC,OAAO;QACX,CAAC;QACD,IAAI,KAAK,YAAY,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACtD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAChC,OAAO;QACX,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,MAAA,KAAK,CAAC,WAAW,mCAAI,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAoB;IAChD,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;IACxC,IAAI,CAAC,SAAS,EAAE,CAAC;QACb,OAAO;IACX,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAClC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtB,SAAS,CAAC,eAAe,EAAE,CAAC;IAC5B,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { DataModelValues, StructuredFormula } from '../../interface/types';
|
|
2
|
+
/**
|
|
3
|
+
* Convert formula operand to number. Merge tags and fillable only ever give:
|
|
4
|
+
* empty '', a number, or a string number (e.g. '1.2'). Only those are converted to number for calculation.
|
|
5
|
+
*/
|
|
6
|
+
export declare function valueToNumber(raw: unknown): number;
|
|
7
|
+
/**
|
|
8
|
+
* Evaluate a structured formula with the given data.
|
|
9
|
+
* Field tokens are resolved via resolvePdfDataValues; string values are converted to number.
|
|
10
|
+
* Supports +, -, *, / and parentheses. Returns 0 when formula is empty or invalid.
|
|
11
|
+
*/
|
|
12
|
+
export declare function evaluateFormula(formula: StructuredFormula | undefined | null, data: DataModelValues | undefined): number;
|
|
13
|
+
//# sourceMappingURL=evaluate-formula.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate-formula.utils.d.ts","sourceRoot":"","sources":["../../../src/utils/formula/evaluate-formula.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,eAAe,EAGf,iBAAiB,EACpB,MAAM,uBAAuB,CAAC;AAG/B;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAgBlD;AAoHD;;;;GAIG;AACH,wBAAgB,eAAe,CAC3B,OAAO,EAAE,iBAAiB,GAAG,SAAS,GAAG,IAAI,EAC7C,IAAI,EAAE,eAAe,GAAG,SAAS,GAClC,MAAM,CAMR"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { resolvePdfDataValues } from '../data-model';
|
|
2
|
+
/**
|
|
3
|
+
* Convert formula operand to number. Merge tags and fillable only ever give:
|
|
4
|
+
* empty '', a number, or a string number (e.g. '1.2'). Only those are converted to number for calculation.
|
|
5
|
+
*/
|
|
6
|
+
export function valueToNumber(raw) {
|
|
7
|
+
if (raw === null || raw === undefined) {
|
|
8
|
+
return 0;
|
|
9
|
+
}
|
|
10
|
+
if (typeof raw === 'number' && !Number.isNaN(raw)) {
|
|
11
|
+
return raw;
|
|
12
|
+
}
|
|
13
|
+
if (typeof raw !== 'string') {
|
|
14
|
+
return 0;
|
|
15
|
+
}
|
|
16
|
+
const s = raw.trim();
|
|
17
|
+
if (s === '') {
|
|
18
|
+
return 0;
|
|
19
|
+
}
|
|
20
|
+
const n = Number(s);
|
|
21
|
+
return Number.isNaN(n) ? 0 : n;
|
|
22
|
+
}
|
|
23
|
+
function resolveTokens(formula, data) {
|
|
24
|
+
return formula.tokens.map((t) => {
|
|
25
|
+
if (t.type === 'field') {
|
|
26
|
+
const raw = resolvePdfDataValues(data, t.path);
|
|
27
|
+
return { type: 'number', value: valueToNumber(raw) };
|
|
28
|
+
}
|
|
29
|
+
if (t.type === 'number') {
|
|
30
|
+
return { type: 'number', value: valueToNumber(t.value) };
|
|
31
|
+
}
|
|
32
|
+
return t;
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function applyOp(a, op, b) {
|
|
36
|
+
switch (op) {
|
|
37
|
+
case '+':
|
|
38
|
+
return a + b;
|
|
39
|
+
case '-':
|
|
40
|
+
return a - b;
|
|
41
|
+
case '*':
|
|
42
|
+
return a * b;
|
|
43
|
+
case '/':
|
|
44
|
+
return b === 0 ? 0 : a / b;
|
|
45
|
+
default:
|
|
46
|
+
return 0;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/** Find the index of the matching closing paren for an open paren at openIndex. */
|
|
50
|
+
function findMatchingParen(tokens, openIndex) {
|
|
51
|
+
let balance = 1;
|
|
52
|
+
for (let i = openIndex + 1; i < tokens.length; i++) {
|
|
53
|
+
const t = tokens[i];
|
|
54
|
+
if (t.type === 'lparen') {
|
|
55
|
+
balance++;
|
|
56
|
+
}
|
|
57
|
+
else if (t.type === 'rparen') {
|
|
58
|
+
balance--;
|
|
59
|
+
if (balance === 0) {
|
|
60
|
+
return i;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return -1;
|
|
65
|
+
}
|
|
66
|
+
/** Evaluate a flat list of numbers and * / + - (no parentheses). */
|
|
67
|
+
function evalFlat(tokens) {
|
|
68
|
+
const list = [...tokens];
|
|
69
|
+
// First pass: * and /
|
|
70
|
+
for (let i = 1; i < list.length - 1;) {
|
|
71
|
+
const t = list[i];
|
|
72
|
+
if (t.type === 'operator' && (t.value === '*' || t.value === '/')) {
|
|
73
|
+
const a = list[i - 1].value;
|
|
74
|
+
const b = list[i + 1].value;
|
|
75
|
+
const result = applyOp(a, t.value, b);
|
|
76
|
+
list.splice(i - 1, 3, { type: 'number', value: result });
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
i += 2;
|
|
80
|
+
}
|
|
81
|
+
// Second pass: + and -
|
|
82
|
+
for (let i = 1; i < list.length - 1;) {
|
|
83
|
+
const t = list[i];
|
|
84
|
+
if (t.type === 'operator' && (t.value === '+' || t.value === '-')) {
|
|
85
|
+
const a = list[i - 1].value;
|
|
86
|
+
const b = list[i + 1].value;
|
|
87
|
+
const result = applyOp(a, t.value, b);
|
|
88
|
+
list.splice(i - 1, 3, { type: 'number', value: result });
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
i += 2;
|
|
92
|
+
}
|
|
93
|
+
const single = list[0];
|
|
94
|
+
return (single === null || single === void 0 ? void 0 : single.type) === 'number' ? single.value : 0;
|
|
95
|
+
}
|
|
96
|
+
function evalResolvedTokens(tokens) {
|
|
97
|
+
if (tokens.length === 0) {
|
|
98
|
+
return 0;
|
|
99
|
+
}
|
|
100
|
+
if (tokens.length === 1 && tokens[0].type === 'number') {
|
|
101
|
+
return tokens[0].value;
|
|
102
|
+
}
|
|
103
|
+
const list = [...tokens];
|
|
104
|
+
// Resolve innermost parentheses first
|
|
105
|
+
let idx = 0;
|
|
106
|
+
while (idx < list.length) {
|
|
107
|
+
if (list[idx].type === 'lparen') {
|
|
108
|
+
const close = findMatchingParen(list, idx);
|
|
109
|
+
if (close === -1) {
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
const inner = list.slice(idx + 1, close);
|
|
113
|
+
const value = evalResolvedTokens(inner);
|
|
114
|
+
list.splice(idx, close - idx + 1, { type: 'number', value });
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
idx++;
|
|
118
|
+
}
|
|
119
|
+
return evalFlat(list);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Evaluate a structured formula with the given data.
|
|
123
|
+
* Field tokens are resolved via resolvePdfDataValues; string values are converted to number.
|
|
124
|
+
* Supports +, -, *, / and parentheses. Returns 0 when formula is empty or invalid.
|
|
125
|
+
*/
|
|
126
|
+
export function evaluateFormula(formula, data) {
|
|
127
|
+
var _a;
|
|
128
|
+
if (!((_a = formula === null || formula === void 0 ? void 0 : formula.tokens) === null || _a === void 0 ? void 0 : _a.length)) {
|
|
129
|
+
return 0;
|
|
130
|
+
}
|
|
131
|
+
const resolved = resolveTokens(formula, data);
|
|
132
|
+
return evalResolvedTokens(resolved);
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=evaluate-formula.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate-formula.utils.js","sourceRoot":"","sources":["../../../src/utils/formula/evaluate-formula.utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { FormulaToken, StructuredFormula } from '../../interface/types';
|
|
2
|
+
/**
|
|
3
|
+
* Convert StructuredFormula tokens to an editable expression string.
|
|
4
|
+
* Uses field path as the identifier so parsing is unambiguous.
|
|
5
|
+
*/
|
|
6
|
+
export declare function tokensToExpression(formula: StructuredFormula | undefined): string;
|
|
7
|
+
/** Token from tokenizing an expression string (before resolving to FormulaToken) */
|
|
8
|
+
export interface ExpressionPart {
|
|
9
|
+
type: 'field' | 'number' | 'operator' | 'paren' | 'text';
|
|
10
|
+
value: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function tokenizeExpression(expression: string): ExpressionPart[];
|
|
13
|
+
/**
|
|
14
|
+
* Parse an expression string into FormulaToken[] using valid paths and path->label map.
|
|
15
|
+
* Invalid or unknown identifiers are skipped (or could be left as placeholder); only known paths become field tokens.
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseExpression(expression: string, validPaths: Set<string>, pathToLabel: Map<string, string>): FormulaToken[];
|
|
18
|
+
//# sourceMappingURL=expression.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expression.utils.d.ts","sourceRoot":"","sources":["../../../src/utils/formula/expression.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAExE;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,GAAG,MAAM,CAcjF;AAED,oFAAoF;AACpF,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;IACzD,KAAK,EAAE,MAAM,CAAC;CACjB;AAKD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,EAAE,CAgBvE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC3B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,YAAY,EAAE,CAyChB"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert StructuredFormula tokens to an editable expression string.
|
|
3
|
+
* Uses field path as the identifier so parsing is unambiguous.
|
|
4
|
+
*/
|
|
5
|
+
export function tokensToExpression(formula) {
|
|
6
|
+
var _a;
|
|
7
|
+
if (!((_a = formula === null || formula === void 0 ? void 0 : formula.tokens) === null || _a === void 0 ? void 0 : _a.length)) {
|
|
8
|
+
return '';
|
|
9
|
+
}
|
|
10
|
+
return formula.tokens
|
|
11
|
+
.map(t => {
|
|
12
|
+
if (t.type === 'field') {
|
|
13
|
+
return t.path;
|
|
14
|
+
}
|
|
15
|
+
return t.value;
|
|
16
|
+
})
|
|
17
|
+
.join(' ')
|
|
18
|
+
.replace(/\s+/g, ' ')
|
|
19
|
+
.trim();
|
|
20
|
+
}
|
|
21
|
+
// Field paths may contain hyphens (e.g. fillable_recipient_uuid with UUIDs)
|
|
22
|
+
const EXPRESSION_REGEX = /[A-Za-z_][A-Za-z0-9_.-]*|\d+(?:\.\d+)?|[()+\-*/]|\s+|./g;
|
|
23
|
+
export function tokenizeExpression(expression) {
|
|
24
|
+
const tokens = [];
|
|
25
|
+
let match;
|
|
26
|
+
while ((match = EXPRESSION_REGEX.exec(expression)) !== null) {
|
|
27
|
+
const value = match[0];
|
|
28
|
+
if (/^[A-Za-z_]/.test(value)) {
|
|
29
|
+
tokens.push({ type: 'field', value });
|
|
30
|
+
}
|
|
31
|
+
else if (/^\d/.test(value)) {
|
|
32
|
+
tokens.push({ type: 'number', value });
|
|
33
|
+
}
|
|
34
|
+
else if (/^[()+\-*/]$/.test(value)) {
|
|
35
|
+
tokens.push({ type: value === '(' || value === ')' ? 'paren' : 'operator', value });
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
tokens.push({ type: 'text', value });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return tokens;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Parse an expression string into FormulaToken[] using valid paths and path->label map.
|
|
45
|
+
* Invalid or unknown identifiers are skipped (or could be left as placeholder); only known paths become field tokens.
|
|
46
|
+
*/
|
|
47
|
+
export function parseExpression(expression, validPaths, pathToLabel) {
|
|
48
|
+
var _a;
|
|
49
|
+
const parts = tokenizeExpression(expression).filter(p => p.type !== 'text' || p.value.trim() !== '');
|
|
50
|
+
const tokens = [];
|
|
51
|
+
for (const part of parts) {
|
|
52
|
+
if (part.type === 'text') {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (part.type === 'field') {
|
|
56
|
+
if (validPaths.has(part.value)) {
|
|
57
|
+
tokens.push({
|
|
58
|
+
type: 'field',
|
|
59
|
+
path: part.value,
|
|
60
|
+
label: (_a = pathToLabel.get(part.value)) !== null && _a !== void 0 ? _a : part.value,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (part.type === 'number') {
|
|
66
|
+
tokens.push({ type: 'number', value: part.value });
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (part.type === 'operator') {
|
|
70
|
+
tokens.push({
|
|
71
|
+
type: 'operator',
|
|
72
|
+
value: part.value,
|
|
73
|
+
});
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (part.type === 'paren') {
|
|
77
|
+
tokens.push(part.value === '('
|
|
78
|
+
? { type: 'lparen', value: '(' }
|
|
79
|
+
: { type: 'rparen', value: ')' });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return tokens;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=expression.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expression.utils.js","sourceRoot":"","sources":["../../../src/utils/formula/expression.utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { CalculatedFieldFormat } from '../../interface/types';
|
|
2
|
+
/**
|
|
3
|
+
* Format a calculated formula result for display using advanced settings.
|
|
4
|
+
* Applies rounding, decimal places, thousands/decimal separators, result type (number/currency/percent), and prefix/postfix.
|
|
5
|
+
*/
|
|
6
|
+
export declare function formatCalculatedResult(value: number, format: CalculatedFieldFormat | undefined): string;
|
|
7
|
+
//# sourceMappingURL=format-calculated-result.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-calculated-result.utils.d.ts","sourceRoot":"","sources":["../../../src/utils/formula/format-calculated-result.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAsC9D;;;GAGG;AACH,wBAAgB,sBAAsB,CAClC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,qBAAqB,GAAG,SAAS,GAC1C,MAAM,CAiCR"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
function roundValue(value, decimals, mode) {
|
|
2
|
+
const factor = 10 ** decimals;
|
|
3
|
+
const scaled = value * factor;
|
|
4
|
+
switch (mode) {
|
|
5
|
+
case 'floor':
|
|
6
|
+
return Math.floor(scaled) / factor;
|
|
7
|
+
case 'ceil':
|
|
8
|
+
return Math.ceil(scaled) / factor;
|
|
9
|
+
default:
|
|
10
|
+
return Math.round(scaled) / factor;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function formatIntegerPart(s, thousandsSeparator, decimalSeparator) {
|
|
14
|
+
if (!thousandsSeparator) {
|
|
15
|
+
return s;
|
|
16
|
+
}
|
|
17
|
+
const sep = decimalSeparator === ',' ? '.' : ','; // opposite for thousands
|
|
18
|
+
const parts = [];
|
|
19
|
+
let i = s.length;
|
|
20
|
+
while (i > 0) {
|
|
21
|
+
const start = Math.max(0, i - 3);
|
|
22
|
+
parts.unshift(s.slice(start, i));
|
|
23
|
+
i = start;
|
|
24
|
+
}
|
|
25
|
+
return parts.join(sep);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Format a calculated formula result for display using advanced settings.
|
|
29
|
+
* Applies rounding, decimal places, thousands/decimal separators, result type (number/currency/percent), and prefix/postfix.
|
|
30
|
+
*/
|
|
31
|
+
export function formatCalculatedResult(value, format) {
|
|
32
|
+
if (format == null) {
|
|
33
|
+
return String(value);
|
|
34
|
+
}
|
|
35
|
+
const { decimalSeparator, decimalSeparatorEnabled, decimals, postfixText, prefixText, resultType, roundingMode, thousandsSeparator, } = format;
|
|
36
|
+
let num = value;
|
|
37
|
+
if (resultType === 'percent') {
|
|
38
|
+
num = value * 100;
|
|
39
|
+
}
|
|
40
|
+
const rounded = roundValue(num, decimals, roundingMode);
|
|
41
|
+
const fixed = rounded.toFixed(decimals);
|
|
42
|
+
const [intPart, decPart] = fixed.split('.');
|
|
43
|
+
const decimalSep = decimalSeparatorEnabled ? decimalSeparator : '.';
|
|
44
|
+
const intFormatted = formatIntegerPart(intPart, thousandsSeparator, decimalSep);
|
|
45
|
+
const decSuffix = decimals > 0 ? decimalSep + (decPart !== null && decPart !== void 0 ? decPart : '') : '';
|
|
46
|
+
const numberStr = intFormatted + decSuffix;
|
|
47
|
+
const suffix = resultType === 'percent' ? '%' : '';
|
|
48
|
+
return `${prefixText}${numberStr}${suffix}${postfixText}`;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=format-calculated-result.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-calculated-result.utils.js","sourceRoot":"","sources":["../../../src/utils/formula/format-calculated-result.utils.ts"],"names":[],"mappings":"AAEA,SAAS,UAAU,CACf,KAAa,EACb,QAAgB,EAChB,IAA2C;IAE3C,MAAM,MAAM,GAAG,EAAE,IAAI,QAAQ,CAAC;IAC9B,MAAM,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;IAC9B,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,OAAO;YACR,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;QACvC,KAAK,MAAM;YACP,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;QACtC;YACI,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IAC3C,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CACtB,CAAS,EACT,kBAA2B,EAC3B,gBAA2B;IAE3B,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACtB,OAAO,CAAC,CAAC;IACb,CAAC;IACD,MAAM,GAAG,GAAG,gBAAgB,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,yBAAyB;IAC3E,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACjB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACjC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,GAAG,KAAK,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAClC,KAAa,EACb,MAAyC;IAEzC,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACjB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,EACF,gBAAgB,EAChB,uBAAuB,EACvB,QAAQ,EACR,WAAW,EACX,UAAU,EACV,UAAU,EACV,YAAY,EACZ,kBAAkB,GACrB,GAAG,MAAM,CAAC;IAEX,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC3B,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC;IACtB,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE5C,MAAM,UAAU,GAAG,uBAAuB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC;IACpE,MAAM,YAAY,GAAG,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,EAAE,UAAU,CAAC,CAAC;IAChF,MAAM,SAAS,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnE,MAAM,SAAS,GAAG,YAAY,GAAG,SAAS,CAAC;IAC3C,MAAM,MAAM,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnD,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,WAAW,EAAE,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formula-types.d.ts","sourceRoot":"","sources":["../../../src/utils/formula/formula-types.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formula-types.js","sourceRoot":"","sources":["../../../src/utils/formula/formula-types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from './caret.utils';
|
|
2
|
+
export * from './dom.utils';
|
|
3
|
+
export * from './evaluate-formula.utils';
|
|
4
|
+
export * from './expression.utils';
|
|
5
|
+
export * from './format-calculated-result.utils';
|
|
6
|
+
export * from './formula-types';
|
|
7
|
+
export * from './referenced-paths.utils';
|
|
8
|
+
export * from './render-formula.utils';
|
|
9
|
+
export * from './serialize-formula.utils';
|
|
10
|
+
export * from './validate-formula.utils';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/formula/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kCAAkC,CAAC;AACjD,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from './caret.utils';
|
|
2
|
+
export * from './dom.utils';
|
|
3
|
+
export * from './evaluate-formula.utils';
|
|
4
|
+
export * from './expression.utils';
|
|
5
|
+
export * from './format-calculated-result.utils';
|
|
6
|
+
export * from './formula-types';
|
|
7
|
+
export * from './referenced-paths.utils';
|
|
8
|
+
export * from './render-formula.utils';
|
|
9
|
+
export * from './serialize-formula.utils';
|
|
10
|
+
export * from './validate-formula.utils';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/formula/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kCAAkC,CAAC;AACjD,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { StructuredFormula } from '../../interface/types';
|
|
2
|
+
/**
|
|
3
|
+
* Returns the set of data model field paths referenced in the formula.
|
|
4
|
+
* Used for recalculation scope: only these fields should trigger formula updates.
|
|
5
|
+
*/
|
|
6
|
+
export declare function getReferencedPaths(formula: StructuredFormula | undefined | null): string[];
|
|
7
|
+
//# sourceMappingURL=referenced-paths.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"referenced-paths.utils.d.ts","sourceRoot":"","sources":["../../../src/utils/formula/referenced-paths.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,EAAE,CAW1F"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns the set of data model field paths referenced in the formula.
|
|
3
|
+
* Used for recalculation scope: only these fields should trigger formula updates.
|
|
4
|
+
*/
|
|
5
|
+
export function getReferencedPaths(formula) {
|
|
6
|
+
var _a;
|
|
7
|
+
if (!((_a = formula === null || formula === void 0 ? void 0 : formula.tokens) === null || _a === void 0 ? void 0 : _a.length)) {
|
|
8
|
+
return [];
|
|
9
|
+
}
|
|
10
|
+
const paths = [];
|
|
11
|
+
for (const token of formula.tokens) {
|
|
12
|
+
if (token.type === 'field') {
|
|
13
|
+
paths.push(token.path);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return paths;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=referenced-paths.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"referenced-paths.utils.js","sourceRoot":"","sources":["../../../src/utils/formula/referenced-paths.utils.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAA6C;;IAC5E,IAAI,CAAC,CAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,0CAAE,MAAM,CAAA,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { FormulaToken } from '../../interface/types';
|
|
2
|
+
/**
|
|
3
|
+
* Renders formula tokens to HTML for the read-only preview (e.g. formula box).
|
|
4
|
+
* Uses the same token classes as the modal (dte-formula-token, dte-formula-token-field, etc.).
|
|
5
|
+
*/
|
|
6
|
+
export declare function renderFormulaPreviewHtml(tokens: FormulaToken[]): string;
|
|
7
|
+
export declare function renderFormulaHtml(expression: string, labelMap: Map<string, string>): string;
|
|
8
|
+
//# sourceMappingURL=render-formula.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-formula.utils.d.ts","sourceRoot":"","sources":["../../../src/utils/formula/render-formula.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAIrD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,CAYvE;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAiB3F"}
|