@servicetitan/dte-unlayer 0.149.0 → 0.151.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.
@@ -9,5 +9,5 @@ export interface ConditionGroupProps {
9
9
  onFormSelect: (formId: number) => void;
10
10
  onUpdate: (g: ConditionGroupType) => void;
11
11
  }
12
- export declare function ConditionGroup({ dataPointOptions, formFieldOptions, forms, group, onFormSelect, onUpdate, }: Readonly<ConditionGroupProps>): import("react/jsx-runtime").JSX.Element;
12
+ export declare function ConditionGroup({ dataPointOptions, formFieldOptions, forms, group, onFormSelect, onUpdate, }: Readonly<ConditionGroupProps>): import("react").JSX.Element;
13
13
  //# sourceMappingURL=ConditionGroup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConditionGroup.d.ts","sourceRoot":"","sources":["../../src/display-conditions/ConditionGroup.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAG3C,OAAO,EAAE,cAAc,IAAI,kBAAkB,EAAE,eAAe,EAAmB,MAAM,SAAS,CAAC;AACjG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,MAAM,WAAW,mBAAmB;IAChC,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,EAAE,CAAC,CAAC,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAC7C;AAED,wBAAgB,cAAc,CAAC,EAC3B,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,EACL,KAAK,EACL,YAAY,EACZ,QAAQ,GACX,EAAE,QAAQ,CAAC,mBAAmB,CAAC,2CAiE/B"}
1
+ {"version":3,"file":"ConditionGroup.d.ts","sourceRoot":"","sources":["../../src/display-conditions/ConditionGroup.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAG3C,OAAO,EAAE,cAAc,IAAI,kBAAkB,EAAE,eAAe,EAAmB,MAAM,SAAS,CAAC;AACjG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,MAAM,WAAW,mBAAmB;IAChC,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,EAAE,CAAC,CAAC,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAC7C;AAED,wBAAgB,cAAc,CAAC,EAC3B,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,EACL,KAAK,EACL,YAAY,EACZ,QAAQ,GACX,EAAE,QAAQ,CAAC,mBAAmB,CAAC,+BAiE/B"}
@@ -14,5 +14,5 @@ export interface ConditionGroupsSectionProps {
14
14
  onMatchTypeChange: (matchType: MatchType) => void;
15
15
  onUpdateGroup: (index: number, group: ConditionGroupType) => void;
16
16
  }
17
- export declare function ConditionGroupsSection({ behaviorSection, dataPointOptions, formFieldOptions, forms, groups, matchType, onFormSelect, onMatchTypeChange, onUpdateGroup, }: Readonly<ConditionGroupsSectionProps>): import("react/jsx-runtime").JSX.Element | null;
17
+ export declare function ConditionGroupsSection({ behaviorSection, dataPointOptions, formFieldOptions, forms, groups, matchType, onFormSelect, onMatchTypeChange, onUpdateGroup, }: Readonly<ConditionGroupsSectionProps>): import("react").JSX.Element | null;
18
18
  //# sourceMappingURL=ConditionGroupsSection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConditionGroupsSection.d.ts","sourceRoot":"","sources":["../../src/display-conditions/ConditionGroupsSection.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EAAE,cAAc,IAAI,kBAAkB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAChF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC;AAEtC,MAAM,WAAW,2BAA2B;IACxC,eAAe,CAAC,EAAE,SAAS,CAAC;IAC5B,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,iBAAiB,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;IAClD,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;CACrE;AAED,wBAAgB,sBAAsB,CAAC,EACnC,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,EACL,MAAM,EACN,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,aAAa,GAChB,EAAE,QAAQ,CAAC,2BAA2B,CAAC,kDAuCvC"}
1
+ {"version":3,"file":"ConditionGroupsSection.d.ts","sourceRoot":"","sources":["../../src/display-conditions/ConditionGroupsSection.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EAAE,cAAc,IAAI,kBAAkB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAChF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC;AAEtC,MAAM,WAAW,2BAA2B;IACxC,eAAe,CAAC,EAAE,SAAS,CAAC;IAC5B,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,iBAAiB,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;IAClD,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;CACrE;AAED,wBAAgB,sBAAsB,CAAC,EACnC,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,EACL,MAAM,EACN,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,aAAa,GAChB,EAAE,QAAQ,CAAC,2BAA2B,CAAC,sCAuCvC"}
@@ -11,5 +11,5 @@ export interface ConditionRowProps {
11
11
  onFormSelect: (formId: number) => void;
12
12
  onRemove: () => void;
13
13
  }
14
- export declare function ConditionRow({ canRemove, condition, dataPointOptions, formFieldOptions, forms, onChange, onFormSelect, onRemove, }: Readonly<ConditionRowProps>): import("react/jsx-runtime").JSX.Element;
14
+ export declare function ConditionRow({ canRemove, condition, dataPointOptions, formFieldOptions, forms, onChange, onFormSelect, onRemove, }: Readonly<ConditionRowProps>): import("react").JSX.Element;
15
15
  //# sourceMappingURL=ConditionRow.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConditionRow.d.ts","sourceRoot":"","sources":["../../src/display-conditions/ConditionRow.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAqB,MAAM,iBAAiB,CAAC;AAE9D,OAAO,EAAoB,eAAe,EAA0C,MAAM,SAAS,CAAC;AACpG,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAEhE,MAAM,WAAW,iBAAiB;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,eAAe,CAAC;IAC3B,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;IACvC,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACxB;AAaD,wBAAgB,YAAY,CAAC,EACzB,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,QAAQ,GACX,EAAE,QAAQ,CAAC,iBAAiB,CAAC,2CAuR7B"}
1
+ {"version":3,"file":"ConditionRow.d.ts","sourceRoot":"","sources":["../../src/display-conditions/ConditionRow.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAqB,MAAM,iBAAiB,CAAC;AAE9D,OAAO,EAAoB,eAAe,EAA0C,MAAM,SAAS,CAAC;AACpG,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAEhE,MAAM,WAAW,iBAAiB;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,eAAe,CAAC;IAC3B,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;IACvC,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACxB;AAaD,wBAAgB,YAAY,CAAC,EACzB,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,QAAQ,GACX,EAAE,QAAQ,CAAC,iBAAiB,CAAC,+BAuR7B"}
@@ -1,13 +1,14 @@
1
1
  import { FormFieldInfo, FormInfo } from '../shared/forms';
2
2
  export interface DisplayConditionModalProps {
3
3
  /**
4
- * When set, the conditions dialog is portaled here instead of resolving from the DOM anchor.
5
- * Use when the host controls stacking context or shadow boundaries explicitly.
4
+ * Optional portal target. Prefer leaving unset so the dialog stays under the host
5
+ * `AnvilProvider` (`.anvil2` CSS scope). When set (e.g. a host-controlled container),
6
+ * content is wrapped in `ThemeProvider` so Anvil2 styles still apply after portaling.
6
7
  */
7
8
  portalContainer?: Element | DocumentFragment | null;
8
9
  onConditionFormSelect?: (formId: number, sendFormFields: (formId: number, fields: FormFieldInfo[]) => void) => void;
9
10
  onConditionalsOpen?: (usedFormIds: number[], sendFormList: (forms: FormInfo[]) => void, sendFormFields: (formId: number, fields: FormFieldInfo[]) => void) => void;
10
11
  schema?: import('../shared/schema').SchemaObject;
11
12
  }
12
- export declare const DisplayConditionModal: (props: DisplayConditionModalProps) => import("react/jsx-runtime").JSX.Element;
13
+ export declare const DisplayConditionModal: (props: DisplayConditionModalProps) => import("react").JSX.Element | null;
13
14
  //# sourceMappingURL=DisplayConditionModal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DisplayConditionModal.d.ts","sourceRoot":"","sources":["../../src/display-conditions/DisplayConditionModal.tsx"],"names":[],"mappings":"AAWA,OAAO,EAEH,aAAa,EACb,QAAQ,EAGX,MAAM,iBAAiB,CAAC;AA4DzB,MAAM,WAAW,0BAA0B;IACvC;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI,CAAC;IACpD,qBAAqB,CAAC,EAAE,CACpB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,IAAI,KAChE,IAAI,CAAC;IACV,kBAAkB,CAAC,EAAE,CACjB,WAAW,EAAE,MAAM,EAAE,EACrB,YAAY,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,IAAI,EACzC,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,IAAI,KAChE,IAAI,CAAC;IACV,MAAM,CAAC,EAAE,OAAO,kBAAkB,EAAE,YAAY,CAAC;CACpD;AAED,eAAO,MAAM,qBAAqB,GAAI,OAAO,0BAA0B,4CAoVtE,CAAC"}
1
+ {"version":3,"file":"DisplayConditionModal.d.ts","sourceRoot":"","sources":["../../src/display-conditions/DisplayConditionModal.tsx"],"names":[],"mappings":"AAGA,OAAO,EAEH,aAAa,EACb,QAAQ,EAGX,MAAM,iBAAiB,CAAC;AAmDzB,MAAM,WAAW,0BAA0B;IACvC;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI,CAAC;IACpD,qBAAqB,CAAC,EAAE,CACpB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,IAAI,KAChE,IAAI,CAAC;IACV,kBAAkB,CAAC,EAAE,CACjB,WAAW,EAAE,MAAM,EAAE,EACrB,YAAY,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,IAAI,EACzC,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,IAAI,KAChE,IAAI,CAAC;IACV,MAAM,CAAC,EAAE,OAAO,kBAAkB,EAAE,YAAY,CAAC;CACpD;AAED,eAAO,MAAM,qBAAqB,GAAI,OAAO,0BAA0B,uCAsTtE,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Button, Combobox, Dialog, Flex, Text } from '@servicetitan/anvil2';
3
- import { Fragment, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';
2
+ import { Button, Combobox, Dialog, Flex, Text, ThemeProvider } from '@servicetitan/anvil2';
3
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
4
4
  import { createPortal } from 'react-dom';
5
5
  import { buildFormFieldKey, getConditionalFieldTypeFromFormItemType, parseFormFieldKey } from '../shared/forms';
6
6
  import { ConditionGroupsSection } from './ConditionGroupsSection';
@@ -19,13 +19,6 @@ const BEHAVIOR_OPTIONS = [
19
19
  }
20
20
  ];
21
21
  const NUMERIC_VALUE_RE = /^-?(?:\d+\.?\d*|\.\d+)$/;
22
- /** When the editor runs inside a shadow root (e.g. monolith MFE), portaling to `document.body` escapes the shadow tree and loses bundled styles. */ function resolveDisplayConditionPortalContainer(anchor) {
23
- const rootNode = anchor.getRootNode();
24
- if (rootNode instanceof ShadowRoot) {
25
- return rootNode;
26
- }
27
- return document.body;
28
- }
29
22
  function deriveMatchType(conditionState) {
30
23
  const firstGroup = conditionState.groups[0];
31
24
  if (!firstGroup || firstGroup.conditions.length <= 1) {
@@ -131,20 +124,6 @@ export const DisplayConditionModal = (props)=>{
131
124
  }, [
132
125
  onConditionFormSelect
133
126
  ]);
134
- const portalAnchorRef = useRef(null);
135
- const [resolvedPortalContainer, setResolvedPortalContainer] = useState(null);
136
- useLayoutEffect(()=>{
137
- if (typeof document === 'undefined' || portalContainerProp !== undefined) {
138
- return;
139
- }
140
- const anchor = portalAnchorRef.current;
141
- if (!anchor) {
142
- return;
143
- }
144
- setResolvedPortalContainer(resolveDisplayConditionPortalContainer(anchor));
145
- }, [
146
- portalContainerProp
147
- ]);
148
127
  useEffect(()=>{
149
128
  return onDisplayCondition((nextRequest)=>{
150
129
  setRequest(nextRequest);
@@ -270,132 +249,128 @@ export const DisplayConditionModal = (props)=>{
270
249
  isFieldDataLoading,
271
250
  state.groups
272
251
  ]);
273
- const portalTarget = portalContainerProp === undefined ? resolvedPortalContainer : portalContainerProp;
274
- return /*#__PURE__*/ _jsxs(Fragment, {
252
+ if (!isOpen) {
253
+ return null;
254
+ }
255
+ /*
256
+ * Render in-place by default (same as pdf-editor). Anvil2 3.x CSS is nested under
257
+ * `.anvil2`; portaling to `document.body` / bare shadow root drops that ancestor and
258
+ * styles disappear in MFE prod. Native `<dialog>` top-layer still stacks correctly.
259
+ */ const dialog = /*#__PURE__*/ _jsxs(Dialog, {
260
+ open: isOpen,
261
+ onClose: handleClose,
262
+ size: "xlarge",
275
263
  children: [
276
- portalContainerProp === undefined ? /*#__PURE__*/ _jsx("span", {
277
- ref: portalAnchorRef,
278
- "aria-hidden": "true",
279
- style: {
280
- position: 'absolute',
281
- width: 0,
282
- height: 0,
283
- clipPath: 'inset(50%)',
284
- overflow: 'hidden',
285
- whiteSpace: 'nowrap'
286
- }
287
- }) : null,
288
- portalTarget && isOpen ? /*#__PURE__*/ createPortal(/*#__PURE__*/ _jsxs(Dialog, {
289
- open: isOpen,
290
- onClose: handleClose,
291
- size: "xlarge",
292
- children: [
293
- /*#__PURE__*/ _jsx(Dialog.Header, {
294
- children: "Conditions"
295
- }),
296
- /*#__PURE__*/ _jsx(Dialog.Content, {
297
- children: /*#__PURE__*/ _jsx(Flex, {
298
- direction: "column",
299
- gap: "4",
264
+ /*#__PURE__*/ _jsx(Dialog.Header, {
265
+ children: "Conditions"
266
+ }),
267
+ /*#__PURE__*/ _jsx(Dialog.Content, {
268
+ children: /*#__PURE__*/ _jsx(Flex, {
269
+ direction: "column",
270
+ gap: "4",
271
+ style: {
272
+ maxHeight: MODAL_CONTENT_MAX_HEIGHT,
273
+ overflowY: 'auto',
274
+ paddingRight: 8,
275
+ width: '100%'
276
+ },
277
+ children: /*#__PURE__*/ _jsx(ConditionGroupsSection, {
278
+ behaviorSection: /*#__PURE__*/ _jsxs(Flex, {
279
+ direction: "row",
280
+ alignItems: "center",
281
+ gap: "2",
300
282
  style: {
301
- maxHeight: MODAL_CONTENT_MAX_HEIGHT,
302
- overflowY: 'auto',
303
- paddingRight: 8,
304
- width: '100%'
283
+ flexWrap: 'wrap'
305
284
  },
306
- children: /*#__PURE__*/ _jsx(ConditionGroupsSection, {
307
- behaviorSection: /*#__PURE__*/ _jsxs(Flex, {
308
- direction: "row",
309
- alignItems: "center",
310
- gap: "2",
285
+ children: [
286
+ /*#__PURE__*/ _jsx(Text, {
287
+ size: "small",
288
+ subdued: true,
289
+ variant: "body",
290
+ children: "Select to include or exclude selected template/file."
291
+ }),
292
+ /*#__PURE__*/ _jsx("div", {
311
293
  style: {
312
- flexWrap: 'wrap'
294
+ width: 90
313
295
  },
314
- children: [
315
- /*#__PURE__*/ _jsx(Text, {
316
- size: "small",
317
- subdued: true,
318
- variant: "body",
319
- children: "Select to include or exclude selected template/file."
320
- }),
321
- /*#__PURE__*/ _jsx("div", {
322
- style: {
323
- width: 90
324
- },
325
- children: /*#__PURE__*/ _jsxs(Combobox.Select, {
326
- disableClearSelection: true,
327
- itemToKey: (item)=>{
328
- var _ref;
329
- return (_ref = item === null || item === void 0 ? void 0 : item.value) !== null && _ref !== void 0 ? _ref : '';
330
- },
331
- itemToString: (item)=>{
332
- var _ref;
333
- return (_ref = item === null || item === void 0 ? void 0 : item.label) !== null && _ref !== void 0 ? _ref : '';
334
- },
335
- items: [
336
- ...BEHAVIOR_OPTIONS
337
- ],
338
- selectedItem: selectedBehavior,
339
- onChange: handleBehaviorChange,
340
- children: [
341
- /*#__PURE__*/ _jsx(Combobox.SelectTrigger, {
342
- label: "",
343
- placeholder: "Select...",
344
- size: "small"
345
- }),
346
- /*#__PURE__*/ _jsx(Combobox.Content, {
347
- children: ({ items })=>/*#__PURE__*/ _jsx(Combobox.List, {
348
- children: items.map((item, i)=>/*#__PURE__*/ _jsx(Combobox.Item, {
349
- index: i,
350
- item: item,
351
- children: item.label
352
- }, item.value))
353
- })
296
+ children: /*#__PURE__*/ _jsxs(Combobox.Select, {
297
+ disableClearSelection: true,
298
+ itemToKey: (item)=>{
299
+ var _ref;
300
+ return (_ref = item === null || item === void 0 ? void 0 : item.value) !== null && _ref !== void 0 ? _ref : '';
301
+ },
302
+ itemToString: (item)=>{
303
+ var _ref;
304
+ return (_ref = item === null || item === void 0 ? void 0 : item.label) !== null && _ref !== void 0 ? _ref : '';
305
+ },
306
+ items: [
307
+ ...BEHAVIOR_OPTIONS
308
+ ],
309
+ selectedItem: selectedBehavior,
310
+ onChange: handleBehaviorChange,
311
+ children: [
312
+ /*#__PURE__*/ _jsx(Combobox.SelectTrigger, {
313
+ label: "",
314
+ placeholder: "Select...",
315
+ size: "small"
316
+ }),
317
+ /*#__PURE__*/ _jsx(Combobox.Content, {
318
+ children: ({ items })=>/*#__PURE__*/ _jsx(Combobox.List, {
319
+ children: items.map((item, i)=>/*#__PURE__*/ _jsx(Combobox.Item, {
320
+ index: i,
321
+ item: item,
322
+ children: item.label
323
+ }, item.value))
354
324
  })
355
- ]
356
325
  })
357
- })
358
- ]
359
- }),
360
- dataPointOptions: dataPointOptions,
361
- formFieldOptions: formFieldOptions,
362
- forms: forms,
363
- groups: state.groups,
364
- matchType: matchType,
365
- onFormSelect: handleFormSelect,
366
- onMatchTypeChange: setMatchType,
367
- onUpdateGroup: updateGroup
368
- })
369
- })
370
- }),
371
- /*#__PURE__*/ _jsx(Dialog.Footer, {
372
- sticky: true,
373
- children: /*#__PURE__*/ _jsxs(Flex, {
374
- justifyContent: "flex-end",
375
- alignItems: "center",
376
- gap: "3",
377
- style: {
378
- width: '100%'
379
- },
380
- children: [
381
- /*#__PURE__*/ _jsx(Button, {
382
- appearance: "secondary",
383
- onClick: handleClose,
384
- children: "Cancel"
385
- }),
386
- /*#__PURE__*/ _jsx(Button, {
387
- appearance: "primary",
388
- disabled: !canSave,
389
- onClick: handleSave,
390
- children: "Save Changes"
326
+ ]
327
+ })
391
328
  })
392
329
  ]
393
- })
330
+ }),
331
+ dataPointOptions: dataPointOptions,
332
+ formFieldOptions: formFieldOptions,
333
+ forms: forms,
334
+ groups: state.groups,
335
+ matchType: matchType,
336
+ onFormSelect: handleFormSelect,
337
+ onMatchTypeChange: setMatchType,
338
+ onUpdateGroup: updateGroup
394
339
  })
395
- ]
396
- }), portalTarget) : null
340
+ })
341
+ }),
342
+ /*#__PURE__*/ _jsx(Dialog.Footer, {
343
+ sticky: true,
344
+ children: /*#__PURE__*/ _jsxs(Flex, {
345
+ justifyContent: "flex-end",
346
+ alignItems: "center",
347
+ gap: "3",
348
+ style: {
349
+ width: '100%'
350
+ },
351
+ children: [
352
+ /*#__PURE__*/ _jsx(Button, {
353
+ appearance: "secondary",
354
+ onClick: handleClose,
355
+ children: "Cancel"
356
+ }),
357
+ /*#__PURE__*/ _jsx(Button, {
358
+ appearance: "primary",
359
+ disabled: !canSave,
360
+ onClick: handleSave,
361
+ children: "Save Changes"
362
+ })
363
+ ]
364
+ })
365
+ })
397
366
  ]
398
367
  });
368
+ if (portalContainerProp) {
369
+ return /*#__PURE__*/ createPortal(/*#__PURE__*/ _jsx(ThemeProvider, {
370
+ children: dialog
371
+ }), portalContainerProp);
372
+ }
373
+ return dialog;
399
374
  };
400
375
 
401
376
  //# sourceMappingURL=DisplayConditionModal.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/display-conditions/DisplayConditionModal.tsx"],"sourcesContent":["import { Button, Combobox, Dialog, Flex, Text } from '@servicetitan/anvil2';\nimport {\n Fragment,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n buildFormFieldKey,\n FormFieldInfo,\n FormInfo,\n getConditionalFieldTypeFromFormItemType,\n parseFormFieldKey,\n} from '../shared/forms';\nimport { ConditionGroupsSection, MatchType } from './ConditionGroupsSection';\nimport { defaultState, MODAL_CONTENT_MAX_HEIGHT } from './constants';\nimport { DisplayConditionRequest, onDisplayCondition } from './displayConditionController';\nimport { buildUnlayerDisplayCondition, parseUnlayerDisplayCondition } from './nunjucks';\nimport { getSchemaDataPointOptions } from './schemaDataPoints';\nimport {\n ConditionGroup as ConditionGroupType,\n DisplayBehavior,\n DisplayConditionState,\n FormFieldOption,\n LogicalOperator,\n} from './types';\n\nconst BEHAVIOR_OPTIONS = [\n { label: 'Show', value: 'show' },\n { label: 'Hide', value: 'hide' },\n] as const;\nconst NUMERIC_VALUE_RE = /^-?(?:\\d+\\.?\\d*|\\.\\d+)$/;\ntype BehaviorOption = (typeof BEHAVIOR_OPTIONS)[number];\n\n/** When the editor runs inside a shadow root (e.g. monolith MFE), portaling to `document.body` escapes the shadow tree and loses bundled styles. */\nfunction resolveDisplayConditionPortalContainer(anchor: HTMLElement): Element | DocumentFragment {\n const rootNode = anchor.getRootNode();\n if (rootNode instanceof ShadowRoot) {\n return rootNode;\n }\n return document.body;\n}\n\nfunction deriveMatchType(conditionState: DisplayConditionState): MatchType {\n const firstGroup = conditionState.groups[0];\n if (!firstGroup || firstGroup.conditions.length <= 1) {\n return 'all';\n }\n const hasOr = firstGroup.conditions.some(c => c.logicalOperator === 'or');\n return hasOr ? 'any' : 'all';\n}\n\nfunction applyMatchTypeToState(\n conditionState: DisplayConditionState,\n matchType: MatchType,\n): DisplayConditionState {\n const logicalOp: LogicalOperator = matchType === 'all' ? 'and' : 'or';\n return {\n ...conditionState,\n groups: conditionState.groups.map((group, groupIndex) => {\n if (groupIndex !== 0) {\n return group;\n }\n return {\n ...group,\n conditions: group.conditions.map((c, i) =>\n i === 0 ? c : { ...c, logicalOperator: logicalOp },\n ),\n };\n }),\n };\n}\n\nexport interface DisplayConditionModalProps {\n /**\n * When set, the conditions dialog is portaled here instead of resolving from the DOM anchor.\n * Use when the host controls stacking context or shadow boundaries explicitly.\n */\n portalContainer?: Element | DocumentFragment | null;\n onConditionFormSelect?: (\n formId: number,\n sendFormFields: (formId: number, fields: FormFieldInfo[]) => void,\n ) => void;\n onConditionalsOpen?: (\n usedFormIds: number[],\n sendFormList: (forms: FormInfo[]) => void,\n sendFormFields: (formId: number, fields: FormFieldInfo[]) => void,\n ) => void;\n schema?: import('../shared/schema').SchemaObject;\n}\n\nexport const DisplayConditionModal = (props: DisplayConditionModalProps) => {\n const {\n onConditionFormSelect,\n onConditionalsOpen,\n portalContainer: portalContainerProp,\n schema,\n } = props;\n const [request, setRequest] = useState<DisplayConditionRequest | null>(null);\n const [isOpen, setIsOpen] = useState(false);\n const [state, setState] = useState(defaultState);\n const [matchType, setMatchType] = useState<MatchType>('all');\n const [forms, setForms] = useState<FormInfo[]>([]);\n const [formFieldsByFormId, setFormFieldsByFormId] = useState<Record<number, FormFieldInfo[]>>(\n {},\n );\n const [loadingFormIds, setLoadingFormIds] = useState<number[]>([]);\n const [isFormsListLoading, setIsFormsListLoading] = useState(false);\n const formFieldsByFormIdRef = useRef<Record<number, FormFieldInfo[]>>({});\n const loadingFormIdsRef = useRef<number[]>([]);\n\n const dataPointOptions = useMemo(() => getSchemaDataPointOptions(schema), [schema]);\n const formFieldOptions = useMemo<FormFieldOption[]>(() => {\n const nextOptions: FormFieldOption[] = [];\n for (const form of forms) {\n const fields = formFieldsByFormId[form.id];\n if (!fields) {\n continue;\n }\n for (const field of fields) {\n const fieldType = getConditionalFieldTypeFromFormItemType(field.itemType);\n if (!fieldType) {\n continue;\n }\n nextOptions.push({\n fieldType,\n formId: form.id,\n fullKey: buildFormFieldKey(form.id, field.id),\n title: field.header,\n });\n }\n }\n return nextOptions.sort((left, right) => left.title.localeCompare(right.title));\n }, [forms, formFieldsByFormId]);\n const allFieldOptions = useMemo(\n () => [...dataPointOptions, ...formFieldOptions],\n [dataPointOptions, formFieldOptions],\n );\n const isFieldDataLoading = isFormsListLoading || loadingFormIds.length > 0;\n\n useEffect(() => {\n formFieldsByFormIdRef.current = formFieldsByFormId;\n }, [formFieldsByFormId]);\n\n useEffect(() => {\n loadingFormIdsRef.current = loadingFormIds;\n }, [loadingFormIds]);\n\n const requestFormFields = useCallback(\n (formId: number) => {\n if (!onConditionFormSelect) {\n return;\n }\n if (\n formFieldsByFormIdRef.current[formId] ||\n loadingFormIdsRef.current.includes(formId)\n ) {\n return;\n }\n\n setLoadingFormIds(prev => (prev.includes(formId) ? prev : [...prev, formId]));\n onConditionFormSelect(formId, (selectedFormId, fields) => {\n setFormFieldsByFormId(prev => ({ ...prev, [selectedFormId]: fields }));\n setLoadingFormIds(prev => prev.filter(id => id !== selectedFormId));\n });\n },\n [onConditionFormSelect],\n );\n\n const portalAnchorRef = useRef<HTMLSpanElement>(null);\n const [resolvedPortalContainer, setResolvedPortalContainer] = useState<\n Element | DocumentFragment | null\n >(null);\n\n useLayoutEffect(() => {\n if (typeof document === 'undefined' || portalContainerProp !== undefined) {\n return;\n }\n const anchor = portalAnchorRef.current;\n if (!anchor) {\n return;\n }\n setResolvedPortalContainer(resolveDisplayConditionPortalContainer(anchor));\n }, [portalContainerProp]);\n\n useEffect(() => {\n return onDisplayCondition(nextRequest => {\n setRequest(nextRequest);\n const existing = nextRequest.data;\n const parsed = parseUnlayerDisplayCondition(existing);\n const initialState = parsed ?? defaultState();\n const usedFormIds = Array.from(\n new Set(\n initialState.groups\n .flatMap(group => group.conditions)\n .map(condition => parseFormFieldKey(condition.dataPointKey)?.formId)\n .filter((formId): formId is number => formId != null),\n ),\n );\n\n setForms([]);\n setFormFieldsByFormId({});\n setIsFormsListLoading(!!onConditionalsOpen);\n setLoadingFormIds([]);\n\n if (onConditionalsOpen) {\n onConditionalsOpen(\n usedFormIds,\n nextForms => {\n setForms(nextForms);\n setIsFormsListLoading(false);\n },\n (formId, fields) => {\n setFormFieldsByFormId(prev => ({ ...prev, [formId]: fields }));\n setLoadingFormIds(prev => prev.filter(id => id !== formId));\n },\n );\n\n /*\n * Keep display-condition flow aligned with calculated-field flow:\n * when modal opens, request fields for already-used forms so labels\n * are available in edit mode.\n */\n usedFormIds.forEach(formId => requestFormFields(formId));\n } else {\n setIsFormsListLoading(false);\n setLoadingFormIds([]);\n }\n\n setState(initialState);\n setMatchType(deriveMatchType(initialState));\n setIsOpen(true);\n });\n }, [onConditionalsOpen, requestFormFields]);\n\n const handleClose = useCallback(() => {\n setRequest(null);\n setIsOpen(false);\n }, []);\n\n const handleSave = useCallback(() => {\n if (!request) {\n return;\n }\n const finalState = applyMatchTypeToState(state, matchType);\n const condition = buildUnlayerDisplayCondition(finalState);\n if (condition) {\n request.done(condition);\n } else {\n request.done(null);\n }\n setRequest(null);\n setIsOpen(false);\n }, [matchType, request, state]);\n\n const updateGroup = useCallback((index: number, group: ConditionGroupType) => {\n setState(prev => {\n const next = [...prev.groups];\n next[index] = group;\n return { ...prev, groups: next };\n });\n }, []);\n\n const selectedBehavior = useMemo(\n () => BEHAVIOR_OPTIONS.find(opt => opt.value === state.behavior) ?? BEHAVIOR_OPTIONS[0],\n [state.behavior],\n );\n\n const handleBehaviorChange = useCallback((item: BehaviorOption | null) => {\n if (item) {\n setState(prev => ({ ...prev, behavior: item.value as DisplayBehavior }));\n }\n }, []);\n\n const handleFormSelect = useCallback(\n (formId: number) => {\n requestFormFields(formId);\n },\n [requestFormFields],\n );\n\n const canSave = useMemo(() => {\n if (isFieldDataLoading) {\n return false;\n }\n for (const group of state.groups) {\n for (const condition of group.conditions) {\n if (!condition.dataPointKey) {\n return false;\n }\n if (condition.operator === 'is_empty' || condition.operator === 'is_not_empty') {\n continue;\n }\n const trimmedValue = condition.value.trim();\n if (!trimmedValue) {\n return false;\n }\n const fieldType =\n allFieldOptions.find(opt => opt.fullKey === condition.dataPointKey)\n ?.fieldType ?? 'string';\n if (fieldType === 'number' && !NUMERIC_VALUE_RE.test(trimmedValue)) {\n return false;\n }\n }\n }\n return state.groups.length > 0;\n }, [allFieldOptions, isFieldDataLoading, state.groups]);\n\n const portalTarget =\n portalContainerProp === undefined ? resolvedPortalContainer : portalContainerProp;\n\n return (\n <Fragment>\n {portalContainerProp === undefined ? (\n <span\n ref={portalAnchorRef}\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n width: 0,\n height: 0,\n clipPath: 'inset(50%)',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n }}\n />\n ) : null}\n {portalTarget && isOpen\n ? createPortal(\n <Dialog open={isOpen} onClose={handleClose} size=\"xlarge\">\n <Dialog.Header>Conditions</Dialog.Header>\n <Dialog.Content>\n <Flex\n direction=\"column\"\n gap=\"4\"\n style={{\n maxHeight: MODAL_CONTENT_MAX_HEIGHT,\n overflowY: 'auto',\n paddingRight: 8,\n width: '100%',\n }}\n >\n <ConditionGroupsSection\n behaviorSection={\n <Flex\n direction=\"row\"\n alignItems=\"center\"\n gap=\"2\"\n style={{ flexWrap: 'wrap' }}\n >\n <Text size=\"small\" subdued variant=\"body\">\n Select to include or exclude selected\n template/file.\n </Text>\n <div style={{ width: 90 }}>\n <Combobox.Select\n disableClearSelection\n itemToKey={(item: BehaviorOption | null) =>\n item?.value ?? ''\n }\n itemToString={(item: BehaviorOption | null) =>\n item?.label ?? ''\n }\n items={[...BEHAVIOR_OPTIONS]}\n selectedItem={selectedBehavior}\n onChange={handleBehaviorChange}\n >\n <Combobox.SelectTrigger\n label=\"\"\n placeholder=\"Select...\"\n size=\"small\"\n />\n <Combobox.Content>\n {({\n items,\n }: {\n items: BehaviorOption[];\n }) => (\n <Combobox.List>\n {items.map((item, i) => (\n <Combobox.Item\n index={i}\n item={item}\n key={item.value}\n >\n {item.label}\n </Combobox.Item>\n ))}\n </Combobox.List>\n )}\n </Combobox.Content>\n </Combobox.Select>\n </div>\n </Flex>\n }\n dataPointOptions={dataPointOptions}\n formFieldOptions={formFieldOptions}\n forms={forms}\n groups={state.groups}\n matchType={matchType}\n onFormSelect={handleFormSelect}\n onMatchTypeChange={setMatchType}\n onUpdateGroup={updateGroup}\n />\n </Flex>\n </Dialog.Content>\n <Dialog.Footer sticky>\n <Flex\n justifyContent=\"flex-end\"\n alignItems=\"center\"\n gap=\"3\"\n style={{ width: '100%' }}\n >\n <Button appearance=\"secondary\" onClick={handleClose}>\n Cancel\n </Button>\n <Button\n appearance=\"primary\"\n disabled={!canSave}\n onClick={handleSave}\n >\n Save Changes\n </Button>\n </Flex>\n </Dialog.Footer>\n </Dialog>,\n portalTarget,\n )\n : null}\n </Fragment>\n );\n};\n"],"names":["Button","Combobox","Dialog","Flex","Text","Fragment","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","createPortal","buildFormFieldKey","getConditionalFieldTypeFromFormItemType","parseFormFieldKey","ConditionGroupsSection","defaultState","MODAL_CONTENT_MAX_HEIGHT","onDisplayCondition","buildUnlayerDisplayCondition","parseUnlayerDisplayCondition","getSchemaDataPointOptions","BEHAVIOR_OPTIONS","label","value","NUMERIC_VALUE_RE","resolveDisplayConditionPortalContainer","anchor","rootNode","getRootNode","ShadowRoot","document","body","deriveMatchType","conditionState","firstGroup","groups","conditions","length","hasOr","some","c","logicalOperator","applyMatchTypeToState","matchType","logicalOp","map","group","groupIndex","i","DisplayConditionModal","props","onConditionFormSelect","onConditionalsOpen","portalContainer","portalContainerProp","schema","request","setRequest","isOpen","setIsOpen","state","setState","setMatchType","forms","setForms","formFieldsByFormId","setFormFieldsByFormId","loadingFormIds","setLoadingFormIds","isFormsListLoading","setIsFormsListLoading","formFieldsByFormIdRef","loadingFormIdsRef","dataPointOptions","formFieldOptions","nextOptions","form","fields","id","field","fieldType","itemType","push","formId","fullKey","title","header","sort","left","right","localeCompare","allFieldOptions","isFieldDataLoading","current","requestFormFields","includes","prev","selectedFormId","filter","portalAnchorRef","resolvedPortalContainer","setResolvedPortalContainer","undefined","nextRequest","existing","data","parsed","initialState","usedFormIds","Array","from","Set","flatMap","condition","dataPointKey","nextForms","forEach","handleClose","handleSave","finalState","done","updateGroup","index","next","selectedBehavior","find","opt","behavior","handleBehaviorChange","item","handleFormSelect","canSave","operator","trimmedValue","trim","test","portalTarget","span","ref","aria-hidden","style","position","width","height","clipPath","overflow","whiteSpace","open","onClose","size","Header","Content","direction","gap","maxHeight","overflowY","paddingRight","behaviorSection","alignItems","flexWrap","subdued","variant","div","Select","disableClearSelection","itemToKey","itemToString","items","selectedItem","onChange","SelectTrigger","placeholder","List","Item","onFormSelect","onMatchTypeChange","onUpdateGroup","Footer","sticky","justifyContent","appearance","onClick","disabled"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/display-conditions/DisplayConditionModal.tsx"],"sourcesContent":["import { Button, Combobox, Dialog, Flex, Text, ThemeProvider } from '@servicetitan/anvil2';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n buildFormFieldKey,\n FormFieldInfo,\n FormInfo,\n getConditionalFieldTypeFromFormItemType,\n parseFormFieldKey,\n} from '../shared/forms';\nimport { ConditionGroupsSection, MatchType } from './ConditionGroupsSection';\nimport { defaultState, MODAL_CONTENT_MAX_HEIGHT } from './constants';\nimport { DisplayConditionRequest, onDisplayCondition } from './displayConditionController';\nimport { buildUnlayerDisplayCondition, parseUnlayerDisplayCondition } from './nunjucks';\nimport { getSchemaDataPointOptions } from './schemaDataPoints';\nimport {\n ConditionGroup as ConditionGroupType,\n DisplayBehavior,\n DisplayConditionState,\n FormFieldOption,\n LogicalOperator,\n} from './types';\n\nconst BEHAVIOR_OPTIONS = [\n { label: 'Show', value: 'show' },\n { label: 'Hide', value: 'hide' },\n] as const;\nconst NUMERIC_VALUE_RE = /^-?(?:\\d+\\.?\\d*|\\.\\d+)$/;\ntype BehaviorOption = (typeof BEHAVIOR_OPTIONS)[number];\n\nfunction deriveMatchType(conditionState: DisplayConditionState): MatchType {\n const firstGroup = conditionState.groups[0];\n if (!firstGroup || firstGroup.conditions.length <= 1) {\n return 'all';\n }\n const hasOr = firstGroup.conditions.some(c => c.logicalOperator === 'or');\n return hasOr ? 'any' : 'all';\n}\n\nfunction applyMatchTypeToState(\n conditionState: DisplayConditionState,\n matchType: MatchType,\n): DisplayConditionState {\n const logicalOp: LogicalOperator = matchType === 'all' ? 'and' : 'or';\n return {\n ...conditionState,\n groups: conditionState.groups.map((group, groupIndex) => {\n if (groupIndex !== 0) {\n return group;\n }\n return {\n ...group,\n conditions: group.conditions.map((c, i) =>\n i === 0 ? c : { ...c, logicalOperator: logicalOp },\n ),\n };\n }),\n };\n}\n\nexport interface DisplayConditionModalProps {\n /**\n * Optional portal target. Prefer leaving unset so the dialog stays under the host\n * `AnvilProvider` (`.anvil2` CSS scope). When set (e.g. a host-controlled container),\n * content is wrapped in `ThemeProvider` so Anvil2 styles still apply after portaling.\n */\n portalContainer?: Element | DocumentFragment | null;\n onConditionFormSelect?: (\n formId: number,\n sendFormFields: (formId: number, fields: FormFieldInfo[]) => void,\n ) => void;\n onConditionalsOpen?: (\n usedFormIds: number[],\n sendFormList: (forms: FormInfo[]) => void,\n sendFormFields: (formId: number, fields: FormFieldInfo[]) => void,\n ) => void;\n schema?: import('../shared/schema').SchemaObject;\n}\n\nexport const DisplayConditionModal = (props: DisplayConditionModalProps) => {\n const {\n onConditionFormSelect,\n onConditionalsOpen,\n portalContainer: portalContainerProp,\n schema,\n } = props;\n const [request, setRequest] = useState<DisplayConditionRequest | null>(null);\n const [isOpen, setIsOpen] = useState(false);\n const [state, setState] = useState(defaultState);\n const [matchType, setMatchType] = useState<MatchType>('all');\n const [forms, setForms] = useState<FormInfo[]>([]);\n const [formFieldsByFormId, setFormFieldsByFormId] = useState<Record<number, FormFieldInfo[]>>(\n {},\n );\n const [loadingFormIds, setLoadingFormIds] = useState<number[]>([]);\n const [isFormsListLoading, setIsFormsListLoading] = useState(false);\n const formFieldsByFormIdRef = useRef<Record<number, FormFieldInfo[]>>({});\n const loadingFormIdsRef = useRef<number[]>([]);\n\n const dataPointOptions = useMemo(() => getSchemaDataPointOptions(schema), [schema]);\n const formFieldOptions = useMemo<FormFieldOption[]>(() => {\n const nextOptions: FormFieldOption[] = [];\n for (const form of forms) {\n const fields = formFieldsByFormId[form.id];\n if (!fields) {\n continue;\n }\n for (const field of fields) {\n const fieldType = getConditionalFieldTypeFromFormItemType(field.itemType);\n if (!fieldType) {\n continue;\n }\n nextOptions.push({\n fieldType,\n formId: form.id,\n fullKey: buildFormFieldKey(form.id, field.id),\n title: field.header,\n });\n }\n }\n return nextOptions.sort((left, right) => left.title.localeCompare(right.title));\n }, [forms, formFieldsByFormId]);\n const allFieldOptions = useMemo(\n () => [...dataPointOptions, ...formFieldOptions],\n [dataPointOptions, formFieldOptions],\n );\n const isFieldDataLoading = isFormsListLoading || loadingFormIds.length > 0;\n\n useEffect(() => {\n formFieldsByFormIdRef.current = formFieldsByFormId;\n }, [formFieldsByFormId]);\n\n useEffect(() => {\n loadingFormIdsRef.current = loadingFormIds;\n }, [loadingFormIds]);\n\n const requestFormFields = useCallback(\n (formId: number) => {\n if (!onConditionFormSelect) {\n return;\n }\n if (\n formFieldsByFormIdRef.current[formId] ||\n loadingFormIdsRef.current.includes(formId)\n ) {\n return;\n }\n\n setLoadingFormIds(prev => (prev.includes(formId) ? prev : [...prev, formId]));\n onConditionFormSelect(formId, (selectedFormId, fields) => {\n setFormFieldsByFormId(prev => ({ ...prev, [selectedFormId]: fields }));\n setLoadingFormIds(prev => prev.filter(id => id !== selectedFormId));\n });\n },\n [onConditionFormSelect],\n );\n\n useEffect(() => {\n return onDisplayCondition(nextRequest => {\n setRequest(nextRequest);\n const existing = nextRequest.data;\n const parsed = parseUnlayerDisplayCondition(existing);\n const initialState = parsed ?? defaultState();\n const usedFormIds = Array.from(\n new Set(\n initialState.groups\n .flatMap(group => group.conditions)\n .map(condition => parseFormFieldKey(condition.dataPointKey)?.formId)\n .filter((formId): formId is number => formId != null),\n ),\n );\n\n setForms([]);\n setFormFieldsByFormId({});\n setIsFormsListLoading(!!onConditionalsOpen);\n setLoadingFormIds([]);\n\n if (onConditionalsOpen) {\n onConditionalsOpen(\n usedFormIds,\n nextForms => {\n setForms(nextForms);\n setIsFormsListLoading(false);\n },\n (formId, fields) => {\n setFormFieldsByFormId(prev => ({ ...prev, [formId]: fields }));\n setLoadingFormIds(prev => prev.filter(id => id !== formId));\n },\n );\n\n /*\n * Keep display-condition flow aligned with calculated-field flow:\n * when modal opens, request fields for already-used forms so labels\n * are available in edit mode.\n */\n usedFormIds.forEach(formId => requestFormFields(formId));\n } else {\n setIsFormsListLoading(false);\n setLoadingFormIds([]);\n }\n\n setState(initialState);\n setMatchType(deriveMatchType(initialState));\n setIsOpen(true);\n });\n }, [onConditionalsOpen, requestFormFields]);\n\n const handleClose = useCallback(() => {\n setRequest(null);\n setIsOpen(false);\n }, []);\n\n const handleSave = useCallback(() => {\n if (!request) {\n return;\n }\n const finalState = applyMatchTypeToState(state, matchType);\n const condition = buildUnlayerDisplayCondition(finalState);\n if (condition) {\n request.done(condition);\n } else {\n request.done(null);\n }\n setRequest(null);\n setIsOpen(false);\n }, [matchType, request, state]);\n\n const updateGroup = useCallback((index: number, group: ConditionGroupType) => {\n setState(prev => {\n const next = [...prev.groups];\n next[index] = group;\n return { ...prev, groups: next };\n });\n }, []);\n\n const selectedBehavior = useMemo(\n () => BEHAVIOR_OPTIONS.find(opt => opt.value === state.behavior) ?? BEHAVIOR_OPTIONS[0],\n [state.behavior],\n );\n\n const handleBehaviorChange = useCallback((item: BehaviorOption | null) => {\n if (item) {\n setState(prev => ({ ...prev, behavior: item.value as DisplayBehavior }));\n }\n }, []);\n\n const handleFormSelect = useCallback(\n (formId: number) => {\n requestFormFields(formId);\n },\n [requestFormFields],\n );\n\n const canSave = useMemo(() => {\n if (isFieldDataLoading) {\n return false;\n }\n for (const group of state.groups) {\n for (const condition of group.conditions) {\n if (!condition.dataPointKey) {\n return false;\n }\n if (condition.operator === 'is_empty' || condition.operator === 'is_not_empty') {\n continue;\n }\n const trimmedValue = condition.value.trim();\n if (!trimmedValue) {\n return false;\n }\n const fieldType =\n allFieldOptions.find(opt => opt.fullKey === condition.dataPointKey)\n ?.fieldType ?? 'string';\n if (fieldType === 'number' && !NUMERIC_VALUE_RE.test(trimmedValue)) {\n return false;\n }\n }\n }\n return state.groups.length > 0;\n }, [allFieldOptions, isFieldDataLoading, state.groups]);\n\n if (!isOpen) {\n return null;\n }\n\n /*\n * Render in-place by default (same as pdf-editor). Anvil2 3.x CSS is nested under\n * `.anvil2`; portaling to `document.body` / bare shadow root drops that ancestor and\n * styles disappear in MFE prod. Native `<dialog>` top-layer still stacks correctly.\n */\n const dialog = (\n <Dialog open={isOpen} onClose={handleClose} size=\"xlarge\">\n <Dialog.Header>Conditions</Dialog.Header>\n <Dialog.Content>\n <Flex\n direction=\"column\"\n gap=\"4\"\n style={{\n maxHeight: MODAL_CONTENT_MAX_HEIGHT,\n overflowY: 'auto',\n paddingRight: 8,\n width: '100%',\n }}\n >\n <ConditionGroupsSection\n behaviorSection={\n <Flex\n direction=\"row\"\n alignItems=\"center\"\n gap=\"2\"\n style={{ flexWrap: 'wrap' }}\n >\n <Text size=\"small\" subdued variant=\"body\">\n Select to include or exclude selected template/file.\n </Text>\n <div style={{ width: 90 }}>\n <Combobox.Select\n disableClearSelection\n itemToKey={(item: BehaviorOption | null) =>\n item?.value ?? ''\n }\n itemToString={(item: BehaviorOption | null) =>\n item?.label ?? ''\n }\n items={[...BEHAVIOR_OPTIONS]}\n selectedItem={selectedBehavior}\n onChange={handleBehaviorChange}\n >\n <Combobox.SelectTrigger\n label=\"\"\n placeholder=\"Select...\"\n size=\"small\"\n />\n <Combobox.Content>\n {({\n items,\n }: {\n items: BehaviorOption[];\n }) => (\n <Combobox.List>\n {items.map((item, i) => (\n <Combobox.Item\n index={i}\n item={item}\n key={item.value}\n >\n {item.label}\n </Combobox.Item>\n ))}\n </Combobox.List>\n )}\n </Combobox.Content>\n </Combobox.Select>\n </div>\n </Flex>\n }\n dataPointOptions={dataPointOptions}\n formFieldOptions={formFieldOptions}\n forms={forms}\n groups={state.groups}\n matchType={matchType}\n onFormSelect={handleFormSelect}\n onMatchTypeChange={setMatchType}\n onUpdateGroup={updateGroup}\n />\n </Flex>\n </Dialog.Content>\n <Dialog.Footer sticky>\n <Flex\n justifyContent=\"flex-end\"\n alignItems=\"center\"\n gap=\"3\"\n style={{ width: '100%' }}\n >\n <Button appearance=\"secondary\" onClick={handleClose}>\n Cancel\n </Button>\n <Button appearance=\"primary\" disabled={!canSave} onClick={handleSave}>\n Save Changes\n </Button>\n </Flex>\n </Dialog.Footer>\n </Dialog>\n );\n\n if (portalContainerProp) {\n return createPortal(<ThemeProvider>{dialog}</ThemeProvider>, portalContainerProp);\n }\n\n return dialog;\n};\n"],"names":["Button","Combobox","Dialog","Flex","Text","ThemeProvider","useCallback","useEffect","useMemo","useRef","useState","createPortal","buildFormFieldKey","getConditionalFieldTypeFromFormItemType","parseFormFieldKey","ConditionGroupsSection","defaultState","MODAL_CONTENT_MAX_HEIGHT","onDisplayCondition","buildUnlayerDisplayCondition","parseUnlayerDisplayCondition","getSchemaDataPointOptions","BEHAVIOR_OPTIONS","label","value","NUMERIC_VALUE_RE","deriveMatchType","conditionState","firstGroup","groups","conditions","length","hasOr","some","c","logicalOperator","applyMatchTypeToState","matchType","logicalOp","map","group","groupIndex","i","DisplayConditionModal","props","onConditionFormSelect","onConditionalsOpen","portalContainer","portalContainerProp","schema","request","setRequest","isOpen","setIsOpen","state","setState","setMatchType","forms","setForms","formFieldsByFormId","setFormFieldsByFormId","loadingFormIds","setLoadingFormIds","isFormsListLoading","setIsFormsListLoading","formFieldsByFormIdRef","loadingFormIdsRef","dataPointOptions","formFieldOptions","nextOptions","form","fields","id","field","fieldType","itemType","push","formId","fullKey","title","header","sort","left","right","localeCompare","allFieldOptions","isFieldDataLoading","current","requestFormFields","includes","prev","selectedFormId","filter","nextRequest","existing","data","parsed","initialState","usedFormIds","Array","from","Set","flatMap","condition","dataPointKey","nextForms","forEach","handleClose","handleSave","finalState","done","updateGroup","index","next","selectedBehavior","find","opt","behavior","handleBehaviorChange","item","handleFormSelect","canSave","operator","trimmedValue","trim","test","dialog","open","onClose","size","Header","Content","direction","gap","style","maxHeight","overflowY","paddingRight","width","behaviorSection","alignItems","flexWrap","subdued","variant","div","Select","disableClearSelection","itemToKey","itemToString","items","selectedItem","onChange","SelectTrigger","placeholder","List","Item","onFormSelect","onMatchTypeChange","onUpdateGroup","Footer","sticky","justifyContent","appearance","onClick","disabled"],"mappings":"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"}
@@ -15,5 +15,5 @@ export interface LookupValueControlProps {
15
15
  * has no stored label — we display the saved key as the label until the user
16
16
  * re-searches and re-selects.
17
17
  */
18
- export declare function LookupValueControl({ fieldType, lookupSource, onChange, value, }: Readonly<LookupValueControlProps>): import("react/jsx-runtime").JSX.Element;
18
+ export declare function LookupValueControl({ fieldType, lookupSource, onChange, value, }: Readonly<LookupValueControlProps>): import("react").JSX.Element;
19
19
  //# sourceMappingURL=LookupValueControl.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LookupValueControl.d.ts","sourceRoot":"","sources":["../../src/display-conditions/LookupValueControl.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,uBAAuB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC/B,uFAAuF;IACvF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAiCD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,EAC/B,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,KAAK,GACR,EAAE,QAAQ,CAAC,uBAAuB,CAAC,2CAyJnC"}
1
+ {"version":3,"file":"LookupValueControl.d.ts","sourceRoot":"","sources":["../../src/display-conditions/LookupValueControl.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,uBAAuB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC/B,uFAAuF;IACvF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAiCD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,EAC/B,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,KAAK,GACR,EAAE,QAAQ,CAAC,uBAAuB,CAAC,+BAyJnC"}
@@ -2,5 +2,5 @@ export interface SeparatorWithChipProps {
2
2
  label: string;
3
3
  color?: string;
4
4
  }
5
- export declare function SeparatorWithChip({ color, label }: Readonly<SeparatorWithChipProps>): import("react/jsx-runtime").JSX.Element;
5
+ export declare function SeparatorWithChip({ color, label }: Readonly<SeparatorWithChipProps>): import("react").JSX.Element;
6
6
  //# sourceMappingURL=SeparatorWithChip.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SeparatorWithChip.d.ts","sourceRoot":"","sources":["../../src/display-conditions/SeparatorWithChip.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,sBAAsB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,KAAiB,EAAE,KAAK,EAAE,EAAE,QAAQ,CAAC,sBAAsB,CAAC,2CAM/F"}
1
+ {"version":3,"file":"SeparatorWithChip.d.ts","sourceRoot":"","sources":["../../src/display-conditions/SeparatorWithChip.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,sBAAsB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,KAAiB,EAAE,KAAK,EAAE,EAAE,QAAQ,CAAC,sBAAsB,CAAC,+BAM/F"}