@servicetitan/dte-pdf-editor 1.52.0 → 1.54.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 (75) hide show
  1. package/README.md +67 -51
  2. package/dist/components/display-conditions/condition-row.d.ts.map +1 -1
  3. package/dist/components/display-conditions/condition-row.js +35 -29
  4. package/dist/components/display-conditions/condition-row.js.map +1 -1
  5. package/dist/components/display-conditions/condition-value-control.d.ts +9 -0
  6. package/dist/components/display-conditions/condition-value-control.d.ts.map +1 -0
  7. package/dist/components/display-conditions/condition-value-control.js +33 -0
  8. package/dist/components/display-conditions/condition-value-control.js.map +1 -0
  9. package/dist/components/field-config-panel/field-config-panel-overlay.d.ts +1 -0
  10. package/dist/components/field-config-panel/field-config-panel-overlay.d.ts.map +1 -1
  11. package/dist/components/field-config-panel/field-config-panel-overlay.js +2 -2
  12. package/dist/components/field-config-panel/field-config-panel-overlay.js.map +1 -1
  13. package/dist/components/field-config-panel/field-config-panel.d.ts +1 -0
  14. package/dist/components/field-config-panel/field-config-panel.d.ts.map +1 -1
  15. package/dist/components/field-config-panel/field-config-panel.js +38 -15
  16. package/dist/components/field-config-panel/field-config-panel.js.map +1 -1
  17. package/dist/components/pdf-editor/pdf-editor.d.ts.map +1 -1
  18. package/dist/components/pdf-editor/pdf-editor.js +1 -1
  19. package/dist/components/pdf-editor/pdf-editor.js.map +1 -1
  20. package/dist/components/pdf-view/pdf-view-fillable.d.ts +2 -0
  21. package/dist/components/pdf-view/pdf-view-fillable.d.ts.map +1 -1
  22. package/dist/components/pdf-view/pdf-view-fillable.js +14 -10
  23. package/dist/components/pdf-view/pdf-view-fillable.js.map +1 -1
  24. package/dist/components/pdf-view/pdf-view.d.ts +11 -0
  25. package/dist/components/pdf-view/pdf-view.d.ts.map +1 -1
  26. package/dist/components/pdf-view/pdf-view.js +2 -2
  27. package/dist/components/pdf-view/pdf-view.js.map +1 -1
  28. package/dist/hooks/index.d.ts +1 -0
  29. package/dist/hooks/index.d.ts.map +1 -1
  30. package/dist/hooks/index.js +1 -0
  31. package/dist/hooks/index.js.map +1 -1
  32. package/dist/hooks/useLookupOptions.d.ts +23 -0
  33. package/dist/hooks/useLookupOptions.d.ts.map +1 -0
  34. package/dist/hooks/useLookupOptions.js +60 -0
  35. package/dist/hooks/useLookupOptions.js.map +1 -0
  36. package/dist/hooks/usePdfFieldDnD.d.ts.map +1 -1
  37. package/dist/hooks/usePdfFieldDnD.js +5 -0
  38. package/dist/hooks/usePdfFieldDnD.js.map +1 -1
  39. package/dist/hooks/usePdfFieldSelection.d.ts +1 -0
  40. package/dist/hooks/usePdfFieldSelection.d.ts.map +1 -1
  41. package/dist/hooks/usePdfFieldSelection.js +4 -0
  42. package/dist/hooks/usePdfFieldSelection.js.map +1 -1
  43. package/dist/index.d.ts +1 -0
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +1 -0
  46. package/dist/index.js.map +1 -1
  47. package/dist/interface/host-events.d.ts +65 -0
  48. package/dist/interface/host-events.d.ts.map +1 -0
  49. package/dist/interface/host-events.js +75 -0
  50. package/dist/interface/host-events.js.map +1 -0
  51. package/dist/interface/types.d.ts +16 -0
  52. package/dist/interface/types.d.ts.map +1 -1
  53. package/dist/interface/types.js +5 -0
  54. package/dist/interface/types.js.map +1 -1
  55. package/dist/utils/conditions/schema-data-points.utils.d.ts +1 -0
  56. package/dist/utils/conditions/schema-data-points.utils.d.ts.map +1 -1
  57. package/dist/utils/conditions/schema-data-points.utils.js +30 -6
  58. package/dist/utils/conditions/schema-data-points.utils.js.map +1 -1
  59. package/package.json +1 -1
  60. package/src/components/display-conditions/condition-row.tsx +79 -41
  61. package/src/components/display-conditions/condition-value-control.tsx +90 -0
  62. package/src/components/field-config-panel/field-config-panel-overlay.tsx +6 -0
  63. package/src/components/field-config-panel/field-config-panel.tsx +61 -12
  64. package/src/components/pdf-editor/pdf-editor.tsx +1 -0
  65. package/src/components/pdf-view/pdf-view-fillable.tsx +18 -3
  66. package/src/components/pdf-view/pdf-view.tsx +8 -1
  67. package/src/hooks/index.ts +1 -0
  68. package/src/hooks/useLookupOptions.ts +86 -0
  69. package/src/hooks/usePdfFieldDnD.ts +5 -0
  70. package/src/hooks/usePdfFieldSelection.ts +8 -0
  71. package/src/index.ts +1 -0
  72. package/src/interface/host-events.ts +118 -0
  73. package/src/interface/types.ts +15 -0
  74. package/src/utils/conditions/__tests__/schema-data-points.utils.test.ts +35 -0
  75. package/src/utils/conditions/schema-data-points.utils.ts +38 -6
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Host <-> editor contract for the "data-model lookup source" dropdown options (BYOD editor).
3
+ *
4
+ * A schema field can be tagged (in the template-type editor) with `options.fieldLookupSource`.
5
+ * When such a field is selected in the conditional-logic UI, the editor does NOT own the option
6
+ * data — it asks the HOST for it over the EventTarget bus below and renders whatever the host
7
+ * returns.
8
+ *
9
+ * Transport mirrors the unlayer `displayConditionController` / `lookupOptionsController` pattern: a
10
+ * module-scoped `EventTarget` shared by every consumer of this package (no global `window`
11
+ * pollution, no cross-instance leakage). The host imports `onLookupOptionsRequest` /
12
+ * `emitLookupOptionsResponse`; the editor uses `emitLookupOptionsRequest` / `onLookupOptionsResponse`.
13
+ *
14
+ * Event names (host <-> editor):
15
+ * - "dte-byod-client-mfe:lookup-options-request" (editor -> host)
16
+ * - "dte-byod-client-mfe:lookup-options-response" (host -> editor)
17
+ *
18
+ * The host-side resolver is implemented separately (it wires these events to the app's data
19
+ * providers, e.g. job types / states).
20
+ */
21
+ /** editor -> host event name. */
22
+ export const LOOKUP_OPTIONS_REQUEST_EVENT = 'dte-byod-client-mfe:lookup-options-request';
23
+ /** host -> editor event name. */
24
+ export const LOOKUP_OPTIONS_RESPONSE_EVENT = 'dte-byod-client-mfe:lookup-options-response';
25
+ /**
26
+ * Lookup sources that require the host to search an API per typed query. These keep the free-text
27
+ * input for now (the editor only handles full-list, load-once sources).
28
+ */
29
+ export const SEARCHABLE_LOOKUP_SOURCES = ['city'];
30
+ /** True when a lookup source is searchable (host-side per-query search) rather than a full list. */
31
+ export const isSearchableLookupSource = (sourceKey) => {
32
+ return !!sourceKey && SEARCHABLE_LOOKUP_SOURCES.includes(sourceKey);
33
+ };
34
+ /** Generate a unique request id for correlating request/response pairs. */
35
+ export const createLookupRequestId = () => {
36
+ return `lookup-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;
37
+ };
38
+ const lookupOptionsEvents = new EventTarget();
39
+ /** editor -> host: ask the host to resolve options for a lookup source. */
40
+ export const emitLookupOptionsRequest = (request) => {
41
+ lookupOptionsEvents.dispatchEvent(new CustomEvent(LOOKUP_OPTIONS_REQUEST_EVENT, { detail: request }));
42
+ };
43
+ /** host side: listen for editor requests. Returns an unsubscribe function. */
44
+ export const onLookupOptionsRequest = (listener) => {
45
+ const handler = (event) => {
46
+ const detail = event.detail;
47
+ if (!detail) {
48
+ return;
49
+ }
50
+ listener(detail);
51
+ };
52
+ lookupOptionsEvents.addEventListener(LOOKUP_OPTIONS_REQUEST_EVENT, handler);
53
+ return () => {
54
+ lookupOptionsEvents.removeEventListener(LOOKUP_OPTIONS_REQUEST_EVENT, handler);
55
+ };
56
+ };
57
+ /** host -> editor: deliver resolved options back to the editor. */
58
+ export const emitLookupOptionsResponse = (response) => {
59
+ lookupOptionsEvents.dispatchEvent(new CustomEvent(LOOKUP_OPTIONS_RESPONSE_EVENT, { detail: response }));
60
+ };
61
+ /** editor side: listen for host responses. Returns an unsubscribe function. */
62
+ export const onLookupOptionsResponse = (listener) => {
63
+ const handler = (event) => {
64
+ const detail = event.detail;
65
+ if (!detail) {
66
+ return;
67
+ }
68
+ listener(detail);
69
+ };
70
+ lookupOptionsEvents.addEventListener(LOOKUP_OPTIONS_RESPONSE_EVENT, handler);
71
+ return () => {
72
+ lookupOptionsEvents.removeEventListener(LOOKUP_OPTIONS_RESPONSE_EVENT, handler);
73
+ };
74
+ };
75
+ //# sourceMappingURL=host-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-events.js","sourceRoot":"","sources":["../../src/interface/host-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AA2BH,iCAAiC;AACjC,MAAM,CAAC,MAAM,4BAA4B,GAAG,4CAA4C,CAAC;AACzF,iCAAiC;AACjC,MAAM,CAAC,MAAM,6BAA6B,GAAG,6CAA6C,CAAC;AAE3F;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,MAAM,CAAU,CAAC;AAI3D,oGAAoG;AACpG,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,SAA6B,EAAW,EAAE;IAC/E,OAAO,CAAC,CAAC,SAAS,IAAK,yBAA+C,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC/F,CAAC,CAAC;AAEF,2EAA2E;AAC3E,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAW,EAAE;IAC9C,OAAO,UAAU,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAC7E,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,IAAI,WAAW,EAAE,CAAC;AAE9C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,OAA6B,EAAE,EAAE;IACtE,mBAAmB,CAAC,aAAa,CAC7B,IAAI,WAAW,CAAuB,4BAA4B,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAC3F,CAAC;AACN,CAAC,CAAC;AAEF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,QAAiD,EAAE,EAAE;IACxF,MAAM,OAAO,GAAG,CAAC,KAAY,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAI,KAA2C,CAAC,MAAM,CAAC;QACnE,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO;QACX,CAAC;QACD,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC,CAAC;IAEF,mBAAmB,CAAC,gBAAgB,CAAC,4BAA4B,EAAE,OAAO,CAAC,CAAC;IAE5E,OAAO,GAAG,EAAE;QACR,mBAAmB,CAAC,mBAAmB,CAAC,4BAA4B,EAAE,OAAO,CAAC,CAAC;IACnF,CAAC,CAAC;AACN,CAAC,CAAC;AAEF,mEAAmE;AACnE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,QAA+B,EAAE,EAAE;IACzE,mBAAmB,CAAC,aAAa,CAC7B,IAAI,WAAW,CAAwB,6BAA6B,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAC9F,CAAC;AACN,CAAC,CAAC;AAEF,+EAA+E;AAC/E,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,QAAmD,EAAE,EAAE;IAC3F,MAAM,OAAO,GAAG,CAAC,KAAY,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAI,KAA4C,CAAC,MAAM,CAAC;QACpE,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO;QACX,CAAC;QACD,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC,CAAC;IAEF,mBAAmB,CAAC,gBAAgB,CAAC,6BAA6B,EAAE,OAAO,CAAC,CAAC;IAE7E,OAAO,GAAG,EAAE;QACR,mBAAmB,CAAC,mBAAmB,CAAC,6BAA6B,EAAE,OAAO,CAAC,CAAC;IACpF,CAAC,CAAC;AACN,CAAC,CAAC"}
@@ -75,6 +75,7 @@ export interface PdfField {
75
75
  y: number;
76
76
  page: number;
77
77
  label: string;
78
+ groupName?: string;
78
79
  width: number;
79
80
  height: number;
80
81
  required?: boolean;
@@ -254,13 +255,28 @@ export declare const NUMBER_OPERATORS: readonly [{
254
255
  readonly value: "num_lte";
255
256
  }];
256
257
  export type ConditionOperator = (typeof STRING_OPERATORS)[number]['value'] | (typeof NUMBER_OPERATORS)[number]['value'];
258
+ /** Operators for radio-group fillable fields. */
259
+ export declare const RADIO_OPERATORS: readonly [{
260
+ readonly label: "Is equal to";
261
+ readonly value: "is_equal_to";
262
+ }, {
263
+ readonly label: "Is not equal to";
264
+ readonly value: "is_not_equal_to";
265
+ }];
257
266
  /** Operators that do not require a value (empty/is not empty) */
258
267
  export declare const VALUE_LESS_OPERATORS: ConditionOperator[];
268
+ export interface RadioGroupOption {
269
+ id: string;
270
+ label: string;
271
+ }
259
272
  export interface DataPointOption {
260
273
  fieldType: 'number' | 'string';
261
274
  fullKey: string;
262
275
  title: string;
263
276
  formSnapshot?: FormulaFieldFormSnapshot;
277
+ isRadioGroup?: boolean;
278
+ radioOptions?: RadioGroupOption[];
279
+ lookupSource?: string;
264
280
  }
265
281
  export {};
266
282
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/interface/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/interface/types.ts"],"names":[],"mappings":"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"}
@@ -39,6 +39,11 @@ export const NUMBER_OPERATORS = [
39
39
  { label: '>= (greater than or equal to)', value: 'num_gte' },
40
40
  { label: '<= (less than or equal to)', value: 'num_lte' },
41
41
  ];
42
+ /** Operators for radio-group fillable fields. */
43
+ export const RADIO_OPERATORS = [
44
+ { label: 'Is equal to', value: 'is_equal_to' },
45
+ { label: 'Is not equal to', value: 'is_not_equal_to' },
46
+ ];
42
47
  /** Operators that do not require a value (empty/is not empty) */
43
48
  export const VALUE_LESS_OPERATORS = ['is_empty', 'is_not_empty'];
44
49
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/interface/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,aAOX;AAPD,WAAY,aAAa;IACrB,wCAAuB,CAAA;IACvB,gCAAe,CAAA;IACf,gCAAe,CAAA;IACf,sCAAqB,CAAA;IACrB,0CAAyB,CAAA;IACzB,oCAAmB,CAAA;AACvB,CAAC,EAPW,aAAa,KAAb,aAAa,QAOxB;AAED,MAAM,CAAN,IAAY,cAKX;AALD,WAAY,cAAc;IACtB,yCAAuB,CAAA;IACvB,uCAAqB,CAAA;IACrB,2CAAyB,CAAA;IACzB,uCAAqB,CAAA;AACzB,CAAC,EALW,cAAc,KAAd,cAAc,QAKzB;AA6GD,kCAAkC;AAClC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAiItD;;GAEG;AAEH,wCAAwC;AACxC,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC5B,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;IACxC,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,kBAAkB,EAAE;IACxD,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE;IAC9C,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,iBAAiB,EAAE;IACtD,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE;IAC9C,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;IAC1C,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;IACxC,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE;CAC1C,CAAC;AAEX,wCAAwC;AACxC,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC5B,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE;IAC3C,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE;IAChD,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,QAAQ,EAAE;IAC9C,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE;IAC3C,EAAE,KAAK,EAAE,+BAA+B,EAAE,KAAK,EAAE,SAAS,EAAE;IAC5D,EAAE,KAAK,EAAE,4BAA4B,EAAE,KAAK,EAAE,SAAS,EAAE;CACnD,CAAC;AAMX,iEAAiE;AACjE,MAAM,CAAC,MAAM,oBAAoB,GAAwB,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/interface/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,aAOX;AAPD,WAAY,aAAa;IACrB,wCAAuB,CAAA;IACvB,gCAAe,CAAA;IACf,gCAAe,CAAA;IACf,sCAAqB,CAAA;IACrB,0CAAyB,CAAA;IACzB,oCAAmB,CAAA;AACvB,CAAC,EAPW,aAAa,KAAb,aAAa,QAOxB;AAED,MAAM,CAAN,IAAY,cAKX;AALD,WAAY,cAAc;IACtB,yCAAuB,CAAA;IACvB,uCAAqB,CAAA;IACrB,2CAAyB,CAAA;IACzB,uCAAqB,CAAA;AACzB,CAAC,EALW,cAAc,KAAd,cAAc,QAKzB;AA8GD,kCAAkC;AAClC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAiItD;;GAEG;AAEH,wCAAwC;AACxC,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC5B,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;IACxC,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,kBAAkB,EAAE;IACxD,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE;IAC9C,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,iBAAiB,EAAE;IACtD,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE;IAC9C,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;IAC1C,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;IACxC,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE;CAC1C,CAAC;AAEX,wCAAwC;AACxC,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC5B,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE;IAC3C,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE;IAChD,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,QAAQ,EAAE;IAC9C,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE;IAC3C,EAAE,KAAK,EAAE,+BAA+B,EAAE,KAAK,EAAE,SAAS,EAAE;IAC5D,EAAE,KAAK,EAAE,4BAA4B,EAAE,KAAK,EAAE,SAAS,EAAE;CACnD,CAAC;AAMX,iDAAiD;AACjD,MAAM,CAAC,MAAM,eAAe,GAAG;IAC3B,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE;IAC9C,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,iBAAiB,EAAE;CAChD,CAAC;AAEX,iEAAiE;AACjE,MAAM,CAAC,MAAM,oBAAoB,GAAwB,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC"}
@@ -3,6 +3,7 @@ export declare function getSchemaDataPointOptions(schema: SchemaObject | undefin
3
3
  /**
4
4
  * Data point options from document fields: fillable only (no calculated fields).
5
5
  * Uses field.path as fullKey so condition evaluation can read from the same data object.
6
+ * Radio buttons sharing the same path are grouped into a single option using groupName.
6
7
  */
7
8
  export declare function getDocumentFieldsDataPointOptions(fields: PdfField[] | undefined): DataPointOption[];
8
9
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"schema-data-points.utils.d.ts","sourceRoot":"","sources":["../../../src/utils/conditions/schema-data-points.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,eAAe,EAEf,KAAK,QAAQ,EAEb,KAAK,YAAY,EACpB,MAAM,uBAAuB,CAAC;AA8C/B,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,eAAe,EAAE,CAG7F;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAC7C,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,GAC/B,eAAe,EAAE,CAiBnB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAC/B,MAAM,EAAE,YAAY,GAAG,SAAS,EAChC,cAAc,EAAE,QAAQ,EAAE,GAAG,SAAS,GACvC,eAAe,EAAE,CAKnB"}
1
+ {"version":3,"file":"schema-data-points.utils.d.ts","sourceRoot":"","sources":["../../../src/utils/conditions/schema-data-points.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,eAAe,EAEf,KAAK,QAAQ,EAEb,KAAK,YAAY,EACpB,MAAM,uBAAuB,CAAC;AA+C/B,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,eAAe,EAAE,CAG7F;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAC7C,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,GAC/B,eAAe,EAAE,CA+CnB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAC/B,MAAM,EAAE,YAAY,GAAG,SAAS,EAChC,cAAc,EAAE,QAAQ,EAAE,GAAG,SAAS,GACvC,eAAe,EAAE,CAKnB"}
@@ -7,7 +7,7 @@ function isValueNode(node) {
7
7
  return (node === null || node === void 0 ? void 0 : node.type) === 'string' || (node === null || node === void 0 ? void 0 : node.type) === 'number';
8
8
  }
9
9
  function walkSchema(schema, prefix, parentTitles) {
10
- var _a;
10
+ var _a, _b, _c;
11
11
  if (!(schema === null || schema === void 0 ? void 0 : schema.properties)) {
12
12
  return [];
13
13
  }
@@ -25,6 +25,7 @@ function walkSchema(schema, prefix, parentTitles) {
25
25
  fieldType,
26
26
  fullKey,
27
27
  title: fullTitle || fullKey,
28
+ lookupSource: (_c = (_b = node.options) === null || _b === void 0 ? void 0 : _b.fieldLookupSource) === null || _c === void 0 ? void 0 : _c.trim(),
28
29
  });
29
30
  }
30
31
  }
@@ -37,21 +38,44 @@ export function getSchemaDataPointOptions(schema) {
37
38
  /**
38
39
  * Data point options from document fields: fillable only (no calculated fields).
39
40
  * Uses field.path as fullKey so condition evaluation can read from the same data object.
41
+ * Radio buttons sharing the same path are grouped into a single option using groupName.
40
42
  */
41
43
  export function getDocumentFieldsDataPointOptions(fields) {
44
+ var _a, _b, _c, _d, _e;
42
45
  if (!(fields === null || fields === void 0 ? void 0 : fields.length)) {
43
46
  return [];
44
47
  }
45
48
  const result = [];
46
- for (const f of fields) {
47
- if (!f.path || f.type !== FieldTypeEnum.fillable) {
49
+ const radioGroupsByPath = new Map();
50
+ for (const field of fields) {
51
+ if (!field.path || field.type !== FieldTypeEnum.fillable) {
48
52
  continue;
49
53
  }
50
- const fieldType = f.subType === 'number' ? 'number' : 'string';
54
+ if (field.subType === 'radio') {
55
+ const group = (_a = radioGroupsByPath.get(field.path)) !== null && _a !== void 0 ? _a : [];
56
+ group.push(field);
57
+ radioGroupsByPath.set(field.path, group);
58
+ continue;
59
+ }
60
+ const fieldType = field.subType === 'number' ? 'number' : 'string';
51
61
  result.push({
52
62
  fieldType,
53
- fullKey: f.path,
54
- title: f.label || f.path,
63
+ fullKey: field.path,
64
+ title: field.label || field.path,
65
+ });
66
+ }
67
+ for (const [path, radioFields] of radioGroupsByPath) {
68
+ const sortedRadioFields = [...radioFields].sort((a, b) => (a.label || '').localeCompare(b.label || ''));
69
+ const groupName = (_e = (_c = (_b = sortedRadioFields.find(radioField => radioField.groupName)) === null || _b === void 0 ? void 0 : _b.groupName) !== null && _c !== void 0 ? _c : (_d = sortedRadioFields[0]) === null || _d === void 0 ? void 0 : _d.label) !== null && _e !== void 0 ? _e : path;
70
+ result.push({
71
+ fieldType: 'string',
72
+ fullKey: path,
73
+ title: groupName,
74
+ isRadioGroup: true,
75
+ radioOptions: sortedRadioFields.map(radioField => ({
76
+ id: radioField.id,
77
+ label: radioField.label || radioField.id,
78
+ })),
55
79
  });
56
80
  }
57
81
  return result.sort((a, b) => a.title.localeCompare(b.title));
@@ -1 +1 @@
1
- {"version":3,"file":"schema-data-points.utils.js","sourceRoot":"","sources":["../../../src/utils/conditions/schema-data-points.utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema-data-points.utils.js","sourceRoot":"","sources":["../../../src/utils/conditions/schema-data-points.utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/dte-pdf-editor",
3
- "version": "1.52.0",
3
+ "version": "1.54.0",
4
4
  "description": "",
5
5
  "main": "./dist/index.js",
6
6
  "typings": "./dist/index.d.ts",
@@ -1,4 +1,4 @@
1
- import { Button, Chip, Combobox, Flex, Text, TextField } from '@servicetitan/anvil2';
1
+ import { Button, Chip, Combobox, Flex, Text } from '@servicetitan/anvil2';
2
2
  import TrashIcon from '@servicetitan/anvil2/assets/icons/material/round/delete.svg';
3
3
  import { useEffect, useMemo, useState } from 'react';
4
4
  import {
@@ -9,6 +9,8 @@ import {
9
9
  FormFieldsByFormIdI,
10
10
  FormInfo,
11
11
  NUMBER_OPERATORS,
12
+ RADIO_OPERATORS,
13
+ RadioGroupOption,
12
14
  STRING_OPERATORS,
13
15
  VALUE_LESS_OPERATORS,
14
16
  } from '../../interface/types';
@@ -19,6 +21,7 @@ import {
19
21
  inferDisplayConditionSourceKind,
20
22
  parseFormFieldKey,
21
23
  } from '../../utils';
24
+ import { ConditionValueControl } from './condition-value-control';
22
25
 
23
26
  export interface ConditionRowProps {
24
27
  canRemove: boolean;
@@ -55,20 +58,6 @@ const SOURCE_KIND_LABELS: Record<DisplayConditionSourceKind, string> = {
55
58
  [FieldTypeEnum.forms]: 'Form',
56
59
  };
57
60
 
58
- function sanitizeNumericInput(raw: string): string {
59
- let value = raw.replaceAll(/[^0-9.-]/g, '');
60
- const isNegative = value.startsWith('-');
61
- value = value.replaceAll('-', '');
62
- if (isNegative) {
63
- value = `-${value}`;
64
- }
65
- const firstDot = value.indexOf('.');
66
- if (firstDot >= 0) {
67
- value = `${value.slice(0, firstDot + 1)}${value.slice(firstDot + 1).replaceAll('.', '')}`;
68
- }
69
- return value;
70
- }
71
-
72
61
  const pickDefaultSourceKind = (options: SourceKindOption[]) => {
73
62
  return options[0]?.value ?? FieldTypeEnum.dataModel;
74
63
  };
@@ -199,12 +188,25 @@ export function ConditionRow({
199
188
  [dataPointItems, condition.dataPointKey],
200
189
  );
201
190
 
202
- const operatorItems: OperatorOption[] = useMemo(
203
- () =>
204
- fieldType === 'number'
205
- ? ([...NUMBER_OPERATORS] as OperatorOption[])
206
- : ([...STRING_OPERATORS] as OperatorOption[]),
207
- [fieldType],
191
+ const isRadioGroup = selectedDataPoint?.isRadioGroup === true;
192
+
193
+ const operatorItems: OperatorOption[] = useMemo(() => {
194
+ if (isRadioGroup) {
195
+ return [...RADIO_OPERATORS] as OperatorOption[];
196
+ }
197
+ return fieldType === 'number'
198
+ ? ([...NUMBER_OPERATORS] as OperatorOption[])
199
+ : ([...STRING_OPERATORS] as OperatorOption[]);
200
+ }, [fieldType, isRadioGroup]);
201
+
202
+ const radioValueOptions = useMemo(
203
+ () => selectedDataPoint?.radioOptions ?? [],
204
+ [selectedDataPoint],
205
+ );
206
+
207
+ const selectedRadioValue = useMemo(
208
+ () => radioValueOptions.find(option => option.id === condition.value) ?? null,
209
+ [radioValueOptions, condition.value],
208
210
  );
209
211
 
210
212
  const selectedOperator = useMemo(
@@ -214,28 +216,34 @@ export function ConditionRow({
214
216
 
215
217
  const isValueLess = VALUE_LESS_OPERATORS.includes(condition.operator as ConditionOperator);
216
218
 
217
- const handleValueChange = (raw: string) => {
218
- const value = fieldType === 'number' ? sanitizeNumericInput(raw) : raw;
219
- onChange({ ...condition, value });
220
- };
221
-
222
- const resetOperatorForFieldType = (nextFieldType: 'number' | 'string') => {
223
- const nextOperatorItems = nextFieldType === 'number' ? NUMBER_OPERATORS : STRING_OPERATORS;
219
+ const resetOperatorForFieldType = (
220
+ nextFieldType: 'number' | 'string',
221
+ nextIsRadioGroup: boolean,
222
+ ) => {
223
+ const nextOperatorItems = nextIsRadioGroup
224
+ ? RADIO_OPERATORS
225
+ : nextFieldType === 'number'
226
+ ? NUMBER_OPERATORS
227
+ : STRING_OPERATORS;
224
228
  return !nextOperatorItems.some(op => op.value === condition.operator);
225
229
  };
226
230
 
227
231
  const handleDataPointChange = (item: DataPointOption | null) => {
228
232
  const nextFieldType = item?.fieldType ?? 'string';
229
- const operatorReset = resetOperatorForFieldType(nextFieldType);
233
+ const nextIsRadioGroup = item?.isRadioGroup === true;
234
+ const operatorReset = resetOperatorForFieldType(nextFieldType, nextIsRadioGroup);
230
235
  onChange({
231
236
  ...condition,
232
237
  dataPointKey: item?.fullKey ?? '',
233
238
  formSnapshot: item?.formSnapshot,
234
239
  operator: operatorReset
235
- ? nextFieldType === 'number'
236
- ? 'num_eq'
237
- : 'is_equal_to'
240
+ ? nextIsRadioGroup
241
+ ? 'is_equal_to'
242
+ : nextFieldType === 'number'
243
+ ? 'num_eq'
244
+ : 'is_equal_to'
238
245
  : condition.operator,
246
+ value: '',
239
247
  });
240
248
  };
241
249
 
@@ -429,15 +437,45 @@ export function ConditionRow({
429
437
  </Flex>
430
438
  {!isValueLess && (
431
439
  <Flex flex={1} style={{ minWidth: 120 }}>
432
- <TextField
433
- label="Value"
434
- flex={1}
435
- value={condition.value}
436
- onChange={e => handleValueChange(e.target.value)}
437
- placeholder={fieldType === 'number' ? 'e.g. 1.5' : 'Enter value...'}
438
- aria-label="Value"
439
- {...(fieldType === 'number' && { inputMode: 'decimal' })}
440
- />
440
+ {isRadioGroup ? (
441
+ <Combobox
442
+ flex={1}
443
+ itemToKey={item => item?.id ?? ''}
444
+ itemToString={item => item?.label ?? ''}
445
+ items={radioValueOptions}
446
+ selectedItem={selectedRadioValue}
447
+ onChange={(item: RadioGroupOption | null) =>
448
+ onChange({
449
+ ...condition,
450
+ value: item?.id ?? '',
451
+ })
452
+ }
453
+ filterOptions={{ keys: ['label'] }}
454
+ >
455
+ <Combobox.SelectTrigger
456
+ label="Value"
457
+ placeholder="Select radio option..."
458
+ />
459
+ <Combobox.Content>
460
+ {({ items }) => (
461
+ <Combobox.List>
462
+ {items.map((item, i) => (
463
+ <Combobox.Item index={i} item={item} key={item.id}>
464
+ {item.label}
465
+ </Combobox.Item>
466
+ ))}
467
+ </Combobox.List>
468
+ )}
469
+ </Combobox.Content>
470
+ </Combobox>
471
+ ) : (
472
+ <ConditionValueControl
473
+ value={condition.value}
474
+ fieldType={fieldType}
475
+ lookupSource={selectedDataPoint?.lookupSource}
476
+ onChange={value => onChange({ ...condition, value })}
477
+ />
478
+ )}
441
479
  </Flex>
442
480
  )}
443
481
  {canRemove && (
@@ -0,0 +1,90 @@
1
+ import { Combobox, TextField } from '@servicetitan/anvil2';
2
+ import { useMemo } from 'react';
3
+ import { useLookupOptions } from '../../hooks';
4
+ import type { LookupOption } from '../../interface/host-events';
5
+
6
+ export interface ConditionValueControlProps {
7
+ value: string;
8
+ fieldType: 'number' | 'string';
9
+ /** The selected data point's `options.fieldLookupSource`; empty -> free-text input. */
10
+ lookupSource?: string;
11
+ onChange: (value: string) => void;
12
+ }
13
+
14
+ const sanitizeNumericInput = (raw: string): string => {
15
+ let value = raw.replaceAll(/[^0-9.-]/g, '');
16
+ const isNegative = value.startsWith('-');
17
+ value = value.replaceAll('-', '');
18
+ if (isNegative) {
19
+ value = `-${value}`;
20
+ }
21
+ const firstDot = value.indexOf('.');
22
+ if (firstDot >= 0) {
23
+ value = `${value.slice(0, firstDot + 1)}${value.slice(firstDot + 1).replaceAll('.', '')}`;
24
+ }
25
+ return value;
26
+ };
27
+
28
+ export function ConditionValueControl({
29
+ fieldType,
30
+ lookupSource,
31
+ onChange,
32
+ value,
33
+ }: Readonly<ConditionValueControlProps>) {
34
+ const { options, status } = useLookupOptions(lookupSource);
35
+
36
+ const selectedOption = useMemo(
37
+ () => options.find(option => option.key === value) ?? null,
38
+ [options, value],
39
+ );
40
+
41
+ if (status === 'loading') {
42
+ return (
43
+ <TextField label="Value" flex={1} disabled value="" placeholder="" aria-label="Value" />
44
+ );
45
+ }
46
+
47
+ // idle / fallback (no source, searchable source, empty, error, or timeout) -> free text.
48
+ if (status !== 'ready') {
49
+ const handleTextChange = (raw: string) => {
50
+ onChange(fieldType === 'number' ? sanitizeNumericInput(raw) : raw);
51
+ };
52
+
53
+ return (
54
+ <TextField
55
+ label="Value"
56
+ flex={1}
57
+ value={value}
58
+ onChange={e => handleTextChange(e.target.value)}
59
+ placeholder={fieldType === 'number' ? 'e.g. 1.5' : 'Enter value...'}
60
+ aria-label="Value"
61
+ {...(fieldType === 'number' && { inputMode: 'decimal' })}
62
+ />
63
+ );
64
+ }
65
+
66
+ return (
67
+ <Combobox
68
+ flex={1}
69
+ items={options}
70
+ selectedItem={selectedOption}
71
+ itemToKey={(item: LookupOption | null) => item?.key ?? ''}
72
+ itemToString={(item: LookupOption | null) => item?.label ?? ''}
73
+ onChange={(item: LookupOption | null) => onChange(item?.key ?? '')}
74
+ filterOptions={{ keys: ['label'] }}
75
+ >
76
+ <Combobox.SelectTrigger label="Value" placeholder="Select value..." />
77
+ <Combobox.Content>
78
+ {({ items }: { items: LookupOption[] }) => (
79
+ <Combobox.List>
80
+ {items.map((item, i) => (
81
+ <Combobox.Item index={i} item={item} key={item.key}>
82
+ {item.label}
83
+ </Combobox.Item>
84
+ ))}
85
+ </Combobox.List>
86
+ )}
87
+ </Combobox.Content>
88
+ </Combobox>
89
+ );
90
+ }
@@ -20,6 +20,10 @@ interface FieldConfigPanelOverlayProps {
20
20
  recipients?: RecipientInfo[];
21
21
  hideConditionalLogic?: boolean;
22
22
  onFieldConfigChange(updates: Partial<PdfField>): void;
23
+ onMatchingFieldsConfigChange?(
24
+ predicate: (field: PdfField) => boolean,
25
+ updates: Partial<PdfField>,
26
+ ): void;
23
27
  onDeleteField(): void;
24
28
  onDeselectField?(): void;
25
29
  onRequestFormFields(formId: number): void;
@@ -35,6 +39,7 @@ export const FieldConfigPanelOverlay: FC<FieldConfigPanelOverlayProps> = ({
35
39
  onDeleteField,
36
40
  onDeselectField,
37
41
  onFieldConfigChange,
42
+ onMatchingFieldsConfigChange,
38
43
  onRequestFormFields,
39
44
  recipients,
40
45
  selectedField,
@@ -67,6 +72,7 @@ export const FieldConfigPanelOverlay: FC<FieldConfigPanelOverlayProps> = ({
67
72
  formulaLoadingFormId={formulaLoadingFormId}
68
73
  recipients={recipients}
69
74
  onFieldConfigChange={onFieldConfigChange}
75
+ onMatchingFieldsConfigChange={onMatchingFieldsConfigChange}
70
76
  onDeleteField={onDeleteField}
71
77
  hideConditionalLogic={hideConditionalLogic}
72
78
  onRequestFormFields={onRequestFormFields}