@servicetitan/dte-unlayer 0.121.0 → 0.123.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 (47) hide show
  1. package/dist/display-conditions/ConditionGroup.d.ts +6 -2
  2. package/dist/display-conditions/ConditionGroup.d.ts.map +1 -1
  3. package/dist/display-conditions/ConditionGroup.js +8 -3
  4. package/dist/display-conditions/ConditionGroup.js.map +1 -1
  5. package/dist/display-conditions/ConditionGroupsSection.d.ts +6 -2
  6. package/dist/display-conditions/ConditionGroupsSection.d.ts.map +1 -1
  7. package/dist/display-conditions/ConditionGroupsSection.js +4 -1
  8. package/dist/display-conditions/ConditionGroupsSection.js.map +1 -1
  9. package/dist/display-conditions/ConditionRow.d.ts +6 -2
  10. package/dist/display-conditions/ConditionRow.d.ts.map +1 -1
  11. package/dist/display-conditions/ConditionRow.js +240 -110
  12. package/dist/display-conditions/ConditionRow.js.map +1 -1
  13. package/dist/display-conditions/DisplayConditionModal.d.ts +3 -0
  14. package/dist/display-conditions/DisplayConditionModal.d.ts.map +1 -1
  15. package/dist/display-conditions/DisplayConditionModal.js +97 -7
  16. package/dist/display-conditions/DisplayConditionModal.js.map +1 -1
  17. package/dist/display-conditions/nunjucks.d.ts.map +1 -1
  18. package/dist/display-conditions/nunjucks.js +17 -6
  19. package/dist/display-conditions/nunjucks.js.map +1 -1
  20. package/dist/display-conditions/types.d.ts +3 -0
  21. package/dist/display-conditions/types.d.ts.map +1 -1
  22. package/dist/display-conditions/types.js.map +1 -1
  23. package/dist/editor-core-source.d.ts +2 -2
  24. package/dist/editor-core-source.d.ts.map +1 -1
  25. package/dist/editor-core-source.js +2 -2
  26. package/dist/editor-core-source.js.map +1 -1
  27. package/dist/editor.d.ts.map +1 -1
  28. package/dist/editor.js +3 -1
  29. package/dist/editor.js.map +1 -1
  30. package/dist/shared/forms.d.ts +26 -0
  31. package/dist/shared/forms.d.ts.map +1 -1
  32. package/dist/shared/forms.js +75 -1
  33. package/dist/shared/forms.js.map +1 -1
  34. package/dist/unlayer-interface.d.ts +2 -0
  35. package/dist/unlayer-interface.d.ts.map +1 -1
  36. package/dist/unlayer-interface.js.map +1 -1
  37. package/package.json +1 -1
  38. package/src/display-conditions/ConditionGroup.tsx +12 -3
  39. package/src/display-conditions/ConditionGroupsSection.tsx +11 -1
  40. package/src/display-conditions/ConditionRow.tsx +229 -86
  41. package/src/display-conditions/DisplayConditionModal.tsx +106 -4
  42. package/src/display-conditions/nunjucks.ts +18 -9
  43. package/src/display-conditions/types.ts +4 -0
  44. package/src/editor-core-source.ts +2 -2
  45. package/src/editor.tsx +7 -1
  46. package/src/shared/forms.ts +85 -0
  47. package/src/unlayer-interface.tsx +9 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/display-conditions/ConditionRow.tsx"],"sourcesContent":["import { Button, Chip, Combobox, Flex, TextField } from '@servicetitan/anvil2';\nimport TrashIcon from '@servicetitan/anvil2/assets/icons/material/round/delete.svg';\nimport { useMemo } from 'react';\nimport { NUMBER_OPERATORS, SingleCondition, STRING_OPERATORS, VALUE_LESS_OPERATORS } from './types';\nimport type { DataPointOption } from './types';\n\nexport interface ConditionRowProps {\n canRemove: boolean;\n condition: SingleCondition;\n dataPointOptions: DataPointOption[];\n onChange: (c: SingleCondition) => void;\n onRemove: () => void;\n}\n\ninterface OperatorOption {\n label: string;\n value: string;\n}\n\nfunction sanitizeNumericInput(raw: string): string {\n // Allow only a single leading minus and one decimal separator.\n let value = raw.replaceAll(/[^0-9.-]/g, '');\n const isNegative = value.startsWith('-');\n value = value.replaceAll('-', '');\n if (isNegative) {\n value = `-${value}`;\n }\n const firstDot = value.indexOf('.');\n if (firstDot >= 0) {\n value = `${value.slice(0, firstDot + 1)}${value.slice(firstDot + 1).replaceAll('.', '')}`;\n }\n return value;\n}\n\nexport function ConditionRow({\n canRemove,\n condition,\n dataPointOptions,\n onChange,\n onRemove,\n}: Readonly<ConditionRowProps>) {\n const selectedDataPoint = useMemo(\n () => dataPointOptions.find(opt => opt.fullKey === condition.dataPointKey) ?? null,\n [dataPointOptions, condition.dataPointKey],\n );\n\n const fieldType = selectedDataPoint?.fieldType ?? 'string';\n\n const operatorItems: OperatorOption[] = useMemo(\n () =>\n fieldType === 'number'\n ? ([...NUMBER_OPERATORS] as OperatorOption[])\n : ([...STRING_OPERATORS] as OperatorOption[]),\n [fieldType],\n );\n\n const selectedOperator = useMemo(\n () => operatorItems.find(op => op.value === condition.operator) ?? null,\n [operatorItems, condition.operator],\n );\n\n const isValueLess = VALUE_LESS_OPERATORS.includes(condition.operator);\n\n const handleValueChange = (raw: string) => {\n const value = fieldType === 'number' ? sanitizeNumericInput(raw) : raw;\n onChange({ ...condition, value });\n };\n\n const handleDataPointChange = (item: DataPointOption | null) => {\n const nextFieldType = item?.fieldType ?? 'string';\n const nextIsNumber = nextFieldType === 'number';\n const nextOperatorItems = nextIsNumber ? NUMBER_OPERATORS : STRING_OPERATORS;\n const operatorReset = !nextOperatorItems.some(op => op.value === condition.operator);\n onChange({\n ...condition,\n dataPointKey: item?.fullKey ?? '',\n operator: operatorReset\n ? nextIsNumber\n ? 'num_eq'\n : 'is_equal_to'\n : condition.operator,\n });\n };\n\n return (\n <Flex\n direction=\"row\"\n alignItems=\"flex-end\"\n gap=\"2\"\n style={{ flexWrap: 'wrap', rowGap: 8, width: '100%' }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'flex-end',\n flexShrink: 0,\n padding: '4px 8px',\n }}\n >\n <Chip label=\"IF\" size=\"small\" />\n </div>\n <div style={{ flex: '2 1 240px', minWidth: 200 }}>\n <Combobox\n {...({ disableClearSelection: true } as object)}\n itemToKey={(item: DataPointOption | null) => item?.fullKey ?? ''}\n itemToString={(item: DataPointOption | null) => item?.title ?? ''}\n items={dataPointOptions}\n selectedItem={selectedDataPoint}\n onChange={handleDataPointChange}\n >\n <Combobox.SelectTrigger\n label=\"Data point\"\n placeholder=\"Select data point...\"\n size=\"small\"\n />\n <Combobox.Content>\n {({ items }: { items: DataPointOption[] }) => (\n <Combobox.List>\n {items.map((item, i) => (\n <Combobox.Item index={i} item={item} key={item.fullKey}>\n {item.title}\n </Combobox.Item>\n ))}\n </Combobox.List>\n )}\n </Combobox.Content>\n </Combobox>\n </div>\n <div style={{ flex: '1 1 180px', minWidth: 150 }}>\n <Combobox\n {...({ disableClearSelection: true } as object)}\n itemToKey={(item: OperatorOption | null) => item?.value ?? ''}\n itemToString={(item: OperatorOption | null) => item?.label ?? ''}\n items={operatorItems}\n selectedItem={selectedOperator}\n onChange={(item: OperatorOption | null) =>\n onChange({\n ...condition,\n operator: (item?.value ?? 'is_equal_to') as SingleCondition['operator'],\n })\n }\n >\n <Combobox.SelectTrigger\n label=\"Condition\"\n placeholder=\"Select...\"\n size=\"small\"\n />\n <Combobox.Content>\n {({ items }: { items: OperatorOption[] }) => (\n <Combobox.List>\n {items.map((item, i) => (\n <Combobox.Item index={i} item={item} key={item.value}>\n {item.label}\n </Combobox.Item>\n ))}\n </Combobox.List>\n )}\n </Combobox.Content>\n </Combobox>\n </div>\n {!isValueLess && (\n <div style={{ flex: '1 1 180px', minWidth: 150 }}>\n <TextField\n label=\"Value\"\n size=\"small\"\n value={condition.value}\n onChange={e => handleValueChange(e.target.value)}\n placeholder={fieldType === 'number' ? 'e.g. 1.5' : 'Enter value...'}\n style={{ width: '100%' }}\n aria-label=\"Value\"\n {...(fieldType === 'number' && { inputMode: 'decimal' })}\n />\n </div>\n )}\n {canRemove && (\n <div\n style={{\n display: 'flex',\n alignItems: 'flex-end',\n flexShrink: 0,\n padding: '4px 8px',\n }}\n >\n <Button\n appearance=\"secondary\"\n aria-label=\"Remove condition\"\n icon={{ before: TrashIcon }}\n size=\"small\"\n onClick={onRemove}\n />\n </div>\n )}\n </Flex>\n );\n}\n"],"names":["Button","Chip","Combobox","Flex","TextField","TrashIcon","useMemo","NUMBER_OPERATORS","STRING_OPERATORS","VALUE_LESS_OPERATORS","sanitizeNumericInput","raw","value","replaceAll","isNegative","startsWith","firstDot","indexOf","slice","ConditionRow","canRemove","condition","dataPointOptions","onChange","onRemove","selectedDataPoint","find","opt","fullKey","dataPointKey","fieldType","operatorItems","selectedOperator","op","operator","isValueLess","includes","handleValueChange","handleDataPointChange","item","nextFieldType","nextIsNumber","nextOperatorItems","operatorReset","some","direction","alignItems","gap","style","flexWrap","rowGap","width","div","display","flexShrink","padding","label","size","flex","minWidth","disableClearSelection","itemToKey","itemToString","title","items","selectedItem","SelectTrigger","placeholder","Content","List","map","i","Item","index","e","target","aria-label","inputMode","appearance","icon","before","onClick"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/display-conditions/ConditionRow.tsx"],"sourcesContent":["import { Button, Chip, Combobox, Flex, TextField } from '@servicetitan/anvil2';\nimport TrashIcon from '@servicetitan/anvil2/assets/icons/material/round/delete.svg';\nimport { useEffect, useMemo, useState } from 'react';\nimport { FormInfo, parseFormFieldKey } from '../shared/forms';\nimport { NUMBER_OPERATORS, SingleCondition, STRING_OPERATORS, VALUE_LESS_OPERATORS } from './types';\nimport type { DataPointOption, FormFieldOption } from './types';\n\nexport interface ConditionRowProps {\n canRemove: boolean;\n condition: SingleCondition;\n dataPointOptions: DataPointOption[];\n formFieldOptions: FormFieldOption[];\n forms: FormInfo[];\n onChange: (c: SingleCondition) => void;\n onFormSelect: (formId: number) => void;\n onRemove: () => void;\n}\n\ninterface OperatorOption {\n label: string;\n value: string;\n}\n\ninterface SourceOption {\n formId?: number;\n label: string;\n value: string;\n}\n\nfunction sanitizeNumericInput(raw: string): string {\n // Allow only a single leading minus and one decimal separator.\n let value = raw.replaceAll(/[^0-9.-]/g, '');\n const isNegative = value.startsWith('-');\n value = value.replaceAll('-', '');\n if (isNegative) {\n value = `-${value}`;\n }\n const firstDot = value.indexOf('.');\n if (firstDot >= 0) {\n value = `${value.slice(0, firstDot + 1)}${value.slice(firstDot + 1).replaceAll('.', '')}`;\n }\n return value;\n}\n\nexport function ConditionRow({\n canRemove,\n condition,\n dataPointOptions,\n formFieldOptions,\n forms,\n onChange,\n onFormSelect,\n onRemove,\n}: Readonly<ConditionRowProps>) {\n const selectedFormFieldMeta = useMemo(\n () => parseFormFieldKey(condition.dataPointKey),\n [condition.dataPointKey],\n );\n const [selectedSourceValue, setSelectedSourceValue] = useState<string>(\n selectedFormFieldMeta ? `form:${selectedFormFieldMeta.formId}` : 'schema',\n );\n\n const sourceOptions = useMemo<SourceOption[]>(\n () => [\n { label: 'Data point', value: 'schema' },\n ...forms.map(form => ({\n formId: form.id,\n label: form.name,\n value: `form:${form.id}`,\n })),\n ],\n [forms],\n );\n\n const selectedSource = useMemo<SourceOption | null>(() => {\n return (\n sourceOptions.find(opt => opt.value === selectedSourceValue) ?? sourceOptions[0] ?? null\n );\n }, [selectedSourceValue, sourceOptions]);\n\n useEffect(() => {\n if (selectedFormFieldMeta) {\n setSelectedSourceValue(`form:${selectedFormFieldMeta.formId}`);\n return;\n }\n if (!condition.dataPointKey) {\n return;\n }\n const hasSchemaMatch = dataPointOptions.some(opt => opt.fullKey === condition.dataPointKey);\n if (hasSchemaMatch) {\n setSelectedSourceValue('schema');\n }\n }, [condition.dataPointKey, dataPointOptions, selectedFormFieldMeta]);\n\n const currentFormId = selectedSource?.formId;\n const activeDataPointOptions = useMemo(\n () =>\n currentFormId\n ? formFieldOptions.filter(option => option.formId === currentFormId)\n : dataPointOptions,\n [currentFormId, dataPointOptions, formFieldOptions],\n );\n\n const selectedDataPoint = useMemo(\n () => activeDataPointOptions.find(opt => opt.fullKey === condition.dataPointKey) ?? null,\n [activeDataPointOptions, condition.dataPointKey],\n );\n\n const fieldType = selectedDataPoint?.fieldType ?? 'string';\n\n const operatorItems: OperatorOption[] = useMemo(\n () =>\n fieldType === 'number'\n ? ([...NUMBER_OPERATORS] as OperatorOption[])\n : ([...STRING_OPERATORS] as OperatorOption[]),\n [fieldType],\n );\n\n const selectedOperator = useMemo(\n () => operatorItems.find(op => op.value === condition.operator) ?? null,\n [operatorItems, condition.operator],\n );\n\n const isValueLess = VALUE_LESS_OPERATORS.includes(condition.operator);\n\n const handleValueChange = (raw: string) => {\n const value = fieldType === 'number' ? sanitizeNumericInput(raw) : raw;\n onChange({ ...condition, value });\n };\n\n const handleDataPointChange = (item: DataPointOption | null) => {\n const nextIsNumber = item?.fieldType === 'number';\n const nextOperatorItems = nextIsNumber ? NUMBER_OPERATORS : STRING_OPERATORS;\n const operatorReset = !nextOperatorItems.some(op => op.value === condition.operator);\n onChange({\n ...condition,\n dataPointKey: item?.fullKey ?? '',\n operator: operatorReset\n ? nextIsNumber\n ? 'num_eq'\n : 'is_equal_to'\n : condition.operator,\n });\n };\n\n const handleSourceChange = (item: SourceOption | null) => {\n if (!item) {\n return;\n }\n setSelectedSourceValue(item.value);\n\n if (!item.formId) {\n const schemaField =\n dataPointOptions.find(opt => opt.fullKey === condition.dataPointKey) ?? null;\n const nextFieldType = schemaField?.fieldType ?? 'string';\n const nextIsNumber = nextFieldType === 'number';\n const nextOperatorItems = nextIsNumber ? NUMBER_OPERATORS : STRING_OPERATORS;\n const operatorReset = !nextOperatorItems.some(op => op.value === condition.operator);\n\n onChange({\n ...condition,\n dataPointKey: schemaField?.fullKey ?? '',\n operator: operatorReset\n ? nextIsNumber\n ? 'num_eq'\n : 'is_equal_to'\n : condition.operator,\n });\n return;\n }\n\n onFormSelect(item.formId);\n const nextFormFieldOptions = formFieldOptions.filter(\n option => option.formId === item.formId,\n );\n const currentSelected = nextFormFieldOptions.find(\n opt => opt.fullKey === condition.dataPointKey,\n );\n const nextSelected = currentSelected ?? nextFormFieldOptions[0] ?? null;\n const nextFieldType = nextSelected?.fieldType ?? 'string';\n const nextIsNumber = nextFieldType === 'number';\n const nextOperatorItems = nextIsNumber ? NUMBER_OPERATORS : STRING_OPERATORS;\n const operatorReset = !nextOperatorItems.some(op => op.value === condition.operator);\n\n onChange({\n ...condition,\n dataPointKey: nextSelected?.fullKey ?? '',\n operator: operatorReset\n ? nextIsNumber\n ? 'num_eq'\n : 'is_equal_to'\n : condition.operator,\n });\n };\n\n return (\n <Flex direction=\"column\" gap=\"3\" style={{ width: '100%' }}>\n <div style={{ width: '100%' }}>\n <Combobox\n {...({ disableClearSelection: true } as object)}\n itemToKey={(item: SourceOption | null) => item?.value ?? ''}\n itemToString={(item: SourceOption | null) => item?.label ?? ''}\n items={sourceOptions}\n selectedItem={selectedSource}\n onChange={handleSourceChange}\n >\n <Combobox.SelectTrigger\n label=\"Data Type\"\n placeholder=\"Select source...\"\n size=\"small\"\n />\n <Combobox.Content>\n {({ items }: { items: SourceOption[] }) => (\n <Combobox.List>\n {items.map((item, i) => (\n <Combobox.Item index={i} item={item} key={item.value}>\n {item.label}\n </Combobox.Item>\n ))}\n </Combobox.List>\n )}\n </Combobox.Content>\n </Combobox>\n </div>\n <Flex\n direction=\"row\"\n alignItems=\"flex-end\"\n gap=\"2\"\n style={{ flexWrap: 'wrap', rowGap: 8, width: '100%' }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'flex-end',\n flexShrink: 0,\n padding: '4px 8px',\n }}\n >\n <Chip label=\"IF\" size=\"small\" />\n </div>\n <div style={{ flex: '2 1 240px', minWidth: 200 }}>\n <Combobox\n {...({ disableClearSelection: true } as object)}\n itemToKey={(item: DataPointOption | null) => item?.fullKey ?? ''}\n itemToString={(item: DataPointOption | null) => item?.title ?? ''}\n items={activeDataPointOptions}\n selectedItem={selectedDataPoint}\n onChange={handleDataPointChange}\n >\n <Combobox.SelectTrigger\n label=\"Data Point\"\n placeholder={\n currentFormId ? 'Select form field...' : 'Select data point...'\n }\n size=\"small\"\n />\n <Combobox.Content>\n {({ items }: { items: DataPointOption[] }) => (\n <Combobox.List>\n {items.map((item, i) => (\n <Combobox.Item index={i} item={item} key={item.fullKey}>\n {item.title}\n </Combobox.Item>\n ))}\n </Combobox.List>\n )}\n </Combobox.Content>\n </Combobox>\n </div>\n <div style={{ flex: '1 1 180px', minWidth: 150 }}>\n <Combobox\n {...({ disableClearSelection: true } as object)}\n itemToKey={(item: OperatorOption | null) => item?.value ?? ''}\n itemToString={(item: OperatorOption | null) => item?.label ?? ''}\n items={operatorItems}\n selectedItem={selectedOperator}\n onChange={(item: OperatorOption | null) =>\n onChange({\n ...condition,\n operator: (item?.value ??\n 'is_equal_to') as SingleCondition['operator'],\n })\n }\n >\n <Combobox.SelectTrigger\n label=\"Condition\"\n placeholder=\"Select...\"\n size=\"small\"\n />\n <Combobox.Content>\n {({ items }: { items: OperatorOption[] }) => (\n <Combobox.List>\n {items.map((item, i) => (\n <Combobox.Item index={i} item={item} key={item.value}>\n {item.label}\n </Combobox.Item>\n ))}\n </Combobox.List>\n )}\n </Combobox.Content>\n </Combobox>\n </div>\n {!isValueLess && (\n <div style={{ flex: '1 1 180px', minWidth: 150 }}>\n <TextField\n label=\"Value\"\n size=\"small\"\n value={condition.value}\n onChange={e => handleValueChange(e.target.value)}\n placeholder={fieldType === 'number' ? 'e.g. 1.5' : 'Enter value...'}\n style={{ width: '100%' }}\n aria-label=\"Value\"\n {...(fieldType === 'number' && { inputMode: 'decimal' })}\n />\n </div>\n )}\n {canRemove && (\n <div\n style={{\n display: 'flex',\n alignItems: 'flex-end',\n flexShrink: 0,\n padding: '4px 8px',\n }}\n >\n <Button\n appearance=\"secondary\"\n aria-label=\"Remove condition\"\n icon={{ before: TrashIcon }}\n size=\"small\"\n onClick={onRemove}\n />\n </div>\n )}\n </Flex>\n </Flex>\n );\n}\n"],"names":["Button","Chip","Combobox","Flex","TextField","TrashIcon","useEffect","useMemo","useState","parseFormFieldKey","NUMBER_OPERATORS","STRING_OPERATORS","VALUE_LESS_OPERATORS","sanitizeNumericInput","raw","value","replaceAll","isNegative","startsWith","firstDot","indexOf","slice","ConditionRow","canRemove","condition","dataPointOptions","formFieldOptions","forms","onChange","onFormSelect","onRemove","selectedFormFieldMeta","dataPointKey","selectedSourceValue","setSelectedSourceValue","formId","sourceOptions","label","map","form","id","name","selectedSource","find","opt","hasSchemaMatch","some","fullKey","currentFormId","activeDataPointOptions","filter","option","selectedDataPoint","fieldType","operatorItems","selectedOperator","op","operator","isValueLess","includes","handleValueChange","handleDataPointChange","item","nextIsNumber","nextOperatorItems","operatorReset","handleSourceChange","schemaField","nextFieldType","nextFormFieldOptions","currentSelected","nextSelected","direction","gap","style","width","div","disableClearSelection","itemToKey","itemToString","items","selectedItem","SelectTrigger","placeholder","size","Content","List","i","Item","index","alignItems","flexWrap","rowGap","display","flexShrink","padding","flex","minWidth","title","e","target","aria-label","inputMode","appearance","icon","before","onClick"],"mappings":"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"}
@@ -1,4 +1,7 @@
1
+ import { FormFieldInfo, FormInfo } from '../shared/forms';
1
2
  export interface DisplayConditionModalProps {
3
+ onConditionFormSelect?: (formId: number, sendFormFields: (formId: number, fields: FormFieldInfo[]) => void) => void;
4
+ onConditionalsOpen?: (usedFormIds: number[], sendFormList: (forms: FormInfo[]) => void, sendFormFields: (formId: number, fields: FormFieldInfo[]) => void) => void;
2
5
  schema?: import('../shared/schema').SchemaObject;
3
6
  }
4
7
  export declare const DisplayConditionModal: (props: DisplayConditionModalProps) => import("react").ReactPortal | null;
@@ -1 +1 @@
1
- {"version":3,"file":"DisplayConditionModal.d.ts","sourceRoot":"","sources":["../../src/display-conditions/DisplayConditionModal.tsx"],"names":[],"mappings":"AAoDA,MAAM,WAAW,0BAA0B;IACvC,MAAM,CAAC,EAAE,OAAO,kBAAkB,EAAE,YAAY,CAAC;CACpD;AAED,eAAO,MAAM,qBAAqB,GAAI,OAAO,0BAA0B,uCAsLtE,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,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,uCA2QtE,CAAC"}
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Button, Combobox, Dialog, Flex, Text } from '@servicetitan/anvil2';
3
3
  import { useCallback, useEffect, useMemo, useState } from 'react';
4
4
  import { createPortal } from 'react-dom';
5
+ import { buildFormFieldKey, getConditionalFieldTypeFromFormItemType, parseFormFieldKey } from '../shared/forms';
5
6
  import { ConditionGroupsSection } from './ConditionGroupsSection';
6
7
  import { defaultState, MODAL_CONTENT_MAX_HEIGHT } from './constants';
7
8
  import { onDisplayCondition } from './displayConditionController';
@@ -45,13 +46,51 @@ function applyMatchTypeToState(conditionState, matchType) {
45
46
  };
46
47
  }
47
48
  export const DisplayConditionModal = (props)=>{
49
+ const { onConditionFormSelect, onConditionalsOpen, schema } = props;
48
50
  const [request, setRequest] = useState(null);
49
51
  const [isOpen, setIsOpen] = useState(false);
50
52
  const [state, setState] = useState(defaultState);
51
53
  const [matchType, setMatchType] = useState('all');
52
- const dataPointOptions = useMemo(()=>getSchemaDataPointOptions(props.schema), [
53
- props.schema
54
+ const [forms, setForms] = useState([]);
55
+ const [formFieldsByFormId, setFormFieldsByFormId] = useState({});
56
+ const [loadingFormIds, setLoadingFormIds] = useState([]);
57
+ const [isFormsListLoading, setIsFormsListLoading] = useState(false);
58
+ const dataPointOptions = useMemo(()=>getSchemaDataPointOptions(schema), [
59
+ schema
54
60
  ]);
61
+ const formFieldOptions = useMemo(()=>{
62
+ const nextOptions = [];
63
+ for (const form of forms){
64
+ const fields = formFieldsByFormId[form.id];
65
+ if (!fields) {
66
+ continue;
67
+ }
68
+ for (const field of fields){
69
+ const fieldType = getConditionalFieldTypeFromFormItemType(field.itemType);
70
+ if (!fieldType) {
71
+ continue;
72
+ }
73
+ nextOptions.push({
74
+ fieldType,
75
+ formId: form.id,
76
+ fullKey: buildFormFieldKey(form.id, field.id),
77
+ title: field.header
78
+ });
79
+ }
80
+ }
81
+ return nextOptions.sort((left, right)=>left.title.localeCompare(right.title));
82
+ }, [
83
+ forms,
84
+ formFieldsByFormId
85
+ ]);
86
+ const allFieldOptions = useMemo(()=>[
87
+ ...dataPointOptions,
88
+ ...formFieldOptions
89
+ ], [
90
+ dataPointOptions,
91
+ formFieldOptions
92
+ ]);
93
+ const isFieldDataLoading = isFormsListLoading || loadingFormIds.length > 0;
55
94
  const portalTarget = useMemo(()=>{
56
95
  if (typeof document === 'undefined') {
57
96
  return null;
@@ -64,11 +103,36 @@ export const DisplayConditionModal = (props)=>{
64
103
  const existing = nextRequest.data;
65
104
  const parsed = parseUnlayerDisplayCondition(existing);
66
105
  const initialState = parsed !== null && parsed !== void 0 ? parsed : defaultState();
106
+ const usedFormIds = Array.from(new Set(initialState.groups.flatMap((group)=>group.conditions).map((condition)=>{
107
+ var _parseFormFieldKey;
108
+ return (_parseFormFieldKey = parseFormFieldKey(condition.dataPointKey)) === null || _parseFormFieldKey === void 0 ? void 0 : _parseFormFieldKey.formId;
109
+ }).filter((formId)=>formId != null)));
110
+ setForms([]);
111
+ setFormFieldsByFormId({});
112
+ setIsFormsListLoading(!!onConditionalsOpen);
113
+ setLoadingFormIds(usedFormIds);
114
+ if (onConditionalsOpen) {
115
+ onConditionalsOpen(usedFormIds, (nextForms)=>{
116
+ setForms(nextForms);
117
+ setIsFormsListLoading(false);
118
+ }, (formId, fields)=>{
119
+ setFormFieldsByFormId((prev)=>({
120
+ ...prev,
121
+ [formId]: fields
122
+ }));
123
+ setLoadingFormIds((prev)=>prev.filter((id)=>id !== formId));
124
+ });
125
+ } else {
126
+ setIsFormsListLoading(false);
127
+ setLoadingFormIds([]);
128
+ }
67
129
  setState(initialState);
68
130
  setMatchType(deriveMatchType(initialState));
69
131
  setIsOpen(true);
70
132
  });
71
- }, []);
133
+ }, [
134
+ onConditionalsOpen
135
+ ]);
72
136
  const handleClose = useCallback(()=>{
73
137
  setRequest(null);
74
138
  setIsOpen(false);
@@ -117,10 +181,32 @@ export const DisplayConditionModal = (props)=>{
117
181
  }));
118
182
  }
119
183
  }, []);
184
+ const handleFormSelect = useCallback((formId)=>{
185
+ if (!onConditionFormSelect || formFieldsByFormId[formId]) {
186
+ return;
187
+ }
188
+ setLoadingFormIds((prev)=>prev.includes(formId) ? prev : [
189
+ ...prev,
190
+ formId
191
+ ]);
192
+ onConditionFormSelect(formId, (selectedFormId, fields)=>{
193
+ setFormFieldsByFormId((prev)=>({
194
+ ...prev,
195
+ [selectedFormId]: fields
196
+ }));
197
+ setLoadingFormIds((prev)=>prev.filter((id)=>id !== selectedFormId));
198
+ });
199
+ }, [
200
+ formFieldsByFormId,
201
+ onConditionFormSelect
202
+ ]);
120
203
  const canSave = useMemo(()=>{
204
+ if (isFieldDataLoading) {
205
+ return false;
206
+ }
121
207
  for (const group of state.groups){
122
208
  for (const condition of group.conditions){
123
- var _dataPointOptions_find;
209
+ var _allFieldOptions_find;
124
210
  if (!condition.dataPointKey) {
125
211
  return false;
126
212
  }
@@ -131,8 +217,8 @@ export const DisplayConditionModal = (props)=>{
131
217
  if (!trimmedValue) {
132
218
  return false;
133
219
  }
134
- var _dataPointOptions_find_fieldType;
135
- const fieldType = (_dataPointOptions_find_fieldType = (_dataPointOptions_find = dataPointOptions.find((opt)=>opt.fullKey === condition.dataPointKey)) === null || _dataPointOptions_find === void 0 ? void 0 : _dataPointOptions_find.fieldType) !== null && _dataPointOptions_find_fieldType !== void 0 ? _dataPointOptions_find_fieldType : 'string';
220
+ var _allFieldOptions_find_fieldType;
221
+ const fieldType = (_allFieldOptions_find_fieldType = (_allFieldOptions_find = allFieldOptions.find((opt)=>opt.fullKey === condition.dataPointKey)) === null || _allFieldOptions_find === void 0 ? void 0 : _allFieldOptions_find.fieldType) !== null && _allFieldOptions_find_fieldType !== void 0 ? _allFieldOptions_find_fieldType : 'string';
136
222
  if (fieldType === 'number' && !NUMERIC_VALUE_RE.test(trimmedValue)) {
137
223
  return false;
138
224
  }
@@ -140,7 +226,8 @@ export const DisplayConditionModal = (props)=>{
140
226
  }
141
227
  return state.groups.length > 0;
142
228
  }, [
143
- dataPointOptions,
229
+ allFieldOptions,
230
+ isFieldDataLoading,
144
231
  state.groups
145
232
  ]);
146
233
  if (!portalTarget || !isOpen) {
@@ -221,8 +308,11 @@ export const DisplayConditionModal = (props)=>{
221
308
  ]
222
309
  }),
223
310
  dataPointOptions: dataPointOptions,
311
+ formFieldOptions: formFieldOptions,
312
+ forms: forms,
224
313
  groups: state.groups,
225
314
  matchType: matchType,
315
+ onFormSelect: handleFormSelect,
226
316
  onMatchTypeChange: setMatchType,
227
317
  onUpdateGroup: updateGroup
228
318
  })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/display-conditions/DisplayConditionModal.tsx"],"sourcesContent":["import { Button, Combobox, Dialog, Flex, Text } from '@servicetitan/anvil2';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { createPortal } from 'react-dom';\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 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 schema?: import('../shared/schema').SchemaObject;\n}\n\nexport const DisplayConditionModal = (props: DisplayConditionModalProps) => {\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\n const dataPointOptions = useMemo(() => getSchemaDataPointOptions(props.schema), [props.schema]);\n\n const portalTarget = useMemo(() => {\n if (typeof document === 'undefined') {\n return null;\n }\n return document.body;\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 setState(initialState);\n setMatchType(deriveMatchType(initialState));\n setIsOpen(true);\n });\n }, []);\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 canSave = useMemo(() => {\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 dataPointOptions.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 }, [dataPointOptions, state.groups]);\n\n if (!portalTarget || !isOpen) {\n return null;\n }\n\n return 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 template/file.\n </Text>\n <div style={{ width: 90 }}>\n <Combobox.Select\n {...({ disableClearSelection: true } as object)}\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 {({ items }: { items: BehaviorOption[] }) => (\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 groups={state.groups}\n matchType={matchType}\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 portalTarget,\n );\n};\n"],"names":["Button","Combobox","Dialog","Flex","Text","useCallback","useEffect","useMemo","useState","createPortal","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","request","setRequest","isOpen","setIsOpen","state","setState","setMatchType","dataPointOptions","schema","portalTarget","document","body","nextRequest","existing","data","parsed","initialState","handleClose","handleSave","finalState","condition","done","updateGroup","index","prev","next","selectedBehavior","find","opt","behavior","handleBehaviorChange","item","canSave","dataPointKey","operator","trimmedValue","trim","fieldType","fullKey","test","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","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 } from '@servicetitan/anvil2';\nimport { useCallback, useEffect, useMemo, 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 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 { onConditionFormSelect, onConditionalsOpen, schema } = 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\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 const portalTarget = useMemo(() => {\n if (typeof document === 'undefined') {\n return null;\n }\n return document.body;\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(usedFormIds);\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 } else {\n setIsFormsListLoading(false);\n setLoadingFormIds([]);\n }\n\n setState(initialState);\n setMatchType(deriveMatchType(initialState));\n setIsOpen(true);\n });\n }, [onConditionalsOpen]);\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 if (!onConditionFormSelect || formFieldsByFormId[formId]) {\n return;\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 [formFieldsByFormId, onConditionFormSelect],\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 (!portalTarget || !isOpen) {\n return null;\n }\n\n return 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 template/file.\n </Text>\n <div style={{ width: 90 }}>\n <Combobox.Select\n {...({ disableClearSelection: true } as object)}\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 {({ items }: { items: BehaviorOption[] }) => (\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 portalTarget,\n );\n};\n"],"names":["Button","Combobox","Dialog","Flex","Text","useCallback","useEffect","useMemo","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","schema","request","setRequest","isOpen","setIsOpen","state","setState","setMatchType","forms","setForms","formFieldsByFormId","setFormFieldsByFormId","loadingFormIds","setLoadingFormIds","isFormsListLoading","setIsFormsListLoading","dataPointOptions","formFieldOptions","nextOptions","form","fields","id","field","fieldType","itemType","push","formId","fullKey","title","header","sort","left","right","localeCompare","allFieldOptions","isFieldDataLoading","portalTarget","document","body","nextRequest","existing","data","parsed","initialState","usedFormIds","Array","from","Set","flatMap","condition","dataPointKey","filter","nextForms","prev","handleClose","handleSave","finalState","done","updateGroup","index","next","selectedBehavior","find","opt","behavior","handleBehaviorChange","item","handleFormSelect","includes","selectedFormId","canSave","operator","trimmedValue","trim","test","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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"nunjucks.d.ts","sourceRoot":"","sources":["../../src/display-conditions/nunjucks.ts"],"names":[],"mappings":"AACA,OAAO,EAKH,qBAAqB,EAGrB,uBAAuB,EAE1B,MAAM,SAAS,CAAC;AA8KjB,wBAAgB,4BAA4B,CACxC,KAAK,EAAE,qBAAqB,GAC7B,uBAAuB,GAAG,IAAI,CAUhC;AA0QD;;;GAGG;AACH,wBAAgB,4BAA4B,CACxC,SAAS,EAAE,uBAAuB,GAAG,IAAI,GAAG,SAAS,GACtD,qBAAqB,GAAG,IAAI,CA4C9B"}
1
+ {"version":3,"file":"nunjucks.d.ts","sourceRoot":"","sources":["../../src/display-conditions/nunjucks.ts"],"names":[],"mappings":"AAEA,OAAO,EAKH,qBAAqB,EAGrB,uBAAuB,EAE1B,MAAM,SAAS,CAAC;AA4KjB,wBAAgB,4BAA4B,CACxC,KAAK,EAAE,qBAAqB,GAC7B,uBAAuB,GAAG,IAAI,CAUhC;AAoRD;;;GAGG;AACH,wBAAgB,4BAA4B,CACxC,SAAS,EAAE,uBAAuB,GAAG,IAAI,GAAG,SAAS,GACtD,qBAAqB,GAAG,IAAI,CA4C9B"}
@@ -1,3 +1,4 @@
1
+ import { buildFormFieldKey, parseFormFieldKey, toNunjucksFieldReference } from '../shared/forms';
1
2
  import { generateId } from './constants';
2
3
  import { CONDITION_OPERATORS, VALUE_LESS_OPERATORS } from './types';
3
4
  const OPERATOR_LABEL_MAP = new Map(CONDITION_OPERATORS.map((op)=>[
@@ -24,7 +25,7 @@ function isValueLessOperator(operator) {
24
25
  * Build a single condition expression in Nunjucks.
25
26
  * Wrapped in () so splitting never breaks composite expressions.
26
27
  */ function buildSingleConditionExpression(dataPointKey, operator, value) {
27
- const path = dataPointKey;
28
+ const path = toNunjucksFieldReference(dataPointKey);
28
29
  const defaulted = `(${path} | default(''))`;
29
30
  const numDefaulted = `(${path} | default(0))`;
30
31
  const normalizedValue = value.trim();
@@ -229,12 +230,22 @@ export function buildUnlayerDisplayCondition(state) {
229
230
  function unescapeNunjucksString(s) {
230
231
  return s.replaceAll('\\\\', '\\').replaceAll(String.raw`\'`, "'");
231
232
  }
232
- const RE_STR_DEFAULT = String.raw`\(([\w.]+)\s*\|\s*default\s*\(\s*''\s*\)\)`;
233
- const RE_NUM_DEFAULT = String.raw`\(([\w.]+)\s*\|\s*default\s*\(\s*0\s*\)\)`;
233
+ const SIMPLE_DATA_POINT_PATH = String.raw`[\w.]+`;
234
+ const FORM_RUNTIME_DATA_POINT_PATH = String.raw`__submission_fields\["\d+"\]\["[A-Za-z0-9]+"\]`;
235
+ const DATA_POINT_PATH = String.raw`(${SIMPLE_DATA_POINT_PATH}|${FORM_RUNTIME_DATA_POINT_PATH})`;
236
+ const RE_STR_DEFAULT = String.raw`\(${DATA_POINT_PATH}\s*\|\s*default\s*\(\s*''\s*\)\)`;
237
+ const RE_NUM_DEFAULT = String.raw`\(${DATA_POINT_PATH}\s*\|\s*default\s*\(\s*0\s*\)\)`;
234
238
  const QUOTED_CONTENT = String.raw`((?:[^'\\]|\\.)*)`;
235
239
  function toSingleCondition(operator, dataPointKey, value, logicalOp) {
240
+ const normalizedDataPointKey = (()=>{
241
+ const parsed = parseFormFieldKey(dataPointKey.trim());
242
+ if (!parsed) {
243
+ return dataPointKey.trim();
244
+ }
245
+ return buildFormFieldKey(parsed.formId, parsed.fieldId);
246
+ })();
236
247
  const condition = {
237
- dataPointKey: dataPointKey.trim(),
248
+ dataPointKey: normalizedDataPointKey,
238
249
  id: generateId(),
239
250
  operator,
240
251
  value
@@ -273,13 +284,13 @@ const PARSE_PATTERNS = [
273
284
  getValue: ()=>'',
274
285
  operator: 'is_empty',
275
286
  pathGroup: 1,
276
- pattern: new RegExp(String.raw`^${RE_STR_DEFAULT}\s*==\s*''\s+or\s+\(\([\w.]+\s*\|\s*default\s*\(\s*''\s*\)\)\s*\|\s*length\)\s*==\s*0$`)
287
+ pattern: new RegExp(String.raw`^${RE_STR_DEFAULT}\s*==\s*''\s+or\s+\(\(${DATA_POINT_PATH}\s*\|\s*default\s*\(\s*''\s*\)\)\s*\|\s*length\)\s*==\s*0$`)
277
288
  },
278
289
  {
279
290
  getValue: ()=>'',
280
291
  operator: 'is_not_empty',
281
292
  pathGroup: 1,
282
- pattern: new RegExp(String.raw`^${RE_STR_DEFAULT}\s*!=\s*''\s+and\s+\(\([\w.]+\s*\|\s*default\s*\(\s*''\s*\)\)\s*\|\s*length\)\s*>\s*0$`)
293
+ pattern: new RegExp(String.raw`^${RE_STR_DEFAULT}\s*!=\s*''\s+and\s+\(\(${DATA_POINT_PATH}\s*\|\s*default\s*\(\s*''\s*\)\)\s*\|\s*length\)\s*>\s*0$`)
283
294
  },
284
295
  // string with value
285
296
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/display-conditions/nunjucks.ts"],"sourcesContent":["import { generateId } from './constants';\nimport {\n CONDITION_OPERATORS,\n ConditionGroup,\n ConditionOperator,\n DisplayBehavior,\n DisplayConditionState,\n LogicalOperator,\n SingleCondition,\n UnlayerDisplayCondition,\n VALUE_LESS_OPERATORS,\n} from './types';\n\nconst OPERATOR_LABEL_MAP = new Map<string, string>(\n CONDITION_OPERATORS.map(op => [op.value, op.label]),\n);\n\nfunction escapeNunjucksString(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n}\n\nfunction nunjucksValueLiteral(value: string): string {\n return `'${escapeNunjucksString(value)}'`;\n}\n\nfunction isEscapedAt(s: string, index: number): boolean {\n let slashCount = 0;\n for (let i = index - 1; i >= 0 && s[i] === '\\\\'; i--) {\n slashCount++;\n }\n return slashCount % 2 === 1;\n}\n\nfunction isValueLessOperator(operator: string): boolean {\n return VALUE_LESS_OPERATORS.includes(operator as ConditionOperator);\n}\n\n/**\n * Build a single condition expression in Nunjucks.\n * Wrapped in () so splitting never breaks composite expressions.\n */\nfunction buildSingleConditionExpression(\n dataPointKey: string,\n operator: string,\n value: string,\n): string {\n const path = dataPointKey;\n const defaulted = `(${path} | default(''))`;\n const numDefaulted = `(${path} | default(0))`;\n const normalizedValue = value.trim();\n const literal = normalizedValue ? nunjucksValueLiteral(normalizedValue) : \"''\";\n const numLiteral =\n /^-?(?:\\d+\\.?\\d*|\\.\\d+)$/.test(normalizedValue) && normalizedValue !== '-'\n ? normalizedValue\n : '0';\n let inner: string;\n\n switch (operator) {\n case 'is_equal_to':\n inner = `${defaulted} == ${literal}`;\n break;\n case 'is_not_equal_to':\n inner = `${defaulted} != ${literal}`;\n break;\n case 'contains':\n inner = `${literal} in ${defaulted}`;\n break;\n case 'does_not_contain':\n inner = `not (${literal} in ${defaulted})`;\n break;\n case 'starts_with':\n inner = `(${defaulted} | startswith(${literal}))`;\n break;\n case 'ends_with':\n inner = `(${defaulted} | endswith(${literal}))`;\n break;\n case 'is_empty':\n inner = `${defaulted} == '' or (${defaulted} | length) == 0`;\n break;\n case 'is_not_empty':\n inner = `${defaulted} != '' and (${defaulted} | length) > 0`;\n break;\n case 'num_eq':\n inner = `${numDefaulted} == ${numLiteral}`;\n break;\n case 'num_neq':\n inner = `${numDefaulted} != ${numLiteral}`;\n break;\n case 'num_gt':\n inner = `${numDefaulted} > ${numLiteral}`;\n break;\n case 'num_lt':\n inner = `${numDefaulted} < ${numLiteral}`;\n break;\n case 'num_gte':\n inner = `${numDefaulted} >= ${numLiteral}`;\n break;\n case 'num_lte':\n inner = `${numDefaulted} <= ${numLiteral}`;\n break;\n default:\n inner = `${defaulted} == ${literal}`;\n }\n return `(${inner})`;\n}\n\n/**\n * Build group expression. Each condition is connected by its own logical operator.\n * E.g. (cond1) and (cond2) or (cond3)\n */\nfunction buildGroupExpression(group: ConditionGroup): string {\n const valid = group.conditions.filter(\n c => c.dataPointKey && (isValueLessOperator(c.operator) || c.value.trim() !== ''),\n );\n if (valid.length === 0) {\n return '';\n }\n let result = buildSingleConditionExpression(\n valid[0].dataPointKey,\n valid[0].operator,\n valid[0].value,\n );\n for (let i = 1; i < valid.length; i++) {\n const joiner = valid[i].logicalOperator === 'or' ? ' or ' : ' and ';\n result +=\n joiner +\n buildSingleConditionExpression(\n valid[i].dataPointKey,\n valid[i].operator,\n valid[i].value,\n );\n }\n // Wrap group in parens so top-level rule AND split works cleanly\n return valid.length > 1 ? `(${result})` : result;\n}\n\n/**\n * Build full condition expression.\n * Rules (groups) are connected by each group's logical operator.\n * hide behavior wraps everything in not().\n */\nfunction buildFullConditionExpression(state: DisplayConditionState): string {\n const validGroups = state.groups\n .map(group => ({ expression: buildGroupExpression(group), group }))\n .filter(item => !!item.expression);\n if (validGroups.length === 0) {\n return '';\n }\n let combined = validGroups[0].expression;\n for (let i = 1; i < validGroups.length; i++) {\n const joiner = validGroups[i].group.logicalOperator === 'or' ? ' or ' : ' and ';\n combined += `${joiner}${validGroups[i].expression}`;\n }\n if (state.behavior === 'hide') {\n return `not (${combined})`;\n }\n return combined;\n}\n\nfunction operatorLabel(operator: string): string {\n return OPERATOR_LABEL_MAP.get(operator) ?? operator;\n}\n\nfunction generateTypeAndLabel(state: DisplayConditionState): { type: string; label: string } {\n const parts: string[] = [];\n for (const group of state.groups) {\n for (const c of group.conditions) {\n if (!c.dataPointKey) {\n continue;\n }\n if (isValueLessOperator(c.operator)) {\n parts.push(`${c.dataPointKey} ${operatorLabel(c.operator)}`);\n } else if (c.value.trim()) {\n parts.push(\n `${c.dataPointKey} ${operatorLabel(c.operator)} ${c.value.trim()}`,\n );\n }\n }\n }\n const summary = parts.slice(0, 2).join('; ') + (parts.length > 2 ? '…' : '');\n const type = state.behavior === 'show' ? 'Display when' : 'Hide when';\n const label = summary || (state.behavior === 'show' ? 'Show when' : 'Hide when');\n return { type, label };\n}\n\nexport function buildUnlayerDisplayCondition(\n state: DisplayConditionState,\n): UnlayerDisplayCondition | null {\n const expr = buildFullConditionExpression(state);\n if (!expr) {\n return null;\n }\n const before = `{% if ${expr} %}`;\n const after = '{% endif %}';\n const { label, type } = generateTypeAndLabel(state);\n const description = state.groups.length > 1 ? `${state.groups.length} rules` : undefined;\n return { after, before, description, label, type };\n}\n\n/*\n * ---------------------------------------------------------------------------\n * Parse helpers\n * ---------------------------------------------------------------------------\n */\n\nfunction stripOuterParens(s: string): string {\n const t = s.trim();\n if (t.length < 2 || !t.startsWith('(') || t.at(-1) !== ')') {\n return t;\n }\n let depth = 1;\n for (let i = 1; i < t.length - 1; i++) {\n if (t[i] === '(') {\n depth++;\n } else if (t[i] === ')') {\n depth--;\n if (depth === 0) {\n return t;\n }\n }\n }\n return depth === 1 ? t.slice(1, -1).trim() : t;\n}\n\n/**\n * Tokenize an expression into alternating tokens of (expr, operator).\n * Returns: [expr, 'and'|'or', expr, 'and'|'or', expr, ...]\n *\n * This scans for top-level \" and \" / \" or \" while respecting parens,\n * and records which separator was found between each pair.\n */\nfunction tokenizeGroupExpression(expr: string): {\n conditionExprs: string[];\n operators: LogicalOperator[];\n} {\n const conditionExprs: string[] = [];\n const operators: LogicalOperator[] = [];\n let depth = 0;\n let inSingleQuote = false;\n let start = 0;\n\n for (let i = 0; i < expr.length; i++) {\n const c = expr[i];\n if (c === \"'\" && !isEscapedAt(expr, i)) {\n inSingleQuote = !inSingleQuote;\n } else if (!inSingleQuote && c === '(') {\n depth++;\n } else if (!inSingleQuote && c === ')') {\n depth = Math.max(0, depth - 1);\n } else if (!inSingleQuote && depth === 0) {\n // Check for \" and \" or \" or \" at this position\n if (expr.slice(i, i + 5) === ' and ') {\n conditionExprs.push(expr.slice(start, i).trim());\n operators.push('and');\n start = i + 5;\n i += 4;\n continue;\n }\n if (expr.slice(i, i + 4) === ' or ') {\n conditionExprs.push(expr.slice(start, i).trim());\n operators.push('or');\n start = i + 4;\n i += 3;\n continue;\n }\n }\n }\n conditionExprs.push(expr.slice(start).trim());\n return { conditionExprs, operators };\n}\n\nfunction unescapeNunjucksString(s: string): string {\n return s.replaceAll('\\\\\\\\', '\\\\').replaceAll(String.raw`\\'`, \"'\");\n}\n\nconst RE_STR_DEFAULT = String.raw`\\(([\\w.]+)\\s*\\|\\s*default\\s*\\(\\s*''\\s*\\)\\)`;\nconst RE_NUM_DEFAULT = String.raw`\\(([\\w.]+)\\s*\\|\\s*default\\s*\\(\\s*0\\s*\\)\\)`;\nconst QUOTED_CONTENT = String.raw`((?:[^'\\\\]|\\\\.)*)`;\n\nfunction toSingleCondition(\n operator: ConditionOperator,\n dataPointKey: string,\n value: string,\n logicalOp?: LogicalOperator,\n): SingleCondition {\n const condition: SingleCondition = {\n dataPointKey: dataPointKey.trim(),\n id: generateId(),\n operator,\n value,\n };\n if (logicalOp) {\n condition.logicalOperator = logicalOp;\n }\n return condition;\n}\n\nfunction parseQuotedValue(s: string): { value: string; rest: string } | null {\n if (!s.startsWith(\"'\")) {\n return null;\n }\n let i = 1;\n let value = '';\n while (i < s.length) {\n if (s[i] === '\\\\' && i + 1 < s.length) {\n value += s[i + 1] === \"'\" ? \"'\" : s[i + 1];\n i += 2;\n continue;\n }\n if (s[i] === \"'\") {\n return { rest: s.slice(i + 1).trim(), value: unescapeNunjucksString(value) };\n }\n value += s[i];\n i++;\n }\n return null;\n}\n\ninterface ParsePattern {\n getValue: (match: RegExpMatchArray) => string | null;\n operator: ConditionOperator;\n pathGroup: number;\n pattern: RegExp;\n}\n\nconst PARSE_PATTERNS: ParsePattern[] = [\n // value-less\n {\n getValue: () => '',\n operator: 'is_empty',\n pathGroup: 1,\n pattern: new RegExp(\n String.raw`^${RE_STR_DEFAULT}\\s*==\\s*''\\s+or\\s+\\(\\([\\w.]+\\s*\\|\\s*default\\s*\\(\\s*''\\s*\\)\\)\\s*\\|\\s*length\\)\\s*==\\s*0$`,\n ),\n },\n {\n getValue: () => '',\n operator: 'is_not_empty',\n pathGroup: 1,\n pattern: new RegExp(\n String.raw`^${RE_STR_DEFAULT}\\s*!=\\s*''\\s+and\\s+\\(\\([\\w.]+\\s*\\|\\s*default\\s*\\(\\s*''\\s*\\)\\)\\s*\\|\\s*length\\)\\s*>\\s*0$`,\n ),\n },\n // string with value\n {\n getValue: m => parseQuotedValue(m[2].trim())?.value ?? null,\n operator: 'is_equal_to',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_STR_DEFAULT}\\s*==\\s+(.+)$`),\n },\n {\n getValue: m => parseQuotedValue(m[2].trim())?.value ?? null,\n operator: 'is_not_equal_to',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_STR_DEFAULT}\\s*!=\\s+(.+)$`),\n },\n {\n getValue: m => unescapeNunjucksString(m[1]),\n operator: 'contains',\n pathGroup: 2,\n pattern: new RegExp(String.raw`^'${QUOTED_CONTENT}'\\s+in\\s+${RE_STR_DEFAULT}$`),\n },\n {\n getValue: m => unescapeNunjucksString(m[1]),\n operator: 'does_not_contain',\n pathGroup: 2,\n pattern: new RegExp(\n String.raw`^not\\s*\\(\\s*'${QUOTED_CONTENT}'\\s+in\\s+${RE_STR_DEFAULT}\\s*\\)\\s*$`,\n ),\n },\n {\n getValue: m => parseQuotedValue(m[2].trim())?.value ?? null,\n operator: 'starts_with',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_STR_DEFAULT}\\s*\\|\\s*startswith\\s*\\(\\s*(.+)\\s*\\)\\s*$`),\n },\n {\n getValue: m => parseQuotedValue(m[2].trim())?.value ?? null,\n operator: 'ends_with',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_STR_DEFAULT}\\s*\\|\\s*endswith\\s*\\(\\s*(.+)\\s*\\)\\s*$`),\n },\n // number operators (>= and <= before > and < to avoid partial match)\n {\n getValue: m => m[2].trim(),\n operator: 'num_gte',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_NUM_DEFAULT}\\s*>=\\s*(.+)$`),\n },\n {\n getValue: m => m[2].trim(),\n operator: 'num_lte',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_NUM_DEFAULT}\\s*<=\\s*(.+)$`),\n },\n {\n getValue: m => m[2].trim(),\n operator: 'num_eq',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_NUM_DEFAULT}\\s*==\\s*(.+)$`),\n },\n {\n getValue: m => m[2].trim(),\n operator: 'num_neq',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_NUM_DEFAULT}\\s*!=\\s*(.+)$`),\n },\n {\n getValue: m => m[2].trim(),\n operator: 'num_gt',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_NUM_DEFAULT}\\s*>\\s*(.+)$`),\n },\n {\n getValue: m => m[2].trim(),\n operator: 'num_lt',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_NUM_DEFAULT}\\s*<\\s*(.+)$`),\n },\n];\n\nfunction parseSingleConditionExpression(\n expr: string,\n logicalOp?: LogicalOperator,\n): SingleCondition | null {\n const trimmed = expr.trim();\n for (const { getValue, operator, pathGroup, pattern } of PARSE_PATTERNS) {\n const match = new RegExp(pattern).exec(trimmed);\n if (!match) {\n continue;\n }\n const value = getValue(match);\n if (value === null) {\n continue;\n }\n return toSingleCondition(operator, match[pathGroup], value, logicalOp);\n }\n return null;\n}\n\n/**\n * Parse a group expression into conditions with per-condition logical operators.\n */\nfunction parseGroupExpression(groupExpr: string): SingleCondition[] | null {\n const { conditionExprs, operators } = tokenizeGroupExpression(groupExpr);\n const conditions: SingleCondition[] = [];\n\n for (let i = 0; i < conditionExprs.length; i++) {\n const cs = conditionExprs[i];\n if (!cs) {\n continue;\n }\n const unwrapped = stripOuterParens(cs);\n const logicalOp = i > 0 ? operators[i - 1] : undefined;\n const single = parseSingleConditionExpression(unwrapped, logicalOp);\n if (single) {\n conditions.push(single);\n }\n }\n\n return conditions.length > 0 ? conditions : null;\n}\n\n/**\n * Parse a saved Unlayer display condition back into modal state for prefilling.\n * Returns null if the condition is missing or cannot be parsed.\n */\nexport function parseUnlayerDisplayCondition(\n condition: UnlayerDisplayCondition | null | undefined,\n): DisplayConditionState | null {\n if (!condition?.before) {\n return null;\n }\n const ifMatch = new RegExp(/\\{%\\s*if\\s+(.+)\\s*%\\}/s).exec(condition.before);\n if (!ifMatch) {\n return null;\n }\n let expr = ifMatch[1].trim();\n\n let behavior: DisplayBehavior = 'show';\n if (expr.startsWith('not (') && expr.endsWith(')')) {\n behavior = 'hide';\n expr = expr.slice(5, -1).trim();\n }\n\n const { conditionExprs: ruleStrings, operators: groupOperators } =\n tokenizeGroupExpression(expr);\n const groups: ConditionGroup[] = [];\n\n for (let i = 0; i < ruleStrings.length; i++) {\n const rs = ruleStrings[i];\n if (!rs) {\n continue;\n }\n const unwrapped = stripOuterParens(rs);\n const conditions = parseGroupExpression(unwrapped);\n if (conditions) {\n const group: ConditionGroup = {\n conditions,\n id: generateId(),\n };\n if (i > 0) {\n group.logicalOperator = groupOperators[i - 1] ?? 'and';\n }\n groups.push(group);\n }\n }\n\n if (groups.length === 0) {\n return null;\n }\n\n return { behavior, groups };\n}\n"],"names":["generateId","CONDITION_OPERATORS","VALUE_LESS_OPERATORS","OPERATOR_LABEL_MAP","Map","map","op","value","label","escapeNunjucksString","s","replace","nunjucksValueLiteral","isEscapedAt","index","slashCount","i","isValueLessOperator","operator","includes","buildSingleConditionExpression","dataPointKey","path","defaulted","numDefaulted","normalizedValue","trim","literal","numLiteral","test","inner","buildGroupExpression","group","valid","conditions","filter","c","length","result","joiner","logicalOperator","buildFullConditionExpression","state","validGroups","groups","expression","item","combined","behavior","operatorLabel","get","generateTypeAndLabel","parts","push","summary","slice","join","type","buildUnlayerDisplayCondition","expr","before","after","description","undefined","stripOuterParens","t","startsWith","at","depth","tokenizeGroupExpression","conditionExprs","operators","inSingleQuote","start","Math","max","unescapeNunjucksString","replaceAll","String","raw","RE_STR_DEFAULT","RE_NUM_DEFAULT","QUOTED_CONTENT","toSingleCondition","logicalOp","condition","id","parseQuotedValue","rest","PARSE_PATTERNS","getValue","pathGroup","pattern","RegExp","m","parseSingleConditionExpression","trimmed","match","exec","parseGroupExpression","groupExpr","cs","unwrapped","single","parseUnlayerDisplayCondition","ifMatch","endsWith","ruleStrings","groupOperators","rs"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/display-conditions/nunjucks.ts"],"sourcesContent":["import { buildFormFieldKey, parseFormFieldKey, toNunjucksFieldReference } from '../shared/forms';\nimport { generateId } from './constants';\nimport {\n CONDITION_OPERATORS,\n ConditionGroup,\n ConditionOperator,\n DisplayBehavior,\n DisplayConditionState,\n LogicalOperator,\n SingleCondition,\n UnlayerDisplayCondition,\n VALUE_LESS_OPERATORS,\n} from './types';\n\nconst OPERATOR_LABEL_MAP = new Map<string, string>(\n CONDITION_OPERATORS.map(op => [op.value, op.label]),\n);\n\nfunction escapeNunjucksString(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n}\n\nfunction nunjucksValueLiteral(value: string): string {\n return `'${escapeNunjucksString(value)}'`;\n}\n\nfunction isEscapedAt(s: string, index: number): boolean {\n let slashCount = 0;\n for (let i = index - 1; i >= 0 && s[i] === '\\\\'; i--) {\n slashCount++;\n }\n return slashCount % 2 === 1;\n}\n\nfunction isValueLessOperator(operator: string): boolean {\n return VALUE_LESS_OPERATORS.includes(operator as ConditionOperator);\n}\n\n/**\n * Build a single condition expression in Nunjucks.\n * Wrapped in () so splitting never breaks composite expressions.\n */\nfunction buildSingleConditionExpression(\n dataPointKey: string,\n operator: string,\n value: string,\n): string {\n const path = toNunjucksFieldReference(dataPointKey);\n const defaulted = `(${path} | default(''))`;\n const numDefaulted = `(${path} | default(0))`;\n const normalizedValue = value.trim();\n const literal = normalizedValue ? nunjucksValueLiteral(normalizedValue) : \"''\";\n const numLiteral =\n /^-?(?:\\d+\\.?\\d*|\\.\\d+)$/.test(normalizedValue) && normalizedValue !== '-'\n ? normalizedValue\n : '0';\n let inner: string;\n\n switch (operator) {\n case 'is_equal_to':\n inner = `${defaulted} == ${literal}`;\n break;\n case 'is_not_equal_to':\n inner = `${defaulted} != ${literal}`;\n break;\n case 'contains':\n inner = `${literal} in ${defaulted}`;\n break;\n case 'does_not_contain':\n inner = `not (${literal} in ${defaulted})`;\n break;\n case 'starts_with':\n inner = `(${defaulted} | startswith(${literal}))`;\n break;\n case 'ends_with':\n inner = `(${defaulted} | endswith(${literal}))`;\n break;\n case 'is_empty':\n inner = `${defaulted} == '' or (${defaulted} | length) == 0`;\n break;\n case 'is_not_empty':\n inner = `${defaulted} != '' and (${defaulted} | length) > 0`;\n break;\n case 'num_eq':\n inner = `${numDefaulted} == ${numLiteral}`;\n break;\n case 'num_neq':\n inner = `${numDefaulted} != ${numLiteral}`;\n break;\n case 'num_gt':\n inner = `${numDefaulted} > ${numLiteral}`;\n break;\n case 'num_lt':\n inner = `${numDefaulted} < ${numLiteral}`;\n break;\n case 'num_gte':\n inner = `${numDefaulted} >= ${numLiteral}`;\n break;\n case 'num_lte':\n inner = `${numDefaulted} <= ${numLiteral}`;\n break;\n default:\n inner = `${defaulted} == ${literal}`;\n }\n return `(${inner})`;\n}\n\n/**\n * Build group expression. Each condition is connected by its own logical operator.\n * E.g. (cond1) and (cond2) or (cond3)\n */\nfunction buildGroupExpression(group: ConditionGroup): string {\n const valid = group.conditions.filter(\n c => c.dataPointKey && (isValueLessOperator(c.operator) || c.value.trim() !== ''),\n );\n if (valid.length === 0) {\n return '';\n }\n let result = buildSingleConditionExpression(\n valid[0].dataPointKey,\n valid[0].operator,\n valid[0].value,\n );\n for (let i = 1; i < valid.length; i++) {\n const joiner = valid[i].logicalOperator === 'or' ? ' or ' : ' and ';\n result +=\n joiner +\n buildSingleConditionExpression(\n valid[i].dataPointKey,\n valid[i].operator,\n valid[i].value,\n );\n }\n // Wrap group in parens so top-level rule AND split works cleanly\n return valid.length > 1 ? `(${result})` : result;\n}\n\n/**\n * Build full condition expression.\n * Rules (groups) are connected by each group's logical operator.\n * hide behavior wraps everything in not().\n */\nfunction buildFullConditionExpression(state: DisplayConditionState): string {\n const validGroups = state.groups\n .map(group => ({ expression: buildGroupExpression(group), group }))\n .filter(item => !!item.expression);\n if (validGroups.length === 0) {\n return '';\n }\n let combined = validGroups[0].expression;\n for (let i = 1; i < validGroups.length; i++) {\n const joiner = validGroups[i].group.logicalOperator === 'or' ? ' or ' : ' and ';\n combined += `${joiner}${validGroups[i].expression}`;\n }\n if (state.behavior === 'hide') {\n return `not (${combined})`;\n }\n return combined;\n}\n\nfunction operatorLabel(operator: string): string {\n return OPERATOR_LABEL_MAP.get(operator) ?? operator;\n}\n\nfunction generateTypeAndLabel(state: DisplayConditionState): { type: string; label: string } {\n const parts: string[] = [];\n for (const group of state.groups) {\n for (const c of group.conditions) {\n if (!c.dataPointKey) {\n continue;\n }\n if (isValueLessOperator(c.operator)) {\n parts.push(`${c.dataPointKey} ${operatorLabel(c.operator)}`);\n } else if (c.value.trim()) {\n parts.push(`${c.dataPointKey} ${operatorLabel(c.operator)} ${c.value.trim()}`);\n }\n }\n }\n const summary = parts.slice(0, 2).join('; ') + (parts.length > 2 ? '…' : '');\n const type = state.behavior === 'show' ? 'Display when' : 'Hide when';\n const label = summary || (state.behavior === 'show' ? 'Show when' : 'Hide when');\n return { type, label };\n}\n\nexport function buildUnlayerDisplayCondition(\n state: DisplayConditionState,\n): UnlayerDisplayCondition | null {\n const expr = buildFullConditionExpression(state);\n if (!expr) {\n return null;\n }\n const before = `{% if ${expr} %}`;\n const after = '{% endif %}';\n const { label, type } = generateTypeAndLabel(state);\n const description = state.groups.length > 1 ? `${state.groups.length} rules` : undefined;\n return { after, before, description, label, type };\n}\n\n/*\n * ---------------------------------------------------------------------------\n * Parse helpers\n * ---------------------------------------------------------------------------\n */\n\nfunction stripOuterParens(s: string): string {\n const t = s.trim();\n if (t.length < 2 || !t.startsWith('(') || t.at(-1) !== ')') {\n return t;\n }\n let depth = 1;\n for (let i = 1; i < t.length - 1; i++) {\n if (t[i] === '(') {\n depth++;\n } else if (t[i] === ')') {\n depth--;\n if (depth === 0) {\n return t;\n }\n }\n }\n return depth === 1 ? t.slice(1, -1).trim() : t;\n}\n\n/**\n * Tokenize an expression into alternating tokens of (expr, operator).\n * Returns: [expr, 'and'|'or', expr, 'and'|'or', expr, ...]\n *\n * This scans for top-level \" and \" / \" or \" while respecting parens,\n * and records which separator was found between each pair.\n */\nfunction tokenizeGroupExpression(expr: string): {\n conditionExprs: string[];\n operators: LogicalOperator[];\n} {\n const conditionExprs: string[] = [];\n const operators: LogicalOperator[] = [];\n let depth = 0;\n let inSingleQuote = false;\n let start = 0;\n\n for (let i = 0; i < expr.length; i++) {\n const c = expr[i];\n if (c === \"'\" && !isEscapedAt(expr, i)) {\n inSingleQuote = !inSingleQuote;\n } else if (!inSingleQuote && c === '(') {\n depth++;\n } else if (!inSingleQuote && c === ')') {\n depth = Math.max(0, depth - 1);\n } else if (!inSingleQuote && depth === 0) {\n // Check for \" and \" or \" or \" at this position\n if (expr.slice(i, i + 5) === ' and ') {\n conditionExprs.push(expr.slice(start, i).trim());\n operators.push('and');\n start = i + 5;\n i += 4;\n continue;\n }\n if (expr.slice(i, i + 4) === ' or ') {\n conditionExprs.push(expr.slice(start, i).trim());\n operators.push('or');\n start = i + 4;\n i += 3;\n continue;\n }\n }\n }\n conditionExprs.push(expr.slice(start).trim());\n return { conditionExprs, operators };\n}\n\nfunction unescapeNunjucksString(s: string): string {\n return s.replaceAll('\\\\\\\\', '\\\\').replaceAll(String.raw`\\'`, \"'\");\n}\n\nconst SIMPLE_DATA_POINT_PATH = String.raw`[\\w.]+`;\nconst FORM_RUNTIME_DATA_POINT_PATH = String.raw`__submission_fields\\[\"\\d+\"\\]\\[\"[A-Za-z0-9]+\"\\]`;\nconst DATA_POINT_PATH = String.raw`(${SIMPLE_DATA_POINT_PATH}|${FORM_RUNTIME_DATA_POINT_PATH})`;\nconst RE_STR_DEFAULT = String.raw`\\(${DATA_POINT_PATH}\\s*\\|\\s*default\\s*\\(\\s*''\\s*\\)\\)`;\nconst RE_NUM_DEFAULT = String.raw`\\(${DATA_POINT_PATH}\\s*\\|\\s*default\\s*\\(\\s*0\\s*\\)\\)`;\nconst QUOTED_CONTENT = String.raw`((?:[^'\\\\]|\\\\.)*)`;\n\nfunction toSingleCondition(\n operator: ConditionOperator,\n dataPointKey: string,\n value: string,\n logicalOp?: LogicalOperator,\n): SingleCondition {\n const normalizedDataPointKey = (() => {\n const parsed = parseFormFieldKey(dataPointKey.trim());\n if (!parsed) {\n return dataPointKey.trim();\n }\n return buildFormFieldKey(parsed.formId, parsed.fieldId);\n })();\n const condition: SingleCondition = {\n dataPointKey: normalizedDataPointKey,\n id: generateId(),\n operator,\n value,\n };\n if (logicalOp) {\n condition.logicalOperator = logicalOp;\n }\n return condition;\n}\n\nfunction parseQuotedValue(s: string): { value: string; rest: string } | null {\n if (!s.startsWith(\"'\")) {\n return null;\n }\n let i = 1;\n let value = '';\n while (i < s.length) {\n if (s[i] === '\\\\' && i + 1 < s.length) {\n value += s[i + 1] === \"'\" ? \"'\" : s[i + 1];\n i += 2;\n continue;\n }\n if (s[i] === \"'\") {\n return { rest: s.slice(i + 1).trim(), value: unescapeNunjucksString(value) };\n }\n value += s[i];\n i++;\n }\n return null;\n}\n\ninterface ParsePattern {\n getValue: (match: RegExpMatchArray) => string | null;\n operator: ConditionOperator;\n pathGroup: number;\n pattern: RegExp;\n}\n\nconst PARSE_PATTERNS: ParsePattern[] = [\n // value-less\n {\n getValue: () => '',\n operator: 'is_empty',\n pathGroup: 1,\n pattern: new RegExp(\n String.raw`^${RE_STR_DEFAULT}\\s*==\\s*''\\s+or\\s+\\(\\(${DATA_POINT_PATH}\\s*\\|\\s*default\\s*\\(\\s*''\\s*\\)\\)\\s*\\|\\s*length\\)\\s*==\\s*0$`,\n ),\n },\n {\n getValue: () => '',\n operator: 'is_not_empty',\n pathGroup: 1,\n pattern: new RegExp(\n String.raw`^${RE_STR_DEFAULT}\\s*!=\\s*''\\s+and\\s+\\(\\(${DATA_POINT_PATH}\\s*\\|\\s*default\\s*\\(\\s*''\\s*\\)\\)\\s*\\|\\s*length\\)\\s*>\\s*0$`,\n ),\n },\n // string with value\n {\n getValue: m => parseQuotedValue(m[2].trim())?.value ?? null,\n operator: 'is_equal_to',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_STR_DEFAULT}\\s*==\\s+(.+)$`),\n },\n {\n getValue: m => parseQuotedValue(m[2].trim())?.value ?? null,\n operator: 'is_not_equal_to',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_STR_DEFAULT}\\s*!=\\s+(.+)$`),\n },\n {\n getValue: m => unescapeNunjucksString(m[1]),\n operator: 'contains',\n pathGroup: 2,\n pattern: new RegExp(String.raw`^'${QUOTED_CONTENT}'\\s+in\\s+${RE_STR_DEFAULT}$`),\n },\n {\n getValue: m => unescapeNunjucksString(m[1]),\n operator: 'does_not_contain',\n pathGroup: 2,\n pattern: new RegExp(\n String.raw`^not\\s*\\(\\s*'${QUOTED_CONTENT}'\\s+in\\s+${RE_STR_DEFAULT}\\s*\\)\\s*$`,\n ),\n },\n {\n getValue: m => parseQuotedValue(m[2].trim())?.value ?? null,\n operator: 'starts_with',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_STR_DEFAULT}\\s*\\|\\s*startswith\\s*\\(\\s*(.+)\\s*\\)\\s*$`),\n },\n {\n getValue: m => parseQuotedValue(m[2].trim())?.value ?? null,\n operator: 'ends_with',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_STR_DEFAULT}\\s*\\|\\s*endswith\\s*\\(\\s*(.+)\\s*\\)\\s*$`),\n },\n // number operators (>= and <= before > and < to avoid partial match)\n {\n getValue: m => m[2].trim(),\n operator: 'num_gte',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_NUM_DEFAULT}\\s*>=\\s*(.+)$`),\n },\n {\n getValue: m => m[2].trim(),\n operator: 'num_lte',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_NUM_DEFAULT}\\s*<=\\s*(.+)$`),\n },\n {\n getValue: m => m[2].trim(),\n operator: 'num_eq',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_NUM_DEFAULT}\\s*==\\s*(.+)$`),\n },\n {\n getValue: m => m[2].trim(),\n operator: 'num_neq',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_NUM_DEFAULT}\\s*!=\\s*(.+)$`),\n },\n {\n getValue: m => m[2].trim(),\n operator: 'num_gt',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_NUM_DEFAULT}\\s*>\\s*(.+)$`),\n },\n {\n getValue: m => m[2].trim(),\n operator: 'num_lt',\n pathGroup: 1,\n pattern: new RegExp(String.raw`^${RE_NUM_DEFAULT}\\s*<\\s*(.+)$`),\n },\n];\n\nfunction parseSingleConditionExpression(\n expr: string,\n logicalOp?: LogicalOperator,\n): SingleCondition | null {\n const trimmed = expr.trim();\n for (const { getValue, operator, pathGroup, pattern } of PARSE_PATTERNS) {\n const match = new RegExp(pattern).exec(trimmed);\n if (!match) {\n continue;\n }\n const value = getValue(match);\n if (value === null) {\n continue;\n }\n return toSingleCondition(operator, match[pathGroup], value, logicalOp);\n }\n return null;\n}\n\n/**\n * Parse a group expression into conditions with per-condition logical operators.\n */\nfunction parseGroupExpression(groupExpr: string): SingleCondition[] | null {\n const { conditionExprs, operators } = tokenizeGroupExpression(groupExpr);\n const conditions: SingleCondition[] = [];\n\n for (let i = 0; i < conditionExprs.length; i++) {\n const cs = conditionExprs[i];\n if (!cs) {\n continue;\n }\n const unwrapped = stripOuterParens(cs);\n const logicalOp = i > 0 ? operators[i - 1] : undefined;\n const single = parseSingleConditionExpression(unwrapped, logicalOp);\n if (single) {\n conditions.push(single);\n }\n }\n\n return conditions.length > 0 ? conditions : null;\n}\n\n/**\n * Parse a saved Unlayer display condition back into modal state for prefilling.\n * Returns null if the condition is missing or cannot be parsed.\n */\nexport function parseUnlayerDisplayCondition(\n condition: UnlayerDisplayCondition | null | undefined,\n): DisplayConditionState | null {\n if (!condition?.before) {\n return null;\n }\n const ifMatch = new RegExp(/\\{%\\s*if\\s+(.+)\\s*%\\}/s).exec(condition.before);\n if (!ifMatch) {\n return null;\n }\n let expr = ifMatch[1].trim();\n\n let behavior: DisplayBehavior = 'show';\n if (expr.startsWith('not (') && expr.endsWith(')')) {\n behavior = 'hide';\n expr = expr.slice(5, -1).trim();\n }\n\n const { conditionExprs: ruleStrings, operators: groupOperators } =\n tokenizeGroupExpression(expr);\n const groups: ConditionGroup[] = [];\n\n for (let i = 0; i < ruleStrings.length; i++) {\n const rs = ruleStrings[i];\n if (!rs) {\n continue;\n }\n const unwrapped = stripOuterParens(rs);\n const conditions = parseGroupExpression(unwrapped);\n if (conditions) {\n const group: ConditionGroup = {\n conditions,\n id: generateId(),\n };\n if (i > 0) {\n group.logicalOperator = groupOperators[i - 1] ?? 'and';\n }\n groups.push(group);\n }\n }\n\n if (groups.length === 0) {\n return null;\n }\n\n return { behavior, groups };\n}\n"],"names":["buildFormFieldKey","parseFormFieldKey","toNunjucksFieldReference","generateId","CONDITION_OPERATORS","VALUE_LESS_OPERATORS","OPERATOR_LABEL_MAP","Map","map","op","value","label","escapeNunjucksString","s","replace","nunjucksValueLiteral","isEscapedAt","index","slashCount","i","isValueLessOperator","operator","includes","buildSingleConditionExpression","dataPointKey","path","defaulted","numDefaulted","normalizedValue","trim","literal","numLiteral","test","inner","buildGroupExpression","group","valid","conditions","filter","c","length","result","joiner","logicalOperator","buildFullConditionExpression","state","validGroups","groups","expression","item","combined","behavior","operatorLabel","get","generateTypeAndLabel","parts","push","summary","slice","join","type","buildUnlayerDisplayCondition","expr","before","after","description","undefined","stripOuterParens","t","startsWith","at","depth","tokenizeGroupExpression","conditionExprs","operators","inSingleQuote","start","Math","max","unescapeNunjucksString","replaceAll","String","raw","SIMPLE_DATA_POINT_PATH","FORM_RUNTIME_DATA_POINT_PATH","DATA_POINT_PATH","RE_STR_DEFAULT","RE_NUM_DEFAULT","QUOTED_CONTENT","toSingleCondition","logicalOp","normalizedDataPointKey","parsed","formId","fieldId","condition","id","parseQuotedValue","rest","PARSE_PATTERNS","getValue","pathGroup","pattern","RegExp","m","parseSingleConditionExpression","trimmed","match","exec","parseGroupExpression","groupExpr","cs","unwrapped","single","parseUnlayerDisplayCondition","ifMatch","endsWith","ruleStrings","groupOperators","rs"],"mappings":"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"}
@@ -119,6 +119,9 @@ export interface DataPointOption {
119
119
  fullKey: string;
120
120
  title: string;
121
121
  }
122
+ export interface FormFieldOption extends DataPointOption {
123
+ formId: number;
124
+ }
122
125
  /** Unlayer display condition shape passed to done() */
123
126
  export interface UnlayerDisplayCondition {
124
127
  type: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/display-conditions/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,CAAC;AAE9C,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,IAAI,CAAC;AAE3C,wCAAwC;AACxC,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;EASnB,CAAC;AAEX,wCAAwC;AACxC,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;EAOnB,CAAC;AAEX,mDAAmD;AACnD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAsD,CAAC;AAEvF,MAAM,MAAM,iBAAiB,GACvB,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAC1C,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC;AAEjD,iEAAiE;AACjE,eAAO,MAAM,oBAAoB,EAAE,iBAAiB,EAAiC,CAAC;AAEtF,MAAM,WAAW,eAAe;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,4FAA4F;IAC5F,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,gFAAgF;IAChF,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,UAAU,EAAE,eAAe,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,qBAAqB;IAClC,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC5B,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,uDAAuD;AACvD,MAAM,WAAW,uBAAuB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACjB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/display-conditions/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,CAAC;AAE9C,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,IAAI,CAAC;AAE3C,wCAAwC;AACxC,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;EASnB,CAAC;AAEX,wCAAwC;AACxC,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;EAOnB,CAAC;AAEX,mDAAmD;AACnD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAsD,CAAC;AAEvF,MAAM,MAAM,iBAAiB,GACvB,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAC1C,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC;AAEjD,iEAAiE;AACjE,eAAO,MAAM,oBAAoB,EAAE,iBAAiB,EAAiC,CAAC;AAEtF,MAAM,WAAW,eAAe;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,4FAA4F;IAC5F,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,gFAAgF;IAChF,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,UAAU,EAAE,eAAe,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,qBAAqB;IAClC,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC5B,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACpD,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,uDAAuD;AACvD,MAAM,WAAW,uBAAuB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACjB"}