@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NumericRangeInput.js","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/RhsControls/NumericRangeInput.tsx"],"names":[],"mappings":"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","sourcesContent":["import { forwardRef, useState } from 'react';\nimport type { Ref } from 'react';\n\nimport { NumberRangeInput, useAfterInitialEffect, useI18n } from '@pega/cosmos-react-core';\nimport type { BaseProps, FormControlProps, NoChildrenProp } from '@pega/cosmos-react-core';\n\nexport interface NumericRangeInputProps extends BaseProps, NoChildrenProp {\n /** Label for the range input. */\n label: FormControlProps['label'];\n /** Determines whether the label is hidden. */\n labelHidden?: FormControlProps['labelHidden'];\n /** Rhs for the condition. */\n rhs?: { start: string | number; end: string | number };\n /** Callback for any modifications to the Rhs. */\n onChange: (rhs: { start: number | undefined; end: number | undefined }) => void;\n /** Used to indicate any errors on the control. */\n status?: 'error';\n /**\n * Determines whether decimals can be entered.\n * @default true\n */\n allowDecimal?: boolean;\n /** Determines whether value is stored in the database in the range of 0 to 1 or 0 to 100. */\n unit?: 'percent_1' | 'percent_100';\n /** Ref to the component. */\n ref?: Ref<HTMLFieldSetElement>;\n}\n\nexport const NumericRangeInput = forwardRef<HTMLFieldSetElement, NumericRangeInputProps>(\n ({ rhs, onChange, status, allowDecimal = true, unit, ...props }, ref) => {\n const t = useI18n();\n // Formats a value as a percentage and fixes floating point rounding errors in input box\n const convertPercentToDisplayValue = (value: string | number | undefined) => {\n if (unit === 'percent_1') {\n const num = typeof value === 'number' ? value : Number(value);\n // Number value of empty string is 0, which we don't want, so we return just value instead\n if (!Number.isNaN(num) && value !== '') {\n return parseFloat((num * 100).toFixed(2));\n }\n }\n return value;\n };\n\n const [internalValue, setInternalValue] = useState<{\n start: string | undefined;\n end: string | undefined;\n }>({\n start: convertPercentToDisplayValue(rhs?.start)?.toString(),\n end: convertPercentToDisplayValue(rhs?.end)?.toString()\n });\n\n useAfterInitialEffect(() => {\n setInternalValue({\n start: convertPercentToDisplayValue(rhs?.start)?.toString(),\n end: convertPercentToDisplayValue(rhs?.end)?.toString()\n });\n }, [rhs?.start, rhs?.end]);\n\n const handleChange = (newValue: { start: string; end: string }) => {\n setInternalValue(newValue);\n };\n\n const handleBlur = (newValue: { start: string; end: string }) => {\n let outStartValue: number | undefined;\n let outEndValue: number | undefined;\n if (newValue.start) {\n const valueAsNumber = Number(newValue.start);\n if (!Number.isNaN(valueAsNumber)) {\n outStartValue = unit === 'percent_1' ? valueAsNumber / 100 : valueAsNumber;\n }\n }\n if (newValue.end) {\n const valueAsNumber = Number(newValue.end);\n if (!Number.isNaN(valueAsNumber)) {\n outEndValue = unit === 'percent_1' ? valueAsNumber / 100 : valueAsNumber;\n }\n }\n onChange({\n start: outStartValue,\n end: outEndValue\n });\n };\n\n return (\n <NumberRangeInput\n {...props}\n ref={ref}\n value={internalValue}\n onChange={handleChange}\n onBlur={handleBlur}\n status={status}\n info={status === 'error' ? t('condition_builder_invalid_number_range') : undefined}\n numberOfDecimals={allowDecimal ? undefined : 0}\n unit={unit === 'percent_1' || unit === 'percent_100' ? 'percent' : undefined}\n fromPlaceholder={t('range_from_numeric')}\n toPlaceholder={t('range_to_numeric')}\n />\n );\n }\n);\n"]}
|
|
@@ -8,7 +8,7 @@ interface ValueSelectorProps<T extends {
|
|
|
8
8
|
}> extends BaseProps, NoChildrenProp {
|
|
9
9
|
mode: ComboBoxProps['mode'];
|
|
10
10
|
/** Previous selection */
|
|
11
|
-
values: string[] | string;
|
|
11
|
+
values: string[] | string | undefined;
|
|
12
12
|
/** Current selected LHS */
|
|
13
13
|
selectedField: T;
|
|
14
14
|
/** Current selected comparator */
|
|
@@ -21,13 +21,15 @@ interface ValueSelectorProps<T extends {
|
|
|
21
21
|
onChange: (selection: string[] | string) => void;
|
|
22
22
|
/** Callback for blur */
|
|
23
23
|
onBlur?: (selection?: string[] | string) => void;
|
|
24
|
+
/** Callback for clear */
|
|
25
|
+
onClear?: () => void;
|
|
24
26
|
/** Used to indicate any errors on the control */
|
|
25
27
|
status?: 'error';
|
|
26
28
|
/** Placeholder text to display in empty control */
|
|
27
29
|
placeholder?: ComboBoxProps['placeholder'];
|
|
28
30
|
/** Custom label for input. Makes label visible if provided. */
|
|
29
31
|
label?: ComboBoxProps['label'];
|
|
30
|
-
/** Guidance text that
|
|
32
|
+
/** Guidance text that appears below the input. */
|
|
31
33
|
info?: ComboBoxProps['info'];
|
|
32
34
|
/** sets status and info */
|
|
33
35
|
setApiError?: Dispatch<SetStateAction<string | null>>;
|
|
@@ -36,6 +38,6 @@ interface ValueSelectorProps<T extends {
|
|
|
36
38
|
declare const ValueSelector: <F extends object & {
|
|
37
39
|
id: string;
|
|
38
40
|
possibleValues?: ValueSelection<F>;
|
|
39
|
-
}>({ values, selectedField, comparator, rhs, onChange, onBlur, status, mode, parameters, placeholder, label, info, setApiError }: ValueSelectorProps<F>) => import("react/jsx-runtime").JSX.Element;
|
|
41
|
+
}>({ values, selectedField, comparator, rhs, onChange, onBlur, onClear, status, mode, parameters, placeholder, label, info, setApiError }: ValueSelectorProps<F>) => import("react/jsx-runtime").JSX.Element;
|
|
40
42
|
export default ValueSelector;
|
|
41
43
|
//# sourceMappingURL=ValueSelector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ValueSelector.d.ts","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/RhsControls/ValueSelector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAGtD,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAa,cAAc,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"ValueSelector.d.ts","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/RhsControls/ValueSelector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAGtD,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAa,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAYnG,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EAEd,cAAc,EACf,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAIhD,UAAU,kBAAkB,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;CAAE,CACvF,SAAQ,SAAS,EACf,cAAc;IAChB,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5B,yBAAyB;IACzB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAAC;IACtC,2BAA2B;IAC3B,aAAa,EAAE,CAAC,CAAC;IACjB,kCAAkC;IAClC,UAAU,EAAE,UAAU,CAAC;IACvB,4BAA4B;IAC5B,GAAG,EAAE,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IACvC,oDAAoD;IACpD,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,2BAA2B;IAC3B,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,IAAI,CAAC;IACjD,wBAAwB;IACxB,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,IAAI,CAAC;IACjD,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,iDAAiD;IACjD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mDAAmD;IACnD,WAAW,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAC3C,+DAA+D;IAC/D,KAAK,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/B,kDAAkD;IAClD,IAAI,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7B,2BAA2B;IAC3B,WAAW,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;CACvD;AAgCD,6EAA6E;AAC7E,QAAA,MAAM,aAAa,GAAI,CAAC,SAAS,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;CAAE,EAAE,wIAe3F,kBAAkB,CAAC,CAAC,CAAC,4CA+OvB,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
3
|
-
import { ComboBox, createStringMatcher, hasProp, useI18n, usePrevious } from '@pega/cosmos-react-core';
|
|
3
|
+
import { ComboBox, createStringMatcher, hasProp, Icon, useI18n, usePrevious } from '@pega/cosmos-react-core';
|
|
4
|
+
import { StyledClearButton } from '@pega/cosmos-react-core/lib/components/CompositeInput/CompositeInput.styles';
|
|
4
5
|
const CHUNK_SIZE = 10;
|
|
5
6
|
const getFilteredOptions = (options, filterValue) => {
|
|
6
7
|
const matcher = createStringMatcher(filterValue);
|
|
@@ -26,7 +27,7 @@ const getItems = (item, values) => {
|
|
|
26
27
|
});
|
|
27
28
|
};
|
|
28
29
|
/** A control for selecting multiple values using checkboxes in an overlay */
|
|
29
|
-
const ValueSelector = ({ values, selectedField, comparator, rhs, onChange, onBlur, status, mode, parameters, placeholder, label, info, setApiError }) => {
|
|
30
|
+
const ValueSelector = ({ values, selectedField, comparator, rhs, onChange, onBlur, onClear, status, mode, parameters, placeholder, label, info, setApiError }) => {
|
|
30
31
|
const t = useI18n();
|
|
31
32
|
const inputRef = useRef(null);
|
|
32
33
|
const [filterValue, setFilterValue] = useState('');
|
|
@@ -37,13 +38,14 @@ const ValueSelector = ({ values, selectedField, comparator, rhs, onChange, onBlu
|
|
|
37
38
|
const [items, setItems] = useState([]);
|
|
38
39
|
const [selected, setSelected] = useState();
|
|
39
40
|
const fetchPossibleValues = useCallback((isFirstChunkLoad, subscribed = true) => {
|
|
40
|
-
|
|
41
|
+
const { possibleValues: fn } = selectedField;
|
|
42
|
+
if (typeof fn === 'function' && (isFirstChunkLoad || !loading)) {
|
|
41
43
|
setLoading(true);
|
|
42
44
|
if (isFirstChunkLoad) {
|
|
43
45
|
setApiError?.(null);
|
|
44
46
|
setItems([]);
|
|
45
47
|
}
|
|
46
|
-
|
|
48
|
+
fn({
|
|
47
49
|
searchString: filterValue,
|
|
48
50
|
comparator,
|
|
49
51
|
lhs: selectedField,
|
|
@@ -66,15 +68,7 @@ const ValueSelector = ({ values, selectedField, comparator, rhs, onChange, onBlu
|
|
|
66
68
|
}
|
|
67
69
|
});
|
|
68
70
|
}
|
|
69
|
-
}, [
|
|
70
|
-
isSelectedFieldPossibleValuesFunction,
|
|
71
|
-
loading,
|
|
72
|
-
items,
|
|
73
|
-
selectedField,
|
|
74
|
-
filterValue,
|
|
75
|
-
comparator,
|
|
76
|
-
values
|
|
77
|
-
]);
|
|
71
|
+
}, [loading, items, selectedField, filterValue, comparator, values]);
|
|
78
72
|
useEffect(() => {
|
|
79
73
|
let subscribed = true;
|
|
80
74
|
if (hasProp(rhs, 'parameterId')) {
|
|
@@ -118,11 +112,16 @@ const ValueSelector = ({ values, selectedField, comparator, rhs, onChange, onBlu
|
|
|
118
112
|
useEffect(() => {
|
|
119
113
|
let subscribed = true;
|
|
120
114
|
const handlePossibleValues = (ids, setSelectedFn) => {
|
|
115
|
+
const filteredIds = ids.filter(id => id !== '');
|
|
116
|
+
if (filteredIds.length === 0) {
|
|
117
|
+
setSelectedFn([]);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
121
120
|
const { possibleValues } = selectedField;
|
|
122
121
|
if (typeof possibleValues === 'function') {
|
|
123
122
|
possibleValues({
|
|
124
123
|
lhs: selectedField,
|
|
125
|
-
ids
|
|
124
|
+
ids: filteredIds
|
|
126
125
|
})
|
|
127
126
|
.then(response => {
|
|
128
127
|
if (subscribed) {
|
|
@@ -140,14 +139,14 @@ const ValueSelector = ({ values, selectedField, comparator, rhs, onChange, onBlu
|
|
|
140
139
|
});
|
|
141
140
|
}
|
|
142
141
|
else if (Array.isArray(possibleValues)) {
|
|
143
|
-
const options =
|
|
144
|
-
const optionLabel = possibleValues.find(opt => typeof opt === 'object' && opt.id === id);
|
|
142
|
+
const options = filteredIds.map(id => {
|
|
143
|
+
const optionLabel = possibleValues.find((opt) => typeof opt === 'object' && opt.id === id);
|
|
145
144
|
return { id, text: optionLabel?.primary ?? id };
|
|
146
145
|
});
|
|
147
146
|
setSelectedFn(options);
|
|
148
147
|
}
|
|
149
148
|
};
|
|
150
|
-
if (typeof values === 'string') {
|
|
149
|
+
if (typeof values === 'string' && values) {
|
|
151
150
|
if (hasProp(rhs, 'parameterId')) {
|
|
152
151
|
const selectedItem = parameters.find(item => item.id === values);
|
|
153
152
|
setSelected({
|
|
@@ -163,10 +162,10 @@ const ValueSelector = ({ values, selectedField, comparator, rhs, onChange, onBlu
|
|
|
163
162
|
});
|
|
164
163
|
}
|
|
165
164
|
}
|
|
166
|
-
else if (values.length > 0) {
|
|
165
|
+
else if (Array.isArray(values) && values.length > 0) {
|
|
167
166
|
const onRemove = (value) => {
|
|
168
167
|
onChange((() => {
|
|
169
|
-
const current = values;
|
|
168
|
+
const current = Array.isArray(values) ? values : [];
|
|
170
169
|
return current.filter(selection => selection !== value);
|
|
171
170
|
})());
|
|
172
171
|
};
|
|
@@ -209,17 +208,24 @@ const ValueSelector = ({ values, selectedField, comparator, rhs, onChange, onBlu
|
|
|
209
208
|
}
|
|
210
209
|
else {
|
|
211
210
|
onChange((() => {
|
|
212
|
-
const current = values;
|
|
211
|
+
const current = Array.isArray(values) ? values : [];
|
|
213
212
|
return current.includes(id)
|
|
214
213
|
? current.filter(selection => selection !== id)
|
|
215
|
-
: [...
|
|
214
|
+
: [...current, id];
|
|
216
215
|
})());
|
|
217
216
|
}
|
|
218
217
|
},
|
|
219
218
|
loading,
|
|
220
219
|
loadMore: hasMore ? () => fetchPossibleValues(false) : undefined,
|
|
221
220
|
accent: createStringMatcher(filterValue)
|
|
222
|
-
}, onMenuOpen: () => fetchPossibleValues(true), selected: selected, status: status, info: info
|
|
221
|
+
}, onMenuOpen: () => fetchPossibleValues(true), selected: selected, status: status, info: info, actions: onClear && (_jsx(StyledClearButton, { icon: true, variant: 'simple', label: t('clear'), onClick: () => {
|
|
222
|
+
onChange(mode === 'single-select' ? '' : []);
|
|
223
|
+
onClear();
|
|
224
|
+
if (inputRef.current) {
|
|
225
|
+
const inputEl = inputRef.current.querySelector('input');
|
|
226
|
+
inputEl?.focus();
|
|
227
|
+
}
|
|
228
|
+
}, children: _jsx(Icon, { name: 'times' }) })) }));
|
|
223
229
|
};
|
|
224
230
|
export default ValueSelector;
|
|
225
231
|
//# sourceMappingURL=ValueSelector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ValueSelector.js","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/RhsControls/ValueSelector.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { Dispatch, SetStateAction } from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport type { BaseProps, ComboBoxProps, MenuProps, NoChildrenProp } from '@pega/cosmos-react-core';\nimport {\n ComboBox,\n createStringMatcher,\n hasProp,\n useI18n,\n usePrevious\n} from '@pega/cosmos-react-core';\nimport type { Selected } from '@pega/cosmos-react-core/lib/components/ComboBox/ComboBox.types';\n\nimport type {\n LeafCondition,\n ParameterValue,\n ReferenceValue,\n ValueSelection,\n ValueSelectionFunction\n} from '../ConditionBuilder.types';\nimport type { Comparator } from '../core/types';\n\nconst CHUNK_SIZE = 10;\n\ninterface ValueSelectorProps<T extends { id: string; possibleValues?: ValueSelection<T> }>\n extends BaseProps,\n NoChildrenProp {\n mode: ComboBoxProps['mode'];\n /** Previous selection */\n values: string[] | string;\n /** Current selected LHS */\n selectedField: T;\n /** Current selected comparator */\n comparator: Comparator;\n /** Rhs for the condition */\n rhs: NonNullable<LeafCondition['rhs']>;\n /** Passed Parameters array for Rhstype PARAMETER */\n parameters: ParameterValue[];\n /** Callback for changes */\n onChange: (selection: string[] | string) => void;\n /** Callback for blur */\n onBlur?: (selection?: string[] | string) => void;\n /** Used to indicate any errors on the control */\n status?: 'error';\n /** Placeholder text to display in empty control */\n placeholder?: ComboBoxProps['placeholder'];\n /** Custom label for input. Makes label visible if provided. */\n label?: ComboBoxProps['label'];\n /** Guidance text that apppears below the input. */\n info?: ComboBoxProps['info'];\n /** sets status and info */\n setApiError?: Dispatch<SetStateAction<string | null>>;\n}\n\nconst getFilteredOptions = (\n options: (string | ParameterValue | ReferenceValue)[],\n filterValue: string\n) => {\n const matcher = createStringMatcher(filterValue);\n return options.filter(option => {\n if (typeof option === 'object') return matcher.test(option.primary);\n return matcher.test(option);\n });\n};\n\nconst getItems = (\n item: (string | ParameterValue | ReferenceValue)[],\n values: string[] | string\n) => {\n return item.map(option => {\n if (typeof option === 'object') {\n return {\n ...option,\n selected: Array.isArray(values) ? values.includes(option.id) : values === option.id\n };\n }\n return {\n id: option,\n primary: option,\n selected: Array.isArray(values) ? values.includes(option) : values === option\n };\n });\n};\n\n/** A control for selecting multiple values using checkboxes in an overlay */\nconst ValueSelector = <F extends object & { id: string; possibleValues?: ValueSelection<F> }>({\n values,\n selectedField,\n comparator,\n rhs,\n onChange,\n onBlur,\n status,\n mode,\n parameters,\n placeholder,\n label,\n info,\n setApiError\n}: ValueSelectorProps<F>) => {\n const t = useI18n();\n\n const inputRef = useRef<HTMLDivElement>(null);\n\n const [filterValue, setFilterValue] = useState('');\n const prevFilterValue = usePrevious(filterValue);\n const [loading, setLoading] = useState(false);\n const isSelectedFieldPossibleValuesFunction =\n hasProp(selectedField, 'possibleValues') && typeof selectedField.possibleValues === 'function';\n const [hasMore, setHasMore] = useState(isSelectedFieldPossibleValuesFunction);\n const [items, setItems] = useState<MenuProps['items']>([]);\n const [selected, setSelected] = useState<ComboBoxProps['selected']>();\n\n const fetchPossibleValues = useCallback(\n (isFirstChunkLoad: boolean, subscribed: boolean = true) => {\n if (isSelectedFieldPossibleValuesFunction && (isFirstChunkLoad || !loading)) {\n setLoading(true);\n if (isFirstChunkLoad) {\n setApiError?.(null);\n setItems([]);\n }\n (selectedField.possibleValues as ValueSelectionFunction<F>)({\n searchString: filterValue,\n comparator,\n lhs: selectedField,\n pageNumber: isFirstChunkLoad ? 1 : Math.floor(items.length / CHUNK_SIZE) + 1,\n pageSize: CHUNK_SIZE\n })\n .then(response => {\n if (subscribed) {\n setApiError?.(null);\n setHasMore(response.length >= CHUNK_SIZE);\n const newItems = getItems(response, values);\n setItems(curr => (isFirstChunkLoad ? newItems : [...curr, ...newItems]));\n setLoading(false);\n }\n })\n .catch(err => {\n if (err && subscribed) {\n setApiError?.(t('condition_builder_possible_values_error'));\n setLoading(false);\n }\n });\n }\n },\n [\n isSelectedFieldPossibleValuesFunction,\n loading,\n items,\n selectedField,\n filterValue,\n comparator,\n values\n ]\n );\n\n useEffect(() => {\n let subscribed = true;\n\n if (hasProp(rhs, 'parameterId')) {\n setItems(getItems(getFilteredOptions(parameters, filterValue), values));\n } else if (hasProp(selectedField, 'possibleValues')) {\n const { possibleValues } = selectedField;\n if (typeof possibleValues === 'function') {\n if (prevFilterValue !== filterValue) {\n fetchPossibleValues(true, subscribed);\n } else {\n setItems(curr =>\n curr.map(i => ({\n ...i,\n selected: Array.isArray(values) ? values.includes(i.id) : values === i.id\n }))\n );\n }\n } else if (Array.isArray(possibleValues)) {\n setItems(getItems(getFilteredOptions(possibleValues, filterValue), values));\n } else {\n setItems([]);\n }\n }\n\n return () => {\n subscribed = false;\n };\n }, [\n rhs,\n parameters,\n filterValue,\n values,\n selectedField.id,\n selectedField.possibleValues,\n comparator\n ]);\n\n useEffect(() => {\n setFilterValue('');\n }, [selectedField, comparator]);\n\n useEffect(() => {\n let subscribed = true;\n\n const handlePossibleValues = (ids: string[], setSelectedFn: (options: Selected[]) => void) => {\n const { possibleValues } = selectedField;\n if (typeof possibleValues === 'function') {\n (possibleValues as ValueSelectionFunction<F>)({\n lhs: selectedField,\n ids\n })\n .then(response => {\n if (subscribed) {\n const options = response.map(option =>\n typeof option === 'object'\n ? { id: option.id, text: option.primary }\n : { id: option, text: option }\n );\n setSelectedFn(options);\n }\n })\n .catch(err => {\n if (err && subscribed) {\n setApiError?.(t('condition_builder_possible_values_error'));\n return [];\n }\n });\n } else if (Array.isArray(possibleValues)) {\n const options = ids.map(id => {\n const optionLabel = possibleValues.find(\n opt => typeof opt === 'object' && opt.id === id\n ) as ReferenceValue;\n return { id, text: optionLabel?.primary ?? id };\n });\n setSelectedFn(options);\n }\n };\n\n if (typeof values === 'string') {\n if (hasProp(rhs, 'parameterId')) {\n const selectedItem = parameters.find(item => item.id === values);\n setSelected({\n items: { id: values, text: selectedItem !== undefined ? selectedItem.primary : values }\n });\n } else if (hasProp(selectedField, 'possibleValues')) {\n handlePossibleValues([values], options => setSelected({ items: options[0] }));\n } else {\n setSelected({\n items: { id: values, text: values }\n });\n }\n } else if (values.length > 0) {\n const onRemove = (value: string) => {\n onChange(\n (() => {\n const current = values as string[];\n return current.filter(selection => selection !== value) as string | string[];\n })()\n );\n };\n if (hasProp(rhs, 'parameterId')) {\n setSelected({\n items: values.map(s => {\n const optionLabel = parameters.find(opt => typeof opt === 'object' && opt.id === s);\n return { id: s, text: optionLabel?.primary ?? s };\n }),\n onRemove\n });\n } else if (hasProp(selectedField, 'possibleValues')) {\n handlePossibleValues(values, options => setSelected({ items: options, onRemove }));\n } else {\n setSelected({ items: values.map(s => ({ id: s, text: s })), onRemove });\n }\n } else {\n setSelected(undefined);\n }\n\n return () => {\n subscribed = false;\n };\n }, [values, rhs, parameters, selectedField.id, selectedField.possibleValues]);\n\n return (\n <ComboBox\n ref={inputRef}\n mode={mode}\n label={label ?? t('condition_builder_possible_values_label')}\n placeholder={placeholder}\n value={filterValue}\n onChange={e => {\n setFilterValue(e.target.value);\n if (mode === 'single-select' && !e.target.value) onChange('');\n }}\n onBlur={() => {\n onBlur?.(values);\n setFilterValue('');\n }}\n menu={{\n items,\n onItemClick: id => {\n if (mode === 'single-select') {\n setFilterValue('');\n onChange(id);\n } else {\n onChange(\n (() => {\n const current = values as string[];\n return current.includes(id)\n ? current.filter(selection => selection !== id)\n : [...values, id];\n })()\n );\n }\n },\n loading,\n loadMore: hasMore ? () => fetchPossibleValues(false) : undefined,\n accent: createStringMatcher(filterValue)\n }}\n onMenuOpen={() => fetchPossibleValues(true)}\n selected={selected}\n status={status}\n info={info}\n />\n );\n};\n\nexport default ValueSelector;\n"]}
|
|
1
|
+
{"version":3,"file":"ValueSelector.js","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/RhsControls/ValueSelector.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { Dispatch, SetStateAction } from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport type { BaseProps, ComboBoxProps, MenuProps, NoChildrenProp } from '@pega/cosmos-react-core';\nimport {\n ComboBox,\n createStringMatcher,\n hasProp,\n Icon,\n useI18n,\n usePrevious\n} from '@pega/cosmos-react-core';\nimport type { Selected } from '@pega/cosmos-react-core/lib/components/ComboBox/ComboBox.types';\nimport { StyledClearButton } from '@pega/cosmos-react-core/lib/components/CompositeInput/CompositeInput.styles';\n\nimport type {\n LeafCondition,\n ParameterValue,\n ReferenceValue,\n ValueSelection\n} from '../ConditionBuilder.types';\nimport type { Comparator } from '../core/types';\n\nconst CHUNK_SIZE = 10;\n\ninterface ValueSelectorProps<T extends { id: string; possibleValues?: ValueSelection<T> }>\n extends BaseProps,\n NoChildrenProp {\n mode: ComboBoxProps['mode'];\n /** Previous selection */\n values: string[] | string | undefined;\n /** Current selected LHS */\n selectedField: T;\n /** Current selected comparator */\n comparator: Comparator;\n /** Rhs for the condition */\n rhs: NonNullable<LeafCondition['rhs']>;\n /** Passed Parameters array for Rhstype PARAMETER */\n parameters: ParameterValue[];\n /** Callback for changes */\n onChange: (selection: string[] | string) => void;\n /** Callback for blur */\n onBlur?: (selection?: string[] | string) => void;\n /** Callback for clear */\n onClear?: () => void;\n /** Used to indicate any errors on the control */\n status?: 'error';\n /** Placeholder text to display in empty control */\n placeholder?: ComboBoxProps['placeholder'];\n /** Custom label for input. Makes label visible if provided. */\n label?: ComboBoxProps['label'];\n /** Guidance text that appears below the input. */\n info?: ComboBoxProps['info'];\n /** sets status and info */\n setApiError?: Dispatch<SetStateAction<string | null>>;\n}\n\nconst getFilteredOptions = (\n options: (string | ParameterValue | ReferenceValue)[],\n filterValue: string\n) => {\n const matcher = createStringMatcher(filterValue);\n return options.filter(option => {\n if (typeof option === 'object') return matcher.test(option.primary);\n return matcher.test(option);\n });\n};\n\nconst getItems = (\n item: (string | ParameterValue | ReferenceValue)[],\n values: string[] | string | undefined\n) => {\n return item.map(option => {\n if (typeof option === 'object') {\n return {\n ...option,\n selected: Array.isArray(values) ? values.includes(option.id) : values === option.id\n };\n }\n return {\n id: option,\n primary: option,\n selected: Array.isArray(values) ? values.includes(option) : values === option\n };\n });\n};\n\n/** A control for selecting multiple values using checkboxes in an overlay */\nconst ValueSelector = <F extends object & { id: string; possibleValues?: ValueSelection<F> }>({\n values,\n selectedField,\n comparator,\n rhs,\n onChange,\n onBlur,\n onClear,\n status,\n mode,\n parameters,\n placeholder,\n label,\n info,\n setApiError\n}: ValueSelectorProps<F>) => {\n const t = useI18n();\n\n const inputRef = useRef<HTMLDivElement>(null);\n\n const [filterValue, setFilterValue] = useState('');\n const prevFilterValue = usePrevious(filterValue);\n const [loading, setLoading] = useState(false);\n const isSelectedFieldPossibleValuesFunction =\n hasProp(selectedField, 'possibleValues') && typeof selectedField.possibleValues === 'function';\n const [hasMore, setHasMore] = useState(isSelectedFieldPossibleValuesFunction);\n const [items, setItems] = useState<MenuProps['items']>([]);\n const [selected, setSelected] = useState<ComboBoxProps['selected']>();\n\n const fetchPossibleValues = useCallback(\n (isFirstChunkLoad: boolean, subscribed: boolean = true) => {\n const { possibleValues: fn } = selectedField;\n if (typeof fn === 'function' && (isFirstChunkLoad || !loading)) {\n setLoading(true);\n if (isFirstChunkLoad) {\n setApiError?.(null);\n setItems([]);\n }\n fn({\n searchString: filterValue,\n comparator,\n lhs: selectedField,\n pageNumber: isFirstChunkLoad ? 1 : Math.floor(items.length / CHUNK_SIZE) + 1,\n pageSize: CHUNK_SIZE\n })\n .then(response => {\n if (subscribed) {\n setApiError?.(null);\n setHasMore(response.length >= CHUNK_SIZE);\n const newItems = getItems(response, values);\n setItems(curr => (isFirstChunkLoad ? newItems : [...curr, ...newItems]));\n setLoading(false);\n }\n })\n .catch(err => {\n if (err && subscribed) {\n setApiError?.(t('condition_builder_possible_values_error'));\n setLoading(false);\n }\n });\n }\n },\n [loading, items, selectedField, filterValue, comparator, values]\n );\n\n useEffect(() => {\n let subscribed = true;\n\n if (hasProp(rhs, 'parameterId')) {\n setItems(getItems(getFilteredOptions(parameters, filterValue), values));\n } else if (hasProp(selectedField, 'possibleValues')) {\n const { possibleValues } = selectedField;\n if (typeof possibleValues === 'function') {\n if (prevFilterValue !== filterValue) {\n fetchPossibleValues(true, subscribed);\n } else {\n setItems(curr =>\n curr.map(i => ({\n ...i,\n selected: Array.isArray(values) ? values.includes(i.id) : values === i.id\n }))\n );\n }\n } else if (Array.isArray(possibleValues)) {\n setItems(getItems(getFilteredOptions(possibleValues, filterValue), values));\n } else {\n setItems([]);\n }\n }\n\n return () => {\n subscribed = false;\n };\n }, [\n rhs,\n parameters,\n filterValue,\n values,\n selectedField.id,\n selectedField.possibleValues,\n comparator\n ]);\n\n useEffect(() => {\n setFilterValue('');\n }, [selectedField, comparator]);\n\n useEffect(() => {\n let subscribed = true;\n\n const handlePossibleValues = (ids: string[], setSelectedFn: (options: Selected[]) => void) => {\n const filteredIds = ids.filter(id => id !== '');\n if (filteredIds.length === 0) {\n setSelectedFn([]);\n return;\n }\n const { possibleValues } = selectedField;\n if (typeof possibleValues === 'function') {\n possibleValues({\n lhs: selectedField,\n ids: filteredIds\n })\n .then(response => {\n if (subscribed) {\n const options = response.map(option =>\n typeof option === 'object'\n ? { id: option.id, text: option.primary }\n : { id: option, text: option }\n );\n setSelectedFn(options);\n }\n })\n .catch(err => {\n if (err && subscribed) {\n setApiError?.(t('condition_builder_possible_values_error'));\n return [];\n }\n });\n } else if (Array.isArray(possibleValues)) {\n const options = filteredIds.map(id => {\n const optionLabel = possibleValues.find(\n (opt): opt is ReferenceValue => typeof opt === 'object' && opt.id === id\n );\n return { id, text: optionLabel?.primary ?? id };\n });\n setSelectedFn(options);\n }\n };\n\n if (typeof values === 'string' && values) {\n if (hasProp(rhs, 'parameterId')) {\n const selectedItem = parameters.find(item => item.id === values);\n setSelected({\n items: { id: values, text: selectedItem !== undefined ? selectedItem.primary : values }\n });\n } else if (hasProp(selectedField, 'possibleValues')) {\n handlePossibleValues([values], options => setSelected({ items: options[0] }));\n } else {\n setSelected({\n items: { id: values, text: values }\n });\n }\n } else if (Array.isArray(values) && values.length > 0) {\n const onRemove = (value: string) => {\n onChange(\n (() => {\n const current = Array.isArray(values) ? values : [];\n return current.filter(selection => selection !== value);\n })()\n );\n };\n if (hasProp(rhs, 'parameterId')) {\n setSelected({\n items: values.map(s => {\n const optionLabel = parameters.find(opt => typeof opt === 'object' && opt.id === s);\n return { id: s, text: optionLabel?.primary ?? s };\n }),\n onRemove\n });\n } else if (hasProp(selectedField, 'possibleValues')) {\n handlePossibleValues(values, options => setSelected({ items: options, onRemove }));\n } else {\n setSelected({ items: values.map(s => ({ id: s, text: s })), onRemove });\n }\n } else {\n setSelected(undefined);\n }\n\n return () => {\n subscribed = false;\n };\n }, [values, rhs, parameters, selectedField.id, selectedField.possibleValues]);\n\n return (\n <ComboBox\n ref={inputRef}\n mode={mode}\n label={label ?? t('condition_builder_possible_values_label')}\n placeholder={placeholder}\n value={filterValue}\n onChange={e => {\n setFilterValue(e.target.value);\n if (mode === 'single-select' && !e.target.value) onChange('');\n }}\n onBlur={() => {\n onBlur?.(values);\n setFilterValue('');\n }}\n menu={{\n items,\n onItemClick: id => {\n if (mode === 'single-select') {\n setFilterValue('');\n onChange(id);\n } else {\n onChange(\n (() => {\n const current = Array.isArray(values) ? values : [];\n return current.includes(id)\n ? current.filter(selection => selection !== id)\n : [...current, id];\n })()\n );\n }\n },\n loading,\n loadMore: hasMore ? () => fetchPossibleValues(false) : undefined,\n accent: createStringMatcher(filterValue)\n }}\n onMenuOpen={() => fetchPossibleValues(true)}\n selected={selected}\n status={status}\n info={info}\n actions={\n onClear && (\n <StyledClearButton\n icon\n variant='simple'\n label={t('clear')}\n onClick={() => {\n onChange(mode === 'single-select' ? '' : []);\n onClear();\n if (inputRef.current) {\n const inputEl = inputRef.current.querySelector('input');\n inputEl?.focus();\n }\n }}\n >\n <Icon name='times' />\n </StyledClearButton>\n )\n }\n />\n );\n};\n\nexport default ValueSelector;\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { FunctionComponent
|
|
2
|
-
import type { BaseProps, ForwardProps
|
|
1
|
+
import type { FunctionComponent } from 'react';
|
|
2
|
+
import type { BaseProps, ForwardProps } from '@pega/cosmos-react-core';
|
|
3
3
|
import type { FieldType, Comparator, RHSType } from '../core/types';
|
|
4
4
|
import type { LeafCondition, Field, DateFunctionsByType } from '../ConditionBuilder.types';
|
|
5
5
|
/**
|
|
@@ -12,7 +12,7 @@ import type { LeafCondition, Field, DateFunctionsByType } from '../ConditionBuil
|
|
|
12
12
|
export declare function isValidRhs(rhs: LeafCondition['rhs'], lhs: LeafCondition['lhs'], fields: Field[], fieldType?: FieldType, trimValues?: boolean): boolean;
|
|
13
13
|
/** For a condition with the given comparator and lhs-field-type, determines an appropriate default value for the Rhs */
|
|
14
14
|
export declare function getDefaultRhs(fieldType: FieldType, comparator: Comparator, validRhsTypes: Set<RHSType>, dateFunctions?: DateFunctionsByType): LeafCondition['rhs'];
|
|
15
|
-
export declare function truncateISODateString(dateString: string, fieldType: FieldType): string;
|
|
15
|
+
export declare function truncateISODateString(dateString: string, fieldType: FieldType, withSeconds?: boolean): string;
|
|
16
16
|
/** Type definition for the input props of RhsControls */
|
|
17
17
|
interface RhsControlProps extends BaseProps {
|
|
18
18
|
/** Lhs for the condition */
|
|
@@ -33,8 +33,8 @@ interface RhsControlProps extends BaseProps {
|
|
|
33
33
|
validRhsTypes: Set<RHSType>;
|
|
34
34
|
/** Passed to enable additional date controls on the RHS, when a DATE_TIME/DATE_ONLY field is selected on the LHS */
|
|
35
35
|
dateFunctions?: DateFunctionsByType;
|
|
36
|
-
/**
|
|
37
|
-
|
|
36
|
+
/** IANA timezone string used to initialize date/time pickers with the operator's timezone */
|
|
37
|
+
timeZone?: string;
|
|
38
38
|
}
|
|
39
39
|
/** A controlled component for controls on a Condition's RHS */
|
|
40
40
|
declare const RhsControls: FunctionComponent<RhsControlProps & ForwardProps>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/RhsControls/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAe,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/RhsControls/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAe,MAAM,OAAO,CAAC;AAa5D,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAMvE,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AA2C3F;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,EACzB,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,EACzB,MAAM,EAAE,KAAK,EAAE,EACf,SAAS,CAAC,EAAE,SAAS,EACrB,UAAU,GAAE,OAAe,GAC1B,OAAO,CA4GT;AAED,wHAAwH;AACxH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,EAC3B,aAAa,CAAC,EAAE,mBAAmB,GAClC,aAAa,CAAC,KAAK,CAAC,CAgDtB;AAID,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,SAAS,EACpB,WAAW,UAAQ,GAClB,MAAM,CAkBR;AAED,yDAAyD;AACzD,UAAU,eAAgB,SAAQ,SAAS;IACzC,4BAA4B;IAC5B,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IAE1B,mCAAmC;IACnC,UAAU,EAAE,UAAU,CAAC;IAEvB,4BAA4B;IAC5B,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IAE1B,4EAA4E;IAC5E,MAAM,EAAE,KAAK,EAAE,CAAC;IAEhB,gDAAgD;IAChD,QAAQ,EAAE,CAAC,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAEhE,+DAA+D;IAC/D,cAAc,EAAE,OAAO,CAAC;IAExB,0BAA0B;IAC1B,aAAa,EAAE,KAAK,GAAG,QAAQ,CAAC;IAEhC,uDAAuD;IACvD,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAE5B,oHAAoH;IACpH,aAAa,CAAC,EAAE,mBAAmB,CAAC;IAEpC,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,+DAA+D;AAC/D,QAAA,MAAM,WAAW,EAAE,iBAAiB,CAAC,eAAe,GAAG,YAAY,CA2alE,CAAC;AACF,eAAe,WAAW,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useState,
|
|
3
|
-
import { DateInput, DateTimeInput, Flex, Input, hasProp, TimeInput, useI18n, DateRangeInput, TimeRangeInput
|
|
2
|
+
import { useState, useMemo } from 'react';
|
|
3
|
+
import { DateInput, DateTimeInput, Flex, Input, hasProp, TimeInput, useI18n, DateRangeInput, TimeRangeInput } from '@pega/cosmos-react-core';
|
|
4
4
|
import { convertTimeValueToMs } from '../core/time-utils';
|
|
5
5
|
import { getItem } from '../core/utils';
|
|
6
6
|
import ValueSelector from './ValueSelector';
|
|
@@ -9,6 +9,8 @@ import RhsModeSwitch from './RhsModeSwitch';
|
|
|
9
9
|
import TimePeriodInput from './TimePeriodInput';
|
|
10
10
|
import TimePeriodMenu from './TimePeriodMenu';
|
|
11
11
|
import NumericInput from './NumericInput';
|
|
12
|
+
import { NumericRangeInput } from './NumericRangeInput';
|
|
13
|
+
import { CSVInput } from './CSVInput';
|
|
12
14
|
function isValidLiteralValue(value, fieldType, trimValues = false) {
|
|
13
15
|
// Identify any invalid numbers (e.g. when `-` is entered)
|
|
14
16
|
if (typeof value === 'number') {
|
|
@@ -102,15 +104,25 @@ export function isValidRhs(rhs, lhs, fields, fieldType, trimValues = false) {
|
|
|
102
104
|
!isValidLiteralValue(rhs.end, fieldType, trimValues)) {
|
|
103
105
|
return false;
|
|
104
106
|
}
|
|
107
|
+
if (fieldType === 'DECIMAL' || fieldType === 'INTEGER') {
|
|
108
|
+
return (!Number.isNaN(Number(rhs.start)) &&
|
|
109
|
+
!Number.isNaN(Number(rhs.end)) &&
|
|
110
|
+
Number(rhs.start) < Number(rhs.end));
|
|
111
|
+
}
|
|
105
112
|
if (fieldType === 'TIME_ONLY') {
|
|
113
|
+
// Equal range endpoints are valid because the transformer expands them
|
|
114
|
+
// to cover the unit implied by the input precision (HH:mm → whole minute,
|
|
115
|
+
// HH:mm:ss → whole second).
|
|
106
116
|
if (typeof rhs.start === 'number' && typeof rhs.end === 'number')
|
|
107
|
-
return rhs.start
|
|
117
|
+
return rhs.start <= rhs.end;
|
|
108
118
|
if (typeof rhs.start === 'string' && typeof rhs.end === 'string')
|
|
109
|
-
return convertTimeValueToMs(rhs.start)
|
|
119
|
+
return convertTimeValueToMs(rhs.start) <= convertTimeValueToMs(rhs.end);
|
|
110
120
|
}
|
|
111
121
|
const startDate = new Date(rhs.start);
|
|
112
122
|
const endDate = new Date(rhs.end);
|
|
113
|
-
|
|
123
|
+
if (Number.isNaN(startDate.getTime()) || Number.isNaN(endDate.getTime()))
|
|
124
|
+
return false;
|
|
125
|
+
return startDate <= endDate;
|
|
114
126
|
}
|
|
115
127
|
return true;
|
|
116
128
|
}
|
|
@@ -156,7 +168,7 @@ export function getDefaultRhs(fieldType, comparator, validRhsTypes, dateFunction
|
|
|
156
168
|
}
|
|
157
169
|
// Truncates output values from DateInput/DateTimeInput to return a wall time on the RHS
|
|
158
170
|
// NOTE: This assumes that the input date is set up on the UTC timezone
|
|
159
|
-
export function truncateISODateString(dateString, fieldType) {
|
|
171
|
+
export function truncateISODateString(dateString, fieldType, withSeconds = false) {
|
|
160
172
|
const date = new Date(dateString);
|
|
161
173
|
const YYYY = date.getUTCFullYear().toString().padStart(4, '0');
|
|
162
174
|
const MM = (date.getUTCMonth() + 1).toString().padStart(2, '0');
|
|
@@ -168,14 +180,14 @@ export function truncateISODateString(dateString, fieldType) {
|
|
|
168
180
|
const mm = date.getUTCMinutes().toString().padStart(2, '0');
|
|
169
181
|
const ss = date.getUTCSeconds().toString().padStart(2, '0');
|
|
170
182
|
if (fieldType === 'TIME_ONLY')
|
|
171
|
-
return `${hh}:${mm}:${ss}`;
|
|
183
|
+
return withSeconds ? `${hh}:${mm}:${ss}` : `${hh}:${mm}`;
|
|
172
184
|
// cspell:disable-next-line
|
|
173
185
|
// For DATE_TIME fields, returning a YYYY-MM-DDTHH:mm format and discarding the time-zone etc. to be consistent with the previous spec which was returning a wall time
|
|
174
186
|
return `${YYYY}-${MM}-${DD}T${hh}:${mm}`;
|
|
175
187
|
}
|
|
176
188
|
/** A controlled component for controls on a Condition's RHS */
|
|
177
189
|
const RhsControls = (props) => {
|
|
178
|
-
const { lhs, comparator, rhs, fields, onChange, indicateErrors, itemDirection, validRhsTypes, dateFunctions,
|
|
190
|
+
const { lhs, comparator, rhs, fields, onChange, indicateErrors, itemDirection, validRhsTypes, dateFunctions, timeZone } = props;
|
|
179
191
|
const t = useI18n();
|
|
180
192
|
const [apiError, setApiError] = useState(null);
|
|
181
193
|
// Find the field corresponding to the LHS
|
|
@@ -203,15 +215,6 @@ const RhsControls = (props) => {
|
|
|
203
215
|
};
|
|
204
216
|
return findMatchingObjectType(fields, matchingField.type);
|
|
205
217
|
}, [fields, lhs]);
|
|
206
|
-
// Set up a CSV input for IN/NOT_IN comparators
|
|
207
|
-
const [csvInput, setCsvInput] = useState(rhs && hasProp(rhs, 'values') ? rhs.values.join(', ') : '');
|
|
208
|
-
useEffect(() => {
|
|
209
|
-
// If moving away from the CSV-mode, clear the CSV Input.
|
|
210
|
-
// This ensures that if a different `rhs.values` is passed (a new empty array can be passed when an applicable comparator is selected), the local state matches the new input.
|
|
211
|
-
if (csvInput && (!rhs || !hasProp(rhs, 'values'))) {
|
|
212
|
-
setCsvInput('');
|
|
213
|
-
}
|
|
214
|
-
}, [rhs]);
|
|
215
218
|
// If a field is not selected or if the comparator doesn't need any RHS, don't render anything
|
|
216
219
|
if (rhs === undefined) {
|
|
217
220
|
return _jsx("div", {}); // Rendering a placeholder div to keep the layout consistent
|
|
@@ -222,6 +225,7 @@ const RhsControls = (props) => {
|
|
|
222
225
|
return _jsx("div", {}); // Rendering a placeholder div to keep the layout consistent
|
|
223
226
|
}
|
|
224
227
|
const fieldType = matchingField.type;
|
|
228
|
+
const fieldUnit = matchingField.unit;
|
|
225
229
|
const parameters = matchingField.parameters !== undefined ? matchingField.parameters : [];
|
|
226
230
|
// If errors should be indicated inline, validate the current rhs
|
|
227
231
|
let showError = false;
|
|
@@ -265,7 +269,7 @@ const RhsControls = (props) => {
|
|
|
265
269
|
onChange({ value: valueAsTimestamp ?? '' }, 'error');
|
|
266
270
|
return;
|
|
267
271
|
}
|
|
268
|
-
const truncatedValue = truncateISODateString(valueAsISOString, fieldType
|
|
272
|
+
const truncatedValue = truncateISODateString(valueAsISOString, fieldType, fieldType === 'TIME_ONLY');
|
|
269
273
|
onChange({ value: truncatedValue });
|
|
270
274
|
};
|
|
271
275
|
const handleDateRangeValueChange = ({ start, end }) => {
|
|
@@ -282,8 +286,8 @@ const RhsControls = (props) => {
|
|
|
282
286
|
return;
|
|
283
287
|
}
|
|
284
288
|
const [truncatedStartValue, truncatedEndValue] = [
|
|
285
|
-
truncateISODateString(start.valueAsISOString, fieldType),
|
|
286
|
-
truncateISODateString(end.valueAsISOString, fieldType)
|
|
289
|
+
truncateISODateString(start.valueAsISOString, fieldType, fieldType === 'TIME_ONLY'),
|
|
290
|
+
truncateISODateString(end.valueAsISOString, fieldType, fieldType === 'TIME_ONLY')
|
|
287
291
|
];
|
|
288
292
|
const onChangeParam = {
|
|
289
293
|
start: truncatedStartValue ?? '',
|
|
@@ -298,32 +302,20 @@ const RhsControls = (props) => {
|
|
|
298
302
|
onChange(onChangeParam);
|
|
299
303
|
};
|
|
300
304
|
const handleNumberRangeValueChange = ({ start, end }) => {
|
|
301
|
-
const startValue = start
|
|
302
|
-
const endValue = end
|
|
305
|
+
const startValue = start;
|
|
306
|
+
const endValue = end;
|
|
307
|
+
const hasStartValue = startValue !== undefined;
|
|
308
|
+
const hasEndValue = endValue !== undefined;
|
|
303
309
|
onChange({
|
|
304
|
-
start:
|
|
305
|
-
end:
|
|
310
|
+
start: hasStartValue ? Number(start) : '',
|
|
311
|
+
end: hasEndValue ? Number(end) : ''
|
|
306
312
|
},
|
|
307
313
|
// checking one of values is empty, but not both
|
|
308
|
-
((!
|
|
309
|
-
(
|
|
314
|
+
((!hasStartValue || !hasEndValue) && (hasStartValue || hasEndValue)) ||
|
|
315
|
+
(hasStartValue && hasEndValue && startValue > endValue)
|
|
310
316
|
? 'error'
|
|
311
317
|
: undefined);
|
|
312
318
|
};
|
|
313
|
-
// Handle changes from a CSV-input
|
|
314
|
-
const handleCSVChange = (e) => {
|
|
315
|
-
// Update the controlled input
|
|
316
|
-
setCsvInput(e.target.value);
|
|
317
|
-
// Submit a new RHS
|
|
318
|
-
let newValues = e.target.value
|
|
319
|
-
.split(',')
|
|
320
|
-
.map(v => v.trim())
|
|
321
|
-
.filter(v => v.length > 0); // Ignore empty strings
|
|
322
|
-
if (fieldType === 'DECIMAL' || fieldType === 'INTEGER') {
|
|
323
|
-
newValues = newValues.map(v => Number(v)); // This can set up some NaN values. Those are used to show an appropriate feedback when the submit button is hit
|
|
324
|
-
}
|
|
325
|
-
onChange({ values: newValues });
|
|
326
|
-
};
|
|
327
319
|
// Render the menu directly if in a vertical layout
|
|
328
320
|
const TimePeriodComp = itemDirection === 'column' ? TimePeriodMenu : TimePeriodInput;
|
|
329
321
|
const alignItems = showError ? 'center' : 'end';
|
|
@@ -332,11 +324,11 @@ const RhsControls = (props) => {
|
|
|
332
324
|
alignItems: itemDirection === 'column' ? 'stretch' : alignItems,
|
|
333
325
|
justify: 'between',
|
|
334
326
|
gap: 0.5
|
|
335
|
-
}, children: [_jsx(RhsModeSwitch, { parameters: parameters, fieldType: fieldType, comparator: comparator, rhs: rhs, onChange: onChange, mode: itemDirection === 'column' ? 'combo-box' : 'menu-button', validRhsTypes: validRhsTypes, dateFunctions: dateFunctions }), hasProp(rhs, 'field') && (_jsx(Flex, { item: { grow: 1 }, children: _jsx(FieldSelector, { value: rhs.field, onChange: handleFieldChange, fields: fieldOptions, status: showError ? 'error' : undefined, info: showError ? t('condition_builder_no_selection') : undefined, label: t('condition_builder_compare_with_another_field') }) })), hasProp(rhs, 'parameterId') && (_jsxs(Flex, { item: { grow: 1 }, children: [parameters.length === 1 && (_jsx(Input, { value: parameters[0].primary.toString(), status: showError ? 'error' : undefined, info: showError ? t('condition_builder_empty_value_text') : undefined, name: 'rhs-text-parameter-input', label: t('condition_builder_value_label'), readOnly: true })), parameters.length > 1 && (_jsx(ValueSelector, { parameters: parameters, mode: 'single-select', values: rhs.parameterId.toString(), selectedField: matchingField, rhs: rhs, comparator: comparator, onChange: handleValueSelection, status: showError ? 'error' : undefined, info: showError ? t('condition_builder_empty_selection_error_text') : undefined, label: t('condition_builder_value_label'), placeholder: t('condition_builder_single_selection_placeholder') }))] })), hasProp(rhs, 'value') && !hasProp(rhs, 'dateFunction') && (_jsxs(Flex, { item: { grow: 1 }, children: [fieldType === 'TEXT' && useValueSelector && (_jsx(ValueSelector, { parameters: parameters, mode: 'single-select', values: rhs.value.toString(), selectedField: matchingField, comparator: comparator, rhs: rhs, onChange: handleValueSelection, status: showError || apiError ? 'error' : undefined, info: showError ? t('condition_builder_no_selection') : apiError, setApiError: setApiError, label: t('condition_builder_value_label'), placeholder: t('condition_builder_single_selection_placeholder') })), fieldType === 'TEXT' && !useValueSelector && (_jsx(Input, { value: rhs.value.toString(), onChange: handleValueChange, status: showError ? 'error' : undefined, info: showError ? t('empty_value') : undefined, name: 'rhs-text-literal-input', label: t('condition_builder_value_label') })), (fieldType === 'DECIMAL' || fieldType === 'INTEGER') && (_jsx(NumericInput, { rhs: rhs, onChange: onChange, allowDecimal: fieldType !== 'INTEGER', status: showError ? 'error' : undefined })), fieldType === 'TIME_ONLY' && (_jsx(TimeInput, { value: rhs.value === '' ? undefined : rhs.value, withSeconds: true, onChange: handleDateValueChange, status: showError ? 'error' : undefined, info: showError ? t('condition_builder_invalid_time') : '', label: t('condition_builder_value_label') })), fieldType === 'DATE_ONLY' && (_jsx(DateInput, { value: rhs.value, onChange: handleDateValueChange, status: showError ? 'error' : undefined, info: showError ? t('condition_builder_invalid_date') : '', label: t('condition_builder_value_label') })), fieldType === 'DATE_TIME' && (_jsx(DateTimeInput, { value: rhs.value !== '' ? rhs.value : undefined, onChange: handleDateValueChange, status: showError ? 'error' : undefined, info: showError ? t('condition_builder_invalid_date') : '', label: t('condition_builder_value_label') }))] })), (fieldType === 'DATE_ONLY' || fieldType === 'DATE_TIME') &&
|
|
336
|
-
(hasProp(rhs, 'relativeDate') || hasProp(rhs, 'dateFunction')) && (_jsx(Flex, { item: { grow: 1 }, children: _jsx(TimePeriodComp, { rhs: rhs, fieldType: fieldType, onChange: onChange, dateFunctionsList: dateFunctions ? dateFunctions[fieldType] : [], status: showError ? 'error' : undefined }) })), hasProp(rhs, 'values') && (_jsxs(Flex, { item: { grow: 1 }, children: [useValueSelector && (_jsx(ValueSelector, { parameters: parameters, mode: 'multi-select', values: rhs.values.map(String), selectedField: matchingField, comparator: comparator, rhs: rhs, onChange: handleValueSelection, status: showError || apiError ? 'error' : undefined, info: showError ? t('condition_builder_no_selection') : apiError, setApiError: setApiError, label: t('condition_builder_value_label'), placeholder: t('condition_builder_multi_selection_placeholder') })), !useValueSelector && (_jsx(
|
|
327
|
+
}, children: [_jsx(RhsModeSwitch, { parameters: parameters, fieldType: fieldType, comparator: comparator, rhs: rhs, onChange: onChange, mode: itemDirection === 'column' ? 'combo-box' : 'menu-button', validRhsTypes: validRhsTypes, dateFunctions: dateFunctions }), hasProp(rhs, 'field') && (_jsx(Flex, { item: { grow: 1 }, children: _jsx(FieldSelector, { value: rhs.field, onChange: handleFieldChange, fields: fieldOptions, status: showError ? 'error' : undefined, info: showError ? t('condition_builder_no_selection') : undefined, label: t('condition_builder_compare_with_another_field') }) })), hasProp(rhs, 'parameterId') && (_jsxs(Flex, { item: { grow: 1 }, children: [parameters.length === 1 && (_jsx(Input, { value: parameters[0].primary.toString(), status: showError ? 'error' : undefined, info: showError ? t('condition_builder_empty_value_text') : undefined, name: 'rhs-text-parameter-input', label: t('condition_builder_value_label'), readOnly: true })), parameters.length > 1 && (_jsx(ValueSelector, { parameters: parameters, mode: 'single-select', values: rhs.parameterId.toString(), selectedField: matchingField, rhs: rhs, comparator: comparator, onChange: handleValueSelection, status: showError ? 'error' : undefined, info: showError ? t('condition_builder_empty_selection_error_text') : undefined, label: t('condition_builder_value_label'), placeholder: t('condition_builder_single_selection_placeholder') }))] })), hasProp(rhs, 'value') && !hasProp(rhs, 'dateFunction') && (_jsxs(Flex, { item: { grow: 1 }, children: [fieldType === 'TEXT' && useValueSelector && (_jsx(ValueSelector, { parameters: parameters, mode: 'single-select', values: rhs.value.toString(), selectedField: matchingField, comparator: comparator, rhs: rhs, onChange: handleValueSelection, status: showError || apiError ? 'error' : undefined, info: showError ? t('condition_builder_no_selection') : apiError, setApiError: setApiError, label: t('condition_builder_value_label'), placeholder: t('condition_builder_single_selection_placeholder') })), fieldType === 'TEXT' && !useValueSelector && (_jsx(Input, { value: rhs.value.toString(), onChange: handleValueChange, status: showError ? 'error' : undefined, info: showError ? t('empty_value') : undefined, name: 'rhs-text-literal-input', label: t('condition_builder_value_label') })), (fieldType === 'DECIMAL' || fieldType === 'INTEGER') && (_jsx(NumericInput, { rhs: rhs, onChange: onChange, allowDecimal: fieldType !== 'INTEGER', status: showError ? 'error' : undefined, unit: fieldUnit })), fieldType === 'TIME_ONLY' && (_jsx(TimeInput, { value: rhs.value === '' ? undefined : rhs.value, withSeconds: true, onChange: handleDateValueChange, status: showError ? 'error' : undefined, info: showError ? t('condition_builder_invalid_time') : '', label: t('condition_builder_value_label') })), fieldType === 'DATE_ONLY' && (_jsx(DateInput, { value: rhs.value, onChange: handleDateValueChange, status: showError ? 'error' : undefined, info: showError ? t('condition_builder_invalid_date') : '', label: t('condition_builder_value_label'), timeZone: timeZone })), fieldType === 'DATE_TIME' && (_jsx(DateTimeInput, { value: rhs.value !== '' ? rhs.value : undefined, onChange: handleDateValueChange, status: showError ? 'error' : undefined, info: showError ? t('condition_builder_invalid_date') : '', label: t('condition_builder_value_label'), timeZone: timeZone }))] })), (fieldType === 'DATE_ONLY' || fieldType === 'DATE_TIME') &&
|
|
328
|
+
(hasProp(rhs, 'relativeDate') || hasProp(rhs, 'dateFunction')) && (_jsx(Flex, { item: { grow: 1 }, children: _jsx(TimePeriodComp, { rhs: rhs, fieldType: fieldType, onChange: onChange, dateFunctionsList: dateFunctions ? dateFunctions[fieldType] : [], status: showError ? 'error' : undefined }) })), hasProp(rhs, 'values') && (_jsxs(Flex, { item: { grow: 1 }, children: [useValueSelector && (_jsx(ValueSelector, { parameters: parameters, mode: 'multi-select', values: rhs.values.map(String), selectedField: matchingField, comparator: comparator, rhs: rhs, onChange: handleValueSelection, status: showError || apiError ? 'error' : undefined, info: showError ? t('condition_builder_no_selection') : apiError, setApiError: setApiError, label: t('condition_builder_value_label'), placeholder: t('condition_builder_multi_selection_placeholder') })), !useValueSelector && (_jsx(CSVInput, { rhs: rhs, field: matchingField, onChange: onChange, status: showError ? 'error' : undefined, info: showError ? t('condition_builder_invalid_values') : undefined, label: t('condition_builder_value_label'), placeholder: t('condition_builder_enter_csv_placeholder') }))] })), hasProp(rhs, 'start') && (_jsxs(Flex, { item: { grow: 1 }, children: [(fieldType === 'DECIMAL' || fieldType === 'INTEGER') && (_jsx(NumericRangeInput, { label: t('condition_builder_value_label'), rhs: { start: rhs.start.toString(), end: rhs.end.toString() }, onChange: handleNumberRangeValueChange, status: showError ? 'error' : undefined, allowDecimal: fieldType !== 'INTEGER', unit: fieldUnit })), fieldType === 'DATE_ONLY' && (_jsx(DateRangeInput, { value: { start: rhs.start, end: rhs.end }, onChange: handleDateRangeValueChange, label: t('condition_builder_value_label'), status: showError ? 'error' : undefined, info: showError ? t('condition_builder_invalid_date_range') : '', timeZone: timeZone })), fieldType === 'TIME_ONLY' && (_jsx(TimeRangeInput, { mode: 'time', value: {
|
|
337
329
|
start: rhs.start === '' ? undefined : rhs.start,
|
|
338
330
|
end: rhs.end === '' ? undefined : rhs.end
|
|
339
|
-
}, withSeconds: true, onChange: handleDateRangeValueChange, label: t('condition_builder_value_label'), status: showError ? 'error' : undefined, info: showError ? t('condition_builder_invalid_time_range') : '' })), fieldType === 'DATE_TIME' && (_jsx(TimeRangeInput, { mode: 'datetime', value: { start: rhs.start, end: rhs.end }, onChange: handleDateRangeValueChange, label: t('condition_builder_value_label'), status: showError ? 'error' : undefined, info: showError ? t('condition_builder_invalid_date_range') : '' }))] }))] }));
|
|
331
|
+
}, withSeconds: true, onChange: handleDateRangeValueChange, label: t('condition_builder_value_label'), status: showError ? 'error' : undefined, info: showError ? t('condition_builder_invalid_time_range') : '' })), fieldType === 'DATE_TIME' && (_jsx(TimeRangeInput, { mode: 'datetime', value: { start: rhs.start, end: rhs.end }, onChange: handleDateRangeValueChange, label: t('condition_builder_value_label'), status: showError ? 'error' : undefined, info: showError ? t('condition_builder_invalid_date_range') : '', timeZone: timeZone }))] }))] }));
|
|
340
332
|
};
|
|
341
333
|
export default RhsControls;
|
|
342
334
|
//# sourceMappingURL=index.js.map
|