@servicetitan/dte-pdf-editor 1.17.0 → 1.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/README.md +35 -7
  2. package/dist/components/field-config-panel/advanced-settings.d.ts +9 -0
  3. package/dist/components/field-config-panel/advanced-settings.d.ts.map +1 -0
  4. package/dist/components/field-config-panel/advanced-settings.js +17 -0
  5. package/dist/components/field-config-panel/advanced-settings.js.map +1 -0
  6. package/dist/components/field-config-panel/field-config-panel-overlay.d.ts +4 -1
  7. package/dist/components/field-config-panel/field-config-panel-overlay.d.ts.map +1 -1
  8. package/dist/components/field-config-panel/field-config-panel-overlay.js +2 -2
  9. package/dist/components/field-config-panel/field-config-panel-overlay.js.map +1 -1
  10. package/dist/components/field-config-panel/field-config-panel.d.ts +4 -1
  11. package/dist/components/field-config-panel/field-config-panel.d.ts.map +1 -1
  12. package/dist/components/field-config-panel/field-config-panel.js +11 -5
  13. package/dist/components/field-config-panel/field-config-panel.js.map +1 -1
  14. package/dist/components/field-config-panel/field-sidebar.d.ts +13 -0
  15. package/dist/components/field-config-panel/field-sidebar.d.ts.map +1 -0
  16. package/dist/components/field-config-panel/field-sidebar.js +20 -0
  17. package/dist/components/field-config-panel/field-sidebar.js.map +1 -0
  18. package/dist/components/field-config-panel/formula-generator.d.ts +11 -0
  19. package/dist/components/field-config-panel/formula-generator.d.ts.map +1 -0
  20. package/dist/components/field-config-panel/formula-generator.js +51 -0
  21. package/dist/components/field-config-panel/formula-generator.js.map +1 -0
  22. package/dist/components/field-config-panel/formula-modal.d.ts +12 -0
  23. package/dist/components/field-config-panel/formula-modal.d.ts.map +1 -0
  24. package/dist/components/field-config-panel/formula-modal.js +99 -0
  25. package/dist/components/field-config-panel/formula-modal.js.map +1 -0
  26. package/dist/components/field-config-panel/formula-workspace.d.ts +23 -0
  27. package/dist/components/field-config-panel/formula-workspace.d.ts.map +1 -0
  28. package/dist/components/field-config-panel/formula-workspace.js +28 -0
  29. package/dist/components/field-config-panel/formula-workspace.js.map +1 -0
  30. package/dist/components/field-config-panel/result-type-selector.d.ts +9 -0
  31. package/dist/components/field-config-panel/result-type-selector.d.ts.map +1 -0
  32. package/dist/components/field-config-panel/result-type-selector.js +10 -0
  33. package/dist/components/field-config-panel/result-type-selector.js.map +1 -0
  34. package/dist/components/field-sidebar/calculated-field-type-list.d.ts +9 -0
  35. package/dist/components/field-sidebar/calculated-field-type-list.d.ts.map +1 -0
  36. package/dist/components/field-sidebar/calculated-field-type-list.js +12 -0
  37. package/dist/components/field-sidebar/calculated-field-type-list.js.map +1 -0
  38. package/dist/components/field-sidebar/data-model-field-type-list.d.ts +0 -1
  39. package/dist/components/field-sidebar/data-model-field-type-list.d.ts.map +1 -1
  40. package/dist/components/field-sidebar/data-model-field-type-list.js +8 -7
  41. package/dist/components/field-sidebar/data-model-field-type-list.js.map +1 -1
  42. package/dist/components/field-sidebar/field-menu-group.d.ts +11 -0
  43. package/dist/components/field-sidebar/field-menu-group.d.ts.map +1 -0
  44. package/dist/components/field-sidebar/field-menu-group.js +6 -0
  45. package/dist/components/field-sidebar/field-menu-group.js.map +1 -0
  46. package/dist/components/field-sidebar/field-sidebar.d.ts.map +1 -1
  47. package/dist/components/field-sidebar/field-sidebar.js +6 -15
  48. package/dist/components/field-sidebar/field-sidebar.js.map +1 -1
  49. package/dist/components/field-sidebar/fillable-field-type-list.d.ts +0 -1
  50. package/dist/components/field-sidebar/fillable-field-type-list.d.ts.map +1 -1
  51. package/dist/components/field-sidebar/fillable-field-type-list.js +8 -9
  52. package/dist/components/field-sidebar/fillable-field-type-list.js.map +1 -1
  53. package/dist/components/pdf-canvas/pdf-canvas.d.ts +1 -0
  54. package/dist/components/pdf-canvas/pdf-canvas.d.ts.map +1 -1
  55. package/dist/components/pdf-canvas/pdf-canvas.js +2 -2
  56. package/dist/components/pdf-canvas/pdf-canvas.js.map +1 -1
  57. package/dist/components/pdf-editor/pdf-editor.d.ts +1 -0
  58. package/dist/components/pdf-editor/pdf-editor.d.ts.map +1 -1
  59. package/dist/components/pdf-editor/pdf-editor.js +2 -2
  60. package/dist/components/pdf-editor/pdf-editor.js.map +1 -1
  61. package/dist/components/pdf-fields-overlay/pdf-fields-overlay.d.ts +1 -0
  62. package/dist/components/pdf-fields-overlay/pdf-fields-overlay.d.ts.map +1 -1
  63. package/dist/components/pdf-fields-overlay/pdf-fields-overlay.js +2 -2
  64. package/dist/components/pdf-fields-overlay/pdf-fields-overlay.js.map +1 -1
  65. package/dist/components/pdf-fields-overlay/pdf-overlay-field-calculated.d.ts +8 -0
  66. package/dist/components/pdf-fields-overlay/pdf-overlay-field-calculated.d.ts.map +1 -0
  67. package/dist/components/pdf-fields-overlay/pdf-overlay-field-calculated.js +5 -0
  68. package/dist/components/pdf-fields-overlay/pdf-overlay-field-calculated.js.map +1 -0
  69. package/dist/components/pdf-fields-overlay/pdf-overlay-field.d.ts +1 -0
  70. package/dist/components/pdf-fields-overlay/pdf-overlay-field.d.ts.map +1 -1
  71. package/dist/components/pdf-fields-overlay/pdf-overlay-field.js +3 -2
  72. package/dist/components/pdf-fields-overlay/pdf-overlay-field.js.map +1 -1
  73. package/dist/components/pdf-view/pdf-view-calculated.d.ts +9 -0
  74. package/dist/components/pdf-view/pdf-view-calculated.d.ts.map +1 -0
  75. package/dist/components/pdf-view/pdf-view-calculated.js +18 -0
  76. package/dist/components/pdf-view/pdf-view-calculated.js.map +1 -0
  77. package/dist/components/pdf-view/pdf-view.d.ts.map +1 -1
  78. package/dist/components/pdf-view/pdf-view.js +2 -1
  79. package/dist/components/pdf-view/pdf-view.js.map +1 -1
  80. package/dist/constants/field.constants.d.ts +3 -2
  81. package/dist/constants/field.constants.d.ts.map +1 -1
  82. package/dist/constants/field.constants.js +6 -0
  83. package/dist/constants/field.constants.js.map +1 -1
  84. package/dist/constants/menu-group.d.ts +8 -0
  85. package/dist/constants/menu-group.d.ts.map +1 -0
  86. package/dist/constants/menu-group.js +20 -0
  87. package/dist/constants/menu-group.js.map +1 -0
  88. package/dist/hooks/index.d.ts +1 -0
  89. package/dist/hooks/index.d.ts.map +1 -1
  90. package/dist/hooks/index.js +1 -0
  91. package/dist/hooks/index.js.map +1 -1
  92. package/dist/hooks/useFormulaEditor.d.ts +22 -0
  93. package/dist/hooks/useFormulaEditor.d.ts.map +1 -0
  94. package/dist/hooks/useFormulaEditor.js +290 -0
  95. package/dist/hooks/useFormulaEditor.js.map +1 -0
  96. package/dist/hooks/usePdfFieldDnD.d.ts.map +1 -1
  97. package/dist/hooks/usePdfFieldDnD.js +3 -0
  98. package/dist/hooks/usePdfFieldDnD.js.map +1 -1
  99. package/dist/index.d.ts +1 -1
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +1 -0
  102. package/dist/index.js.map +1 -1
  103. package/dist/interface/types.d.ts +45 -3
  104. package/dist/interface/types.d.ts.map +1 -1
  105. package/dist/interface/types.js +3 -0
  106. package/dist/interface/types.js.map +1 -1
  107. package/dist/utils/data-model/extract-fields.utils.d.ts +5 -5
  108. package/dist/utils/data-model/extract-fields.utils.d.ts.map +1 -1
  109. package/dist/utils/data-model/extract-fields.utils.js +42 -8
  110. package/dist/utils/data-model/extract-fields.utils.js.map +1 -1
  111. package/dist/utils/formula/caret.utils.d.ts +3 -0
  112. package/dist/utils/formula/caret.utils.d.ts.map +1 -0
  113. package/dist/utils/formula/caret.utils.js +123 -0
  114. package/dist/utils/formula/caret.utils.js.map +1 -0
  115. package/dist/utils/formula/dom.utils.d.ts +4 -0
  116. package/dist/utils/formula/dom.utils.d.ts.map +1 -0
  117. package/dist/utils/formula/dom.utils.js +34 -0
  118. package/dist/utils/formula/dom.utils.js.map +1 -0
  119. package/dist/utils/formula/evaluate-formula.utils.d.ts +13 -0
  120. package/dist/utils/formula/evaluate-formula.utils.d.ts.map +1 -0
  121. package/dist/utils/formula/evaluate-formula.utils.js +134 -0
  122. package/dist/utils/formula/evaluate-formula.utils.js.map +1 -0
  123. package/dist/utils/formula/expression.utils.d.ts +18 -0
  124. package/dist/utils/formula/expression.utils.d.ts.map +1 -0
  125. package/dist/utils/formula/expression.utils.js +84 -0
  126. package/dist/utils/formula/expression.utils.js.map +1 -0
  127. package/dist/utils/formula/format-calculated-result.utils.d.ts +7 -0
  128. package/dist/utils/formula/format-calculated-result.utils.d.ts.map +1 -0
  129. package/dist/utils/formula/format-calculated-result.utils.js +50 -0
  130. package/dist/utils/formula/format-calculated-result.utils.js.map +1 -0
  131. package/dist/utils/formula/formula-types.d.ts +3 -0
  132. package/dist/utils/formula/formula-types.d.ts.map +1 -0
  133. package/dist/utils/formula/formula-types.js +2 -0
  134. package/dist/utils/formula/formula-types.js.map +1 -0
  135. package/dist/utils/formula/index.d.ts +11 -0
  136. package/dist/utils/formula/index.d.ts.map +1 -0
  137. package/dist/utils/formula/index.js +11 -0
  138. package/dist/utils/formula/index.js.map +1 -0
  139. package/dist/utils/formula/referenced-paths.utils.d.ts +7 -0
  140. package/dist/utils/formula/referenced-paths.utils.d.ts.map +1 -0
  141. package/dist/utils/formula/referenced-paths.utils.js +18 -0
  142. package/dist/utils/formula/referenced-paths.utils.js.map +1 -0
  143. package/dist/utils/formula/render-formula.utils.d.ts +8 -0
  144. package/dist/utils/formula/render-formula.utils.d.ts.map +1 -0
  145. package/dist/utils/formula/render-formula.utils.js +39 -0
  146. package/dist/utils/formula/render-formula.utils.js.map +1 -0
  147. package/dist/utils/formula/serialize-formula.utils.d.ts +14 -0
  148. package/dist/utils/formula/serialize-formula.utils.d.ts.map +1 -0
  149. package/dist/utils/formula/serialize-formula.utils.js +33 -0
  150. package/dist/utils/formula/serialize-formula.utils.js.map +1 -0
  151. package/dist/utils/formula/validate-formula.utils.d.ts +11 -0
  152. package/dist/utils/formula/validate-formula.utils.d.ts.map +1 -0
  153. package/dist/utils/formula/validate-formula.utils.js +79 -0
  154. package/dist/utils/formula/validate-formula.utils.js.map +1 -0
  155. package/dist/utils/index.d.ts +1 -0
  156. package/dist/utils/index.d.ts.map +1 -1
  157. package/dist/utils/index.js +1 -0
  158. package/dist/utils/index.js.map +1 -1
  159. package/package.json +2 -2
  160. package/src/components/field-config-panel/advanced-settings.tsx +113 -0
  161. package/src/components/field-config-panel/field-config-panel-overlay.tsx +8 -1
  162. package/src/components/field-config-panel/field-config-panel.tsx +43 -15
  163. package/src/components/field-config-panel/field-sidebar.tsx +91 -0
  164. package/src/components/field-config-panel/formula-generator.tsx +122 -0
  165. package/src/components/field-config-panel/formula-modal.tsx +229 -0
  166. package/src/components/field-config-panel/formula-workspace.tsx +116 -0
  167. package/src/components/field-config-panel/result-type-selector.tsx +34 -0
  168. package/src/components/field-sidebar/calculated-field-type-list.tsx +29 -0
  169. package/src/components/field-sidebar/data-model-field-type-list.tsx +10 -4
  170. package/src/components/field-sidebar/field-menu-group.tsx +36 -0
  171. package/src/components/field-sidebar/field-sidebar.tsx +14 -55
  172. package/src/components/field-sidebar/fillable-field-type-list.tsx +11 -9
  173. package/src/components/pdf-canvas/pdf-canvas.tsx +3 -0
  174. package/src/components/pdf-editor/pdf-editor.tsx +5 -0
  175. package/src/components/pdf-fields-overlay/pdf-fields-overlay.tsx +3 -0
  176. package/src/components/pdf-fields-overlay/pdf-overlay-field-calculated.tsx +15 -0
  177. package/src/components/pdf-fields-overlay/pdf-overlay-field.tsx +6 -1
  178. package/src/components/pdf-view/pdf-view-calculated.tsx +23 -0
  179. package/src/components/pdf-view/pdf-view.tsx +7 -1
  180. package/src/constants/field.constants.ts +9 -2
  181. package/src/constants/menu-group.ts +26 -0
  182. package/src/hooks/index.ts +1 -0
  183. package/src/hooks/useFormulaEditor.ts +336 -0
  184. package/src/hooks/usePdfFieldDnD.ts +4 -0
  185. package/src/index.ts +1 -1
  186. package/src/interface/types.ts +38 -2
  187. package/src/styles/formula-modal.css +307 -0
  188. package/src/styles/index.css +1 -0
  189. package/src/styles/pdf-field-overlay.css +14 -0
  190. package/src/styles/variables.css +1 -0
  191. package/src/utils/data-model/extract-fields.utils.ts +65 -7
  192. package/src/utils/formula/caret.utils.ts +125 -0
  193. package/src/utils/formula/dom.utils.ts +35 -0
  194. package/src/utils/formula/evaluate-formula.utils.ts +159 -0
  195. package/src/utils/formula/expression.utils.ts +99 -0
  196. package/src/utils/formula/format-calculated-result.utils.ts +79 -0
  197. package/src/utils/formula/formula-types.ts +2 -0
  198. package/src/utils/formula/index.ts +10 -0
  199. package/src/utils/formula/referenced-paths.utils.ts +18 -0
  200. package/src/utils/formula/render-formula.utils.ts +40 -0
  201. package/src/utils/formula/serialize-formula.utils.ts +40 -0
  202. package/src/utils/formula/validate-formula.utils.ts +94 -0
  203. 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, and fillable form fields.
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 recipient assignment
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?: FillableFieldType | ESignFieldType;
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;AAGhE,UAAU,4BAA4B;IAClC,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,CAmCpE,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;AAUxD,MAAM,CAAC,MAAM,uBAAuB,GAAqC,CAAC,EACtE,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,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,UAAU,EACtB,mBAAmB,EAAE,mBAAmB,EACxC,aAAa,EAAE,aAAa,GAC9B,GACA,IACH,CACV,CAAC;AACN,CAAC,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,EAAiC,QAAQ,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG/F,UAAU,qBAAqB;IAC3B,KAAK,EAAE,QAAQ,CAAC;IAChB,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,CAqItD,CAAC"}
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
- export const FieldConfigPanel = ({ field, onDeleteField, onFieldConfigChange, recipients = [], }) => {
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: [(field.type === FieldTypeEnum.fillable || field.type === FieldTypeEnum.eSign) && (_jsx(TextField, { label: "Label", value: field.label, onChange: e => onFieldConfigChange({
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(Textarea, { label: "Description", value: field.description, onChange: e => {
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":"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"}
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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"}