@pega/cosmos-react-condition-builder 9.0.0-build.9.9 → 9.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/ConditionBuilder/AtomicCondition.d.ts +4 -0
- package/lib/components/ConditionBuilder/AtomicCondition.d.ts.map +1 -1
- package/lib/components/ConditionBuilder/AtomicCondition.js +10 -11
- package/lib/components/ConditionBuilder/AtomicCondition.js.map +1 -1
- package/lib/components/ConditionBuilder/ConditionBuilder.d.ts +2 -3
- package/lib/components/ConditionBuilder/ConditionBuilder.d.ts.map +1 -1
- package/lib/components/ConditionBuilder/ConditionBuilder.js +79 -40
- package/lib/components/ConditionBuilder/ConditionBuilder.js.map +1 -1
- package/lib/components/ConditionBuilder/ConditionBuilder.styles.d.ts +604 -6
- package/lib/components/ConditionBuilder/ConditionBuilder.styles.d.ts.map +1 -1
- package/lib/components/ConditionBuilder/ConditionBuilder.styles.js +90 -36
- package/lib/components/ConditionBuilder/ConditionBuilder.styles.js.map +1 -1
- package/lib/components/ConditionBuilder/ConditionBuilder.types.d.ts +42 -2
- package/lib/components/ConditionBuilder/ConditionBuilder.types.d.ts.map +1 -1
- package/lib/components/ConditionBuilder/ConditionBuilder.types.js.map +1 -1
- package/lib/components/ConditionBuilder/RhsControls/CSVInput.d.ts +18 -0
- package/lib/components/ConditionBuilder/RhsControls/CSVInput.d.ts.map +1 -0
- package/lib/components/ConditionBuilder/RhsControls/CSVInput.js +59 -0
- package/lib/components/ConditionBuilder/RhsControls/CSVInput.js.map +1 -0
- package/lib/components/ConditionBuilder/RhsControls/NumericInput.d.ts +2 -0
- package/lib/components/ConditionBuilder/RhsControls/NumericInput.d.ts.map +1 -1
- package/lib/components/ConditionBuilder/RhsControls/NumericInput.js +21 -5
- package/lib/components/ConditionBuilder/RhsControls/NumericInput.js.map +1 -1
- package/lib/components/ConditionBuilder/RhsControls/NumericRangeInput.d.ts +31 -0
- package/lib/components/ConditionBuilder/RhsControls/NumericRangeInput.d.ts.map +1 -0
- package/lib/components/ConditionBuilder/RhsControls/NumericRangeInput.js +52 -0
- package/lib/components/ConditionBuilder/RhsControls/NumericRangeInput.js.map +1 -0
- package/lib/components/ConditionBuilder/RhsControls/ValueSelector.d.ts +5 -3
- package/lib/components/ConditionBuilder/RhsControls/ValueSelector.d.ts.map +1 -1
- package/lib/components/ConditionBuilder/RhsControls/ValueSelector.js +28 -22
- package/lib/components/ConditionBuilder/RhsControls/ValueSelector.js.map +1 -1
- package/lib/components/ConditionBuilder/RhsControls/index.d.ts +5 -5
- package/lib/components/ConditionBuilder/RhsControls/index.d.ts.map +1 -1
- package/lib/components/ConditionBuilder/RhsControls/index.js +35 -43
- package/lib/components/ConditionBuilder/RhsControls/index.js.map +1 -1
- package/lib/components/ConditionBuilder/core/comparators.d.ts.map +1 -1
- package/lib/components/ConditionBuilder/core/comparators.js +6 -1
- package/lib/components/ConditionBuilder/core/comparators.js.map +1 -1
- package/lib/components/ConditionBuilder/core/formatter.d.ts.map +1 -1
- package/lib/components/ConditionBuilder/core/formatter.js +51 -4
- package/lib/components/ConditionBuilder/core/formatter.js.map +1 -1
- package/lib/components/ConditionBuilder/core/time-utils.d.ts +1 -1
- package/lib/components/ConditionBuilder/core/time-utils.d.ts.map +1 -1
- package/lib/components/ConditionBuilder/core/time-utils.js +4 -3
- package/lib/components/ConditionBuilder/core/time-utils.js.map +1 -1
- package/lib/components/ConditionBuilder/core/transformer.d.ts +6 -1
- package/lib/components/ConditionBuilder/core/transformer.d.ts.map +1 -1
- package/lib/components/ConditionBuilder/core/transformer.js +104 -84
- package/lib/components/ConditionBuilder/core/transformer.js.map +1 -1
- package/lib/components/ConditionBuilder/core/types.d.ts +4 -1
- package/lib/components/ConditionBuilder/core/types.d.ts.map +1 -1
- package/lib/components/ConditionBuilder/core/types.js.map +1 -1
- package/lib/components/ConditionBuilder/index.d.ts +2 -1
- package/lib/components/ConditionBuilder/index.d.ts.map +1 -1
- package/lib/components/ConditionBuilder/index.js.map +1 -1
- package/lib/components/ConditionInput/ConditionInput.d.ts.map +1 -1
- package/lib/components/ConditionInput/ConditionInput.js +110 -32
- package/lib/components/ConditionInput/ConditionInput.js.map +1 -1
- package/lib/components/ConditionInput/ConditionInput.styles.d.ts +52 -4
- package/lib/components/ConditionInput/ConditionInput.styles.d.ts.map +1 -1
- package/lib/components/ConditionInput/ConditionInput.styles.js +4 -3
- package/lib/components/ConditionInput/ConditionInput.styles.js.map +1 -1
- package/lib/components/ConditionInput/ConditionInput.types.d.ts +4 -0
- package/lib/components/ConditionInput/ConditionInput.types.d.ts.map +1 -1
- package/lib/components/ConditionInput/ConditionInput.types.js.map +1 -1
- package/lib/components/PromotedFilters/ConditionSelector.d.ts +2 -0
- package/lib/components/PromotedFilters/ConditionSelector.d.ts.map +1 -1
- package/lib/components/PromotedFilters/ConditionSelector.js +13 -20
- package/lib/components/PromotedFilters/ConditionSelector.js.map +1 -1
- package/lib/components/PromotedFilters/PromotedFilters.d.ts.map +1 -1
- package/lib/components/PromotedFilters/PromotedFilters.js +36 -25
- package/lib/components/PromotedFilters/PromotedFilters.js.map +1 -1
- package/lib/components/PromotedFilters/PromotedFilters.styles.d.ts +191 -3
- package/lib/components/PromotedFilters/PromotedFilters.styles.d.ts.map +1 -1
- package/lib/components/PromotedFilters/PromotedFilters.styles.js +13 -5
- package/lib/components/PromotedFilters/PromotedFilters.styles.js.map +1 -1
- package/lib/components/PromotedFilters/PromotedFilters.types.d.ts +4 -0
- package/lib/components/PromotedFilters/PromotedFilters.types.d.ts.map +1 -1
- package/lib/components/PromotedFilters/PromotedFilters.types.js.map +1 -1
- package/package.json +4 -5
|
@@ -15,6 +15,8 @@ export declare function isValidCondition(condition: LeafCondition, fields: Field
|
|
|
15
15
|
export interface AtomicConditionProps extends BaseProps {
|
|
16
16
|
/** Condition to use in the component */
|
|
17
17
|
condition: LeafCondition;
|
|
18
|
+
/** (Optional) Index of the condition. Used when rendering multiple conditions */
|
|
19
|
+
index?: number;
|
|
18
20
|
/** Metadata (data-model) for the Fields to use in the Condition */
|
|
19
21
|
fields: Field[];
|
|
20
22
|
/** Used to enable inline error indicators on invalid inputs */
|
|
@@ -46,6 +48,8 @@ export interface AtomicConditionProps extends BaseProps {
|
|
|
46
48
|
validRhsTypes?: Set<RHSType>;
|
|
47
49
|
/** (Optional) When enabling 'DATE_FUNCTION's via `validRhsTypes`, pass this to specify which all date functions are applicable per field type */
|
|
48
50
|
dateFunctions?: DateFunctionsByType;
|
|
51
|
+
/** (Optional) IANA timezone string used to initialize date/time pickers with the operator's timezone */
|
|
52
|
+
timeZone?: string;
|
|
49
53
|
/** Ref forwarded to the wrapping element. */
|
|
50
54
|
ref?: Ref<HTMLDivElement>;
|
|
51
55
|
/** Imperative handle */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AtomicCondition.d.ts","sourceRoot":"","sources":["../../../src/components/ConditionBuilder/AtomicCondition.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAe,GAAG,EAAmB,MAAM,OAAO,CAAC;AAY/D,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,+BAA+B,EAChC,MAAM,yBAAyB,CAAC;AAGjC,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAI1F,OAAO,KAAK,EAAc,iBAAiB,EAAa,OAAO,EAAE,MAAM,cAAc,CAAC;AAoDtF,oEAAoE;AACpE,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,EACzB,MAAM,EAAE,KAAK,EAAE,EACf,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,EAC3B,gBAAgB,CAAC,EAAE,iBAAiB,EAAE,EACtC,aAAa,CAAC,EAAE,mBAAmB,GAClC,aAAa,CAcf;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,aAAa,EACxB,MAAM,EAAE,KAAK,EAAE,EACf,UAAU,GAAE,OAAe,GAC1B,OAAO,CAST;AAED,6DAA6D;AAC7D,MAAM,WAAW,oBAAqB,SAAQ,SAAS;IACrD,wCAAwC;IACxC,SAAS,EAAE,aAAa,CAAC;IAEzB,mEAAmE;IACnE,MAAM,EAAE,KAAK,EAAE,CAAC;IAEhB,+DAA+D;IAC/D,cAAc,EAAE,OAAO,CAAC;IAExB,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAEvC,sDAAsD;IACtD,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAEnE,iDAAiD;IACjD,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IAEhD,6CAA6C;IAC7C,aAAa,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAEjC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;IAEvC;;;;;;;;;;OAUG;IACH,aAAa,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAE7B,iJAAiJ;IACjJ,aAAa,CAAC,EAAE,mBAAmB,CAAC;IAEpC,6CAA6C;IAC7C,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1B,wBAAwB;IACxB,MAAM,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;CAC3B;AAED,mDAAmD;AACnD,QAAA,MAAM,eAAe,EAAE,+BAA+B,CAAC,oBAAoB,CAwL1E,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"AtomicCondition.d.ts","sourceRoot":"","sources":["../../../src/components/ConditionBuilder/AtomicCondition.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAe,GAAG,EAAmB,MAAM,OAAO,CAAC;AAY/D,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,+BAA+B,EAChC,MAAM,yBAAyB,CAAC;AAGjC,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAI1F,OAAO,KAAK,EAAc,iBAAiB,EAAa,OAAO,EAAE,MAAM,cAAc,CAAC;AAoDtF,oEAAoE;AACpE,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,EACzB,MAAM,EAAE,KAAK,EAAE,EACf,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,EAC3B,gBAAgB,CAAC,EAAE,iBAAiB,EAAE,EACtC,aAAa,CAAC,EAAE,mBAAmB,GAClC,aAAa,CAcf;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,aAAa,EACxB,MAAM,EAAE,KAAK,EAAE,EACf,UAAU,GAAE,OAAe,GAC1B,OAAO,CAST;AAED,6DAA6D;AAC7D,MAAM,WAAW,oBAAqB,SAAQ,SAAS;IACrD,wCAAwC;IACxC,SAAS,EAAE,aAAa,CAAC;IAEzB,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,mEAAmE;IACnE,MAAM,EAAE,KAAK,EAAE,CAAC;IAEhB,+DAA+D;IAC/D,cAAc,EAAE,OAAO,CAAC;IAExB,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAEvC,sDAAsD;IACtD,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAEnE,iDAAiD;IACjD,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IAEhD,6CAA6C;IAC7C,aAAa,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAEjC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;IAEvC;;;;;;;;;;OAUG;IACH,aAAa,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAE7B,iJAAiJ;IACjJ,aAAa,CAAC,EAAE,mBAAmB,CAAC;IAEpC,wGAAwG;IACxG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,6CAA6C;IAC7C,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1B,wBAAwB;IACxB,MAAM,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;CAC3B;AAED,mDAAmD;AACnD,QAAA,MAAM,eAAe,EAAE,+BAA+B,CAAC,oBAAoB,CAwL1E,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
|
@@ -82,7 +82,7 @@ export function isValidCondition(condition, fields, trimValues = false) {
|
|
|
82
82
|
return isValidRhs(condition.rhs, condition.lhs, fields, fieldType, trimValues);
|
|
83
83
|
}
|
|
84
84
|
/** A controlled component for Atomic Conditions */
|
|
85
|
-
const AtomicCondition = forwardRef(function AtomicCondition({ condition, fields, indicateErrors, validComparators, onChange, onBlur, itemDirection, lhsMode = 'input', validRhsTypes = new Set(['LITERAL', 'FIELD']), dateFunctions, handle, ...restProps }, ref) {
|
|
85
|
+
const AtomicCondition = forwardRef(function AtomicCondition({ condition, fields, indicateErrors, validComparators, onChange, onBlur, itemDirection, lhsMode = 'input', validRhsTypes = new Set(['LITERAL', 'FIELD']), dateFunctions, timeZone, handle, ...restProps }, ref) {
|
|
86
86
|
const t = useI18n();
|
|
87
87
|
// stores condition form state
|
|
88
88
|
const [state, setState] = useState(condition);
|
|
@@ -150,21 +150,20 @@ const AtomicCondition = forwardRef(function AtomicCondition({ condition, fields,
|
|
|
150
150
|
clear
|
|
151
151
|
}), [clear]);
|
|
152
152
|
const lhsLabel = getFieldLabel(condition.lhs.field, fields);
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
}, container: {
|
|
153
|
+
const gridCols = (() => {
|
|
154
|
+
if (itemDirection === 'column')
|
|
155
|
+
return 'minmax(0, 1fr)';
|
|
156
|
+
if (lhsMode !== 'input')
|
|
157
|
+
return '20ch minmax(0, 1fr)';
|
|
158
|
+
return '20ch 20ch minmax(0, 1fr)';
|
|
159
|
+
})();
|
|
160
|
+
return (_jsx(StyledAtomicCondition, { ...restProps, name: lhsMode === 'label' ? lhsLabel : undefined, "aria-label": lhsMode === 'hidden' ? lhsLabel : undefined, children: _jsxs(Grid, { md: { container: { cols: gridCols } }, container: {
|
|
162
161
|
justifyItems: 'stretch',
|
|
163
162
|
colGap: 0.5,
|
|
164
163
|
rowGap: 0.5
|
|
165
164
|
}, ref: containerRef, children: [lhsMode === 'input' && (_jsx(FieldSelector, { value: state.lhs.field, onChange: handleFieldChange, fields: fields, status: indicateErrors && state.lhs.field === '' ? 'error' : undefined, info: indicateErrors && state.lhs.field === ''
|
|
166
165
|
? t('condition_builder_condition_select_info_default')
|
|
167
|
-
: undefined })), _jsx(Select, { value: state.comparator, onChange: handleComparatorChange, name: 'comparator', label: t('condition_builder_comparator_label'), children: comparatorOptions.map(option => (_jsx(Option, { value: option.id, children: option.label }, option.id))) }), _jsx(RhsControls, { lhs: state.lhs, comparator: state.comparator, rhs: state.rhs, fields: fields, onChange: handleRHSChange, indicateErrors: indicateErrors, validRhsTypes: validRhsTypes, dateFunctions: dateFunctions, itemDirection: itemDirection || 'row', handle: rhsHandle })] }) }));
|
|
166
|
+
: undefined })), _jsx(Select, { value: state.comparator, onChange: handleComparatorChange, name: 'comparator', label: t('condition_builder_comparator_label'), children: comparatorOptions.map(option => (_jsx(Option, { value: option.id, children: option.label }, option.id))) }), _jsx(RhsControls, { lhs: state.lhs, comparator: state.comparator, rhs: state.rhs, fields: fields, onChange: handleRHSChange, indicateErrors: indicateErrors, validRhsTypes: validRhsTypes, dateFunctions: dateFunctions, itemDirection: itemDirection || 'row', handle: rhsHandle, timeZone: timeZone })] }) }));
|
|
168
167
|
});
|
|
169
168
|
export default AtomicCondition;
|
|
170
169
|
//# sourceMappingURL=AtomicCondition.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AtomicCondition.js","sourceRoot":"","sources":["../../../src/components/ConditionBuilder/AtomicCondition.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAG1E,OAAO,EACL,IAAI,EACJ,MAAM,EACN,MAAM,EACN,OAAO,EACP,OAAO,EACP,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACtB,MAAM,yBAAyB,CAAC;AAOjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,aAAa,MAAM,6BAA6B,CAAC;AACxD,OAAO,WAAW,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,oBAAoB,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,4CAA4C;AAC5C,SAAS,YAAY,CAAC,SAAiB,EAAE,MAAe;IACtD,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACjD,OAAO,aAAa,IAAI,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1F,CAAC;AAED,+CAA+C;AAC/C,SAAS,aAAa,CAAC,SAAiB,EAAE,MAAe;IACvD,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACjD,OAAO,aAAa,EAAE,OAAO,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,SAAS,uBAAuB,CAAC,GAAyB,EAAE,UAAsB;IAChF,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,CAAC,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC;IAED,oCAAoC;IACpC,OAAO;QACL,IAAI;QACJ,KAAK;QACL,IAAI;QACJ,KAAK;QACL,IAAI;QACJ,KAAK;QACL,aAAa;QACb,iBAAiB;QACjB,WAAW;QACX,eAAe;QACf,UAAU;QACV,cAAc;KACf,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AACzB,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,sBAAsB,CACpC,GAAyB,EACzB,MAAe,EACf,aAA2B,EAC3B,gBAAsC,EACtC,aAAmC;IAEnC,IAAI,UAAsB,CAAC;IAC3B,IAAI,GAAyB,CAAC;IAC9B,IAAI,GAAG,CAAC,KAAK,KAAK,EAAE,EAAE,CAAC;QACrB,wFAAwF;QACxF,UAAU,GAAG,aAAa,CAAC;QAC3B,GAAG,GAAG,SAAS,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAc,CAAC;QAClE,UAAU,GAAG,oBAAoB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,kEAAkE;QAC3I,GAAG,GAAG,aAAa,CAAC,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;AAClC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAAwB,EACxB,MAAe,EACf,aAAsB,KAAK;IAE3B,yCAAyC;IACzC,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,8DAA8D;IAC9D,wFAAwF;IACxF,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC5D,OAAO,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AACjF,CAAC;AAqDD,mDAAmD;AACnD,MAAM,eAAe,GAA0D,UAAU,CACvF,SAAS,eAAe,CACtB,EACE,SAAS,EACT,MAAM,EACN,cAAc,EACd,gBAAgB,EAChB,QAAQ,EACR,MAAM,EACN,aAAa,EACb,OAAO,GAAG,OAAO,EACjB,aAAa,GAAG,IAAI,GAAG,CAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,EACtD,aAAa,EACb,MAAM,EACN,GAAG,SAAS,EAC0B,EACxC,GAAgC;IAEhC,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IAEpB,8BAA8B;IAC9B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,SAAS,CAAC,CAAC;IAC7D,wFAAwF;IACxF,sFAAsF;IACtF,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAEvC,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,yDAAyD;IACtH,MAAM,iBAAiB,GAAG,SAAS;QACjC,CAAC,CAAC,oBAAoB,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC/D,GAAG,MAAM;YACT,KAAK,EAAE,CAAC,CAAC,gCAAgC,MAAM,CAAC,KAAK,EAAE,CAAC;SACzD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,sCAAsC,CAAC,EAAE,CAAC,CAAC;IAEnE,qBAAqB,CAAC,GAAG,EAAE;QACzB,QAAQ,CAAC,SAAS,CAAC,CAAC;IACtB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,MAAM,aAAa,GAAG,CAAC,OAAgB,EAAE,EAAE;QACzC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,sDAAsD;YACtD,MAAM,EAAE,CACN,YAAY,CAAC,OAAO,IAAI,gBAAgB,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC;gBAC1E,CAAC,CAAC,YAAY,CAAC,OAAO;gBACtB,CAAC,CAAC,SAAS,CACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC7C,cAAc,CAAC,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC,CAAC;IAE9C,0BAA0B;IAC1B,MAAM,qBAAqB,GAAG,CAAC,gBAA+B,EAAE,MAAgB,EAAE,EAAE;QAClF,YAAY,CAAC,OAAO,GAAG,gBAAgB,CAAC;QACxC,kHAAkH;QAClH,QAAQ,EAAE,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC,CAAC;IAEF,sCAAsC;IACtC,MAAM,iBAAiB,GAAG,CAAC,EAAU,EAAE,EAAE;QACvC,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QAC1B,MAAM,aAAa,GAAG,sBAAsB,CAC1C,GAAG,EACH,MAAM,EACN,aAAa,EACb,gBAAgB,EAChB,aAAa,CACd,CAAC,CAAC,+CAA+C;QAClD,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACvC,CAAC,CAAC;IAEF,kCAAkC;IAClC,MAAM,sBAAsB,GAAG,CAAC,CAAiC,EAAE,EAAE;QACnE,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE,EAAE,CAAC;YAC1B,OAAO,CAAC,kGAAkG;QAC5G,CAAC;QACD,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,KAAmB,CAAC;QAChD,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG;YAChC,CAAC,CAAE,EAAE,GAAG,SAAS,CAAC,GAAG,EAA2B,CAAC,2EAA2E;YAC5H,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,GAAG,GAAG,uBAAuB,CAAC,YAAY,EAAE,UAAU,CAAC;YAC3D,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,aAAa,CAAC,SAAsB,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;QAEpF,qBAAqB,CAAC,EAAE,GAAG,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC;IAEF,2BAA2B;IAC3B,MAAM,eAAe,GAAG,CAAC,GAAyB,EAAE,MAAgB,EAAE,EAAE;QACtE,qBAAqB,CAAC,EAAE,GAAG,SAAS,EAAE,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,MAAM,CAAc,IAAI,CAAC,CAAC;IAE5C,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAC3B,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YACzB,qBAAqB,CACnB,sBAAsB,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAC1F,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;IAEF,mBAAmB,CACjB,MAAM,EACN,GAAG,EAAE,CAAC,CAAC;QACL,KAAK;KACN,CAAC,EACF,CAAC,KAAK,CAAC,CACR,CAAC;IAEF,MAAM,QAAQ,GAAG,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAE5D,OAAO;IACL,mFAAmF;IACnF,KAAC,qBAAqB,OAChB,SAAS,EACb,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,gBACpC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,YAEvD,MAAC,IAAI,IACH,EAAE,EAAE;gBACF,SAAS,EAAE;oBACT,IAAI,EACF,aAAa,KAAK,QAAQ;wBACxB,CAAC,CAAC,gBAAgB;wBAClB,CAAC,CAAC,UAAU,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB;iBAC9D;aACF,EACD,SAAS,EAAE;gBACT,YAAY,EAAE,SAAS;gBACvB,MAAM,EAAE,GAAG;gBACX,MAAM,EAAE,GAAG;aACZ,EACD,GAAG,EAAE,YAAY,aAGhB,OAAO,KAAK,OAAO,IAAI,CACtB,KAAC,aAAa,IACZ,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EACtB,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,cAAc,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EACtE,IAAI,EACF,cAAc,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE;wBACtC,CAAC,CAAC,CAAC,CAAC,iDAAiD,CAAC;wBACtD,CAAC,CAAC,SAAS,GAEf,CACH,EAGD,KAAC,MAAM,IACL,KAAK,EAAE,KAAK,CAAC,UAAU,EACvB,QAAQ,EAAE,sBAAsB,EAChC,IAAI,EAAC,YAAY,EACjB,KAAK,EAAE,CAAC,CAAC,oCAAoC,CAAC,YAE7C,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAC/B,KAAC,MAAM,IAAiB,KAAK,EAAE,MAAM,CAAC,EAAE,YACrC,MAAM,CAAC,KAAK,IADF,MAAM,CAAC,EAAE,CAEb,CACV,CAAC,GACK,EAGT,KAAC,WAAW,IACV,GAAG,EAAE,KAAK,CAAC,GAAG,EACd,UAAU,EAAE,KAAK,CAAC,UAAU,EAC5B,GAAG,EAAE,KAAK,CAAC,GAAG,EACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,eAAe,EACzB,cAAc,EAAE,cAAc,EAC9B,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa,IAAI,KAAK,EACrC,MAAM,EAAE,SAAS,GACjB,IACG,GACe,CACzB,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,eAAe,eAAe,CAAC","sourcesContent":["import { forwardRef, useRef, useState, useImperativeHandle } from 'react';\nimport type { ChangeEvent, Ref, PropsWithoutRef } from 'react';\n\nimport {\n Grid,\n Select,\n Option,\n useI18n,\n hasProp,\n useConsolidatedRef,\n useFocusWithin,\n useAfterInitialEffect\n} from '@pega/cosmos-react-core';\nimport type {\n BaseProps,\n HandleValue,\n ForwardRefForwardPropsComponent\n} from '@pega/cosmos-react-core';\n\nimport { getItem } from './core/utils';\nimport type { LeafCondition, Field, DateFunctionsByType } from './ConditionBuilder.types';\nimport FieldSelector from './RhsControls/FieldSelector';\nimport RhsControls, { getDefaultRhs, isValidRhs } from './RhsControls';\nimport getComparatorOptions from './core/comparators';\nimport type { Comparator, ComparatorsByType, FieldType, RHSType } from './core/types';\nimport { StyledAtomicCondition } from './ConditionBuilder.styles';\n\n// Returns field-type for a given field-name\nfunction getFieldType(fieldName: string, fields: Field[]): FieldType | undefined {\n const matchingField = getItem(fields, fieldName);\n return matchingField && hasProp(matchingField, 'type') ? matchingField.type : undefined;\n}\n\n// Returns display label for a given field-name\nfunction getFieldLabel(fieldName: string, fields: Field[]): string | undefined {\n const matchingField = getItem(fields, fieldName);\n return matchingField?.primary;\n}\n\n/**\n * Upon changing the comparator, checks if the old RHS is valid for the new comparator\n * NOTE: This works under the assumption that the LHS doesn't change\n */\nfunction isRhsValidForComparator(rhs: LeafCondition['rhs'], comparator: Comparator): boolean {\n if (rhs === undefined) {\n return ['IS_NULL', 'IS_NOT_NULL', 'IS_TRUE', 'IS_FALSE'].includes(comparator);\n }\n if (hasProp(rhs, 'values')) {\n return ['IN', 'NOT_IN'].includes(comparator);\n }\n\n if (hasProp(rhs, 'parameterId')) {\n return ['EQ', 'NEQ'].includes(comparator);\n }\n\n if (hasProp(rhs, 'start')) {\n return ['BTW', 'NOT_BTW'].includes(comparator);\n }\n\n // `rhs.field` and `rhs.value` cases\n return [\n 'EQ',\n 'NEQ',\n 'GT',\n 'GTE',\n 'LT',\n 'LTE',\n 'STARTS_WITH',\n 'NOT_STARTS_WITH',\n 'ENDS_WITH',\n 'NOT_ENDS_WITH',\n 'CONTAINS',\n 'NOT_CONTAINS'\n ].includes(comparator);\n}\n\n/** Determines the default condition object for a given LHS value */\nexport function getInitConditionForLhs(\n lhs: LeafCondition['lhs'],\n fields: Field[],\n validRhsTypes: Set<RHSType>,\n validComparators?: ComparatorsByType[],\n dateFunctions?: DateFunctionsByType\n): LeafCondition {\n let comparator: Comparator;\n let rhs: LeafCondition['rhs'];\n if (lhs.field === '') {\n // If the empty option is selected, reset the comparator and rhs to their default values\n comparator = 'IS_NOT_NULL';\n rhs = undefined;\n } else {\n const newFieldType = getFieldType(lhs.field, fields) as FieldType;\n comparator = getComparatorOptions(newFieldType, validComparators)[0].id; // Find the applicable comparators and select the first among them\n rhs = getDefaultRhs(newFieldType, comparator, validRhsTypes, dateFunctions);\n }\n\n return { lhs, comparator, rhs };\n}\n\n/**\n * Verifies if all the values in the condition are valid.\n * NOTES:\n * - This is intended to be used only on conditions emitted by the components in this package.\n * - If a condition is manually constructed outside these components, this utility could miss some malformed conditions.\n */\nexport function isValidCondition(\n condition: LeafCondition,\n fields: Field[],\n trimValues: boolean = false\n): boolean {\n // If no field is yet selected on the LHS\n if (condition.lhs.field === '') {\n return false;\n }\n // If a field is present on the LHS, check if the RHS is valid\n // No need to check the comparator since the comparator is always assigned a valid value\n const fieldType = getFieldType(condition.lhs.field, fields);\n return isValidRhs(condition.rhs, condition.lhs, fields, fieldType, trimValues);\n}\n\n/** Type definition for the input props of AtomicCondition */\nexport interface AtomicConditionProps extends BaseProps {\n /** Condition to use in the component */\n condition: LeafCondition;\n\n /** Metadata (data-model) for the Fields to use in the Condition */\n fields: Field[];\n\n /** Used to enable inline error indicators on invalid inputs */\n indicateErrors: boolean;\n\n /** (Optional) Lookup used to limit the Comparators allowed in the Condition. */\n validComparators?: ComparatorsByType[];\n\n /** Callback for any modifications to the Condition */\n onChange?: (newCondition: LeafCondition, status?: 'error') => void;\n\n /** Callback fired when the condition changes. */\n onBlur?: (newCondition?: LeafCondition) => void;\n\n /** Item flow direction. Defaults to 'row' */\n itemDirection?: 'row' | 'column';\n\n /**\n * Allows presenting the LHS as a readonly text, input or hidden. Defaults presenting as 'input'.\n * NOTE: Make sure that a valid LHS is passed in the 'condition'\n */\n lhsMode?: 'input' | 'label' | 'hidden';\n\n /** Restricts RHS values to only specified types of values.\n * DEFAULT: Set(['LITERAL', 'FIELD']).\n * WARNING: There are LHS/Comparator pairings that require specific RHS types. Please be mindful of\n * these incompatibilities when limiting RHS value types using this prop. We do not support\n * limiting RHS field types to incompatible types and it will result in a validation error\n * if you do so. The pairings referred to here are as follows:\n * - BOOLEAN LHS Fields coupled with \"EQ\" or \"NEQ\" comparators, will always yield a Field RHS\n * - Any LHS Fields coupled with \"IN\" or \"NOT_IN\" comparators, will always yield a Literal RHS (Comma separated list)\n * If you would like to limit RHS value types and avoid these incompatibilities, you will need to exclude these\n * comparators using the validComparators prop.\n */\n validRhsTypes?: Set<RHSType>;\n\n /** (Optional) When enabling 'DATE_FUNCTION's via `validRhsTypes`, pass this to specify which all date functions are applicable per field type */\n dateFunctions?: DateFunctionsByType;\n\n /** Ref forwarded to the wrapping element. */\n ref?: Ref<HTMLDivElement>;\n /** Imperative handle */\n handle?: Ref<HandleValue>;\n}\n\n/** A controlled component for Atomic Conditions */\nconst AtomicCondition: ForwardRefForwardPropsComponent<AtomicConditionProps> = forwardRef(\n function AtomicCondition(\n {\n condition,\n fields,\n indicateErrors,\n validComparators,\n onChange,\n onBlur,\n itemDirection,\n lhsMode = 'input',\n validRhsTypes = new Set<RHSType>(['LITERAL', 'FIELD']),\n dateFunctions,\n handle,\n ...restProps\n }: PropsWithoutRef<AtomicConditionProps>,\n ref: AtomicConditionProps['ref']\n ) {\n const t = useI18n();\n\n // stores condition form state\n const [state, setState] = useState<LeafCondition>(condition);\n // ref needed to handle use case of onChange and onBlur being triggered at the same time\n // state is not updated by the time blur is invoked, ref is always set to newest value\n const newCondition = useRef(condition);\n\n const fieldType = getFieldType(condition.lhs.field, fields); // Can be `undefined` if no match or if no previous field\n const comparatorOptions = fieldType\n ? getComparatorOptions(fieldType, validComparators).map(option => ({\n ...option,\n label: t(`condition_builder_comparator_${option.label}`)\n }))\n : [{ id: '', label: t('condition_builder_select_placeholder') }];\n\n useAfterInitialEffect(() => {\n setState(condition);\n }, [condition]);\n\n const onFocusChange = (focused: boolean) => {\n if (!focused) {\n // newCondition is returned, as it stores newest value\n onBlur?.(\n newCondition.current && isValidCondition(newCondition.current, fields, true)\n ? newCondition.current\n : undefined\n );\n }\n };\n\n const containerRef = useConsolidatedRef(ref);\n useFocusWithin([containerRef], onFocusChange);\n\n // Handle condition update\n const handleConditionChange = (updatedCondition: LeafCondition, status?: 'error') => {\n newCondition.current = updatedCondition;\n // new condition is returned with status to allow recognizing errors and avoiding clearing wrong values from input\n onChange?.(updatedCondition, status);\n };\n\n // Handle change in the field-selector\n const handleFieldChange = (id: string) => {\n const lhs = { field: id };\n const initCondition = getInitConditionForLhs(\n lhs,\n fields,\n validRhsTypes,\n validComparators,\n dateFunctions\n ); // Determine comparator and rhs for the new lhs\n handleConditionChange(initCondition);\n };\n\n // Handle change in the comparator\n const handleComparatorChange = (e: ChangeEvent<HTMLSelectElement>) => {\n if (e.target.value === '') {\n return; // The option is shown only when an lhs is not yet selected. Ignore this selection for those cases\n }\n const comparator = e.target.value as Comparator;\n const conditionRhs = condition.rhs\n ? ({ ...condition.rhs } as LeafCondition['rhs']) // Duplicating rhs to avoid using source object as it can be mutated later.\n : undefined;\n\n const rhs = isRhsValidForComparator(conditionRhs, comparator)\n ? conditionRhs\n : getDefaultRhs(fieldType as FieldType, comparator, validRhsTypes, dateFunctions);\n\n handleConditionChange({ ...condition, comparator, rhs });\n };\n\n // Handle change in the RHS\n const handleRHSChange = (rhs: LeafCondition['rhs'], status?: 'error') => {\n handleConditionChange({ ...condition, rhs }, status);\n };\n\n const rhsHandle = useRef<HandleValue>(null);\n\n const clear = () => {\n rhsHandle.current?.clear();\n if (newCondition.current) {\n handleConditionChange(\n getInitConditionForLhs(state.lhs, fields, validRhsTypes, validComparators, dateFunctions)\n );\n }\n };\n\n useImperativeHandle(\n handle,\n () => ({\n clear\n }),\n [clear]\n );\n\n const lhsLabel = getFieldLabel(condition.lhs.field, fields);\n\n return (\n // Using minmax() to get equal widths: https://stackoverflow.com/a/61240964/4247448\n <StyledAtomicCondition\n {...restProps}\n name={lhsMode === 'label' ? lhsLabel : undefined}\n aria-label={lhsMode === 'hidden' ? lhsLabel : undefined}\n >\n <Grid\n sm={{\n container: {\n cols:\n itemDirection === 'column'\n ? 'minmax(0, 1fr)'\n : `repeat(${lhsMode !== 'input' ? 2 : 3}, minmax(0,1fr))`\n }\n }}\n container={{\n justifyItems: 'stretch',\n colGap: 0.5,\n rowGap: 0.5\n }}\n ref={containerRef}\n >\n {/* LHS selector */}\n {lhsMode === 'input' && (\n <FieldSelector\n value={state.lhs.field}\n onChange={handleFieldChange}\n fields={fields}\n status={indicateErrors && state.lhs.field === '' ? 'error' : undefined}\n info={\n indicateErrors && state.lhs.field === ''\n ? t('condition_builder_condition_select_info_default')\n : undefined\n }\n />\n )}\n\n {/* Comparator selector */}\n <Select\n value={state.comparator}\n onChange={handleComparatorChange}\n name='comparator'\n label={t('condition_builder_comparator_label')}\n >\n {comparatorOptions.map(option => (\n <Option key={option.id} value={option.id}>\n {option.label}\n </Option>\n ))}\n </Select>\n\n {/* RHS controls */}\n <RhsControls\n lhs={state.lhs}\n comparator={state.comparator}\n rhs={state.rhs}\n fields={fields}\n onChange={handleRHSChange}\n indicateErrors={indicateErrors}\n validRhsTypes={validRhsTypes}\n dateFunctions={dateFunctions}\n itemDirection={itemDirection || 'row'}\n handle={rhsHandle}\n />\n </Grid>\n </StyledAtomicCondition>\n );\n }\n);\n\nexport default AtomicCondition;\n"]}
|
|
1
|
+
{"version":3,"file":"AtomicCondition.js","sourceRoot":"","sources":["../../../src/components/ConditionBuilder/AtomicCondition.tsx"],"names":[],"mappings":"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","sourcesContent":["import { forwardRef, useRef, useState, useImperativeHandle } from 'react';\nimport type { ChangeEvent, Ref, PropsWithoutRef } from 'react';\n\nimport {\n Grid,\n Select,\n Option,\n useI18n,\n hasProp,\n useConsolidatedRef,\n useFocusWithin,\n useAfterInitialEffect\n} from '@pega/cosmos-react-core';\nimport type {\n BaseProps,\n HandleValue,\n ForwardRefForwardPropsComponent\n} from '@pega/cosmos-react-core';\n\nimport { getItem } from './core/utils';\nimport type { LeafCondition, Field, DateFunctionsByType } from './ConditionBuilder.types';\nimport FieldSelector from './RhsControls/FieldSelector';\nimport RhsControls, { getDefaultRhs, isValidRhs } from './RhsControls';\nimport getComparatorOptions from './core/comparators';\nimport type { Comparator, ComparatorsByType, FieldType, RHSType } from './core/types';\nimport { StyledAtomicCondition } from './ConditionBuilder.styles';\n\n// Returns field-type for a given field-name\nfunction getFieldType(fieldName: string, fields: Field[]): FieldType | undefined {\n const matchingField = getItem(fields, fieldName);\n return matchingField && hasProp(matchingField, 'type') ? matchingField.type : undefined;\n}\n\n// Returns display label for a given field-name\nfunction getFieldLabel(fieldName: string, fields: Field[]): string | undefined {\n const matchingField = getItem(fields, fieldName);\n return matchingField?.primary;\n}\n\n/**\n * Upon changing the comparator, checks if the old RHS is valid for the new comparator\n * NOTE: This works under the assumption that the LHS doesn't change\n */\nfunction isRhsValidForComparator(rhs: LeafCondition['rhs'], comparator: Comparator): boolean {\n if (rhs === undefined) {\n return ['IS_NULL', 'IS_NOT_NULL', 'IS_TRUE', 'IS_FALSE'].includes(comparator);\n }\n if (hasProp(rhs, 'values')) {\n return ['IN', 'NOT_IN'].includes(comparator);\n }\n\n if (hasProp(rhs, 'parameterId')) {\n return ['EQ', 'NEQ'].includes(comparator);\n }\n\n if (hasProp(rhs, 'start')) {\n return ['BTW', 'NOT_BTW'].includes(comparator);\n }\n\n // `rhs.field` and `rhs.value` cases\n return [\n 'EQ',\n 'NEQ',\n 'GT',\n 'GTE',\n 'LT',\n 'LTE',\n 'STARTS_WITH',\n 'NOT_STARTS_WITH',\n 'ENDS_WITH',\n 'NOT_ENDS_WITH',\n 'CONTAINS',\n 'NOT_CONTAINS'\n ].includes(comparator);\n}\n\n/** Determines the default condition object for a given LHS value */\nexport function getInitConditionForLhs(\n lhs: LeafCondition['lhs'],\n fields: Field[],\n validRhsTypes: Set<RHSType>,\n validComparators?: ComparatorsByType[],\n dateFunctions?: DateFunctionsByType\n): LeafCondition {\n let comparator: Comparator;\n let rhs: LeafCondition['rhs'];\n if (lhs.field === '') {\n // If the empty option is selected, reset the comparator and rhs to their default values\n comparator = 'IS_NOT_NULL';\n rhs = undefined;\n } else {\n const newFieldType = getFieldType(lhs.field, fields) as FieldType;\n comparator = getComparatorOptions(newFieldType, validComparators)[0].id; // Find the applicable comparators and select the first among them\n rhs = getDefaultRhs(newFieldType, comparator, validRhsTypes, dateFunctions);\n }\n\n return { lhs, comparator, rhs };\n}\n\n/**\n * Verifies if all the values in the condition are valid.\n * NOTES:\n * - This is intended to be used only on conditions emitted by the components in this package.\n * - If a condition is manually constructed outside these components, this utility could miss some malformed conditions.\n */\nexport function isValidCondition(\n condition: LeafCondition,\n fields: Field[],\n trimValues: boolean = false\n): boolean {\n // If no field is yet selected on the LHS\n if (condition.lhs.field === '') {\n return false;\n }\n // If a field is present on the LHS, check if the RHS is valid\n // No need to check the comparator since the comparator is always assigned a valid value\n const fieldType = getFieldType(condition.lhs.field, fields);\n return isValidRhs(condition.rhs, condition.lhs, fields, fieldType, trimValues);\n}\n\n/** Type definition for the input props of AtomicCondition */\nexport interface AtomicConditionProps extends BaseProps {\n /** Condition to use in the component */\n condition: LeafCondition;\n\n /** (Optional) Index of the condition. Used when rendering multiple conditions */\n index?: number;\n\n /** Metadata (data-model) for the Fields to use in the Condition */\n fields: Field[];\n\n /** Used to enable inline error indicators on invalid inputs */\n indicateErrors: boolean;\n\n /** (Optional) Lookup used to limit the Comparators allowed in the Condition. */\n validComparators?: ComparatorsByType[];\n\n /** Callback for any modifications to the Condition */\n onChange?: (newCondition: LeafCondition, status?: 'error') => void;\n\n /** Callback fired when the condition changes. */\n onBlur?: (newCondition?: LeafCondition) => void;\n\n /** Item flow direction. Defaults to 'row' */\n itemDirection?: 'row' | 'column';\n\n /**\n * Allows presenting the LHS as a readonly text, input or hidden. Defaults presenting as 'input'.\n * NOTE: Make sure that a valid LHS is passed in the 'condition'\n */\n lhsMode?: 'input' | 'label' | 'hidden';\n\n /** Restricts RHS values to only specified types of values.\n * DEFAULT: Set(['LITERAL', 'FIELD']).\n * WARNING: There are LHS/Comparator pairings that require specific RHS types. Please be mindful of\n * these incompatibilities when limiting RHS value types using this prop. We do not support\n * limiting RHS field types to incompatible types and it will result in a validation error\n * if you do so. The pairings referred to here are as follows:\n * - BOOLEAN LHS Fields coupled with \"EQ\" or \"NEQ\" comparators, will always yield a Field RHS\n * - Any LHS Fields coupled with \"IN\" or \"NOT_IN\" comparators, will always yield a Literal RHS (Comma separated list)\n * If you would like to limit RHS value types and avoid these incompatibilities, you will need to exclude these\n * comparators using the validComparators prop.\n */\n validRhsTypes?: Set<RHSType>;\n\n /** (Optional) When enabling 'DATE_FUNCTION's via `validRhsTypes`, pass this to specify which all date functions are applicable per field type */\n dateFunctions?: DateFunctionsByType;\n\n /** (Optional) IANA timezone string used to initialize date/time pickers with the operator's timezone */\n timeZone?: string;\n\n /** Ref forwarded to the wrapping element. */\n ref?: Ref<HTMLDivElement>;\n /** Imperative handle */\n handle?: Ref<HandleValue>;\n}\n\n/** A controlled component for Atomic Conditions */\nconst AtomicCondition: ForwardRefForwardPropsComponent<AtomicConditionProps> = forwardRef(\n function AtomicCondition(\n {\n condition,\n fields,\n indicateErrors,\n validComparators,\n onChange,\n onBlur,\n itemDirection,\n lhsMode = 'input',\n validRhsTypes = new Set<RHSType>(['LITERAL', 'FIELD']),\n dateFunctions,\n timeZone,\n handle,\n ...restProps\n }: PropsWithoutRef<AtomicConditionProps>,\n ref: AtomicConditionProps['ref']\n ) {\n const t = useI18n();\n\n // stores condition form state\n const [state, setState] = useState<LeafCondition>(condition);\n // ref needed to handle use case of onChange and onBlur being triggered at the same time\n // state is not updated by the time blur is invoked, ref is always set to newest value\n const newCondition = useRef(condition);\n\n const fieldType = getFieldType(condition.lhs.field, fields); // Can be `undefined` if no match or if no previous field\n const comparatorOptions = fieldType\n ? getComparatorOptions(fieldType, validComparators).map(option => ({\n ...option,\n label: t(`condition_builder_comparator_${option.label}`)\n }))\n : [{ id: '', label: t('condition_builder_select_placeholder') }];\n\n useAfterInitialEffect(() => {\n setState(condition);\n }, [condition]);\n\n const onFocusChange = (focused: boolean) => {\n if (!focused) {\n // newCondition is returned, as it stores newest value\n onBlur?.(\n newCondition.current && isValidCondition(newCondition.current, fields, true)\n ? newCondition.current\n : undefined\n );\n }\n };\n\n const containerRef = useConsolidatedRef(ref);\n useFocusWithin([containerRef], onFocusChange);\n\n // Handle condition update\n const handleConditionChange = (updatedCondition: LeafCondition, status?: 'error') => {\n newCondition.current = updatedCondition;\n // new condition is returned with status to allow recognizing errors and avoiding clearing wrong values from input\n onChange?.(updatedCondition, status);\n };\n\n // Handle change in the field-selector\n const handleFieldChange = (id: string) => {\n const lhs = { field: id };\n const initCondition = getInitConditionForLhs(\n lhs,\n fields,\n validRhsTypes,\n validComparators,\n dateFunctions\n ); // Determine comparator and rhs for the new lhs\n handleConditionChange(initCondition);\n };\n\n // Handle change in the comparator\n const handleComparatorChange = (e: ChangeEvent<HTMLSelectElement>) => {\n if (e.target.value === '') {\n return; // The option is shown only when an lhs is not yet selected. Ignore this selection for those cases\n }\n const comparator = e.target.value as Comparator;\n const conditionRhs = condition.rhs\n ? ({ ...condition.rhs } as LeafCondition['rhs']) // Duplicating rhs to avoid using source object as it can be mutated later.\n : undefined;\n\n const rhs = isRhsValidForComparator(conditionRhs, comparator)\n ? conditionRhs\n : getDefaultRhs(fieldType as FieldType, comparator, validRhsTypes, dateFunctions);\n\n handleConditionChange({ ...condition, comparator, rhs });\n };\n\n // Handle change in the RHS\n const handleRHSChange = (rhs: LeafCondition['rhs'], status?: 'error') => {\n handleConditionChange({ ...condition, rhs }, status);\n };\n\n const rhsHandle = useRef<HandleValue>(null);\n\n const clear = () => {\n rhsHandle.current?.clear();\n if (newCondition.current) {\n handleConditionChange(\n getInitConditionForLhs(state.lhs, fields, validRhsTypes, validComparators, dateFunctions)\n );\n }\n };\n\n useImperativeHandle(\n handle,\n () => ({\n clear\n }),\n [clear]\n );\n\n const lhsLabel = getFieldLabel(condition.lhs.field, fields);\n\n const gridCols = (() => {\n if (itemDirection === 'column') return 'minmax(0, 1fr)';\n if (lhsMode !== 'input') return '20ch minmax(0, 1fr)';\n return '20ch 20ch minmax(0, 1fr)';\n })();\n\n return (\n <StyledAtomicCondition\n {...restProps}\n name={lhsMode === 'label' ? lhsLabel : undefined}\n aria-label={lhsMode === 'hidden' ? lhsLabel : undefined}\n >\n <Grid\n md={{ container: { cols: gridCols } }}\n container={{\n justifyItems: 'stretch',\n colGap: 0.5,\n rowGap: 0.5\n }}\n ref={containerRef}\n >\n {/* LHS selector */}\n {lhsMode === 'input' && (\n <FieldSelector\n value={state.lhs.field}\n onChange={handleFieldChange}\n fields={fields}\n status={indicateErrors && state.lhs.field === '' ? 'error' : undefined}\n info={\n indicateErrors && state.lhs.field === ''\n ? t('condition_builder_condition_select_info_default')\n : undefined\n }\n />\n )}\n\n {/* Comparator selector */}\n <Select\n value={state.comparator}\n onChange={handleComparatorChange}\n name='comparator'\n label={t('condition_builder_comparator_label')}\n >\n {comparatorOptions.map(option => (\n <Option key={option.id} value={option.id}>\n {option.label}\n </Option>\n ))}\n </Select>\n\n {/* RHS controls */}\n <RhsControls\n lhs={state.lhs}\n comparator={state.comparator}\n rhs={state.rhs}\n fields={fields}\n onChange={handleRHSChange}\n indicateErrors={indicateErrors}\n validRhsTypes={validRhsTypes}\n dateFunctions={dateFunctions}\n itemDirection={itemDirection || 'row'}\n handle={rhsHandle}\n timeZone={timeZone}\n />\n </Grid>\n </StyledAtomicCondition>\n );\n }\n);\n\nexport default AtomicCondition;\n"]}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { ForwardProps } from '@pega/cosmos-react-core';
|
|
1
|
+
import type { ForwardRefForwardPropsComponent } from '@pega/cosmos-react-core';
|
|
3
2
|
import type ConditionBuilderProps from './ConditionBuilder.types';
|
|
4
|
-
declare const ConditionBuilder:
|
|
3
|
+
declare const ConditionBuilder: ForwardRefForwardPropsComponent<ConditionBuilderProps>;
|
|
5
4
|
export default ConditionBuilder;
|
|
6
5
|
//# sourceMappingURL=ConditionBuilder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConditionBuilder.d.ts","sourceRoot":"","sources":["../../../src/components/ConditionBuilder/ConditionBuilder.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ConditionBuilder.d.ts","sourceRoot":"","sources":["../../../src/components/ConditionBuilder/ConditionBuilder.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAC;AAG/E,OAAO,KAAK,qBAAqB,MAAM,0BAA0B,CAAC;AAgClE,QAAA,MAAM,gBAAgB,EAAE,+BAA+B,CAAC,qBAAqB,CAwc5E,CAAC;AAGF,eAAe,gBAAgB,CAAC"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Fragment, useState, useReducer, useImperativeHandle, useRef, useEffect } from 'react';
|
|
3
|
-
import { Button, Flex, Icon, Input, MenuButton, hasProp, useI18n, getFocusables, useLiveLog, Switch } from '@pega/cosmos-react-core';
|
|
2
|
+
import { Fragment, useState, useReducer, useImperativeHandle, useRef, useEffect, useCallback, forwardRef } from 'react';
|
|
3
|
+
import { Button, Flex, Icon, Input, MenuButton, hasProp, useI18n, getFocusables, useLiveLog, useBreakpoint, useConsolidatedRef, Switch } from '@pega/cosmos-react-core';
|
|
4
4
|
import AtomicCondition, { isValidCondition } from './AtomicCondition';
|
|
5
|
-
import { splitConditionForBuilder, parseLogicString, disambiguateLogic, isBasicModeApplicable, getBasicModeOperators, getLogicFromBasicMode } from './core/utils';
|
|
5
|
+
import { splitConditionForBuilder, parseLogicString, disambiguateLogic, isBasicModeApplicable, getBasicModeOperators, getLogicFromBasicMode, getItem } from './core/utils';
|
|
6
6
|
import rowsReducer, { INSERT_ROW, UPDATE_ROW, REMOVE_ROW } from './core/rows-reducer';
|
|
7
|
-
import { StyledRowWithSeparator, StyledRow, StyledLabel, StyledConditionBuilder } from './ConditionBuilder.styles';
|
|
7
|
+
import { StyledRowWithSeparator, StyledRow, StyledLabel, StyledConditionBuilder, StyledInputLevelItem } from './ConditionBuilder.styles';
|
|
8
8
|
// Default props for the builder
|
|
9
9
|
const defaultProps = {
|
|
10
10
|
condition: {
|
|
@@ -15,23 +15,37 @@ const defaultProps = {
|
|
|
15
15
|
}
|
|
16
16
|
};
|
|
17
17
|
// Component for the builder
|
|
18
|
-
const ConditionBuilder = (props)
|
|
19
|
-
const { fields, condition: seedCondition, validComparators, validRhsTypes = new Set(['LITERAL', 'FIELD']), dateFunctions, disallowNOT, handle } = props;
|
|
18
|
+
const ConditionBuilder = forwardRef(function ConditionBuilder(props, ref) {
|
|
19
|
+
const { fields = [], condition: seedCondition, validComparators = [], validRhsTypes = new Set(['LITERAL', 'FIELD']), dateFunctions = { DATE_TIME: [], DATE_ONLY: [] }, timeZone, disallowNOT, disabled = false, readOnly = false, handle, conditionRenderer: ConditionRenderer = AtomicCondition, onLogicError, onAddRow, onDeleteRow, onConditionChange } = props;
|
|
20
20
|
// Split the condition tree into a logic-string and a list of condition-rows.
|
|
21
21
|
const clonedCondition = JSON.parse(JSON.stringify(seedCondition)); // Cloning to avoid modifying the original
|
|
22
22
|
const { logic: seedLogic, rows: seedRows } = splitConditionForBuilder(clonedCondition);
|
|
23
23
|
// On load, look to use the Basic-mode if the seed-condition is simple enough
|
|
24
|
-
const [isBasicMode,
|
|
24
|
+
const [isBasicMode, setIsBasicMode] = useState(() => isBasicModeApplicable(clonedCondition));
|
|
25
25
|
const [operatorsList, setOperatorsList] = useState(() => getBasicModeOperators(seedLogic)); // Operators-list used in Basic-mode to render dropdowns between the rows. NOTE: When in Advanced-mode, this can contain stale values.
|
|
26
26
|
const [logicString, setLogicString] = useState(seedLogic); // Logic-string used in Advanced-mode. NOTE: When in Basic-mode, this can contain stale values.
|
|
27
27
|
const [cachedLogicString, setCachedLogicString] = useState(seedLogic); // Logic-string used to store the last valid logic-string in Advanced-mode. This is used to restore the logic-string when switching back from Basic-mode to Advanced-mode.
|
|
28
28
|
const [conditionRows, dispatch] = useReducer(rowsReducer, seedRows); // Conditions-rows
|
|
29
29
|
const [logicError, setLogicError] = useState(null); // Used to indicate errors in the logic string
|
|
30
|
-
const [showErrorIndicators,
|
|
30
|
+
const [showErrorIndicators, setShowErrorIndicators] = useState(false); // Used to enable inline error indicators in the condition rows
|
|
31
31
|
const enableShading = isBasicMode && operatorsList.includes('AND') && operatorsList.includes('OR'); // In Basic mode, enable shading to indicate grouping only when both operators are present
|
|
32
32
|
const newOperatorButtonRef = useRef(null);
|
|
33
33
|
const focusRowRef = useRef(null);
|
|
34
34
|
const [focusRowIndex, setFocusRowIndex] = useState(null);
|
|
35
|
+
const containerRef = useConsolidatedRef(ref);
|
|
36
|
+
const isSmallOrAbove = useBreakpoint('sm', { breakpointRef: containerRef });
|
|
37
|
+
const isMediumOrAbove = useBreakpoint('md', { breakpointRef: containerRef });
|
|
38
|
+
/**
|
|
39
|
+
* Defers onConditionChange callback to ensure state updates complete before invocation.
|
|
40
|
+
* Justification: Uses setTimeout with 0ms delay for allowing dispatch and setState calls to finish and propagate to the store
|
|
41
|
+
* before the parent component is notified. This prevents the parent from receiving
|
|
42
|
+
* stale condition data.
|
|
43
|
+
*/
|
|
44
|
+
const deferConditionChange = () => {
|
|
45
|
+
if (onConditionChange) {
|
|
46
|
+
setTimeout(onConditionChange, 0);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
35
49
|
// Upon adding/removing rows in Advanced mode, update the logic string to reflect the change in labels
|
|
36
50
|
// NOTE: The input is updated only if the previous logicString was simple enough
|
|
37
51
|
const updateLogicString = (actionType) => {
|
|
@@ -85,6 +99,7 @@ const ConditionBuilder = (props) => {
|
|
|
85
99
|
updateLogicString(INSERT_ROW); // Update the logicString input to reflect the insertion
|
|
86
100
|
}
|
|
87
101
|
setFocusRowIndex(insertAt);
|
|
102
|
+
onAddRow?.(insertAt);
|
|
88
103
|
};
|
|
89
104
|
// Remove the row at the given index
|
|
90
105
|
const removeRow = (removeAt) => {
|
|
@@ -116,6 +131,7 @@ const ConditionBuilder = (props) => {
|
|
|
116
131
|
}
|
|
117
132
|
return removeAt;
|
|
118
133
|
});
|
|
134
|
+
onDeleteRow?.(removeAt);
|
|
119
135
|
};
|
|
120
136
|
// Update a Basic-mode operator at the given index
|
|
121
137
|
const updateOperator = (updateAt, newValue) => {
|
|
@@ -125,6 +141,7 @@ const ConditionBuilder = (props) => {
|
|
|
125
141
|
newValue,
|
|
126
142
|
...operatorsList.slice(updateAt + 1)
|
|
127
143
|
]);
|
|
144
|
+
deferConditionChange();
|
|
128
145
|
};
|
|
129
146
|
// Validate the logic input. Called upon clicking outside the textBox or upon submission.
|
|
130
147
|
// If the expression is invalid, shows appropriate feedback and returns null.
|
|
@@ -141,10 +158,12 @@ const ConditionBuilder = (props) => {
|
|
|
141
158
|
// Indicate any parse error
|
|
142
159
|
if (hasProp(parseResult, 'error')) {
|
|
143
160
|
setLogicError(parseResult.error);
|
|
161
|
+
onLogicError?.(parseResult.error);
|
|
144
162
|
return null;
|
|
145
163
|
}
|
|
146
164
|
// If no errors
|
|
147
165
|
setLogicError(null); // Clear any previous error
|
|
166
|
+
onLogicError?.(null); // Clear any previous error
|
|
148
167
|
setLogicString(disambiguateLogic(logicToUse)); // Disambiguating the logic string by placing parentheses at appropriate places
|
|
149
168
|
setCachedLogicString(disambiguateLogic(logicToUse));
|
|
150
169
|
return parseResult.condition;
|
|
@@ -154,7 +173,7 @@ const ConditionBuilder = (props) => {
|
|
|
154
173
|
if (isBasicMode) {
|
|
155
174
|
// Update the logicString to match the operatorsList before switching the mode
|
|
156
175
|
setLogicString(cachedLogicString || getLogicFromBasicMode(operatorsList));
|
|
157
|
-
|
|
176
|
+
setIsBasicMode(false);
|
|
158
177
|
}
|
|
159
178
|
else {
|
|
160
179
|
// If switched from advanced to basic mode the condition will be stored until another action takes place
|
|
@@ -166,21 +185,24 @@ const ConditionBuilder = (props) => {
|
|
|
166
185
|
setOperatorsList(isBasicModeApplicable(condition)
|
|
167
186
|
? getBasicModeOperators(logicString)
|
|
168
187
|
: new Array(conditionRows.length - 1).fill('AND'));
|
|
169
|
-
|
|
188
|
+
setIsBasicMode(true);
|
|
170
189
|
}
|
|
171
190
|
}
|
|
172
191
|
};
|
|
173
|
-
const getCondition = () => {
|
|
174
|
-
|
|
192
|
+
const getCondition = (options = { performRowValidation: true }) => {
|
|
193
|
+
setShowErrorIndicators(false); // Reset any previous flag
|
|
175
194
|
setLogicError(null); // Clear any previous error
|
|
195
|
+
onLogicError?.(null); // Clear any previous error
|
|
176
196
|
// If there's a single empty condition, submit with an `undefined` value (useful for clearing a previous condition)
|
|
177
197
|
if (conditionRows.length === 1 && conditionRows[0].lhs.field === '') {
|
|
178
198
|
return [true, undefined];
|
|
179
199
|
}
|
|
180
200
|
// Identify and indicate any invalid values in the condition rows
|
|
181
|
-
const hasInvalidRows =
|
|
201
|
+
const hasInvalidRows = options.performRowValidation
|
|
202
|
+
? conditionRows.some(row => !isValidCondition(row, fields, true))
|
|
203
|
+
: false;
|
|
182
204
|
if (hasInvalidRows) {
|
|
183
|
-
|
|
205
|
+
setShowErrorIndicators(true); // Enable inline error indications
|
|
184
206
|
return [false];
|
|
185
207
|
}
|
|
186
208
|
// Validate the Logic string
|
|
@@ -192,53 +214,67 @@ const ConditionBuilder = (props) => {
|
|
|
192
214
|
}
|
|
193
215
|
return [false];
|
|
194
216
|
};
|
|
217
|
+
const getLogicError = useCallback(() => {
|
|
218
|
+
return logicError;
|
|
219
|
+
}, [logicError]);
|
|
195
220
|
useImperativeHandle(handle, () => ({
|
|
196
|
-
getCondition
|
|
197
|
-
|
|
221
|
+
getCondition,
|
|
222
|
+
getLogicError
|
|
223
|
+
}), [getCondition, getLogicError]);
|
|
198
224
|
const t = useI18n();
|
|
199
225
|
const { announceAssertive } = useLiveLog();
|
|
200
226
|
useEffect(() => {
|
|
201
227
|
announceAssertive({ message: t('condition_builder_mode_switch') });
|
|
202
228
|
}, [isBasicMode]);
|
|
203
|
-
return (_jsxs(StyledConditionBuilder, { container: { direction: 'column', gap: 1 }, children: [_jsx(Flex, { container: true, children: _jsx(Switch, { label: t('condition_builder_advanced_mode_button_label'), "aria-label": t('condition_builder_advanced_mode_button_label'), on: !isBasicMode, onChange: () => {
|
|
229
|
+
return (_jsxs(StyledConditionBuilder, { container: { direction: 'column', gap: 1 }, ref: containerRef, children: [_jsx(Flex, { container: true, children: _jsx(Switch, { label: t('condition_builder_advanced_mode_button_label'), "aria-label": t('condition_builder_advanced_mode_button_label'), on: !isBasicMode, onChange: () => {
|
|
204
230
|
toggleMode();
|
|
205
|
-
} }) }), _jsx("div", { role: 'group', children: conditionRows.map(({ id, label, ...leaf }, index) => {
|
|
231
|
+
}, disabled: disabled || readOnly }) }), _jsx("div", { role: 'group', children: conditionRows.map(({ id, label, ...leaf }, index) => {
|
|
206
232
|
const rowIndexAriaLabel = `${t('condition_builder_row', [index + 1])}`;
|
|
207
|
-
const
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
}
|
|
214
|
-
return (_jsxs(Fragment, { children: [isBasicMode && index > 0 && (_jsx(StyledRowWithSeparator, { container: true, shaded: enableShading && operatorsList[index - 1] === 'AND', children: _jsx(MenuButton, { popover: { hideOnTargetHidden: false }, text: operatorsList[index - 1] === 'AND' ? 'And' : 'Or', variant: 'simple', menu: {
|
|
233
|
+
const fieldLabel = getItem(fields, leaf.lhs.field)?.primary ?? leaf.lhs.field.split('.').pop();
|
|
234
|
+
const deleteAriaLabel = `${t('condition_builder_field_label')} ${fieldLabel}`;
|
|
235
|
+
const alignItems = isSmallOrAbove ? 'start' : 'stretch';
|
|
236
|
+
return (_jsxs(Fragment, { children: [isBasicMode && index > 0 && (_jsx(StyledRowWithSeparator, { container: true, "$nested": enableShading && operatorsList[index - 1] === 'AND', children: _jsx(MenuButton, { popover: { hideOnTargetHidden: false }, text: operatorsList[index - 1] === 'AND'
|
|
237
|
+
? t('condition_builder_logical_and')
|
|
238
|
+
: t('condition_builder_logical_or'), variant: 'simple', menu: {
|
|
215
239
|
items: [
|
|
216
240
|
{
|
|
217
241
|
id: 'AND',
|
|
218
|
-
primary: '
|
|
242
|
+
primary: t('condition_builder_logical_and'),
|
|
219
243
|
onClick: () => updateOperator(index - 1, 'AND')
|
|
220
244
|
},
|
|
221
245
|
{
|
|
222
246
|
id: 'OR',
|
|
223
|
-
primary: '
|
|
247
|
+
primary: t('condition_builder_logical_or'),
|
|
224
248
|
onClick: () => updateOperator(index - 1, 'OR')
|
|
225
249
|
}
|
|
226
250
|
]
|
|
227
|
-
}, ref: index === focusRowIndex ? newOperatorButtonRef : null }) })), _jsxs(StyledRow, { "aria-label": rowIndexAriaLabel, container: {
|
|
251
|
+
}, ref: index === focusRowIndex ? newOperatorButtonRef : null, disabled: disabled || readOnly }) })), _jsxs(StyledRow, { "aria-label": rowIndexAriaLabel, container: {
|
|
252
|
+
gap: 1,
|
|
253
|
+
alignItems,
|
|
254
|
+
direction: isSmallOrAbove ? 'row' : 'column',
|
|
255
|
+
justify: 'between'
|
|
256
|
+
}, "$isBasicMode": isBasicMode, "$nested": isBasicMode &&
|
|
257
|
+
enableShading &&
|
|
258
|
+
(operatorsList[index] === 'AND' || operatorsList[index - 1] === 'AND'), ref: index === focusRowIndex ? focusRowRef : null, children: [!isBasicMode && (_jsx(StyledInputLevelItem, { item: { alignSelf: 'start' }, "$row": isSmallOrAbove, children: _jsx(StyledLabel, { children: label }) })), _jsx(Flex, { item: { grow: 1 }, children: _jsx(ConditionRenderer, { indicateErrors: showErrorIndicators, fields: fields, index: index, condition: leaf, onChange: (newCondition) => {
|
|
228
259
|
const newRow = { id, label, ...newCondition };
|
|
229
260
|
dispatch({ type: UPDATE_ROW, payload: { updateAt: index, newRow } });
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
261
|
+
deferConditionChange();
|
|
262
|
+
}, validComparators: validComparators, dateFunctions: dateFunctions, timeZone: timeZone, validRhsTypes: validRhsTypes }) }), _jsxs(StyledInputLevelItem, { container: { justify: 'end' }, "$row": isSmallOrAbove, "$bottom": isSmallOrAbove && !isMediumOrAbove, children: [_jsx(Button, { icon: true, variant: 'simple', onClick: () => {
|
|
263
|
+
insertRow(index + 1);
|
|
264
|
+
setCachedLogicString('');
|
|
265
|
+
deferConditionChange();
|
|
266
|
+
}, label: t('add'), "aria-label": t('add_condition'), disabled: disabled || readOnly, children: _jsx(Icon, { name: 'plus' }) }), _jsx(Button, { icon: true, variant: 'simple', onClick: () => {
|
|
267
|
+
removeRow(index);
|
|
268
|
+
setCachedLogicString('');
|
|
269
|
+
deferConditionChange();
|
|
270
|
+
}, label: t('delete'), "aria-label": deleteAriaLabel ? t('delete_noun', [deleteAriaLabel]) : undefined, disabled: disabled || readOnly, children: _jsx(Icon, { name: 'trash' }) })] })] })] }, id));
|
|
237
271
|
}) }), !isBasicMode && (_jsx("div", { children: _jsx(Flex, { container: { gap: 0.25, direction: 'column' }, children: _jsx(Input, { label: t('condition_builder_advanced_condition_label'), additionalInfo: {
|
|
238
272
|
heading: t('condition_builder_advanced_condition_label'),
|
|
239
273
|
content: (_jsx("div", { children: t('condition_builder_advanced_condition_tooltip', [
|
|
240
|
-
disallowNOT ? '
|
|
241
|
-
|
|
274
|
+
disallowNOT ? 'and/or' : 'and/or/not',
|
|
275
|
+
_jsx("pre", { children: disallowNOT
|
|
276
|
+
? '(1 or 2) and (3 or 4 or 5)'
|
|
277
|
+
: '(1 and 2) or (3 and not 4)' })
|
|
242
278
|
]) }))
|
|
243
279
|
}, type: 'text', placeholder: t('condition_builder_advanced_condition_placeholder'), value: logicString
|
|
244
280
|
.replace(/\bAND\b/g, 'and')
|
|
@@ -246,8 +282,11 @@ const ConditionBuilder = (props) => {
|
|
|
246
282
|
.replace(/\bNOT\b/g, 'not'), onChange: (e) => {
|
|
247
283
|
setLogicString(e.target.value);
|
|
248
284
|
setCachedLogicString(e.target.value);
|
|
249
|
-
}, onBlur: () =>
|
|
250
|
-
|
|
285
|
+
}, onBlur: () => {
|
|
286
|
+
validateLogicString(logicString);
|
|
287
|
+
deferConditionChange();
|
|
288
|
+
}, status: logicError !== null ? 'error' : undefined, info: logicError, required: true, disabled: disabled, readOnly: readOnly || disabled }) }) }))] }));
|
|
289
|
+
});
|
|
251
290
|
ConditionBuilder.defaultProps = defaultProps;
|
|
252
291
|
export default ConditionBuilder;
|
|
253
292
|
//# sourceMappingURL=ConditionBuilder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConditionBuilder.js","sourceRoot":"","sources":["../../../src/components/ConditionBuilder/ConditionBuilder.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Fragment, useState, useReducer, useImperativeHandle, useRef, useEffect } from 'react';\nimport type { FunctionComponent, ChangeEvent } from 'react';\n\nimport {\n Button,\n Flex,\n Icon,\n Input,\n MenuButton,\n hasProp,\n useI18n,\n getFocusables,\n useLiveLog,\n Switch\n} from '@pega/cosmos-react-core';\nimport type { ForwardProps } from '@pega/cosmos-react-core';\n\nimport AtomicCondition, { isValidCondition } from './AtomicCondition';\nimport type ConditionBuilderProps from './ConditionBuilder.types';\nimport type { Condition, HandleValue, LeafCondition } from './ConditionBuilder.types';\nimport {\n splitConditionForBuilder,\n parseLogicString,\n disambiguateLogic,\n isBasicModeApplicable,\n getBasicModeOperators,\n getLogicFromBasicMode\n} from './core/utils';\nimport rowsReducer, { INSERT_ROW, UPDATE_ROW, REMOVE_ROW } from './core/rows-reducer';\nimport type { RHSType } from './core/types';\nimport {\n StyledRowWithSeparator,\n StyledRow,\n StyledLabel,\n StyledConditionBuilder\n} from './ConditionBuilder.styles';\n\n// Default props for the builder\nconst defaultProps: Partial<ConditionBuilderProps> = {\n condition: {\n condition: {\n comparator: 'IS_NOT_NULL',\n lhs: { field: '' }\n }\n }\n};\n\n// Component for the builder\nconst ConditionBuilder: FunctionComponent<ConditionBuilderProps & ForwardProps> = (\n props: ConditionBuilderProps\n) => {\n const {\n fields,\n condition: seedCondition,\n validComparators,\n validRhsTypes = new Set<RHSType>(['LITERAL', 'FIELD']),\n dateFunctions,\n disallowNOT,\n handle\n } = props;\n\n // Split the condition tree into a logic-string and a list of condition-rows.\n const clonedCondition: Condition = JSON.parse(JSON.stringify(seedCondition)); // Cloning to avoid modifying the original\n const { logic: seedLogic, rows: seedRows } = splitConditionForBuilder(clonedCondition);\n\n // On load, look to use the Basic-mode if the seed-condition is simple enough\n const [isBasicMode, setBasicMode] = useState(() => isBasicModeApplicable(clonedCondition));\n const [operatorsList, setOperatorsList] = useState(() => getBasicModeOperators(seedLogic)); // Operators-list used in Basic-mode to render dropdowns between the rows. NOTE: When in Advanced-mode, this can contain stale values.\n const [logicString, setLogicString] = useState(seedLogic); // Logic-string used in Advanced-mode. NOTE: When in Basic-mode, this can contain stale values.\n const [cachedLogicString, setCachedLogicString] = useState(seedLogic); // Logic-string used to store the last valid logic-string in Advanced-mode. This is used to restore the logic-string when switching back from Basic-mode to Advanced-mode.\n const [conditionRows, dispatch] = useReducer(rowsReducer, seedRows); // Conditions-rows\n const [logicError, setLogicError] = useState<string | null>(null); // Used to indicate errors in the logic string\n const [showErrorIndicators, setErrorIndicators] = useState(false); // Used to enable inline error indicators in the condition rows\n const enableShading =\n isBasicMode && operatorsList.includes('AND') && operatorsList.includes('OR'); // In Basic mode, enable shading to indicate grouping only when both operators are present\n\n const newOperatorButtonRef = useRef<HTMLButtonElement | null>(null);\n const focusRowRef = useRef<HTMLElement | null>(null);\n const [focusRowIndex, setFocusRowIndex] = useState<number | null>(null);\n\n // Upon adding/removing rows in Advanced mode, update the logic string to reflect the change in labels\n // NOTE: The input is updated only if the previous logicString was simple enough\n const updateLogicString = (actionType: string): void => {\n const numNewRows =\n actionType === INSERT_ROW ? conditionRows.length + 1 : conditionRows.length - 1;\n\n // If only one row left after the action, simply use its label as logicString\n // NOTE: If none left, the rowsReducer adds a new empty row\n if (numNewRows <= 1) {\n setLogicString('1');\n return;\n }\n\n // If the previous string was a simple AND/OR between all the rows, update the logicString to follow the same for the new list of rows.\n // If the previous string was a single token like `1` and a new row is inserted, do an AND between the new rows, i.e. `1 AND 2`\n // For all other complex cases, skip automatically updating the string and wait for the user to change it\n // To check this, split the previous string by `OR/AND` and check if each of the resultant token is a simple numeric token\n const splitter = logicString.includes('OR') ? 'OR' : 'AND';\n const tokens = logicString.split(splitter);\n const isEveryTokenInteger = tokens.every(w => /^\\d+$/.test(w.trim()));\n if (isEveryTokenInteger) {\n setLogicString(\n new Array(numNewRows)\n .fill(0)\n .map((w, i) => i + 1)\n .join(` ${splitter} `)\n );\n }\n };\n\n // Manages the focus behavior when inserting/removing a row\n useEffect(() => {\n if (focusRowIndex === null) return;\n\n if (newOperatorButtonRef.current) {\n newOperatorButtonRef.current.focus();\n newOperatorButtonRef.current = null;\n } else if (focusRowIndex !== null) {\n getFocusables(focusRowRef)[0]?.focus();\n }\n\n setFocusRowIndex(null);\n }, [focusRowIndex]);\n\n // Insert a new row at the given index\n const insertRow = (insertAt: number): void => {\n dispatch({ type: INSERT_ROW, payload: { insertAt } }); // Insert an entry in conditionRows\n if (isBasicMode) {\n // Set up a new AND/OR selector\n const insertOpAt = insertAt - 1; // Using `insertAt-1` since the operatorsList has one less entry compared to the conditionRows\n setOperatorsList([\n ...operatorsList.slice(0, insertOpAt),\n 'AND',\n ...operatorsList.slice(insertOpAt)\n ]);\n } else {\n updateLogicString(INSERT_ROW); // Update the logicString input to reflect the insertion\n }\n setFocusRowIndex(insertAt);\n };\n\n // Remove the row at the given index\n const removeRow = (removeAt: number): void => {\n dispatch({ type: REMOVE_ROW, payload: { removeAt } }); // Remove an entry in conditionRows\n if (isBasicMode) {\n // Remove an AND/OR selector\n if (removeAt === 0) {\n // If removing the first of the condition rows, remove the extraneous operator\n setOperatorsList(operatorsList.slice(1));\n } else {\n let removeOpAt = removeAt - 1; // Using `removeAt-1` since the operatorsList has one less entry compared to the conditionRows\n if (operatorsList[removeOpAt] === 'OR' && operatorsList[removeOpAt + 1] === 'AND') {\n // If removing a condition at the start of a nested group, remove the first operator from that group. e.g. Take `(1 AND 2) OR (3 AND 4 AND 5)`. If `3` is being deleted, it should become `(1 AND 2) OR (4 AND 5)` instead of `1 AND 2 AND 4 AND 5`\n removeOpAt += 1;\n }\n setOperatorsList([\n ...operatorsList.slice(0, removeOpAt),\n ...operatorsList.slice(removeOpAt + 1)\n ]);\n }\n } else {\n updateLogicString(REMOVE_ROW); // Update the logicString input to reflect the removal\n }\n setFocusRowIndex(() => {\n if (removeAt !== 0 && removeAt === conditionRows.length - 1) {\n return removeAt - 1;\n }\n\n return removeAt;\n });\n };\n\n // Update a Basic-mode operator at the given index\n const updateOperator = (updateAt: number, newValue: 'AND' | 'OR'): void => {\n setCachedLogicString('');\n setOperatorsList([\n ...operatorsList.slice(0, updateAt),\n newValue,\n ...operatorsList.slice(updateAt + 1)\n ]);\n };\n\n // Validate the logic input. Called upon clicking outside the textBox or upon submission.\n // If the expression is invalid, shows appropriate feedback and returns null.\n // If the expression is valid, formats it by setting up brackets at necessary places (to clear any ambiguities e.g. `1 AND 2 OR 3` is formatted as `(1 AND 2) OR 3` ). Returns a save-ready condition\n const validateLogicString = (logicToUse: string): Condition | null => {\n // Set up a lookup with row-labels as keys and rows as values\n const conditionLookup: { [label: string]: LeafCondition } = {};\n conditionRows.forEach(row => {\n const { id, label, ...leaf } = row; // Discard the extra properties added by ConditionRow to the LeafCondition interface\n conditionLookup[row.label] = leaf;\n });\n\n // Convert the logic string into a condition tree\n const parseResult = parseLogicString(logicToUse, conditionLookup, disallowNOT);\n\n // Indicate any parse error\n if (hasProp(parseResult, 'error')) {\n setLogicError(parseResult.error);\n return null;\n }\n\n // If no errors\n setLogicError(null); // Clear any previous error\n setLogicString(disambiguateLogic(logicToUse)); // Disambiguating the logic string by placing parentheses at appropriate places\n setCachedLogicString(disambiguateLogic(logicToUse));\n return parseResult.condition;\n };\n\n // Toggle between the Basic and Advanced modes\n const toggleMode = (): void => {\n if (isBasicMode) {\n // Update the logicString to match the operatorsList before switching the mode\n setLogicString(cachedLogicString || getLogicFromBasicMode(operatorsList));\n setBasicMode(false);\n } else {\n // If switched from advanced to basic mode the condition will be stored until another action takes place\n setCachedLogicString(logicString);\n const condition = validateLogicString(logicString); // Validate the logicString. If it is an invalid, an appropriate error is shown for the user to act on\n if (condition !== null) {\n // If the logic is simple enough, identify the new set of operators before switching to Basic mode.\n // If the logic is too complex fallback to using 'AND' between all rows\n setOperatorsList(\n isBasicModeApplicable(condition)\n ? getBasicModeOperators(logicString)\n : new Array(conditionRows.length - 1).fill('AND')\n );\n setBasicMode(true);\n }\n }\n };\n\n const getCondition: HandleValue['getCondition'] = () => {\n setErrorIndicators(false); // Reset any previous flag\n setLogicError(null); // Clear any previous error\n\n // If there's a single empty condition, submit with an `undefined` value (useful for clearing a previous condition)\n if (conditionRows.length === 1 && conditionRows[0].lhs.field === '') {\n return [true, undefined];\n }\n\n // Identify and indicate any invalid values in the condition rows\n const hasInvalidRows = conditionRows.some(row => !isValidCondition(row, fields, true));\n if (hasInvalidRows) {\n setErrorIndicators(true); // Enable inline error indications\n return [false];\n }\n\n // Validate the Logic string\n const logicToUse = isBasicMode ? getLogicFromBasicMode(operatorsList) : logicString; // If in Basic-mode, construct a different logicString based on the operatorsList\n const condition = validateLogicString(logicToUse); // This also takes care of showing an appropriate error feedback as needed\n if (condition !== null) {\n // Can be null when the logic string has errors\n return [true, condition];\n }\n\n return [false];\n };\n\n useImperativeHandle(\n handle,\n () => ({\n getCondition\n }),\n [getCondition]\n );\n\n const t = useI18n();\n\n const { announceAssertive } = useLiveLog();\n\n useEffect(() => {\n announceAssertive({ message: t('condition_builder_mode_switch') });\n }, [isBasicMode]);\n\n return (\n <StyledConditionBuilder container={{ direction: 'column', gap: 1 }}>\n <Flex container>\n <Switch\n label={t('condition_builder_advanced_mode_button_label')}\n aria-label={t('condition_builder_advanced_mode_button_label')}\n on={!isBasicMode}\n onChange={() => {\n toggleMode();\n }}\n />\n </Flex>\n {/* Condition Rows */}\n <div role='group'>\n {conditionRows.map(({ id, label, ...leaf }, index) => {\n const rowIndexAriaLabel = `${t('condition_builder_row', [index + 1])}`;\n const deleteAriaLabel = `${t('condition_builder_field_label')} ${leaf.lhs.field\n .split('.')\n .pop()}`;\n\n let alignItems = 'end';\n if (showErrorIndicators && !isValidCondition(leaf, fields, false)) {\n alignItems = 'center';\n }\n\n return (\n <Fragment key={id}>\n {/* Row with the operator dropdown in Basic mode */}\n {isBasicMode && index > 0 && (\n <StyledRowWithSeparator\n container\n shaded={enableShading && operatorsList[index - 1] === 'AND'}\n >\n <MenuButton\n popover={{ hideOnTargetHidden: false }}\n text={operatorsList[index - 1] === 'AND' ? 'And' : 'Or'}\n variant='simple'\n menu={{\n items: [\n {\n id: 'AND',\n primary: 'And',\n onClick: () => updateOperator(index - 1, 'AND')\n },\n {\n id: 'OR',\n primary: 'Or',\n onClick: () => updateOperator(index - 1, 'OR')\n }\n ]\n }}\n ref={index === focusRowIndex ? newOperatorButtonRef : null}\n />\n </StyledRowWithSeparator>\n )}\n\n {/* Row with the AtomicCondition */}\n <StyledRow\n aria-label={rowIndexAriaLabel}\n container={{ gap: 0.5, alignItems }}\n shaded={isBasicMode && enableShading}\n ref={index === focusRowIndex ? focusRowRef : null}\n >\n {/* Label */}\n {!isBasicMode && <StyledLabel>{label}</StyledLabel>}\n\n {/* Condition controls */}\n <Flex item={{ grow: 1 }}>\n <AtomicCondition\n condition={leaf}\n fields={fields}\n indicateErrors={showErrorIndicators}\n validComparators={validComparators}\n dateFunctions={dateFunctions}\n onChange={(newCondition: LeafCondition) => {\n const newRow = { id, label, ...newCondition };\n dispatch({ type: UPDATE_ROW, payload: { updateAt: index, newRow } });\n }}\n validRhsTypes={validRhsTypes}\n />\n </Flex>\n\n {/* Row actions */}\n <Button\n icon\n variant='simple'\n onClick={() => {\n insertRow(index + 1);\n setCachedLogicString('');\n }}\n label={t('add_condition')}\n >\n <Icon name='plus' />\n </Button>\n <Button\n icon\n variant='simple'\n onClick={() => {\n removeRow(index);\n setCachedLogicString('');\n }}\n label={t('delete')}\n aria-label={deleteAriaLabel ? t('delete_noun', [deleteAriaLabel]) : undefined}\n >\n <Icon name='trash' />\n </Button>\n </StyledRow>\n </Fragment>\n );\n })}\n </div>\n\n {/* LogicString input */}\n {!isBasicMode && (\n <div>\n <Flex container={{ gap: 0.25, direction: 'column' }}>\n <Input\n label={t('condition_builder_advanced_condition_label')}\n additionalInfo={{\n heading: t('condition_builder_advanced_condition_label'),\n content: (\n <div>\n {t('condition_builder_advanced_condition_tooltip', [\n disallowNOT ? 'AND/OR' : 'AND/OR/NOT',\n disallowNOT ? '(1 OR 2) AND (3 OR 4 OR 5)' : '(1 AND 2) OR (3 AND NOT 4)'\n ])}\n </div>\n )\n }}\n type='text'\n placeholder={t('condition_builder_advanced_condition_placeholder')}\n value={logicString\n .replace(/\\bAND\\b/g, 'and')\n .replace(/\\bOR\\b/g, 'or')\n .replace(/\\bNOT\\b/g, 'not')}\n onChange={(e: ChangeEvent<HTMLInputElement>) => {\n setLogicString(e.target.value);\n setCachedLogicString(e.target.value);\n }}\n onBlur={() => validateLogicString(logicString)}\n status={logicError !== null ? 'error' : undefined}\n info={logicError}\n required\n />\n </Flex>\n </div>\n )}\n </StyledConditionBuilder>\n );\n};\nConditionBuilder.defaultProps = defaultProps;\n\nexport default ConditionBuilder;\n"]}
|
|
1
|
+
{"version":3,"file":"ConditionBuilder.js","sourceRoot":"","sources":["../../../src/components/ConditionBuilder/ConditionBuilder.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Fragment,\n useState,\n useReducer,\n useImperativeHandle,\n useRef,\n useEffect,\n useCallback,\n forwardRef\n} from 'react';\nimport type { ChangeEvent, PropsWithoutRef } from 'react';\n\nimport {\n Button,\n Flex,\n Icon,\n Input,\n MenuButton,\n hasProp,\n useI18n,\n getFocusables,\n useLiveLog,\n useBreakpoint,\n useConsolidatedRef,\n Switch\n} from '@pega/cosmos-react-core';\nimport type { ForwardRefForwardPropsComponent } from '@pega/cosmos-react-core';\n\nimport AtomicCondition, { isValidCondition } from './AtomicCondition';\nimport type ConditionBuilderProps from './ConditionBuilder.types';\nimport type { Condition, HandleValue, LeafCondition } from './ConditionBuilder.types';\nimport {\n splitConditionForBuilder,\n parseLogicString,\n disambiguateLogic,\n isBasicModeApplicable,\n getBasicModeOperators,\n getLogicFromBasicMode,\n getItem\n} from './core/utils';\nimport rowsReducer, { INSERT_ROW, UPDATE_ROW, REMOVE_ROW } from './core/rows-reducer';\nimport type { RHSType } from './core/types';\nimport {\n StyledRowWithSeparator,\n StyledRow,\n StyledLabel,\n StyledConditionBuilder,\n StyledInputLevelItem\n} from './ConditionBuilder.styles';\n\n// Default props for the builder\nconst defaultProps: Partial<ConditionBuilderProps> = {\n condition: {\n condition: {\n comparator: 'IS_NOT_NULL',\n lhs: { field: '' }\n }\n }\n};\n\n// Component for the builder\nconst ConditionBuilder: ForwardRefForwardPropsComponent<ConditionBuilderProps> = forwardRef(\n function ConditionBuilder(\n props: PropsWithoutRef<ConditionBuilderProps>,\n ref: ConditionBuilderProps['ref']\n ) {\n const {\n fields = [],\n condition: seedCondition,\n validComparators = [],\n validRhsTypes = new Set<RHSType>(['LITERAL', 'FIELD']),\n dateFunctions = { DATE_TIME: [], DATE_ONLY: [] },\n timeZone,\n disallowNOT,\n disabled = false,\n readOnly = false,\n handle,\n conditionRenderer: ConditionRenderer = AtomicCondition,\n onLogicError,\n onAddRow,\n onDeleteRow,\n onConditionChange\n } = props;\n\n // Split the condition tree into a logic-string and a list of condition-rows.\n const clonedCondition: Condition = JSON.parse(JSON.stringify(seedCondition)); // Cloning to avoid modifying the original\n const { logic: seedLogic, rows: seedRows } = splitConditionForBuilder(clonedCondition);\n // On load, look to use the Basic-mode if the seed-condition is simple enough\n const [isBasicMode, setIsBasicMode] = useState(() => isBasicModeApplicable(clonedCondition));\n const [operatorsList, setOperatorsList] = useState(() => getBasicModeOperators(seedLogic)); // Operators-list used in Basic-mode to render dropdowns between the rows. NOTE: When in Advanced-mode, this can contain stale values.\n const [logicString, setLogicString] = useState(seedLogic); // Logic-string used in Advanced-mode. NOTE: When in Basic-mode, this can contain stale values.\n const [cachedLogicString, setCachedLogicString] = useState(seedLogic); // Logic-string used to store the last valid logic-string in Advanced-mode. This is used to restore the logic-string when switching back from Basic-mode to Advanced-mode.\n const [conditionRows, dispatch] = useReducer(rowsReducer, seedRows); // Conditions-rows\n const [logicError, setLogicError] = useState<string | null>(null); // Used to indicate errors in the logic string\n const [showErrorIndicators, setShowErrorIndicators] = useState(false); // Used to enable inline error indicators in the condition rows\n const enableShading =\n isBasicMode && operatorsList.includes('AND') && operatorsList.includes('OR'); // In Basic mode, enable shading to indicate grouping only when both operators are present\n\n const newOperatorButtonRef = useRef<HTMLButtonElement | null>(null);\n const focusRowRef = useRef<HTMLElement | null>(null);\n const [focusRowIndex, setFocusRowIndex] = useState<number | null>(null);\n const containerRef = useConsolidatedRef(ref);\n const isSmallOrAbove = useBreakpoint('sm', { breakpointRef: containerRef });\n const isMediumOrAbove = useBreakpoint('md', { breakpointRef: containerRef });\n\n /**\n * Defers onConditionChange callback to ensure state updates complete before invocation.\n * Justification: Uses setTimeout with 0ms delay for allowing dispatch and setState calls to finish and propagate to the store\n * before the parent component is notified. This prevents the parent from receiving\n * stale condition data.\n */\n const deferConditionChange = () => {\n if (onConditionChange) {\n setTimeout(onConditionChange, 0);\n }\n };\n\n // Upon adding/removing rows in Advanced mode, update the logic string to reflect the change in labels\n // NOTE: The input is updated only if the previous logicString was simple enough\n const updateLogicString = (actionType: string): void => {\n const numNewRows =\n actionType === INSERT_ROW ? conditionRows.length + 1 : conditionRows.length - 1;\n\n // If only one row left after the action, simply use its label as logicString\n // NOTE: If none left, the rowsReducer adds a new empty row\n if (numNewRows <= 1) {\n setLogicString('1');\n return;\n }\n\n // If the previous string was a simple AND/OR between all the rows, update the logicString to follow the same for the new list of rows.\n // If the previous string was a single token like `1` and a new row is inserted, do an AND between the new rows, i.e. `1 AND 2`\n // For all other complex cases, skip automatically updating the string and wait for the user to change it\n // To check this, split the previous string by `OR/AND` and check if each of the resultant token is a simple numeric token\n const splitter = logicString.includes('OR') ? 'OR' : 'AND';\n const tokens = logicString.split(splitter);\n const isEveryTokenInteger = tokens.every(w => /^\\d+$/.test(w.trim()));\n if (isEveryTokenInteger) {\n setLogicString(\n new Array(numNewRows)\n .fill(0)\n .map((w, i) => i + 1)\n .join(` ${splitter} `)\n );\n }\n };\n\n // Manages the focus behavior when inserting/removing a row\n useEffect(() => {\n if (focusRowIndex === null) return;\n\n if (newOperatorButtonRef.current) {\n newOperatorButtonRef.current.focus();\n newOperatorButtonRef.current = null;\n } else if (focusRowIndex !== null) {\n getFocusables(focusRowRef)[0]?.focus();\n }\n\n setFocusRowIndex(null);\n }, [focusRowIndex]);\n\n // Insert a new row at the given index\n const insertRow = (insertAt: number): void => {\n dispatch({ type: INSERT_ROW, payload: { insertAt } }); // Insert an entry in conditionRows\n if (isBasicMode) {\n // Set up a new AND/OR selector\n const insertOpAt = insertAt - 1; // Using `insertAt-1` since the operatorsList has one less entry compared to the conditionRows\n setOperatorsList([\n ...operatorsList.slice(0, insertOpAt),\n 'AND',\n ...operatorsList.slice(insertOpAt)\n ]);\n } else {\n updateLogicString(INSERT_ROW); // Update the logicString input to reflect the insertion\n }\n setFocusRowIndex(insertAt);\n onAddRow?.(insertAt);\n };\n\n // Remove the row at the given index\n const removeRow = (removeAt: number): void => {\n dispatch({ type: REMOVE_ROW, payload: { removeAt } }); // Remove an entry in conditionRows\n if (isBasicMode) {\n // Remove an AND/OR selector\n if (removeAt === 0) {\n // If removing the first of the condition rows, remove the extraneous operator\n setOperatorsList(operatorsList.slice(1));\n } else {\n let removeOpAt = removeAt - 1; // Using `removeAt-1` since the operatorsList has one less entry compared to the conditionRows\n if (operatorsList[removeOpAt] === 'OR' && operatorsList[removeOpAt + 1] === 'AND') {\n // If removing a condition at the start of a nested group, remove the first operator from that group. e.g. Take `(1 AND 2) OR (3 AND 4 AND 5)`. If `3` is being deleted, it should become `(1 AND 2) OR (4 AND 5)` instead of `1 AND 2 AND 4 AND 5`\n removeOpAt += 1;\n }\n setOperatorsList([\n ...operatorsList.slice(0, removeOpAt),\n ...operatorsList.slice(removeOpAt + 1)\n ]);\n }\n } else {\n updateLogicString(REMOVE_ROW); // Update the logicString input to reflect the removal\n }\n setFocusRowIndex(() => {\n if (removeAt !== 0 && removeAt === conditionRows.length - 1) {\n return removeAt - 1;\n }\n\n return removeAt;\n });\n onDeleteRow?.(removeAt);\n };\n\n // Update a Basic-mode operator at the given index\n const updateOperator = (updateAt: number, newValue: 'AND' | 'OR'): void => {\n setCachedLogicString('');\n setOperatorsList([\n ...operatorsList.slice(0, updateAt),\n newValue,\n ...operatorsList.slice(updateAt + 1)\n ]);\n deferConditionChange();\n };\n\n // Validate the logic input. Called upon clicking outside the textBox or upon submission.\n // If the expression is invalid, shows appropriate feedback and returns null.\n // If the expression is valid, formats it by setting up brackets at necessary places (to clear any ambiguities e.g. `1 AND 2 OR 3` is formatted as `(1 AND 2) OR 3` ). Returns a save-ready condition\n const validateLogicString = (logicToUse: string): Condition | null => {\n // Set up a lookup with row-labels as keys and rows as values\n const conditionLookup: { [label: string]: LeafCondition } = {};\n conditionRows.forEach(row => {\n const { id, label, ...leaf } = row; // Discard the extra properties added by ConditionRow to the LeafCondition interface\n conditionLookup[row.label] = leaf;\n });\n\n // Convert the logic string into a condition tree\n const parseResult = parseLogicString(logicToUse, conditionLookup, disallowNOT);\n\n // Indicate any parse error\n if (hasProp(parseResult, 'error')) {\n setLogicError(parseResult.error);\n onLogicError?.(parseResult.error);\n return null;\n }\n\n // If no errors\n setLogicError(null); // Clear any previous error\n onLogicError?.(null); // Clear any previous error\n setLogicString(disambiguateLogic(logicToUse)); // Disambiguating the logic string by placing parentheses at appropriate places\n setCachedLogicString(disambiguateLogic(logicToUse));\n return parseResult.condition;\n };\n\n // Toggle between the Basic and Advanced modes\n const toggleMode = (): void => {\n if (isBasicMode) {\n // Update the logicString to match the operatorsList before switching the mode\n setLogicString(cachedLogicString || getLogicFromBasicMode(operatorsList));\n setIsBasicMode(false);\n } else {\n // If switched from advanced to basic mode the condition will be stored until another action takes place\n setCachedLogicString(logicString);\n const condition = validateLogicString(logicString); // Validate the logicString. If it is an invalid, an appropriate error is shown for the user to act on\n if (condition !== null) {\n // If the logic is simple enough, identify the new set of operators before switching to Basic mode.\n // If the logic is too complex fallback to using 'AND' between all rows\n setOperatorsList(\n isBasicModeApplicable(condition)\n ? getBasicModeOperators(logicString)\n : new Array(conditionRows.length - 1).fill('AND')\n );\n setIsBasicMode(true);\n }\n }\n };\n\n const getCondition: HandleValue['getCondition'] = (\n options = { performRowValidation: true }\n ) => {\n setShowErrorIndicators(false); // Reset any previous flag\n setLogicError(null); // Clear any previous error\n onLogicError?.(null); // Clear any previous error\n\n // If there's a single empty condition, submit with an `undefined` value (useful for clearing a previous condition)\n if (conditionRows.length === 1 && conditionRows[0].lhs.field === '') {\n return [true, undefined];\n }\n\n // Identify and indicate any invalid values in the condition rows\n const hasInvalidRows = options.performRowValidation\n ? conditionRows.some(row => !isValidCondition(row, fields, true))\n : false;\n if (hasInvalidRows) {\n setShowErrorIndicators(true); // Enable inline error indications\n return [false];\n }\n\n // Validate the Logic string\n const logicToUse = isBasicMode ? getLogicFromBasicMode(operatorsList) : logicString; // If in Basic-mode, construct a different logicString based on the operatorsList\n const condition = validateLogicString(logicToUse); // This also takes care of showing an appropriate error feedback as needed\n if (condition !== null) {\n // Can be null when the logic string has errors\n return [true, condition];\n }\n\n return [false];\n };\n\n const getLogicError: HandleValue['getLogicError'] = useCallback((): string | null => {\n return logicError;\n }, [logicError]);\n\n useImperativeHandle(\n handle,\n () => ({\n getCondition,\n getLogicError\n }),\n [getCondition, getLogicError]\n );\n\n const t = useI18n();\n\n const { announceAssertive } = useLiveLog();\n\n useEffect(() => {\n announceAssertive({ message: t('condition_builder_mode_switch') });\n }, [isBasicMode]);\n\n return (\n <StyledConditionBuilder container={{ direction: 'column', gap: 1 }} ref={containerRef}>\n <Flex container>\n <Switch\n label={t('condition_builder_advanced_mode_button_label')}\n aria-label={t('condition_builder_advanced_mode_button_label')}\n on={!isBasicMode}\n onChange={() => {\n toggleMode();\n }}\n disabled={disabled || readOnly}\n />\n </Flex>\n {/* Condition Rows */}\n <div role='group'>\n {conditionRows.map(({ id, label, ...leaf }, index) => {\n const rowIndexAriaLabel = `${t('condition_builder_row', [index + 1])}`;\n const fieldLabel =\n getItem(fields, leaf.lhs.field)?.primary ?? leaf.lhs.field.split('.').pop();\n const deleteAriaLabel = `${t('condition_builder_field_label')} ${fieldLabel}`;\n\n const alignItems = isSmallOrAbove ? 'start' : 'stretch';\n\n return (\n <Fragment key={id}>\n {/* Row with the operator dropdown in Basic mode */}\n {isBasicMode && index > 0 && (\n <StyledRowWithSeparator\n container\n $nested={enableShading && operatorsList[index - 1] === 'AND'}\n >\n <MenuButton\n popover={{ hideOnTargetHidden: false }}\n text={\n operatorsList[index - 1] === 'AND'\n ? t('condition_builder_logical_and')\n : t('condition_builder_logical_or')\n }\n variant='simple'\n menu={{\n items: [\n {\n id: 'AND',\n primary: t('condition_builder_logical_and'),\n onClick: () => updateOperator(index - 1, 'AND')\n },\n {\n id: 'OR',\n primary: t('condition_builder_logical_or'),\n onClick: () => updateOperator(index - 1, 'OR')\n }\n ]\n }}\n ref={index === focusRowIndex ? newOperatorButtonRef : null}\n disabled={disabled || readOnly}\n />\n </StyledRowWithSeparator>\n )}\n\n {/* Row with the AtomicCondition */}\n <StyledRow\n aria-label={rowIndexAriaLabel}\n container={{\n gap: 1,\n alignItems,\n direction: isSmallOrAbove ? 'row' : 'column',\n justify: 'between'\n }}\n $isBasicMode={isBasicMode}\n $nested={\n isBasicMode &&\n enableShading &&\n (operatorsList[index] === 'AND' || operatorsList[index - 1] === 'AND')\n }\n ref={index === focusRowIndex ? focusRowRef : null}\n >\n {/* Label */}\n {!isBasicMode && (\n <StyledInputLevelItem item={{ alignSelf: 'start' }} $row={isSmallOrAbove}>\n <StyledLabel>{label}</StyledLabel>\n </StyledInputLevelItem>\n )}\n\n {/* Condition controls */}\n <Flex item={{ grow: 1 }}>\n <ConditionRenderer\n indicateErrors={showErrorIndicators}\n fields={fields}\n index={index}\n condition={leaf}\n onChange={(newCondition: LeafCondition) => {\n const newRow = { id, label, ...newCondition };\n dispatch({ type: UPDATE_ROW, payload: { updateAt: index, newRow } });\n deferConditionChange();\n }}\n validComparators={validComparators}\n dateFunctions={dateFunctions}\n timeZone={timeZone}\n validRhsTypes={validRhsTypes}\n />\n </Flex>\n\n <StyledInputLevelItem\n container={{ justify: 'end' }}\n $row={isSmallOrAbove}\n $bottom={isSmallOrAbove && !isMediumOrAbove}\n >\n {/* Row actions */}\n <Button\n icon\n variant='simple'\n onClick={() => {\n insertRow(index + 1);\n setCachedLogicString('');\n deferConditionChange();\n }}\n label={t('add')}\n aria-label={t('add_condition')}\n disabled={disabled || readOnly}\n >\n <Icon name='plus' />\n </Button>\n <Button\n icon\n variant='simple'\n onClick={() => {\n removeRow(index);\n setCachedLogicString('');\n deferConditionChange();\n }}\n label={t('delete')}\n aria-label={deleteAriaLabel ? t('delete_noun', [deleteAriaLabel]) : undefined}\n disabled={disabled || readOnly}\n >\n <Icon name='trash' />\n </Button>\n </StyledInputLevelItem>\n </StyledRow>\n </Fragment>\n );\n })}\n </div>\n\n {/* LogicString input */}\n {!isBasicMode && (\n <div>\n <Flex container={{ gap: 0.25, direction: 'column' }}>\n <Input\n label={t('condition_builder_advanced_condition_label')}\n additionalInfo={{\n heading: t('condition_builder_advanced_condition_label'),\n content: (\n <div>\n {t('condition_builder_advanced_condition_tooltip', [\n disallowNOT ? 'and/or' : 'and/or/not',\n <pre>\n {disallowNOT\n ? '(1 or 2) and (3 or 4 or 5)'\n : '(1 and 2) or (3 and not 4)'}\n </pre>\n ])}\n </div>\n )\n }}\n type='text'\n placeholder={t('condition_builder_advanced_condition_placeholder')}\n value={logicString\n .replace(/\\bAND\\b/g, 'and')\n .replace(/\\bOR\\b/g, 'or')\n .replace(/\\bNOT\\b/g, 'not')}\n onChange={(e: ChangeEvent<HTMLInputElement>) => {\n setLogicString(e.target.value);\n setCachedLogicString(e.target.value);\n }}\n onBlur={() => {\n validateLogicString(logicString);\n deferConditionChange();\n }}\n status={logicError !== null ? 'error' : undefined}\n info={logicError}\n required\n disabled={disabled}\n readOnly={readOnly || disabled}\n />\n </Flex>\n </div>\n )}\n </StyledConditionBuilder>\n );\n }\n);\nConditionBuilder.defaultProps = defaultProps;\n\nexport default ConditionBuilder;\n"]}
|