@servicetitan/dte-pdf-editor 1.16.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 +11 -6
- 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/useFieldDrag.d.ts +9 -2
- package/dist/hooks/useFieldDrag.d.ts.map +1 -1
- package/dist/hooks/useFieldDrag.js +60 -8
- package/dist/hooks/useFieldDrag.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 +19 -3
- 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 +10 -5
- 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/useFieldDrag.ts +84 -8
- package/src/hooks/useFormulaEditor.ts +336 -0
- package/src/hooks/usePdfFieldDnD.ts +36 -14
- package/src/interface/types.ts +38 -2
- package/src/styles/formula-modal.css +307 -0
- package/src/styles/index.css +1 -0
- package/src/styles/pdf-field-overlay.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
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export declare enum FieldTypeEnum {
|
|
2
2
|
dataModel = "dataModel",
|
|
3
3
|
eSign = "eSign",
|
|
4
|
-
fillable = "fillable"
|
|
4
|
+
fillable = "fillable",
|
|
5
|
+
calculated = "calculated"
|
|
5
6
|
}
|
|
6
7
|
export declare enum ESignFieldType {
|
|
7
8
|
signature = "signature",
|
|
@@ -10,10 +11,11 @@ export declare enum ESignFieldType {
|
|
|
10
11
|
fullName = "fullName"
|
|
11
12
|
}
|
|
12
13
|
export type FillableFieldType = 'text' | 'date' | 'checkbox' | 'radio' | 'number';
|
|
14
|
+
export type PdfFieldSubType = FillableFieldType | ESignFieldType;
|
|
13
15
|
export interface PdfField {
|
|
14
16
|
id: string;
|
|
15
17
|
type: FieldTypeEnum;
|
|
16
|
-
subType?:
|
|
18
|
+
subType?: PdfFieldSubType;
|
|
17
19
|
x: number;
|
|
18
20
|
y: number;
|
|
19
21
|
page: number;
|
|
@@ -24,22 +26,62 @@ export interface PdfField {
|
|
|
24
26
|
path?: string;
|
|
25
27
|
recipient?: string;
|
|
26
28
|
description?: string;
|
|
29
|
+
formula?: StructuredFormula;
|
|
30
|
+
formulaFormat?: CalculatedFieldFormat;
|
|
27
31
|
}
|
|
28
32
|
export interface FieldTypeOption {
|
|
29
33
|
label: string;
|
|
30
34
|
type: FieldTypeEnum;
|
|
31
|
-
subType?:
|
|
35
|
+
subType?: PdfFieldSubType;
|
|
32
36
|
path?: string;
|
|
33
37
|
}
|
|
34
38
|
export interface DataModelFieldGroup {
|
|
35
39
|
groupName: string;
|
|
36
40
|
fields: FieldTypeOption[];
|
|
37
41
|
}
|
|
42
|
+
/** Supported formula operators */
|
|
43
|
+
export declare const FORMULA_OPERATORS: string[];
|
|
44
|
+
export type FormulaOperator = (typeof FORMULA_OPERATORS)[number];
|
|
45
|
+
/** Single token in a structured formula (number, operator, paren, or field reference) */
|
|
46
|
+
export type FormulaToken = {
|
|
47
|
+
type: 'number';
|
|
48
|
+
value: string;
|
|
49
|
+
} | {
|
|
50
|
+
type: 'operator';
|
|
51
|
+
value: FormulaOperator;
|
|
52
|
+
} | {
|
|
53
|
+
type: 'lparen';
|
|
54
|
+
value: '(';
|
|
55
|
+
} | {
|
|
56
|
+
type: 'rparen';
|
|
57
|
+
value: ')';
|
|
58
|
+
} | {
|
|
59
|
+
type: 'field';
|
|
60
|
+
path: string;
|
|
61
|
+
label: string;
|
|
62
|
+
};
|
|
63
|
+
/** Structured formula representation (AST-like token list) for validation and safe editing */
|
|
64
|
+
export interface StructuredFormula {
|
|
65
|
+
tokens: FormulaToken[];
|
|
66
|
+
}
|
|
67
|
+
/** Format options for a calculated field result (display and rounding) */
|
|
68
|
+
export interface CalculatedFieldFormat {
|
|
69
|
+
resultType: 'number' | 'currency' | 'percent';
|
|
70
|
+
thousandsSeparator: boolean;
|
|
71
|
+
decimals: number;
|
|
72
|
+
roundingMode: 'round' | 'floor' | 'ceil';
|
|
73
|
+
decimalSeparatorEnabled: boolean;
|
|
74
|
+
decimalSeparator: '.' | ',';
|
|
75
|
+
prefixText: string;
|
|
76
|
+
postfixText: string;
|
|
77
|
+
}
|
|
38
78
|
export interface SchemaFieldBaseOptions {
|
|
39
79
|
placeholder?: any;
|
|
40
80
|
description?: any;
|
|
41
81
|
sampleData?: any;
|
|
42
82
|
showInEditor?: boolean;
|
|
83
|
+
useInCalculatedFields?: boolean;
|
|
84
|
+
useInConditionals?: boolean;
|
|
43
85
|
isHighlighted?: boolean;
|
|
44
86
|
}
|
|
45
87
|
interface SchemaNodeProps {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/interface/types.ts"],"names":[],"mappings":"AAAA,oBAAY,aAAa;IACrB,SAAS,cAAc;IACvB,KAAK,UAAU;IACf,QAAQ,aAAa;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/interface/types.ts"],"names":[],"mappings":"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"}
|
package/dist/interface/types.js
CHANGED
|
@@ -3,6 +3,7 @@ export var FieldTypeEnum;
|
|
|
3
3
|
FieldTypeEnum["dataModel"] = "dataModel";
|
|
4
4
|
FieldTypeEnum["eSign"] = "eSign";
|
|
5
5
|
FieldTypeEnum["fillable"] = "fillable";
|
|
6
|
+
FieldTypeEnum["calculated"] = "calculated";
|
|
6
7
|
})(FieldTypeEnum || (FieldTypeEnum = {}));
|
|
7
8
|
export var ESignFieldType;
|
|
8
9
|
(function (ESignFieldType) {
|
|
@@ -11,4 +12,6 @@ export var ESignFieldType;
|
|
|
11
12
|
ESignFieldType["dateSigned"] = "dateSigned";
|
|
12
13
|
ESignFieldType["fullName"] = "fullName";
|
|
13
14
|
})(ESignFieldType || (ESignFieldType = {}));
|
|
15
|
+
/** Supported formula operators */
|
|
16
|
+
export const FORMULA_OPERATORS = ['+', '-', '*', '/'];
|
|
14
17
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/interface/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/interface/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,aAKX;AALD,WAAY,aAAa;IACrB,wCAAuB,CAAA;IACvB,gCAAe,CAAA;IACf,sCAAqB,CAAA;IACrB,0CAAyB,CAAA;AAC7B,CAAC,EALW,aAAa,KAAb,aAAa,QAKxB;AAED,MAAM,CAAN,IAAY,cAKX;AALD,WAAY,cAAc;IACtB,yCAAuB,CAAA;IACvB,uCAAqB,CAAA;IACrB,2CAAyB,CAAA;IACzB,uCAAqB,CAAA;AACzB,CAAC,EALW,cAAc,KAAd,cAAc,QAKzB;AAoCD,kCAAkC;AAClC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DataModelFieldGroup, SchemaObject } from '../../interface/types';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export declare const extractGroupedFieldsFromDataModel: (dataModel: SchemaObject) => DataModelFieldGroup[];
|
|
2
|
+
export interface ExtractGroupedFieldsOptions {
|
|
3
|
+
/** When true, only include fields with SchemaFieldBaseOptions.useInCalculatedFields === true */
|
|
4
|
+
onlyUseInCalculatedFields?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare const extractGroupedFieldsFromDataModel: (dataModel: SchemaObject, options?: ExtractGroupedFieldsOptions) => DataModelFieldGroup[];
|
|
7
7
|
//# sourceMappingURL=extract-fields.utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-fields.utils.d.ts","sourceRoot":"","sources":["../../../src/utils/data-model/extract-fields.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,mBAAmB,
|
|
1
|
+
{"version":3,"file":"extract-fields.utils.d.ts","sourceRoot":"","sources":["../../../src/utils/data-model/extract-fields.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,mBAAmB,EAInB,YAAY,EAEf,MAAM,uBAAuB,CAAC;AAU/B,MAAM,WAAW,2BAA2B;IACxC,gGAAgG;IAChG,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACvC;AAQD,eAAO,MAAM,iCAAiC,GAC1C,WAAW,YAAY,EACvB,UAAU,2BAA2B,KACtC,mBAAmB,EAyDrB,CAAC"}
|
|
@@ -1,19 +1,29 @@
|
|
|
1
1
|
import { FieldTypeEnum, } from '../../interface/types';
|
|
2
|
+
function isSchemaSimpleNumber(node) {
|
|
3
|
+
return node.type === 'number';
|
|
4
|
+
}
|
|
5
|
+
function useInCalculatedFields(node) {
|
|
6
|
+
var _a;
|
|
7
|
+
return ((_a = node.options) === null || _a === void 0 ? void 0 : _a.useInCalculatedFields) === true;
|
|
8
|
+
}
|
|
2
9
|
/**
|
|
3
10
|
* Utility function to extract grouped fields from DataModel structure
|
|
4
11
|
* Filters out array types and only processes object properties, generating correct paths for data replacement
|
|
5
12
|
*/
|
|
6
|
-
|
|
13
|
+
const DEFAULT_GROUP_NAME = 'Fields';
|
|
14
|
+
export const extractGroupedFieldsFromDataModel = (dataModel, options) => {
|
|
15
|
+
const onlyUseInCalculatedFields = (options === null || options === void 0 ? void 0 : options.onlyUseInCalculatedFields) === true;
|
|
7
16
|
const groups = [];
|
|
17
|
+
const topLevelFields = [];
|
|
8
18
|
if (!(dataModel === null || dataModel === void 0 ? void 0 : dataModel.properties)) {
|
|
9
19
|
return groups;
|
|
10
20
|
}
|
|
11
21
|
Object.keys(dataModel.properties).forEach(key => {
|
|
12
|
-
var _a;
|
|
22
|
+
var _a, _b;
|
|
13
23
|
const property = dataModel.properties[key];
|
|
14
24
|
if (property.type === 'object' && property.properties) {
|
|
15
25
|
const fields = [];
|
|
16
|
-
extractFieldsRecursive(property.properties, key, fields, key);
|
|
26
|
+
extractFieldsRecursive(property.properties, key, fields, key, onlyUseInCalculatedFields);
|
|
17
27
|
if (fields.length > 0) {
|
|
18
28
|
groups.push({
|
|
19
29
|
groupName: (_a = property.title) !== null && _a !== void 0 ? _a : key,
|
|
@@ -24,20 +34,44 @@ export const extractGroupedFieldsFromDataModel = (dataModel) => {
|
|
|
24
34
|
else if (property.type === 'array' && property.items) {
|
|
25
35
|
// Skip array types - filter them out from the data model
|
|
26
36
|
}
|
|
37
|
+
else {
|
|
38
|
+
// First-level simple field (string, number, boolean) – add under default group
|
|
39
|
+
const rawType = property.type;
|
|
40
|
+
const isLeaf = property.type === 'string' ||
|
|
41
|
+
isSchemaSimpleNumber(property) ||
|
|
42
|
+
rawType === 'boolean';
|
|
43
|
+
const includeField = !onlyUseInCalculatedFields || useInCalculatedFields(property);
|
|
44
|
+
if (isLeaf && includeField) {
|
|
45
|
+
topLevelFields.push({
|
|
46
|
+
label: (_b = property.title) !== null && _b !== void 0 ? _b : key,
|
|
47
|
+
type: FieldTypeEnum.dataModel,
|
|
48
|
+
path: key,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
27
52
|
});
|
|
53
|
+
if (topLevelFields.length > 0) {
|
|
54
|
+
groups.unshift({
|
|
55
|
+
groupName: DEFAULT_GROUP_NAME,
|
|
56
|
+
fields: topLevelFields,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
28
59
|
return groups;
|
|
29
60
|
};
|
|
30
61
|
// Recursive function to extract fields from nested structures
|
|
31
|
-
const extractFieldsRecursive = (properties, basePath, fields, groupName) => {
|
|
62
|
+
const extractFieldsRecursive = (properties, basePath, fields, groupName, onlyUseInCalculatedFields) => {
|
|
32
63
|
Object.keys(properties).forEach(fieldKey => {
|
|
33
64
|
var _a;
|
|
34
65
|
const fieldProperty = properties[fieldKey];
|
|
35
66
|
const currentPath = basePath.includes('[]')
|
|
36
67
|
? `${basePath}.${fieldKey}`
|
|
37
68
|
: `${basePath}.${fieldKey}`;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
fieldProperty
|
|
69
|
+
const rawType = fieldProperty.type;
|
|
70
|
+
const isLeaf = fieldProperty.type === 'string' ||
|
|
71
|
+
isSchemaSimpleNumber(fieldProperty) ||
|
|
72
|
+
rawType === 'boolean';
|
|
73
|
+
const includeField = !onlyUseInCalculatedFields || useInCalculatedFields(fieldProperty);
|
|
74
|
+
if (isLeaf && includeField) {
|
|
41
75
|
// Leaf property - add as a field
|
|
42
76
|
const label = (_a = fieldProperty.title) !== null && _a !== void 0 ? _a : fieldKey;
|
|
43
77
|
fields.push({
|
|
@@ -47,7 +81,7 @@ const extractFieldsRecursive = (properties, basePath, fields, groupName) => {
|
|
|
47
81
|
});
|
|
48
82
|
}
|
|
49
83
|
else if (fieldProperty.type === 'object' && fieldProperty.properties) {
|
|
50
|
-
extractFieldsRecursive(fieldProperty.properties, currentPath, fields, groupName);
|
|
84
|
+
extractFieldsRecursive(fieldProperty.properties, currentPath, fields, groupName, onlyUseInCalculatedFields);
|
|
51
85
|
}
|
|
52
86
|
else if (fieldProperty.type === 'array' && fieldProperty.items) {
|
|
53
87
|
// Skip array types - filter them out from the data model
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-fields.utils.js","sourceRoot":"","sources":["../../../src/utils/data-model/extract-fields.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,aAAa,
|
|
1
|
+
{"version":3,"file":"extract-fields.utils.js","sourceRoot":"","sources":["../../../src/utils/data-model/extract-fields.utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caret.utils.d.ts","sourceRoot":"","sources":["../../../src/utils/formula/caret.utils.ts"],"names":[],"mappings":"AAgEA,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAEpE;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAwDnF"}
|
|
@@ -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"}
|