@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.
Files changed (184) hide show
  1. package/README.md +35 -7
  2. package/dist/components/field-config-panel/advanced-settings.d.ts +9 -0
  3. package/dist/components/field-config-panel/advanced-settings.d.ts.map +1 -0
  4. package/dist/components/field-config-panel/advanced-settings.js +17 -0
  5. package/dist/components/field-config-panel/advanced-settings.js.map +1 -0
  6. package/dist/components/field-config-panel/field-config-panel-overlay.d.ts +4 -1
  7. package/dist/components/field-config-panel/field-config-panel-overlay.d.ts.map +1 -1
  8. package/dist/components/field-config-panel/field-config-panel-overlay.js +2 -2
  9. package/dist/components/field-config-panel/field-config-panel-overlay.js.map +1 -1
  10. package/dist/components/field-config-panel/field-config-panel.d.ts +4 -1
  11. package/dist/components/field-config-panel/field-config-panel.d.ts.map +1 -1
  12. package/dist/components/field-config-panel/field-config-panel.js +11 -5
  13. package/dist/components/field-config-panel/field-config-panel.js.map +1 -1
  14. package/dist/components/field-config-panel/field-sidebar.d.ts +13 -0
  15. package/dist/components/field-config-panel/field-sidebar.d.ts.map +1 -0
  16. package/dist/components/field-config-panel/field-sidebar.js +20 -0
  17. package/dist/components/field-config-panel/field-sidebar.js.map +1 -0
  18. package/dist/components/field-config-panel/formula-generator.d.ts +11 -0
  19. package/dist/components/field-config-panel/formula-generator.d.ts.map +1 -0
  20. package/dist/components/field-config-panel/formula-generator.js +51 -0
  21. package/dist/components/field-config-panel/formula-generator.js.map +1 -0
  22. package/dist/components/field-config-panel/formula-modal.d.ts +12 -0
  23. package/dist/components/field-config-panel/formula-modal.d.ts.map +1 -0
  24. package/dist/components/field-config-panel/formula-modal.js +99 -0
  25. package/dist/components/field-config-panel/formula-modal.js.map +1 -0
  26. package/dist/components/field-config-panel/formula-workspace.d.ts +23 -0
  27. package/dist/components/field-config-panel/formula-workspace.d.ts.map +1 -0
  28. package/dist/components/field-config-panel/formula-workspace.js +28 -0
  29. package/dist/components/field-config-panel/formula-workspace.js.map +1 -0
  30. package/dist/components/field-config-panel/result-type-selector.d.ts +9 -0
  31. package/dist/components/field-config-panel/result-type-selector.d.ts.map +1 -0
  32. package/dist/components/field-config-panel/result-type-selector.js +10 -0
  33. package/dist/components/field-config-panel/result-type-selector.js.map +1 -0
  34. package/dist/components/field-sidebar/calculated-field-type-list.d.ts +9 -0
  35. package/dist/components/field-sidebar/calculated-field-type-list.d.ts.map +1 -0
  36. package/dist/components/field-sidebar/calculated-field-type-list.js +12 -0
  37. package/dist/components/field-sidebar/calculated-field-type-list.js.map +1 -0
  38. package/dist/components/field-sidebar/data-model-field-type-list.d.ts +0 -1
  39. package/dist/components/field-sidebar/data-model-field-type-list.d.ts.map +1 -1
  40. package/dist/components/field-sidebar/data-model-field-type-list.js +8 -7
  41. package/dist/components/field-sidebar/data-model-field-type-list.js.map +1 -1
  42. package/dist/components/field-sidebar/field-menu-group.d.ts +11 -0
  43. package/dist/components/field-sidebar/field-menu-group.d.ts.map +1 -0
  44. package/dist/components/field-sidebar/field-menu-group.js +6 -0
  45. package/dist/components/field-sidebar/field-menu-group.js.map +1 -0
  46. package/dist/components/field-sidebar/field-sidebar.d.ts.map +1 -1
  47. package/dist/components/field-sidebar/field-sidebar.js +6 -15
  48. package/dist/components/field-sidebar/field-sidebar.js.map +1 -1
  49. package/dist/components/field-sidebar/fillable-field-type-list.d.ts +0 -1
  50. package/dist/components/field-sidebar/fillable-field-type-list.d.ts.map +1 -1
  51. package/dist/components/field-sidebar/fillable-field-type-list.js +8 -9
  52. package/dist/components/field-sidebar/fillable-field-type-list.js.map +1 -1
  53. package/dist/components/pdf-editor/pdf-editor.d.ts.map +1 -1
  54. package/dist/components/pdf-editor/pdf-editor.js +1 -1
  55. package/dist/components/pdf-editor/pdf-editor.js.map +1 -1
  56. package/dist/components/pdf-fields-overlay/pdf-overlay-field-calculated.d.ts +8 -0
  57. package/dist/components/pdf-fields-overlay/pdf-overlay-field-calculated.d.ts.map +1 -0
  58. package/dist/components/pdf-fields-overlay/pdf-overlay-field-calculated.js +5 -0
  59. package/dist/components/pdf-fields-overlay/pdf-overlay-field-calculated.js.map +1 -0
  60. package/dist/components/pdf-fields-overlay/pdf-overlay-field.d.ts.map +1 -1
  61. package/dist/components/pdf-fields-overlay/pdf-overlay-field.js +2 -1
  62. package/dist/components/pdf-fields-overlay/pdf-overlay-field.js.map +1 -1
  63. package/dist/components/pdf-view/pdf-view-calculated.d.ts +9 -0
  64. package/dist/components/pdf-view/pdf-view-calculated.d.ts.map +1 -0
  65. package/dist/components/pdf-view/pdf-view-calculated.js +18 -0
  66. package/dist/components/pdf-view/pdf-view-calculated.js.map +1 -0
  67. package/dist/components/pdf-view/pdf-view.d.ts.map +1 -1
  68. package/dist/components/pdf-view/pdf-view.js +2 -1
  69. package/dist/components/pdf-view/pdf-view.js.map +1 -1
  70. package/dist/constants/field.constants.d.ts +3 -2
  71. package/dist/constants/field.constants.d.ts.map +1 -1
  72. package/dist/constants/field.constants.js +6 -0
  73. package/dist/constants/field.constants.js.map +1 -1
  74. package/dist/constants/menu-group.d.ts +8 -0
  75. package/dist/constants/menu-group.d.ts.map +1 -0
  76. package/dist/constants/menu-group.js +20 -0
  77. package/dist/constants/menu-group.js.map +1 -0
  78. package/dist/hooks/index.d.ts +1 -0
  79. package/dist/hooks/index.d.ts.map +1 -1
  80. package/dist/hooks/index.js +1 -0
  81. package/dist/hooks/index.js.map +1 -1
  82. package/dist/hooks/useFormulaEditor.d.ts +22 -0
  83. package/dist/hooks/useFormulaEditor.d.ts.map +1 -0
  84. package/dist/hooks/useFormulaEditor.js +290 -0
  85. package/dist/hooks/useFormulaEditor.js.map +1 -0
  86. package/dist/hooks/usePdfFieldDnD.d.ts.map +1 -1
  87. package/dist/hooks/usePdfFieldDnD.js +3 -0
  88. package/dist/hooks/usePdfFieldDnD.js.map +1 -1
  89. package/dist/interface/types.d.ts +45 -3
  90. package/dist/interface/types.d.ts.map +1 -1
  91. package/dist/interface/types.js +3 -0
  92. package/dist/interface/types.js.map +1 -1
  93. package/dist/utils/data-model/extract-fields.utils.d.ts +5 -5
  94. package/dist/utils/data-model/extract-fields.utils.d.ts.map +1 -1
  95. package/dist/utils/data-model/extract-fields.utils.js +42 -8
  96. package/dist/utils/data-model/extract-fields.utils.js.map +1 -1
  97. package/dist/utils/formula/caret.utils.d.ts +3 -0
  98. package/dist/utils/formula/caret.utils.d.ts.map +1 -0
  99. package/dist/utils/formula/caret.utils.js +123 -0
  100. package/dist/utils/formula/caret.utils.js.map +1 -0
  101. package/dist/utils/formula/dom.utils.d.ts +4 -0
  102. package/dist/utils/formula/dom.utils.d.ts.map +1 -0
  103. package/dist/utils/formula/dom.utils.js +34 -0
  104. package/dist/utils/formula/dom.utils.js.map +1 -0
  105. package/dist/utils/formula/evaluate-formula.utils.d.ts +13 -0
  106. package/dist/utils/formula/evaluate-formula.utils.d.ts.map +1 -0
  107. package/dist/utils/formula/evaluate-formula.utils.js +134 -0
  108. package/dist/utils/formula/evaluate-formula.utils.js.map +1 -0
  109. package/dist/utils/formula/expression.utils.d.ts +18 -0
  110. package/dist/utils/formula/expression.utils.d.ts.map +1 -0
  111. package/dist/utils/formula/expression.utils.js +84 -0
  112. package/dist/utils/formula/expression.utils.js.map +1 -0
  113. package/dist/utils/formula/format-calculated-result.utils.d.ts +7 -0
  114. package/dist/utils/formula/format-calculated-result.utils.d.ts.map +1 -0
  115. package/dist/utils/formula/format-calculated-result.utils.js +50 -0
  116. package/dist/utils/formula/format-calculated-result.utils.js.map +1 -0
  117. package/dist/utils/formula/formula-types.d.ts +3 -0
  118. package/dist/utils/formula/formula-types.d.ts.map +1 -0
  119. package/dist/utils/formula/formula-types.js +2 -0
  120. package/dist/utils/formula/formula-types.js.map +1 -0
  121. package/dist/utils/formula/index.d.ts +11 -0
  122. package/dist/utils/formula/index.d.ts.map +1 -0
  123. package/dist/utils/formula/index.js +11 -0
  124. package/dist/utils/formula/index.js.map +1 -0
  125. package/dist/utils/formula/referenced-paths.utils.d.ts +7 -0
  126. package/dist/utils/formula/referenced-paths.utils.d.ts.map +1 -0
  127. package/dist/utils/formula/referenced-paths.utils.js +18 -0
  128. package/dist/utils/formula/referenced-paths.utils.js.map +1 -0
  129. package/dist/utils/formula/render-formula.utils.d.ts +8 -0
  130. package/dist/utils/formula/render-formula.utils.d.ts.map +1 -0
  131. package/dist/utils/formula/render-formula.utils.js +39 -0
  132. package/dist/utils/formula/render-formula.utils.js.map +1 -0
  133. package/dist/utils/formula/serialize-formula.utils.d.ts +14 -0
  134. package/dist/utils/formula/serialize-formula.utils.d.ts.map +1 -0
  135. package/dist/utils/formula/serialize-formula.utils.js +33 -0
  136. package/dist/utils/formula/serialize-formula.utils.js.map +1 -0
  137. package/dist/utils/formula/validate-formula.utils.d.ts +11 -0
  138. package/dist/utils/formula/validate-formula.utils.d.ts.map +1 -0
  139. package/dist/utils/formula/validate-formula.utils.js +79 -0
  140. package/dist/utils/formula/validate-formula.utils.js.map +1 -0
  141. package/dist/utils/index.d.ts +1 -0
  142. package/dist/utils/index.d.ts.map +1 -1
  143. package/dist/utils/index.js +1 -0
  144. package/dist/utils/index.js.map +1 -1
  145. package/package.json +2 -2
  146. package/src/components/field-config-panel/advanced-settings.tsx +113 -0
  147. package/src/components/field-config-panel/field-config-panel-overlay.tsx +8 -1
  148. package/src/components/field-config-panel/field-config-panel.tsx +43 -15
  149. package/src/components/field-config-panel/field-sidebar.tsx +91 -0
  150. package/src/components/field-config-panel/formula-generator.tsx +122 -0
  151. package/src/components/field-config-panel/formula-modal.tsx +229 -0
  152. package/src/components/field-config-panel/formula-workspace.tsx +116 -0
  153. package/src/components/field-config-panel/result-type-selector.tsx +34 -0
  154. package/src/components/field-sidebar/calculated-field-type-list.tsx +29 -0
  155. package/src/components/field-sidebar/data-model-field-type-list.tsx +10 -4
  156. package/src/components/field-sidebar/field-menu-group.tsx +36 -0
  157. package/src/components/field-sidebar/field-sidebar.tsx +14 -55
  158. package/src/components/field-sidebar/fillable-field-type-list.tsx +11 -9
  159. package/src/components/pdf-editor/pdf-editor.tsx +2 -0
  160. package/src/components/pdf-fields-overlay/pdf-overlay-field-calculated.tsx +15 -0
  161. package/src/components/pdf-fields-overlay/pdf-overlay-field.tsx +2 -0
  162. package/src/components/pdf-view/pdf-view-calculated.tsx +23 -0
  163. package/src/components/pdf-view/pdf-view.tsx +4 -0
  164. package/src/constants/field.constants.ts +9 -2
  165. package/src/constants/menu-group.ts +26 -0
  166. package/src/hooks/index.ts +1 -0
  167. package/src/hooks/useFormulaEditor.ts +336 -0
  168. package/src/hooks/usePdfFieldDnD.ts +4 -0
  169. package/src/interface/types.ts +38 -2
  170. package/src/styles/formula-modal.css +307 -0
  171. package/src/styles/index.css +1 -0
  172. package/src/utils/data-model/extract-fields.utils.ts +65 -7
  173. package/src/utils/formula/caret.utils.ts +125 -0
  174. package/src/utils/formula/dom.utils.ts +35 -0
  175. package/src/utils/formula/evaluate-formula.utils.ts +159 -0
  176. package/src/utils/formula/expression.utils.ts +99 -0
  177. package/src/utils/formula/format-calculated-result.utils.ts +79 -0
  178. package/src/utils/formula/formula-types.ts +2 -0
  179. package/src/utils/formula/index.ts +10 -0
  180. package/src/utils/formula/referenced-paths.utils.ts +18 -0
  181. package/src/utils/formula/render-formula.utils.ts +40 -0
  182. package/src/utils/formula/serialize-formula.utils.ts +40 -0
  183. package/src/utils/formula/validate-formula.utils.ts +94 -0
  184. 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,4 @@
1
+ export declare const escapeHtml: (value: string) => string;
2
+ export declare function readExpressionFromEditor(node: HTMLElement): string;
3
+ export declare function placeCaretAtEnd(element: HTMLElement): void;
4
+ //# sourceMappingURL=dom.utils.d.ts.map
@@ -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, '&amp;')
3
+ .replace(/</g, '&lt;')
4
+ .replace(/>/g, '&gt;')
5
+ .replace(/"/g, '&quot;')
6
+ .replace(/'/g, '&#039;');
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,3 @@
1
+ export type { FormulaOperator, FormulaToken, StructuredFormula } from '../../interface/types';
2
+ export { FORMULA_OPERATORS } from '../../interface/types';
3
+ //# sourceMappingURL=formula-types.d.ts.map
@@ -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,2 @@
1
+ export { FORMULA_OPERATORS } from '../../interface/types';
2
+ //# sourceMappingURL=formula-types.js.map
@@ -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"}