@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
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @servicetitan/dte-pdf-editor
|
|
2
2
|
|
|
3
|
-
A React component library for creating interactive PDF editors with drag-and-drop field placement, data model integration, e-signature support,
|
|
3
|
+
A React component library for creating interactive PDF editors with drag-and-drop field placement, data model integration, e-signature support, fillable form fields, and calculated fields with formulas.
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
@@ -8,11 +8,19 @@ A React component library for creating interactive PDF editors with drag-and-dro
|
|
|
8
8
|
- 🎯 **Drag & Drop Field Placement**: Intuitively place fields on PDF pages by dragging from a sidebar
|
|
9
9
|
- 📊 **Data Model Integration**: Connect fields to structured data models using JSON Schema
|
|
10
10
|
- ✍️ **E-Signature Support**: Add signature, initials, date signed, and full name fields
|
|
11
|
-
- 📝 **Fillable Fields**: Support for text, date, checkbox, and radio button inputs
|
|
11
|
+
- 📝 **Fillable Fields**: Support for text, number, date, checkbox, and radio button inputs
|
|
12
|
+
- 🧮 **Calculated Fields**: Formula-based fields with validation, autosuggest, and advanced formatting (number, currency, percent, rounding, separators)
|
|
12
13
|
- 👥 **Multi-Recipient Support**: Assign fields to different recipients with color-coded visualization
|
|
13
|
-
- ⚙️ **Field Configuration**: Configure field properties including position, size, label, and
|
|
14
|
+
- ⚙️ **Field Configuration**: Configure field properties including position, size, label, recipient assignment, and formula/format for calculated fields
|
|
14
15
|
- 👁️ **View Mode**: Display PDFs with filled data in a read-only or interactive view mode
|
|
15
16
|
|
|
17
|
+
### Recent changes (vs master)
|
|
18
|
+
|
|
19
|
+
- **Calculated fields**: New field type `calculated` with formula editor (validation, autosuggest from data model and document fillable fields), and advanced formatting (number/currency/percent, rounding, decimals, thousands/decimal separators, prefix/postfix).
|
|
20
|
+
- **PdfField**: Added `description`, `formula`, and `formulaFormat`; `subType` is now `PdfFieldSubType` (includes `number` for fillable).
|
|
21
|
+
- **Fillable fields**: Added `number` subType; required checkbox shown in config panel (except for checkbox fields).
|
|
22
|
+
- **Schema**: Optional `useInCalculatedFields` and `useInConditionals` in field options for formula/conditional extraction.
|
|
23
|
+
|
|
16
24
|
## Installation
|
|
17
25
|
|
|
18
26
|
```bash
|
|
@@ -144,7 +152,7 @@ Represents a field placed on a PDF document.
|
|
|
144
152
|
interface PdfField {
|
|
145
153
|
id: string;
|
|
146
154
|
type: FieldTypeEnum;
|
|
147
|
-
subType?:
|
|
155
|
+
subType?: PdfFieldSubType;
|
|
148
156
|
x: number;
|
|
149
157
|
y: number;
|
|
150
158
|
page: number;
|
|
@@ -154,6 +162,9 @@ interface PdfField {
|
|
|
154
162
|
required?: boolean;
|
|
155
163
|
path?: string;
|
|
156
164
|
recipient?: string;
|
|
165
|
+
description?: string;
|
|
166
|
+
formula?: StructuredFormula; // for calculated fields
|
|
167
|
+
formulaFormat?: CalculatedFieldFormat; // for calculated fields
|
|
157
168
|
}
|
|
158
169
|
```
|
|
159
170
|
|
|
@@ -164,6 +175,7 @@ Enumeration of field types:
|
|
|
164
175
|
- `dataModel`: Field connected to a data model schema
|
|
165
176
|
- `eSign`: E-signature field
|
|
166
177
|
- `fillable`: User-fillable form field
|
|
178
|
+
- `calculated`: Formula-based calculated field
|
|
167
179
|
|
|
168
180
|
### ESignFieldType
|
|
169
181
|
|
|
@@ -174,15 +186,29 @@ Types of e-signature fields:
|
|
|
174
186
|
- `dateSigned`: Date signed field
|
|
175
187
|
- `fullName`: Full name field
|
|
176
188
|
|
|
189
|
+
### PdfFieldSubType
|
|
190
|
+
|
|
191
|
+
Union of fillable and e-sign sub-types: `FillableFieldType | ESignFieldType`. Used for `PdfField.subType` and `FieldTypeOption.subType`.
|
|
192
|
+
|
|
177
193
|
### FillableFieldType
|
|
178
194
|
|
|
179
195
|
Types of fillable fields:
|
|
180
196
|
|
|
181
197
|
- `text`: Text input
|
|
198
|
+
- `number`: Number input
|
|
182
199
|
- `date`: Date picker
|
|
183
200
|
- `checkbox`: Checkbox
|
|
184
201
|
- `radio`: Radio button
|
|
185
202
|
|
|
203
|
+
### Calculated Fields (formula & format)
|
|
204
|
+
|
|
205
|
+
Calculated fields use a structured formula and optional display format:
|
|
206
|
+
|
|
207
|
+
- **StructuredFormula**: Token list (numbers, operators `+ - * /`, parentheses, field references) used for validation and safe editing.
|
|
208
|
+
- **CalculatedFieldFormat**: Controls result display: `resultType` (`number` | `currency` | `percent`), rounding mode, decimal places, thousands/decimal separators, prefix/postfix text.
|
|
209
|
+
|
|
210
|
+
Schema fields can opt in via `options.useInCalculatedFields` and `options.useInConditionals` for data model extraction in formula builder and conditionals.
|
|
211
|
+
|
|
186
212
|
### SchemaObject
|
|
187
213
|
|
|
188
214
|
JSON Schema object defining the data model structure. Supports nested objects, arrays, and various string subtypes (string, text, html, image).
|
|
@@ -331,9 +357,10 @@ function PdfEditorPage() {
|
|
|
331
357
|
### Adding Fields
|
|
332
358
|
|
|
333
359
|
Fields are added by dragging from the sidebar onto the PDF canvas. The sidebar displays:
|
|
334
|
-
- **Data Model Fields**: Grouped by schema structure
|
|
360
|
+
- **Data Model Fields (Merge Tags)**: Grouped by schema structure
|
|
335
361
|
- **E-Sign Fields**: Signature, initials, date signed, full name
|
|
336
|
-
- **Fillable Fields**: Text, date, checkbox, radio
|
|
362
|
+
- **Fillable Fields**: Text, number, date, checkbox, radio
|
|
363
|
+
- **Calculated Fields**: Formula-based fields (configure formula and format in the config panel)
|
|
337
364
|
|
|
338
365
|
### Configuring Fields
|
|
339
366
|
|
|
@@ -341,8 +368,9 @@ Click on a field to open the configuration panel where you can:
|
|
|
341
368
|
- Change the label
|
|
342
369
|
- Adjust position and size
|
|
343
370
|
- Assign a recipient
|
|
344
|
-
- Set required status
|
|
371
|
+
- Set required status (fillable fields, except checkbox)
|
|
345
372
|
- Update the data model path
|
|
373
|
+
- For **calculated fields**: edit formula (with validation and autosuggest from data model + fillable fields), set result type (number/currency/percent), rounding, decimals, and separators
|
|
346
374
|
|
|
347
375
|
### Moving and Resizing
|
|
348
376
|
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Dispatch, FC, SetStateAction } from 'react';
|
|
2
|
+
import { CalculatedFieldFormat } from '../../interface/types';
|
|
3
|
+
interface AdvancedSettingsProps {
|
|
4
|
+
format: CalculatedFieldFormat;
|
|
5
|
+
setFormat: Dispatch<SetStateAction<CalculatedFieldFormat>>;
|
|
6
|
+
}
|
|
7
|
+
export declare const AdvancedSettings: FC<AdvancedSettingsProps>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=advanced-settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advanced-settings.d.ts","sourceRoot":"","sources":["../../../src/components/field-config-panel/advanced-settings.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,UAAU,qBAAqB;IAC3B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,SAAS,EAAE,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,CAAC;CAC9D;AAQD,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CAiGtD,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button, Flex, Text } from '@servicetitan/anvil2';
|
|
3
|
+
const ROUNDING_OPTIONS = [
|
|
4
|
+
{ label: 'Round', value: 'round' },
|
|
5
|
+
{ label: 'Floor', value: 'floor' },
|
|
6
|
+
{ label: 'Ceil', value: 'ceil' },
|
|
7
|
+
];
|
|
8
|
+
export const AdvancedSettings = ({ format, setFormat }) => (_jsxs("div", { className: "dte-formula-advanced", children: [_jsx(Text, { variant: "body", size: "small", children: "Rounding mode" }), _jsx(Flex, { gap: 1, children: ROUNDING_OPTIONS.map(({ label, value }) => (_jsx(Button, { appearance: format.roundingMode === value ? 'primary' : 'secondary', size: "small", onClick: () => setFormat(prev => ({ ...prev, roundingMode: value })), children: label }, value))) }), _jsxs(Flex, { alignItems: "center", justifyContent: "space-between", className: "dte-formula-advanced-row", children: [_jsx(Text, { variant: "body", size: "small", children: "Decimal places" }), _jsx(Text, { variant: "body", size: "small", className: "dte-formula-advanced-value", children: format.decimals })] }), _jsx("input", { type: "range", className: "dte-formula-advanced-range", min: 0, max: 10, value: format.decimals, onChange: e => setFormat(prev => ({
|
|
9
|
+
...prev,
|
|
10
|
+
decimals: Number(e.target.value),
|
|
11
|
+
})) }), _jsxs("label", { className: "dte-formula-advanced-checkbox", children: [_jsx("input", { type: "checkbox", checked: format.thousandsSeparator, onChange: e => setFormat(prev => ({
|
|
12
|
+
...prev,
|
|
13
|
+
thousandsSeparator: e.target.checked,
|
|
14
|
+
decimalSeparatorEnabled: e.target.checked,
|
|
15
|
+
decimalSeparator: e.target.checked ? prev.decimalSeparator : '.',
|
|
16
|
+
})) }), _jsx(Text, { variant: "body", size: "small", children: "Thousands separator" })] }), format.thousandsSeparator && (_jsx(Flex, { gap: 2, children: ['.', ','].map(sep => (_jsx(Button, { appearance: format.decimalSeparator === sep ? 'primary' : 'secondary', size: "small", onClick: () => setFormat(prev => ({ ...prev, decimalSeparator: sep })), children: sep }, sep))) })), _jsx(Text, { variant: "body", size: "small", children: "Result affixes" }), _jsxs(Flex, { gap: "2", alignItems: "center", children: [_jsx(Text, { variant: "body", size: "small", children: "Prefix" }), _jsx("input", { type: "text", className: "dte-formula-advanced-input", value: format.prefixText, onChange: e => setFormat(prev => ({ ...prev, prefixText: e.target.value })) }), _jsx(Text, { variant: "body", size: "small", children: "Postfix" }), _jsx("input", { type: "text", className: "dte-formula-advanced-input", value: format.postfixText, onChange: e => setFormat(prev => ({ ...prev, postfixText: e.target.value })) })] })] }));
|
|
17
|
+
//# sourceMappingURL=advanced-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advanced-settings.js","sourceRoot":"","sources":["../../../src/components/field-config-panel/advanced-settings.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { FC } from 'react';
|
|
2
|
-
import { PdfField, RecipientInfo } from '../../interface/types';
|
|
2
|
+
import { PdfField, RecipientInfo, SchemaObject } from '../../interface/types';
|
|
3
3
|
interface FieldConfigPanelOverlayProps {
|
|
4
|
+
dataModel?: SchemaObject;
|
|
5
|
+
/** All fields on the document (e.g. for formula builder fillable section). */
|
|
6
|
+
documentFields?: PdfField[];
|
|
4
7
|
selectedField: PdfField;
|
|
5
8
|
recipients?: RecipientInfo[];
|
|
6
9
|
onFieldConfigChange(updates: Partial<PdfField>): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-config-panel-overlay.d.ts","sourceRoot":"","sources":["../../../src/components/field-config-panel/field-config-panel-overlay.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAC3B,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"field-config-panel-overlay.d.ts","sourceRoot":"","sources":["../../../src/components/field-config-panel/field-config-panel-overlay.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAC3B,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG9E,UAAU,4BAA4B;IAClC,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,8EAA8E;IAC9E,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC5B,aAAa,EAAE,QAAQ,CAAC;IACxB,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IACtD,aAAa,IAAI,IAAI,CAAC;IACtB,eAAe,CAAC,IAAI,IAAI,CAAC;CAC5B;AAED,eAAO,MAAM,uBAAuB,EAAE,EAAE,CAAC,4BAA4B,CAuCpE,CAAC"}
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { Button, Flex, Text } from '@servicetitan/anvil2';
|
|
3
3
|
import IconClose from '@servicetitan/anvil2/assets/icons/material/round/close.svg';
|
|
4
4
|
import { FieldConfigPanel } from './field-config-panel';
|
|
5
|
-
export const FieldConfigPanelOverlay = ({ onDeleteField, onDeselectField, onFieldConfigChange, recipients, selectedField, }) => {
|
|
6
|
-
return (_jsxs(Flex, { className: "dte-field-config-panel-overlay", onClick: e => e.stopPropagation(), children: [_jsxs(Flex, { className: "dte-field-config-panel-header", alignItems: "center", justifyContent: "space-between", children: [_jsx(Text, { variant: "headline", el: "h6", size: "small", children: "Field Configuration" }), _jsx(Button, { appearance: "ghost", size: "small", onClick: onDeselectField, "aria-label": "Close", icon: IconClose })] }), _jsx("div", { className: "dte-field-config-panel-content", children: _jsx(FieldConfigPanel, { field: selectedField, recipients: recipients, onFieldConfigChange: onFieldConfigChange, onDeleteField: onDeleteField }) })] }));
|
|
5
|
+
export const FieldConfigPanelOverlay = ({ dataModel, documentFields = [], onDeleteField, onDeselectField, onFieldConfigChange, recipients, selectedField, }) => {
|
|
6
|
+
return (_jsxs(Flex, { className: "dte-field-config-panel-overlay", onClick: e => e.stopPropagation(), children: [_jsxs(Flex, { className: "dte-field-config-panel-header", alignItems: "center", justifyContent: "space-between", children: [_jsx(Text, { variant: "headline", el: "h6", size: "small", children: "Field Configuration" }), _jsx(Button, { appearance: "ghost", size: "small", onClick: onDeselectField, "aria-label": "Close", icon: IconClose })] }), _jsx("div", { className: "dte-field-config-panel-content", children: _jsx(FieldConfigPanel, { dataModel: dataModel, documentFields: documentFields, field: selectedField, recipients: recipients, onFieldConfigChange: onFieldConfigChange, onDeleteField: onDeleteField }) })] }));
|
|
7
7
|
};
|
|
8
8
|
//# sourceMappingURL=field-config-panel-overlay.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-config-panel-overlay.js","sourceRoot":"","sources":["../../../src/components/field-config-panel/field-config-panel-overlay.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,SAAS,MAAM,4DAA4D,CAAC;AAGnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"field-config-panel-overlay.js","sourceRoot":"","sources":["../../../src/components/field-config-panel/field-config-panel-overlay.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,SAAS,MAAM,4DAA4D,CAAC;AAGnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAaxD,MAAM,CAAC,MAAM,uBAAuB,GAAqC,CAAC,EACtE,SAAS,EACT,cAAc,GAAG,EAAE,EACnB,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,UAAU,EACV,aAAa,GAChB,EAAE,EAAE;IACD,OAAO,CACH,MAAC,IAAI,IAAC,SAAS,EAAC,gCAAgC,EAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,aAC9E,MAAC,IAAI,IACD,SAAS,EAAC,+BAA+B,EACzC,UAAU,EAAC,QAAQ,EACnB,cAAc,EAAC,eAAe,aAE9B,KAAC,IAAI,IAAC,OAAO,EAAC,UAAU,EAAC,EAAE,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,oCAEtC,EACP,KAAC,MAAM,IACH,UAAU,EAAC,OAAO,EAClB,IAAI,EAAC,OAAO,EACZ,OAAO,EAAE,eAAe,gBACb,OAAO,EAClB,IAAI,EAAE,SAAS,GACjB,IACC,EACP,cAAK,SAAS,EAAC,gCAAgC,YAC3C,KAAC,gBAAgB,IACb,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,cAAc,EAC9B,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,UAAU,EACtB,mBAAmB,EAAE,mBAAmB,EACxC,aAAa,EAAE,aAAa,GAC9B,GACA,IACH,CACV,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { FC } from 'react';
|
|
2
|
-
import { PdfField, RecipientInfo } from '../../interface/types';
|
|
2
|
+
import { PdfField, RecipientInfo, SchemaObject } from '../../interface/types';
|
|
3
3
|
interface FieldConfigPanelProps {
|
|
4
4
|
field: PdfField;
|
|
5
|
+
dataModel?: SchemaObject;
|
|
6
|
+
/** All fields on the document (e.g. for formula builder fillable section). */
|
|
7
|
+
documentFields?: PdfField[];
|
|
5
8
|
recipients?: RecipientInfo[];
|
|
6
9
|
onDeleteField(): void;
|
|
7
10
|
onFieldConfigChange(updates: Partial<PdfField>): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-config-panel.d.ts","sourceRoot":"","sources":["../../../src/components/field-config-panel/field-config-panel.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAW,MAAM,OAAO,CAAC;AAEpC,OAAO,
|
|
1
|
+
{"version":3,"file":"field-config-panel.d.ts","sourceRoot":"","sources":["../../../src/components/field-config-panel/field-config-panel.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAW,MAAM,OAAO,CAAC;AAEpC,OAAO,EAGH,QAAQ,EACR,aAAa,EACb,YAAY,EACf,MAAM,uBAAuB,CAAC;AAI/B,UAAU,qBAAqB;IAC3B,KAAK,EAAE,QAAQ,CAAC;IAChB,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,8EAA8E;IAC9E,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;IAC7B,aAAa,IAAI,IAAI,CAAC;IACtB,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;CACzD;AAED,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CAuJtD,CAAC"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Button, Combobox, Flex, Textarea, TextField } from '@servicetitan/anvil2';
|
|
2
|
+
import { Button, Checkbox, Combobox, Flex, Textarea, TextField } from '@servicetitan/anvil2';
|
|
3
3
|
import { useMemo } from 'react';
|
|
4
4
|
import { E_SIGN_FIELD_TYPE_OPTIONS } from '../../constants';
|
|
5
|
-
import { FieldTypeEnum } from '../../interface/types';
|
|
5
|
+
import { FieldTypeEnum, } from '../../interface/types';
|
|
6
6
|
import { generateESignPath, generateFillablePath } from '../../utils';
|
|
7
|
-
|
|
7
|
+
import { FormulaGenerator } from './formula-generator';
|
|
8
|
+
export const FieldConfigPanel = ({ dataModel, documentFields = [], field, onDeleteField, onFieldConfigChange, recipients = [], }) => {
|
|
8
9
|
const recipientOptions = useMemo(() => recipients.map(recipient => ({
|
|
9
10
|
id: recipient.name,
|
|
10
11
|
name: recipient.displayName,
|
|
@@ -34,9 +35,14 @@ export const FieldConfigPanel = ({ field, onDeleteField, onFieldConfigChange, re
|
|
|
34
35
|
});
|
|
35
36
|
}
|
|
36
37
|
};
|
|
37
|
-
return (_jsxs(Flex, { direction: "column", gap: "4", children: [
|
|
38
|
+
return (_jsxs(Flex, { direction: "column", gap: "4", children: [[FieldTypeEnum.fillable, FieldTypeEnum.eSign, FieldTypeEnum.calculated].includes(field.type) && (_jsx(TextField, { required: true, label: "Label", value: field.label, onChange: e => onFieldConfigChange({
|
|
38
39
|
label: e.target.value,
|
|
39
|
-
}) })), (field.type === FieldTypeEnum.fillable || field.type === FieldTypeEnum.eSign) && (_jsxs(Combobox, { items: recipientOptions, itemToString: item => { var _a; return (_a = item === null || item === void 0 ? void 0 : item.name) !== null && _a !== void 0 ? _a : ''; }, onChange: handleRecipientChange, selectedItem: selectedRecipient, filterOptions: { keys: ['name'] }, children: [_jsx(Combobox.SearchField, { placeholder: "", label: "Recipient" }), _jsx(Combobox.Content, { children: ({ items }) => (_jsx(Combobox.List, { children: items.map((item, i) => (_jsx(Combobox.Item, { item: item, index: i, children: item.name }, item.id))) })) })] })), field.type === FieldTypeEnum.eSign && (_jsxs(Combobox, { items: E_SIGN_FIELD_TYPE_OPTIONS, itemToString: item => { var _a; return (_a = item === null || item === void 0 ? void 0 : item.name) !== null && _a !== void 0 ? _a : ''; }, onChange: handleESignFieldTypeChange, selectedItem: selectedESignFieldType, children: [_jsx(Combobox.SearchField, { label: "Field Type" }), _jsx(Combobox.Content, { children: ({ items }) => (_jsx(Combobox.List, { children: items.map((item, i) => (_jsx(Combobox.Item, { item: item, index: i, children: item.name }, item.id))) })) })] })), _jsx(TextField, { label: "Data Path", value: field.path, disabled: true }), _jsx(
|
|
40
|
+
}) })), (field.type === FieldTypeEnum.fillable || field.type === FieldTypeEnum.eSign) && (_jsxs(Combobox, { items: recipientOptions, itemToString: item => { var _a; return (_a = item === null || item === void 0 ? void 0 : item.name) !== null && _a !== void 0 ? _a : ''; }, onChange: handleRecipientChange, selectedItem: selectedRecipient, filterOptions: { keys: ['name'] }, children: [_jsx(Combobox.SearchField, { placeholder: "", label: "Recipient" }), _jsx(Combobox.Content, { children: ({ items }) => (_jsx(Combobox.List, { children: items.map((item, i) => (_jsx(Combobox.Item, { item: item, index: i, children: item.name }, item.id))) })) })] })), field.type === FieldTypeEnum.eSign && (_jsxs(Combobox, { items: E_SIGN_FIELD_TYPE_OPTIONS, itemToString: item => { var _a; return (_a = item === null || item === void 0 ? void 0 : item.name) !== null && _a !== void 0 ? _a : ''; }, onChange: handleESignFieldTypeChange, selectedItem: selectedESignFieldType, children: [_jsx(Combobox.SearchField, { label: "Field Type" }), _jsx(Combobox.Content, { children: ({ items }) => (_jsx(Combobox.List, { children: items.map((item, i) => (_jsx(Combobox.Item, { item: item, index: i, children: item.name }, item.id))) })) })] })), _jsx(TextField, { label: "Data Path", value: field.path, disabled: true }), field.type === FieldTypeEnum.fillable && field.subType !== 'checkbox' && (_jsx(Checkbox, { label: "Required", checked: field.required, onChange: () => onFieldConfigChange({
|
|
41
|
+
required: !field.required,
|
|
42
|
+
}) })), field.type === FieldTypeEnum.calculated && (_jsx(FormulaGenerator, { dataModel: dataModel, documentFields: documentFields, formula: field.formula, formulaFormat: field.formulaFormat, onFormulaChange: (formula, formulaFormat) => onFieldConfigChange({
|
|
43
|
+
formula,
|
|
44
|
+
formulaFormat,
|
|
45
|
+
}) })), _jsx(Textarea, { label: "Description", value: field.description, onChange: e => {
|
|
40
46
|
var _a;
|
|
41
47
|
return onFieldConfigChange({
|
|
42
48
|
description: (_a = e === null || e === void 0 ? void 0 : e.target.value) !== null && _a !== void 0 ? _a : '',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-config-panel.js","sourceRoot":"","sources":["../../../src/components/field-config-panel/field-config-panel.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"field-config-panel.js","sourceRoot":"","sources":["../../../src/components/field-config-panel/field-config-panel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { FieldTypeOption } from '../../interface/types';
|
|
3
|
+
interface FieldSidebarProps {
|
|
4
|
+
fillableOptions: FieldTypeOption[];
|
|
5
|
+
mergeTagOptions: FieldTypeOption[];
|
|
6
|
+
highlightElementPath: string;
|
|
7
|
+
onHover: (path: string) => void;
|
|
8
|
+
onSelect: (path: string) => void;
|
|
9
|
+
selectedPaths: Set<string>;
|
|
10
|
+
}
|
|
11
|
+
export declare const FieldSidebar: FC<FieldSidebarProps>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=field-sidebar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-sidebar.d.ts","sourceRoot":"","sources":["../../../src/components/field-config-panel/field-sidebar.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,UAAU,iBAAiB;IACvB,eAAe,EAAE,eAAe,EAAE,CAAC;IACnC,eAAe,EAAE,eAAe,EAAE,CAAC;IACnC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC9B;AAED,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC,iBAAiB,CA4B9C,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Text } from '@servicetitan/anvil2';
|
|
3
|
+
export const FieldSidebar = ({ fillableOptions, highlightElementPath, mergeTagOptions, onHover, onSelect, selectedPaths, }) => {
|
|
4
|
+
return (_jsxs("div", { className: "dte-formula-sidebar", children: [_jsx(FieldOptionList, { title: "Fillable fields", options: fillableOptions, highlightElementPath: highlightElementPath, selectedPaths: selectedPaths, onHover: onHover, onSelect: onSelect }), _jsx(FieldOptionList, { title: "Merge tags", options: mergeTagOptions, highlightElementPath: highlightElementPath, selectedPaths: selectedPaths, onHover: onHover, onSelect: onSelect })] }));
|
|
5
|
+
};
|
|
6
|
+
const FieldOptionList = ({ highlightElementPath, onHover, onSelect, options, selectedPaths, title, }) => {
|
|
7
|
+
if (options.length === 0) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
return (_jsxs("div", { children: [_jsx(Text, { variant: "headline", el: "h6", size: "small", children: title }), _jsx("ul", { className: "dte-formula-field-list", role: "listbox", "aria-label": title, children: options.map(opt => {
|
|
11
|
+
var _a, _b;
|
|
12
|
+
return (_jsx("li", { role: "option", "aria-selected": opt.path === highlightElementPath, className: `dte-formula-field-list-item ${opt.path === highlightElementPath ? '--highlight' : ''} ${selectedPaths.has((_a = opt.path) !== null && _a !== void 0 ? _a : '') ? '--selected' : ''}`, onMouseEnter: () => opt.path && onHover(opt.path), onMouseDown: e => {
|
|
13
|
+
e.preventDefault();
|
|
14
|
+
if (opt.path) {
|
|
15
|
+
onSelect(opt.path);
|
|
16
|
+
}
|
|
17
|
+
}, children: (_b = opt.label) !== null && _b !== void 0 ? _b : opt.path }, `${opt.path}-${opt.label}`));
|
|
18
|
+
}) })] }));
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=field-sidebar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-sidebar.js","sourceRoot":"","sources":["../../../src/components/field-config-panel/field-sidebar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAa5C,MAAM,CAAC,MAAM,YAAY,GAA0B,CAAC,EAChD,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,OAAO,EACP,QAAQ,EACR,aAAa,GAChB,EAAE,EAAE;IACD,OAAO,CACH,eAAK,SAAS,EAAC,qBAAqB,aAChC,KAAC,eAAe,IACZ,KAAK,EAAC,iBAAiB,EACvB,OAAO,EAAE,eAAe,EACxB,oBAAoB,EAAE,oBAAoB,EAC1C,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,GACpB,EACF,KAAC,eAAe,IACZ,KAAK,EAAC,YAAY,EAClB,OAAO,EAAE,eAAe,EACxB,oBAAoB,EAAE,oBAAoB,EAC1C,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,GACpB,IACA,CACT,CAAC;AACN,CAAC,CAAC;AAWF,MAAM,eAAe,GAA6B,CAAC,EAC/C,oBAAoB,EACpB,OAAO,EACP,QAAQ,EACR,OAAO,EACP,aAAa,EACb,KAAK,GACR,EAAE,EAAE;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,CACH,0BACI,KAAC,IAAI,IAAC,OAAO,EAAC,UAAU,EAAC,EAAE,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,YACxC,KAAK,GACH,EACP,aAAI,SAAS,EAAC,wBAAwB,EAAC,IAAI,EAAC,SAAS,gBAAa,KAAK,YAClE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;;oBAAC,OAAA,CAChB,aAEI,IAAI,EAAC,QAAQ,mBACE,GAAG,CAAC,IAAI,KAAK,oBAAoB,EAChD,SAAS,EAAE,+BAA+B,GAAG,CAAC,IAAI,KAAK,oBAAoB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,aAAa,CAAC,GAAG,CAAC,MAAA,GAAG,CAAC,IAAI,mCAAI,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,EAC3J,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EACjD,WAAW,EAAE,CAAC,CAAC,EAAE;4BACb,CAAC,CAAC,cAAc,EAAE,CAAC;4BACnB,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;gCACX,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;4BACvB,CAAC;wBACL,CAAC,YAEA,MAAA,GAAG,CAAC,KAAK,mCAAI,GAAG,CAAC,IAAI,IAZjB,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAa9B,CACR,CAAA;iBAAA,CAAC,GACD,IACH,CACT,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { CalculatedFieldFormat, PdfField, SchemaObject, StructuredFormula } from '../../interface/types';
|
|
3
|
+
export interface FormulaGeneratorProps {
|
|
4
|
+
dataModel?: SchemaObject;
|
|
5
|
+
documentFields?: PdfField[];
|
|
6
|
+
formula?: StructuredFormula;
|
|
7
|
+
formulaFormat?: CalculatedFieldFormat;
|
|
8
|
+
onFormulaChange?(formula: StructuredFormula, format: CalculatedFieldFormat): void;
|
|
9
|
+
}
|
|
10
|
+
export declare const FormulaGenerator: FC<FormulaGeneratorProps>;
|
|
11
|
+
//# sourceMappingURL=formula-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formula-generator.d.ts","sourceRoot":"","sources":["../../../src/components/field-config-panel/formula-generator.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAA+B,MAAM,OAAO,CAAC;AACxD,OAAO,EACH,qBAAqB,EAIrB,QAAQ,EAER,YAAY,EACZ,iBAAiB,EACpB,MAAM,uBAAuB,CAAC;AAI/B,MAAM,WAAW,qBAAqB;IAClC,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,aAAa,CAAC,EAAE,qBAAqB,CAAC;IACtC,eAAe,CAAC,CAAC,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAC;CACrF;AAgBD,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CAoFtD,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Text } from '@servicetitan/anvil2';
|
|
3
|
+
import { Fragment, useMemo, useState } from 'react';
|
|
4
|
+
import { FieldTypeEnum, } from '../../interface/types';
|
|
5
|
+
import { extractGroupedFieldsFromDataModel } from '../../utils';
|
|
6
|
+
import { FormulaModal } from './formula-modal';
|
|
7
|
+
function getFillableFilteredBuySubTypeFields(fields, subTypes) {
|
|
8
|
+
return fields
|
|
9
|
+
.filter(f => f.type === FieldTypeEnum.fillable && subTypes.includes(f.subType))
|
|
10
|
+
.map(f => {
|
|
11
|
+
var _a;
|
|
12
|
+
return ({
|
|
13
|
+
label: (_a = (f.label || f.path)) !== null && _a !== void 0 ? _a : '',
|
|
14
|
+
type: FieldTypeEnum.fillable,
|
|
15
|
+
subType: f.subType,
|
|
16
|
+
path: f.path,
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export const FormulaGenerator = ({ dataModel, documentFields = [], formula, formulaFormat, onFormulaChange, }) => {
|
|
21
|
+
const [modalOpen, setModalOpen] = useState(false);
|
|
22
|
+
const dataModelGroups = useMemo(() => dataModel
|
|
23
|
+
? extractGroupedFieldsFromDataModel(dataModel, {
|
|
24
|
+
onlyUseInCalculatedFields: true,
|
|
25
|
+
})
|
|
26
|
+
: [], [dataModel]);
|
|
27
|
+
const fillableFieldsFromDocument = useMemo(() => getFillableFilteredBuySubTypeFields(documentFields, ['number']), [documentFields]);
|
|
28
|
+
const hasFormula = (formula === null || formula === void 0 ? void 0 : formula.tokens) && formula.tokens.length > 0;
|
|
29
|
+
const handleSave = (newFormula, format) => {
|
|
30
|
+
onFormulaChange === null || onFormulaChange === void 0 ? void 0 : onFormulaChange(newFormula, format);
|
|
31
|
+
};
|
|
32
|
+
return (_jsxs(Fragment, { children: [_jsx(Text, { variant: "body", size: "small", children: "Formula" }), _jsx("div", { className: "dte-formula-box", role: "button", tabIndex: 0, onClick: () => setModalOpen(true), onKeyDown: e => {
|
|
33
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
34
|
+
e.preventDefault();
|
|
35
|
+
setModalOpen(true);
|
|
36
|
+
}
|
|
37
|
+
}, "aria-label": "Configure formula", children: hasFormula ? ((() => {
|
|
38
|
+
let offset = 0;
|
|
39
|
+
return formula.tokens.map((token) => {
|
|
40
|
+
const value = token.type === 'field'
|
|
41
|
+
? token.path
|
|
42
|
+
: token.value;
|
|
43
|
+
const key = `formula-${offset}-${token.type}-${value}`;
|
|
44
|
+
offset += value.length + 1;
|
|
45
|
+
return (_jsx("span", { className: `dte-formula-token dte-formula-token-${token.type}`, children: token.type === 'field'
|
|
46
|
+
? token.label
|
|
47
|
+
: token.value }, key));
|
|
48
|
+
});
|
|
49
|
+
})()) : (_jsx("span", { children: "Configure formula" })) }), modalOpen && (_jsx(FormulaModal, { initialFormula: formula, initialFormat: formulaFormat, dataModelGroups: dataModelGroups, fillableFieldsFromDocument: fillableFieldsFromDocument, onClose: () => setModalOpen(false), onSave: handleSave }))] }));
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=formula-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formula-generator.js","sourceRoot":"","sources":["../../../src/components/field-config-panel/formula-generator.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { CalculatedFieldFormat, DataModelFieldGroup, FieldTypeOption, StructuredFormula } from '../../interface/types';
|
|
3
|
+
export interface FormulaModalProps {
|
|
4
|
+
initialFormula: StructuredFormula | undefined;
|
|
5
|
+
initialFormat?: CalculatedFieldFormat;
|
|
6
|
+
dataModelGroups: DataModelFieldGroup[];
|
|
7
|
+
fillableFieldsFromDocument?: FieldTypeOption[];
|
|
8
|
+
onClose(): void;
|
|
9
|
+
onSave(formula: StructuredFormula, format: CalculatedFieldFormat): void;
|
|
10
|
+
}
|
|
11
|
+
export declare const FormulaModal: FC<FormulaModalProps>;
|
|
12
|
+
//# sourceMappingURL=formula-modal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formula-modal.d.ts","sourceRoot":"","sources":["../../../src/components/field-config-panel/formula-modal.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,EAAE,EAAkC,MAAM,OAAO,CAAC;AAE3D,OAAO,EACH,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACpB,MAAM,uBAAuB,CAAC;AAyC/B,MAAM,WAAW,iBAAiB;IAC9B,cAAc,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAC9C,aAAa,CAAC,EAAE,qBAAqB,CAAC;IACtC,eAAe,EAAE,mBAAmB,EAAE,CAAC;IACvC,0BAA0B,CAAC,EAAE,eAAe,EAAE,CAAC;IAC/C,OAAO,IAAI,IAAI,CAAC;IAChB,MAAM,CAAC,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAC;CAC3E;AAED,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC,iBAAiB,CAuK9C,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button, Flex, Text } from '@servicetitan/anvil2';
|
|
3
|
+
import IconClose from '@servicetitan/anvil2/assets/icons/material/round/close.svg';
|
|
4
|
+
import IconRedo from '@servicetitan/anvil2/assets/icons/material/round/redo.svg';
|
|
5
|
+
import IconUndo from '@servicetitan/anvil2/assets/icons/material/round/undo.svg';
|
|
6
|
+
import { useCallback, useMemo, useState } from 'react';
|
|
7
|
+
import { useFormulaEditor } from '../../hooks';
|
|
8
|
+
import { parseExpression, tokenizeExpression, tokensToExpression, validateFormula, } from '../../utils';
|
|
9
|
+
import { FieldSidebar } from './field-sidebar';
|
|
10
|
+
import { FormulaWorkspace } from './formula-workspace';
|
|
11
|
+
const DEFAULT_CALCULATED_FIELD_FORMAT = {
|
|
12
|
+
resultType: 'number',
|
|
13
|
+
thousandsSeparator: false,
|
|
14
|
+
decimals: 2,
|
|
15
|
+
roundingMode: 'round',
|
|
16
|
+
decimalSeparatorEnabled: false,
|
|
17
|
+
decimalSeparator: '.',
|
|
18
|
+
prefixText: '',
|
|
19
|
+
postfixText: '',
|
|
20
|
+
};
|
|
21
|
+
function getAllFields(groups) {
|
|
22
|
+
const list = [];
|
|
23
|
+
for (const g of groups) {
|
|
24
|
+
for (const f of g.fields) {
|
|
25
|
+
list.push(f);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return list;
|
|
29
|
+
}
|
|
30
|
+
function getValidPathsSet(groups) {
|
|
31
|
+
const set = new Set();
|
|
32
|
+
for (const f of getAllFields(groups)) {
|
|
33
|
+
if (f.path) {
|
|
34
|
+
set.add(f.path);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return set;
|
|
38
|
+
}
|
|
39
|
+
export const FormulaModal = ({ dataModelGroups, fillableFieldsFromDocument = [], initialFormat, initialFormula, onClose, onSave, }) => {
|
|
40
|
+
var _a, _b;
|
|
41
|
+
const validPaths = useMemo(() => {
|
|
42
|
+
const set = getValidPathsSet(dataModelGroups);
|
|
43
|
+
for (const f of fillableFieldsFromDocument) {
|
|
44
|
+
if (f.path) {
|
|
45
|
+
set.add(f.path);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return set;
|
|
49
|
+
}, [dataModelGroups, fillableFieldsFromDocument]);
|
|
50
|
+
const allFields = useMemo(() => getAllFields(dataModelGroups), [dataModelGroups]);
|
|
51
|
+
const pathToLabel = useMemo(() => {
|
|
52
|
+
var _a, _b;
|
|
53
|
+
const m = new Map();
|
|
54
|
+
for (const f of fillableFieldsFromDocument) {
|
|
55
|
+
if (f.path) {
|
|
56
|
+
m.set(f.path, (_a = f.label) !== null && _a !== void 0 ? _a : f.path);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
for (const f of allFields) {
|
|
60
|
+
if (f.path) {
|
|
61
|
+
m.set(f.path, (_b = f.label) !== null && _b !== void 0 ? _b : f.path);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return m;
|
|
65
|
+
}, [allFields, fillableFieldsFromDocument]);
|
|
66
|
+
const currentExpression = useMemo(() => tokensToExpression(initialFormula), [initialFormula]);
|
|
67
|
+
const [highlightElementPath, setHighlightElementPath] = useState('');
|
|
68
|
+
const [format, setFormat] = useState(() => initialFormat !== null && initialFormat !== void 0 ? initialFormat : DEFAULT_CALCULATED_FIELD_FORMAT);
|
|
69
|
+
const [advancedOpen, setAdvancedOpen] = useState(false);
|
|
70
|
+
const formulaEditor = useFormulaEditor({
|
|
71
|
+
currentExpression,
|
|
72
|
+
opened: true,
|
|
73
|
+
pathToLabel,
|
|
74
|
+
});
|
|
75
|
+
const parsedTokens = useMemo(() => parseExpression(formulaEditor.draftExpression, validPaths, pathToLabel), [formulaEditor.draftExpression, validPaths, pathToLabel]);
|
|
76
|
+
const formulaValidation = useMemo(() => validateFormula({ tokens: parsedTokens }, validPaths), [parsedTokens, validPaths]);
|
|
77
|
+
const unknownFieldErrors = useMemo(() => {
|
|
78
|
+
const parts = tokenizeExpression(formulaEditor.draftExpression);
|
|
79
|
+
const errors = [];
|
|
80
|
+
for (const p of parts) {
|
|
81
|
+
if (p.type === 'field' && !validPaths.has(p.value)) {
|
|
82
|
+
errors.push(`Unknown field: "${p.value}"`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return errors;
|
|
86
|
+
}, [formulaEditor.draftExpression, validPaths]);
|
|
87
|
+
const validationError = (_b = (_a = unknownFieldErrors[0]) !== null && _a !== void 0 ? _a : formulaValidation.errors[0]) !== null && _b !== void 0 ? _b : '';
|
|
88
|
+
const isInvalid = !formulaValidation.valid || unknownFieldErrors.length > 0;
|
|
89
|
+
const canSave = formulaValidation.valid && unknownFieldErrors.length === 0 && parsedTokens.length > 0;
|
|
90
|
+
const handleSave = useCallback(() => {
|
|
91
|
+
if (!canSave) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
onSave({ tokens: parsedTokens }, format);
|
|
95
|
+
onClose();
|
|
96
|
+
}, [canSave, format, onClose, onSave, parsedTokens]);
|
|
97
|
+
return (_jsx(Flex, { alignItems: "center", justifyContent: "center", className: "dte-formula-modal-overlay", role: "dialog", "aria-modal": "true", "aria-label": "Formula", children: _jsxs(Flex, { direction: "column", className: "dte-formula-modal ", children: [_jsxs(Flex, { className: "dte-formula-modal-header", alignItems: "center", justifyContent: "space-between", children: [_jsx(Text, { variant: "headline", el: "h6", size: "small", children: "Formula Builder" }), _jsx(Button, { appearance: "ghost", size: "small", onClick: onClose, "aria-label": "Close", icon: IconClose })] }), _jsx("div", { className: "dte-formula-modal-body", children: _jsxs(Flex, { alignItems: "stretch", gap: 2, className: "dte-formula-modal-columns", children: [_jsx(FieldSidebar, { fillableOptions: fillableFieldsFromDocument, mergeTagOptions: allFields, highlightElementPath: highlightElementPath, onHover: setHighlightElementPath, onSelect: formulaEditor.insertField, selectedPaths: formulaEditor.selectedFieldPaths }), _jsx(FormulaWorkspace, { editorRef: formulaEditor.editorRef, isInvalid: isInvalid && formulaEditor.isDirty, validationError: validationError, format: format, onResultTypeChange: nextType => setFormat(prev => ({ ...prev, resultType: nextType })), advancedOpen: advancedOpen, onToggleAdvanced: () => setAdvancedOpen(prev => !prev), setFormat: setFormat, onInput: formulaEditor.handleEditorInput, onKeyDown: formulaEditor.handleKeyDown, onClick: () => { }, onMouseUp: formulaEditor.handleEditorInput, onPaste: formulaEditor.handlePaste, onOperatorSelect: formulaEditor.insertOperator, onRemoveField: formulaEditor.removeFieldAtIndex, actions: _jsxs(Flex, { gap: "1", alignItems: "center", children: [_jsx(Button, { appearance: "ghost", size: "small", onClick: formulaEditor.undo, disabled: !formulaEditor.canUndo, "aria-label": "Undo", icon: IconUndo }), _jsx(Button, { appearance: "ghost", size: "small", onClick: formulaEditor.redo, disabled: !formulaEditor.canRedo, "aria-label": "Redo", icon: IconRedo })] }) })] }) }), _jsxs(Flex, { className: "dte-formula-modal-footer", gap: "2", justifyContent: "flex-end", children: [_jsx(Button, { onClick: onClose, children: "Cancel" }), _jsx(Button, { onClick: handleSave, appearance: "primary", disabled: !canSave, children: "Save" })] })] }) }));
|
|
98
|
+
};
|
|
99
|
+
//# sourceMappingURL=formula-modal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formula-modal.js","sourceRoot":"","sources":["../../../src/components/field-config-panel/formula-modal.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Dispatch, FC, KeyboardEvent, MouseEvent, ReactNode, RefObject, SetStateAction } from 'react';
|
|
2
|
+
import { CalculatedFieldFormat } from '../../interface/types';
|
|
3
|
+
interface FormulaWorkspaceProps {
|
|
4
|
+
actions: ReactNode;
|
|
5
|
+
advancedOpen: boolean;
|
|
6
|
+
editorRef: RefObject<HTMLDivElement | null>;
|
|
7
|
+
format: CalculatedFieldFormat;
|
|
8
|
+
isInvalid: boolean;
|
|
9
|
+
onClick: (e: MouseEvent<HTMLDivElement>) => void;
|
|
10
|
+
onInput: () => void;
|
|
11
|
+
onKeyDown: (e: KeyboardEvent<HTMLDivElement>) => void;
|
|
12
|
+
onMouseUp: () => void;
|
|
13
|
+
onOperatorSelect: (op: string) => void;
|
|
14
|
+
onPaste: (text: string) => void;
|
|
15
|
+
onRemoveField: (fieldIndex: number) => void;
|
|
16
|
+
onResultTypeChange: (nextType: CalculatedFieldFormat['resultType']) => void;
|
|
17
|
+
onToggleAdvanced: () => void;
|
|
18
|
+
setFormat: Dispatch<SetStateAction<CalculatedFieldFormat>>;
|
|
19
|
+
validationError: string;
|
|
20
|
+
}
|
|
21
|
+
export declare const FormulaWorkspace: FC<FormulaWorkspaceProps>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=formula-workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formula-workspace.d.ts","sourceRoot":"","sources":["../../../src/components/field-config-panel/formula-workspace.tsx"],"names":[],"mappings":"AACA,OAAO,EACH,QAAQ,EACR,EAAE,EACF,aAAa,EACb,UAAU,EACV,SAAS,EACT,SAAS,EACT,cAAc,EAEjB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAI9D,UAAU,qBAAqB;IAC3B,OAAO,EAAE,SAAS,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC5C,MAAM,EAAE,qBAAqB,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACjD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,EAAE,CAAC,CAAC,EAAE,aAAa,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACtD,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,aAAa,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,kBAAkB,EAAE,CAAC,QAAQ,EAAE,qBAAqB,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;IAC5E,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,SAAS,EAAE,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC3D,eAAe,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CAiFtD,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Alert, Button, Flex, Text } from '@servicetitan/anvil2';
|
|
3
|
+
import { useCallback, } from 'react';
|
|
4
|
+
import { AdvancedSettings } from './advanced-settings';
|
|
5
|
+
import { ResultTypeSelector } from './result-type-selector';
|
|
6
|
+
export const FormulaWorkspace = ({ actions, advancedOpen, editorRef, format, isInvalid, onClick, onInput, onKeyDown, onMouseUp, onOperatorSelect, onPaste, onRemoveField, onResultTypeChange, onToggleAdvanced, setFormat, validationError, }) => {
|
|
7
|
+
const handleClick = useCallback((e) => {
|
|
8
|
+
var _a;
|
|
9
|
+
const target = e.target;
|
|
10
|
+
const removeBtn = target.closest('[data-field-remove="true"]');
|
|
11
|
+
if (removeBtn) {
|
|
12
|
+
e.preventDefault();
|
|
13
|
+
e.stopPropagation();
|
|
14
|
+
const chip = removeBtn.closest('[data-field-index]');
|
|
15
|
+
const idx = (_a = chip === null || chip === void 0 ? void 0 : chip.dataset) === null || _a === void 0 ? void 0 : _a.fieldIndex;
|
|
16
|
+
if (idx !== undefined) {
|
|
17
|
+
onRemoveField(Number(idx));
|
|
18
|
+
}
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
onClick(e);
|
|
22
|
+
}, [onClick, onRemoveField]);
|
|
23
|
+
return (_jsxs(Flex, { direction: "column", flex: 1, gap: 2, children: [_jsx(Text, { variant: "body", size: "small", children: "Click a field on the left to add it. Use +, -, *, /, and parentheses to build formulas." }), _jsxs(Flex, { alignItems: "center", justifyContent: "space-between", children: [_jsx(Text, { variant: "body", size: "small", children: "Formula" }), actions] }), _jsx("div", { ref: editorRef, className: `dte-formula-editor ${isInvalid ? 'dte-formula-editor-invalid' : ''}`, role: "textbox", contentEditable: true, suppressContentEditableWarning: true, "data-placeholder": "e.g. order.total + order.tax", onInput: onInput, onKeyDown: onKeyDown, onClick: handleClick, onKeyUp: onInput, onMouseUp: onMouseUp, onPaste: e => {
|
|
24
|
+
e.preventDefault();
|
|
25
|
+
onPaste(e.clipboardData.getData('text/plain'));
|
|
26
|
+
} }), isInvalid && validationError && _jsx(Alert, { status: "danger", title: validationError }), _jsx(Flex, { gap: 1, children: ['+', '-', '*', '/', '(', ')'].map(op => (_jsx(Button, { onClick: () => onOperatorSelect(op), size: "small", children: op }, op))) }), _jsx(ResultTypeSelector, { format: format, onChange: onResultTypeChange }), _jsx(Button, { appearance: "ghost", onClick: onToggleAdvanced, size: "small", children: advancedOpen ? 'Hide advanced settings' : 'Show advanced settings' }), advancedOpen && _jsx(AdvancedSettings, { format: format, setFormat: setFormat })] }));
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=formula-workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formula-workspace.js","sourceRoot":"","sources":["../../../src/components/field-config-panel/formula-workspace.tsx"],"names":[],"mappings":"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"}
|