@pega/cosmos-react-condition-builder 8.8.0 → 9.0.0-build.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/lib/components/ConditionBuilder/AtomicCondition.d.ts +2 -0
  2. package/lib/components/ConditionBuilder/AtomicCondition.d.ts.map +1 -1
  3. package/lib/components/ConditionBuilder/AtomicCondition.js.map +1 -1
  4. package/lib/components/ConditionBuilder/ConditionBuilder.d.ts +2 -3
  5. package/lib/components/ConditionBuilder/ConditionBuilder.d.ts.map +1 -1
  6. package/lib/components/ConditionBuilder/ConditionBuilder.js +32 -21
  7. package/lib/components/ConditionBuilder/ConditionBuilder.js.map +1 -1
  8. package/lib/components/ConditionBuilder/ConditionBuilder.styles.d.ts +2 -1
  9. package/lib/components/ConditionBuilder/ConditionBuilder.styles.d.ts.map +1 -1
  10. package/lib/components/ConditionBuilder/ConditionBuilder.styles.js.map +1 -1
  11. package/lib/components/ConditionBuilder/ConditionBuilder.types.d.ts +27 -7
  12. package/lib/components/ConditionBuilder/ConditionBuilder.types.d.ts.map +1 -1
  13. package/lib/components/ConditionBuilder/ConditionBuilder.types.js.map +1 -1
  14. package/lib/components/ConditionBuilder/RhsControls/FieldSelector.js +1 -1
  15. package/lib/components/ConditionBuilder/RhsControls/FieldSelector.js.map +1 -1
  16. package/lib/components/ConditionBuilder/RhsControls/NumericInput.d.ts +0 -2
  17. package/lib/components/ConditionBuilder/RhsControls/NumericInput.d.ts.map +1 -1
  18. package/lib/components/ConditionBuilder/RhsControls/NumericInput.js +5 -21
  19. package/lib/components/ConditionBuilder/RhsControls/NumericInput.js.map +1 -1
  20. package/lib/components/ConditionBuilder/RhsControls/TimePeriodInput.d.ts.map +1 -1
  21. package/lib/components/ConditionBuilder/RhsControls/TimePeriodInput.js +2 -1
  22. package/lib/components/ConditionBuilder/RhsControls/TimePeriodInput.js.map +1 -1
  23. package/lib/components/ConditionBuilder/RhsControls/index.d.ts +4 -2
  24. package/lib/components/ConditionBuilder/RhsControls/index.d.ts.map +1 -1
  25. package/lib/components/ConditionBuilder/RhsControls/index.js +34 -21
  26. package/lib/components/ConditionBuilder/RhsControls/index.js.map +1 -1
  27. package/lib/components/ConditionBuilder/core/evaluator.d.ts.map +1 -1
  28. package/lib/components/ConditionBuilder/core/evaluator.js +107 -46
  29. package/lib/components/ConditionBuilder/core/evaluator.js.map +1 -1
  30. package/lib/components/ConditionBuilder/core/formatter.d.ts.map +1 -1
  31. package/lib/components/ConditionBuilder/core/formatter.js +4 -51
  32. package/lib/components/ConditionBuilder/core/formatter.js.map +1 -1
  33. package/lib/components/ConditionBuilder/core/transformer.d.ts +1 -1
  34. package/lib/components/ConditionBuilder/core/transformer.d.ts.map +1 -1
  35. package/lib/components/ConditionBuilder/core/transformer.js +7 -7
  36. package/lib/components/ConditionBuilder/core/transformer.js.map +1 -1
  37. package/lib/components/ConditionBuilder/index.d.ts +2 -1
  38. package/lib/components/ConditionBuilder/index.d.ts.map +1 -1
  39. package/lib/components/ConditionBuilder/index.js.map +1 -1
  40. package/lib/components/ConditionInput/ConditionInput.d.ts.map +1 -1
  41. package/lib/components/ConditionInput/ConditionInput.js +10 -7
  42. package/lib/components/ConditionInput/ConditionInput.js.map +1 -1
  43. package/lib/components/ConditionInput/ConditionInput.styles.d.ts +1 -1
  44. package/lib/components/ConditionInput/ConditionInput.styles.d.ts.map +1 -1
  45. package/lib/components/ConditionInput/ConditionInput.types.d.ts +0 -2
  46. package/lib/components/ConditionInput/ConditionInput.types.d.ts.map +1 -1
  47. package/lib/components/ConditionInput/ConditionInput.types.js.map +1 -1
  48. package/lib/components/PromotedFilters/ConditionSelector.d.ts.map +1 -1
  49. package/lib/components/PromotedFilters/ConditionSelector.js +10 -4
  50. package/lib/components/PromotedFilters/ConditionSelector.js.map +1 -1
  51. package/lib/components/PromotedFilters/PromotedFilters.d.ts.map +1 -1
  52. package/lib/components/PromotedFilters/PromotedFilters.js +12 -2
  53. package/lib/components/PromotedFilters/PromotedFilters.js.map +1 -1
  54. package/package.json +2 -2
  55. package/lib/components/ConditionBuilder/RhsControls/CSVInput.d.ts +0 -18
  56. package/lib/components/ConditionBuilder/RhsControls/CSVInput.d.ts.map +0 -1
  57. package/lib/components/ConditionBuilder/RhsControls/CSVInput.js +0 -59
  58. package/lib/components/ConditionBuilder/RhsControls/CSVInput.js.map +0 -1
  59. package/lib/components/ConditionBuilder/RhsControls/NumericRangeInput.d.ts +0 -31
  60. package/lib/components/ConditionBuilder/RhsControls/NumericRangeInput.d.ts.map +0 -1
  61. package/lib/components/ConditionBuilder/RhsControls/NumericRangeInput.js +0 -52
  62. package/lib/components/ConditionBuilder/RhsControls/NumericRangeInput.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ConditionBuilder.types.js","sourceRoot":"","sources":["../../../src/components/ConditionBuilder/ConditionBuilder.types.ts"],"names":[],"mappings":"","sourcesContent":["// cspell:words DDTHH\nimport type { Ref } from 'react';\n\nimport type { BaseProps, MenuItemProps, NoChildrenProp } from '@pega/cosmos-react-core';\n\nimport type {\n Comparator,\n ComparatorsByType,\n DateFunction,\n DatePart,\n FieldType,\n RHSType,\n TimePeriod\n} from './core/types';\n\n/** RHS object with a Date function */\nexport interface RhsWithDateFunction {\n /**\n * Output format for the value varies based on the dateFunction:\n * YEARS: First day of year as YYYY-MM-DD\n * QUARTERS: First day of quarter as YYYY-MM-DD\n * MONTHS: First day of month as YYYY-MM-DD\n * WEEKS: First day of week as YYYY-MM-DD\n * DAYS: Date as YYYY-MM-DD\n * HOURS: YYYY-MM-DDTHH:mm:ss\n * MINUTES: YYYY-MM-DDTHH:mm:ss\n * SECONDS: YYYY-MM-DDTHH:mm:ss\n * HOURS_OF_DAY: 0-23\n * MONTHS_OF_YEAR: 1-12\n * DAYS_OF_MONTH: 1-31\n * DAYS_OF_WEEK: 1-7\n */\n value: string | number;\n dateFunction: DateFunction;\n}\n\n/** RHS object with a Relative Date */\nexport interface RhsWithRelativeDate {\n relativeDate: {\n timePeriod: TimePeriod;\n interval?: number;\n datePart: DatePart;\n };\n}\n\n/** RHS object with PARAMETER type */\nexport interface RhsWithParameter {\n parameterId: string;\n}\n\n/** Type definition for the leaf-level nodes in nested conditions */\nexport interface LeafCondition {\n comparator: Comparator;\n\n lhs: {\n field: string;\n };\n\n // Optional for some of the comparators like IS_TRUE, IS_NULL, etc.\n rhs?:\n | { field: string } // When comparing the LHS with another field\n | { value: string | number } // When comparing the LHS with a single literal value (for comparators like EQ, GTE etc.)\n | { values: string[] | number[] } // When comparing the LHS with a list of literal values (for comparators like IN, NOT_IN etc.)\n | { start: string | number; end: string | number } // When comparing numeric or date field with two values that determine range\n | RhsWithDateFunction // When comparing a date field with a date function on RHS\n | RhsWithRelativeDate // When comparing a date field with a symbolic date on RHS\n | RhsWithParameter; // When comparing the LHS with PARAMETER type\n}\n\n/** Type definition for objects representing condition-rows in the builder UI */\nexport interface ConditionRow extends LeafCondition {\n id: string; // To use as `key` prop when rendering a list of rows\n label: string; // Used to refer the row from a logic-string\n}\n\n/**\n * Type definition for simple/complex conditions\n * At a given node in the condition tree, it can have exactly one of the keys AND/OR/NOT/condition\n */\nexport type Condition =\n | { AND: Condition[] }\n | { OR: Condition[] }\n | { NOT: Condition }\n | { condition: LeafCondition };\n\n/** Type definition for the input Field objects for the ConditionBuilder */\n\nexport type ParameterValue = Pick<MenuItemProps, 'id' | 'primary'>;\n\nexport type ReferenceValue = Pick<MenuItemProps, 'id' | 'primary'>;\n\nexport type ValueSelectionFunction<F> = (\n args:\n | { lhs?: F; ids: string[] }\n | {\n lhs?: F;\n searchString?: string; // If missing, assume empty string\n comparator?: string; // If missing, assume EQ\n\n // If the below are missing, fetch maximum possible results\n pageNumber?: number;\n pageSize?: number;\n }\n) => Promise<string[] | ReferenceValue[]>;\n\nexport type ValueSelection<F> = string[] | ReferenceValue[] | ValueSelectionFunction<F>;\n\ninterface BasicField extends Pick<MenuItemProps, 'id' | 'primary'> {}\n\nexport type Field = BasicField &\n (\n | {\n parameters?: ParameterValue[];\n\n /**\n * For TEXT fields, if a list of possible values is known ahead of time, they can be passed.\n * Otherwise we fetch data from api and pass a promise which returns list of values\n * This enables users to select from those values instead of manually typing them\n */\n possibleValues?: ValueSelection<Field>;\n\n /**\n * Data-type for the field.\n * Has to be one of these values. Convert where necessary\n * e.g. Currency/Percentage... should be used as `DECIMAL`\n * e.g. Text(single value)/Picklist/... should be used as `TEXT`\n */\n type: FieldType;\n\n /**\n * Used to handle percentages are stored in the database,\n * determine whether value is stored in the range of 0 to 1 or 0 to 100\n */\n unit?: 'percent_1' | 'percent_100';\n }\n | {\n /** An array of type Field to represent the child items. */\n items: Field[];\n }\n );\n\n/** Valid date functions by field type */\nexport interface DateFunctionsByType {\n /** Date functions to enable for DATE_TIME fields */\n DATE_TIME: DateFunction[];\n /** Date functions to enable for DATE_ONLY fields */\n DATE_ONLY: DateFunction[];\n}\n\nexport interface HandleValue {\n /**\n * Returns condition validity and condition or undefined if valid.\n * Undefined indicates no condition.\n */\n getCondition: () => [valid: false] | [valid: true, condition: Condition | undefined];\n}\n\n/** Type definition for the input props of ConditionBuilder */\nexport default interface ConditionBuilderProps extends BaseProps, NoChildrenProp {\n /** Metadata (data-model) for the Fields to use in the builder */\n fields: Field[];\n\n /** (Optional) A seed condition for the builder. To use when editing an existing condition */\n condition?: Condition;\n\n /** (Optional) Used to limit the Comparators allowed in the builder. */\n validComparators?: ComparatorsByType[];\n\n /**\n * (Optional) Pass this to control which all types of RHS are enabled in the component\n * DEFAULT: Set(['LITERAL', 'FIELD'])\n * NOTE: If enabling `DATE_FUNCTION`s, additionally pass a `dateFunctions` prop to specify which functions are enabled\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) Pass this if the `NOT` operator should be considered as invalid */\n disallowNOT?: boolean;\n\n /** Imperative handle for the component. */\n handle?: Ref<HandleValue>;\n}\n"]}
1
+ {"version":3,"file":"ConditionBuilder.types.js","sourceRoot":"","sources":["../../../src/components/ConditionBuilder/ConditionBuilder.types.ts"],"names":[],"mappings":"","sourcesContent":["// cspell:words DDTHH\nimport type { ReactNode, Ref } from 'react';\n\nimport type { BaseProps, MenuItemProps, NoChildrenProp } from '@pega/cosmos-react-core';\n\nimport type {\n Comparator,\n ComparatorsByType,\n DateFunction,\n DatePart,\n FieldType,\n RHSType,\n TimePeriod\n} from './core/types';\nimport type { AtomicConditionProps } from './AtomicCondition';\n\n/** RHS object with a Date function */\nexport interface RhsWithDateFunction {\n /**\n * Output format for the value varies based on the dateFunction:\n * YEARS: First day of year as YYYY-MM-DD\n * QUARTERS: First day of quarter as YYYY-MM-DD\n * MONTHS: First day of month as YYYY-MM-DD\n * WEEKS: First day of week as YYYY-MM-DD\n * DAYS: Date as YYYY-MM-DD\n * HOURS: YYYY-MM-DDTHH:mm:ss\n * MINUTES: YYYY-MM-DDTHH:mm:ss\n * SECONDS: YYYY-MM-DDTHH:mm:ss\n * HOURS_OF_DAY: 0-23\n * MONTHS_OF_YEAR: 1-12\n * DAYS_OF_MONTH: 1-31\n * DAYS_OF_WEEK: 1-7\n */\n value: string | number;\n dateFunction: DateFunction;\n}\n\n/** RHS object with a Relative Date */\nexport interface RhsWithRelativeDate {\n relativeDate: {\n timePeriod: TimePeriod;\n interval?: number;\n datePart: DatePart;\n };\n}\n\n/** RHS object with PARAMETER type */\nexport interface RhsWithParameter {\n parameterId: string;\n}\n\n/** Type definition for the leaf-level nodes in nested conditions */\nexport interface LeafCondition {\n comparator: Comparator;\n\n lhs: {\n field: string;\n };\n\n // Optional for some of the comparators like IS_TRUE, IS_NULL, etc.\n rhs?:\n | { field: string } // When comparing the LHS with another field\n | { value: string | number } // When comparing the LHS with a single literal value (for comparators like EQ, GTE etc.)\n | { values: string[] | number[] } // When comparing the LHS with a list of literal values (for comparators like IN, NOT_IN etc.)\n | { start: string | number; end: string | number } // When comparing numeric or date field with two values that determine range\n | RhsWithDateFunction // When comparing a date field with a date function on RHS\n | RhsWithRelativeDate // When comparing a date field with a symbolic date on RHS\n | RhsWithParameter; // When comparing the LHS with PARAMETER type\n lhsType?: string;\n}\n\n/** Type definition for objects representing condition-rows in the builder UI */\nexport interface ConditionRow extends LeafCondition {\n id: string; // To use as `key` prop when rendering a list of rows\n label: string; // Used to refer the row from a logic-string\n}\n\n/**\n * Type definition for simple/complex conditions\n * At a given node in the condition tree, it can have exactly one of the keys AND/OR/NOT/condition\n */\nexport type Condition =\n | { AND: Condition[] }\n | { OR: Condition[] }\n | { NOT: Condition }\n | { condition: LeafCondition };\n\n/** Type definition for the input Field objects for the ConditionBuilder */\n\nexport type ParameterValue = Pick<MenuItemProps, 'id' | 'primary'>;\n\nexport type ReferenceValue = Pick<MenuItemProps, 'id' | 'primary'>;\n\nexport type ValueSelectionFunction<F> = (\n args:\n | { lhs?: F; ids: string[] }\n | {\n lhs?: F;\n searchString?: string; // If missing, assume empty string\n comparator?: string; // If missing, assume EQ\n\n // If the below are missing, fetch maximum possible results\n pageNumber?: number;\n pageSize?: number;\n }\n) => Promise<string[] | ReferenceValue[]>;\n\nexport type ValueSelection<F> = string[] | ReferenceValue[] | ValueSelectionFunction<F>;\n\ninterface BasicField extends Pick<MenuItemProps, 'id' | 'primary'> {}\n\nexport type Field = BasicField &\n (\n | {\n parameters?: ParameterValue[];\n\n /**\n * For TEXT fields, if a list of possible values is known ahead of time, they can be passed.\n * Otherwise we fetch data from api and pass a promise which returns list of values\n * This enables users to select from those values instead of manually typing them\n */\n possibleValues?: ValueSelection<Field>;\n\n /**\n * Data-type for the field.\n * Has to be one of these values. Convert where necessary\n * e.g. Currency/Percentage... should be used as `DECIMAL`\n * e.g. Text(single value)/Picklist/... should be used as `TEXT`\n */\n type: FieldType;\n }\n | {\n /** An array of type Field to represent the child items. */\n items: Field[];\n }\n );\n\n/** Valid date functions by field type */\nexport interface DateFunctionsByType {\n /** Date functions to enable for DATE_TIME fields */\n DATE_TIME: DateFunction[];\n /** Date functions to enable for DATE_ONLY fields */\n DATE_ONLY: DateFunction[];\n}\n\nexport type ValidationOptions = {\n /**\n * Whether to validate individual condition rows for completeness.\n *\n * When `true` (default): Validates each row's LHS, comparator, and RHS fields\n * When `false`: Only validates the overall logic string structure\n */\n performRowValidation?: boolean;\n};\n\nexport interface HandleValue {\n /**\n * Returns condition validity and condition or undefined if valid.\n * Undefined indicates no condition.\n */\n getCondition: (\n options?: ValidationOptions\n ) => [valid: false] | [valid: true, condition: Condition | undefined];\n getLogicError: () => string | null;\n}\n\n/** Type definition for the input props of ConditionBuilder */\nexport default interface ConditionBuilderProps extends BaseProps, NoChildrenProp {\n /** Metadata (data-model) for the Fields to use in the builder */\n fields: Field[];\n\n conditionRenderer?: (props: AtomicConditionProps) => ReactNode;\n\n /** (Optional) A seed condition for the builder. To use when editing an existing condition */\n condition?: Condition;\n\n /** (Optional) Used to limit the Comparators allowed in the builder. */\n validComparators?: ComparatorsByType[];\n\n /**\n * (Optional) Pass this to control which all types of RHS are enabled in the component\n * DEFAULT: Set(['LITERAL', 'FIELD'])\n * NOTE: If enabling `DATE_FUNCTION`s, additionally pass a `dateFunctions` prop to specify which functions are enabled\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) Pass this if the `NOT` operator should be considered as invalid */\n disallowNOT?: boolean;\n\n /** Imperative handle for the component. */\n handle?: Ref<HandleValue>;\n\n /**\n * Callback fired when logic string validation error occurs or clears.\n */\n onLogicError?: (error: string | null) => void;\n\n /** Makes the input non editable and non clickable. The browser defaults to false. */\n readOnly?: boolean;\n\n /** Disable the control. The browser defaults to false. */\n disabled?: boolean;\n\n /**\n * Ref to access the root HTMLDivElement of the ConditionBuilder.\n */\n ref?: Ref<HTMLDivElement>;\n}\n"]}
@@ -40,7 +40,7 @@ const FieldSelector = (props) => {
40
40
  ? menuHelpers.flatten(items).filter(({ primary }) => filterRegex.test(primary))
41
41
  : items;
42
42
  }, [filterRegex, items]);
43
- return (_jsx(ComboBox, { label: label ?? t('condition_builder_field_label'), status: status, info: info, placeholder: t('select_placeholder_default'), mode: 'single-select', value: filterValue, onChange: (ev) => {
43
+ return (_jsx(ComboBox, { label: label ?? t('condition_builder_field_label'), status: value && !selected ? 'error' : status, info: value && !selected ? t('error_field_unavailable', [`"${value}"`]) : info, placeholder: t('select_placeholder_default'), mode: 'single-select', value: filterValue, onChange: (ev) => {
44
44
  setFilterValue(ev.target.value);
45
45
  if (!ev.target.value)
46
46
  onChange('');
@@ -1 +1 @@
1
- {"version":3,"file":"FieldSelector.js","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/RhsControls/FieldSelector.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useMemo, useState } from 'react';\nimport type { ChangeEvent, FunctionComponent } from 'react';\n\nimport { ComboBox, menuHelpers, hasProp, useI18n } from '@pega/cosmos-react-core';\nimport type {\n MenuProps,\n BaseProps,\n ForwardProps,\n NoChildrenProp,\n ComboBoxProps\n} from '@pega/cosmos-react-core';\nimport type { Selected } from '@pega/cosmos-react-core/lib/components/ComboBox/ComboBox.types';\n\nimport type { Field } from '../ConditionBuilder.types';\n\n/** Convert input Fields to use as ComboBox options */\nfunction getMenuItemsFromFields(fields: Field[], selection: string): MenuProps['items'] {\n return fields.map(field => {\n const { id, primary } = field;\n let childitems;\n if (hasProp(field, 'items')) childitems = getMenuItemsFromFields(field.items, selection);\n return {\n id,\n primary,\n selected: childitems ? undefined : id === selection, // set Selected field to selection\n items: childitems\n };\n });\n}\n\ninterface FieldSelectorProps extends BaseProps, NoChildrenProp {\n /** Current selection */\n value: string;\n\n /** Change handler */\n onChange: (selection: string) => void;\n\n /** Metadata (data-model) for the Fields to use in the selector */\n fields: Field[];\n\n /** Status for the ComboBox */\n status?: ComboBoxProps['status'];\n\n /** Info for the ComboBox */\n info?: ComboBoxProps['info'];\n\n /** Label for the ComboBox */\n label?: ComboBoxProps['label'];\n}\n\n/** Sets up a ComboBox to select a Field. Handles grouping and autocomplete. */\nconst FieldSelector: FunctionComponent<FieldSelectorProps & ForwardProps> = (\n props: FieldSelectorProps\n) => {\n const { value, onChange, fields, status, info, label } = props;\n\n const t = useI18n();\n\n // Determine ComboBox menu items from the fields\n const items = useMemo(() => getMenuItemsFromFields(fields, value), [fields, value]);\n const selected: Selected | undefined = useMemo(() => {\n const selectedItem = menuHelpers.getItem(items, value);\n return selectedItem ? { id: selectedItem.id, text: selectedItem.primary } : undefined;\n }, [items]);\n\n // Set up autocomplete input\n const [filterValue, setFilterValue] = useState<string>(''); // NOTE: `''` is needed to show the current selection\n const filterRegex = useMemo(() => {\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping\n // Literal string match from input, not user regex input.\n return filterValue\n ? new RegExp(filterValue.replace(/[.*+\\-?^${}()|[\\]\\\\]/g, '\\\\$&'), 'i')\n : undefined;\n }, [filterValue]);\n\n const filteredItems = useMemo(() => {\n return filterRegex\n ? menuHelpers.flatten(items).filter(({ primary }) => filterRegex.test(primary))\n : items;\n }, [filterRegex, items]);\n\n return (\n <ComboBox\n label={label ?? t('condition_builder_field_label')}\n status={status}\n info={info}\n placeholder={t('select_placeholder_default')}\n mode='single-select'\n value={filterValue}\n onChange={(ev: ChangeEvent<HTMLInputElement>) => {\n setFilterValue(ev.target.value);\n if (!ev.target.value) onChange('');\n }}\n onBlur={() => {\n setFilterValue('');\n }}\n selected={{ items: selected }}\n menu={{\n items: filteredItems,\n mode: 'single-select',\n accent: filterRegex,\n onItemClick: id => {\n onChange(id);\n setFilterValue(''); // To show the selected value in the input\n }\n }}\n />\n );\n};\n\nexport default FieldSelector;\n"]}
1
+ {"version":3,"file":"FieldSelector.js","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/RhsControls/FieldSelector.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useMemo, useState } from 'react';\nimport type { ChangeEvent, FunctionComponent } from 'react';\n\nimport { ComboBox, menuHelpers, hasProp, useI18n } from '@pega/cosmos-react-core';\nimport type {\n MenuProps,\n BaseProps,\n ForwardProps,\n NoChildrenProp,\n ComboBoxProps\n} from '@pega/cosmos-react-core';\nimport type { Selected } from '@pega/cosmos-react-core/lib/components/ComboBox/ComboBox.types';\n\nimport type { Field } from '../ConditionBuilder.types';\n\n/** Convert input Fields to use as ComboBox options */\nfunction getMenuItemsFromFields(fields: Field[], selection: string): MenuProps['items'] {\n return fields.map(field => {\n const { id, primary } = field;\n let childitems;\n if (hasProp(field, 'items')) childitems = getMenuItemsFromFields(field.items, selection);\n return {\n id,\n primary,\n selected: childitems ? undefined : id === selection, // set Selected field to selection\n items: childitems\n };\n });\n}\n\ninterface FieldSelectorProps extends BaseProps, NoChildrenProp {\n /** Current selection */\n value: string;\n\n /** Change handler */\n onChange: (selection: string) => void;\n\n /** Metadata (data-model) for the Fields to use in the selector */\n fields: Field[];\n\n /** Status for the ComboBox */\n status?: ComboBoxProps['status'];\n\n /** Info for the ComboBox */\n info?: ComboBoxProps['info'];\n\n /** Label for the ComboBox */\n label?: ComboBoxProps['label'];\n}\n\n/** Sets up a ComboBox to select a Field. Handles grouping and autocomplete. */\nconst FieldSelector: FunctionComponent<FieldSelectorProps & ForwardProps> = (\n props: FieldSelectorProps\n) => {\n const { value, onChange, fields, status, info, label } = props;\n\n const t = useI18n();\n\n // Determine ComboBox menu items from the fields\n const items = useMemo(() => getMenuItemsFromFields(fields, value), [fields, value]);\n const selected: Selected | undefined = useMemo(() => {\n const selectedItem = menuHelpers.getItem(items, value);\n return selectedItem ? { id: selectedItem.id, text: selectedItem.primary } : undefined;\n }, [items]);\n\n // Set up autocomplete input\n const [filterValue, setFilterValue] = useState<string>(''); // NOTE: `''` is needed to show the current selection\n const filterRegex = useMemo(() => {\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping\n // Literal string match from input, not user regex input.\n return filterValue\n ? new RegExp(filterValue.replace(/[.*+\\-?^${}()|[\\]\\\\]/g, '\\\\$&'), 'i')\n : undefined;\n }, [filterValue]);\n\n const filteredItems = useMemo(() => {\n return filterRegex\n ? menuHelpers.flatten(items).filter(({ primary }) => filterRegex.test(primary))\n : items;\n }, [filterRegex, items]);\n\n return (\n <ComboBox\n label={label ?? t('condition_builder_field_label')}\n status={value && !selected ? 'error' : status}\n info={value && !selected ? t('error_field_unavailable', [`\"${value}\"`]) : info}\n placeholder={t('select_placeholder_default')}\n mode='single-select'\n value={filterValue}\n onChange={(ev: ChangeEvent<HTMLInputElement>) => {\n setFilterValue(ev.target.value);\n if (!ev.target.value) onChange('');\n }}\n onBlur={() => {\n setFilterValue('');\n }}\n selected={{ items: selected }}\n menu={{\n items: filteredItems,\n mode: 'single-select',\n accent: filterRegex,\n onItemClick: id => {\n onChange(id);\n setFilterValue(''); // To show the selected value in the input\n }\n }}\n />\n );\n};\n\nexport default FieldSelector;\n"]}
@@ -13,8 +13,6 @@ interface NumericInputProps extends BaseProps, NoChildrenProp {
13
13
  status?: 'error';
14
14
  /** Determines whether decimals can be entered */
15
15
  allowDecimal?: boolean;
16
- /** Determines whether value is stored in the database in the range of 0 to 1 or 0 to 100 */
17
- unit?: 'percent_1' | 'percent_100';
18
16
  }
19
17
  /** Wrapper over the NumberInput to parse values as Numbers, while still allowing the user to type partial values like `12.`, `12.0`, ... */
20
18
  declare const NumericInput: FunctionComponent<NumericInputProps>;
@@ -1 +1 @@
1
- {"version":3,"file":"NumericInput.d.ts","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/RhsControls/NumericInput.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAG/C,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzE,UAAU,iBAAkB,SAAQ,SAAS,EAAE,cAAc;IAC3D,4BAA4B;IAC5B,GAAG,EAAE;QAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAChC,gDAAgD;IAChD,QAAQ,EAAE,CAAC,GAAG,EAAE;QAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACpD,iDAAiD;IACjD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iDAAiD;IACjD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,4FAA4F;IAC5F,IAAI,CAAC,EAAE,WAAW,GAAG,aAAa,CAAC;CACpC;AAED,4IAA4I;AAC5I,QAAA,MAAM,YAAY,EAAE,iBAAiB,CAAC,iBAAiB,CAgDtD,CAAC;AAEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"NumericInput.d.ts","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/RhsControls/NumericInput.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAG/C,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzE,UAAU,iBAAkB,SAAQ,SAAS,EAAE,cAAc;IAC3D,4BAA4B;IAC5B,GAAG,EAAE;QAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAEhC,gDAAgD;IAChD,QAAQ,EAAE,CAAC,GAAG,EAAE;QAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAEpD,iDAAiD;IACjD,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,iDAAiD;IACjD,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,4IAA4I;AAC5I,QAAA,MAAM,YAAY,EAAE,iBAAiB,CAAC,iBAAiB,CA4BtD,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -3,36 +3,20 @@ import { useState } from 'react';
3
3
  import { NumberInput, useAfterInitialEffect, useI18n } from '@pega/cosmos-react-core';
4
4
  /** Wrapper over the NumberInput to parse values as Numbers, while still allowing the user to type partial values like `12.`, `12.0`, ... */
5
5
  const NumericInput = (props) => {
6
- const { rhs, onChange, status, allowDecimal = true, unit } = props;
6
+ const { rhs, onChange, status, allowDecimal = true } = props;
7
7
  const t = useI18n();
8
- // Formats a value as a percentage and fixes floating point rounding errors in input box
9
- const convertPercentToDisplayValue = (value) => {
10
- if (unit === 'percent_1' && typeof value === 'number') {
11
- return parseFloat((value * 100).toFixed(2));
12
- }
13
- return value;
14
- };
15
8
  // Since we want to always call onChange with parsed Numbers,
16
9
  // if we parse values like `12.`, `12.0`, etc., the decimals will be lost leading to bad UX
17
10
  // Using a local state to avoid that
18
- const [localValue, setLocalValue] = useState(convertPercentToDisplayValue(rhs.value).toString());
11
+ const [localValue, setLocalValue] = useState(rhs.value.toString());
19
12
  useAfterInitialEffect(() => {
20
- setLocalValue(convertPercentToDisplayValue(rhs.value).toString());
13
+ setLocalValue(rhs.value.toString());
21
14
  }, [rhs.value]);
22
15
  const handleInputChange = (newValue) => {
23
16
  setLocalValue(newValue);
17
+ onChange({ value: newValue.trim() ? Number(newValue) : '' }); // Save as a number unless the input is empty
24
18
  };
25
- const handleBlur = (newValue) => {
26
- let outValue = '';
27
- if (newValue) {
28
- const valueAsNumber = Number(newValue);
29
- if (!Number.isNaN(valueAsNumber)) {
30
- outValue = unit === 'percent_1' ? valueAsNumber / 100 : valueAsNumber;
31
- }
32
- }
33
- onChange({ value: outValue });
34
- };
35
- return (_jsx(NumberInput, { value: localValue, onChange: handleInputChange, onBlur: handleBlur, status: status, info: status === 'error' ? t('condition_builder_invalid_number') : undefined, label: t('condition_builder_value_label'), numberOfDecimals: allowDecimal ? undefined : 0, unit: unit === 'percent_1' || unit === 'percent_100' ? 'percent' : undefined }));
19
+ return (_jsx(NumberInput, { value: localValue, onChange: handleInputChange, status: status, info: status === 'error' ? t('condition_builder_invalid_number') : undefined, label: t('condition_builder_value_label'), numberOfDecimals: allowDecimal ? undefined : 0 }));
36
20
  };
37
21
  export default NumericInput;
38
22
  //# sourceMappingURL=NumericInput.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NumericInput.js","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/RhsControls/NumericInput.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGjC,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAgBtF,4IAA4I;AAC5I,MAAM,YAAY,GAAyC,CAAC,KAAwB,EAAE,EAAE;IACtF,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACnE,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IAEpB,wFAAwF;IACxF,MAAM,4BAA4B,GAAG,CAAC,KAAsB,EAAE,EAAE;QAC9D,IAAI,IAAI,KAAK,WAAW,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACtD,OAAO,UAAU,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,6DAA6D;IAC7D,2FAA2F;IAC3F,oCAAoC;IACpC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,4BAA4B,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEjG,qBAAqB,CAAC,GAAG,EAAE;QACzB,aAAa,CAAC,4BAA4B,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpE,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAEhB,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAE,EAAE;QAC7C,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,QAAgB,EAAE,EAAE;QACtC,IAAI,QAAQ,GAAoB,EAAE,CAAC;QACnC,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;gBACjC,QAAQ,GAAG,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC;YACxE,CAAC;QACH,CAAC;QACD,QAAQ,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,OAAO,CACL,KAAC,WAAW,IACV,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,CAAC,SAAS,EAC5E,KAAK,EAAE,CAAC,CAAC,+BAA+B,CAAC,EACzC,gBAAgB,EAAE,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAC9C,IAAI,EAAE,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,GAC5E,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC","sourcesContent":["import { useState } from 'react';\nimport type { FunctionComponent } from 'react';\n\nimport { NumberInput, useAfterInitialEffect, useI18n } from '@pega/cosmos-react-core';\nimport type { BaseProps, NoChildrenProp } from '@pega/cosmos-react-core';\n\ninterface NumericInputProps extends BaseProps, NoChildrenProp {\n /** Rhs for the condition */\n rhs: { value: string | number };\n /** Callback for any modifications to the Rhs */\n onChange: (rhs: { value: string | number }) => void;\n /** Used to indicate any errors on the control */\n status?: 'error';\n /** Determines whether decimals can be entered */\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}\n\n/** Wrapper over the NumberInput to parse values as Numbers, while still allowing the user to type partial values like `12.`, `12.0`, ... */\nconst NumericInput: FunctionComponent<NumericInputProps> = (props: NumericInputProps) => {\n const { rhs, onChange, status, allowDecimal = true, unit } = props;\n const t = useI18n();\n\n // Formats a value as a percentage and fixes floating point rounding errors in input box\n const convertPercentToDisplayValue = (value: string | number) => {\n if (unit === 'percent_1' && typeof value === 'number') {\n return parseFloat((value * 100).toFixed(2));\n }\n return value;\n };\n\n // Since we want to always call onChange with parsed Numbers,\n // if we parse values like `12.`, `12.0`, etc., the decimals will be lost leading to bad UX\n // Using a local state to avoid that\n const [localValue, setLocalValue] = useState(convertPercentToDisplayValue(rhs.value).toString());\n\n useAfterInitialEffect(() => {\n setLocalValue(convertPercentToDisplayValue(rhs.value).toString());\n }, [rhs.value]);\n\n const handleInputChange = (newValue: string) => {\n setLocalValue(newValue);\n };\n\n const handleBlur = (newValue: string) => {\n let outValue: string | number = '';\n if (newValue) {\n const valueAsNumber = Number(newValue);\n if (!Number.isNaN(valueAsNumber)) {\n outValue = unit === 'percent_1' ? valueAsNumber / 100 : valueAsNumber;\n }\n }\n onChange({ value: outValue });\n };\n\n return (\n <NumberInput\n value={localValue}\n onChange={handleInputChange}\n onBlur={handleBlur}\n status={status}\n info={status === 'error' ? t('condition_builder_invalid_number') : undefined}\n label={t('condition_builder_value_label')}\n numberOfDecimals={allowDecimal ? undefined : 0}\n unit={unit === 'percent_1' || unit === 'percent_100' ? 'percent' : undefined}\n />\n );\n};\n\nexport default NumericInput;\n"]}
1
+ {"version":3,"file":"NumericInput.js","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/RhsControls/NumericInput.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGjC,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAiBtF,4IAA4I;AAC5I,MAAM,YAAY,GAAyC,CAAC,KAAwB,EAAE,EAAE;IACtF,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAC7D,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IAEpB,6DAA6D;IAC7D,2FAA2F;IAC3F,oCAAoC;IACpC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEnE,qBAAqB,CAAC,GAAG,EAAE;QACzB,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAEhB,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAE,EAAE;QAC7C,aAAa,CAAC,QAAQ,CAAC,CAAC;QACxB,QAAQ,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,6CAA6C;IAC7G,CAAC,CAAC;IAEF,OAAO,CACL,KAAC,WAAW,IACV,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,CAAC,SAAS,EAC5E,KAAK,EAAE,CAAC,CAAC,+BAA+B,CAAC,EACzC,gBAAgB,EAAE,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAC9C,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC","sourcesContent":["import { useState } from 'react';\nimport type { FunctionComponent } from 'react';\n\nimport { NumberInput, useAfterInitialEffect, useI18n } from '@pega/cosmos-react-core';\nimport type { BaseProps, NoChildrenProp } from '@pega/cosmos-react-core';\n\ninterface NumericInputProps extends BaseProps, NoChildrenProp {\n /** Rhs for the condition */\n rhs: { value: string | number };\n\n /** Callback for any modifications to the Rhs */\n onChange: (rhs: { value: string | number }) => void;\n\n /** Used to indicate any errors on the control */\n status?: 'error';\n\n /** Determines whether decimals can be entered */\n allowDecimal?: boolean;\n}\n\n/** Wrapper over the NumberInput to parse values as Numbers, while still allowing the user to type partial values like `12.`, `12.0`, ... */\nconst NumericInput: FunctionComponent<NumericInputProps> = (props: NumericInputProps) => {\n const { rhs, onChange, status, allowDecimal = true } = props;\n const t = useI18n();\n\n // Since we want to always call onChange with parsed Numbers,\n // if we parse values like `12.`, `12.0`, etc., the decimals will be lost leading to bad UX\n // Using a local state to avoid that\n const [localValue, setLocalValue] = useState(rhs.value.toString());\n\n useAfterInitialEffect(() => {\n setLocalValue(rhs.value.toString());\n }, [rhs.value]);\n\n const handleInputChange = (newValue: string) => {\n setLocalValue(newValue);\n onChange({ value: newValue.trim() ? Number(newValue) : '' }); // Save as a number unless the input is empty\n };\n\n return (\n <NumberInput\n value={localValue}\n onChange={handleInputChange}\n status={status}\n info={status === 'error' ? t('condition_builder_invalid_number') : undefined}\n label={t('condition_builder_value_label')}\n numberOfDecimals={allowDecimal ? undefined : 0}\n />\n );\n};\n\nexport default NumericInput;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"TimePeriodInput.d.ts","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/RhsControls/TimePeriodInput.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAW/C,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,yBAAyB,CAAC;AAUjC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AA0E5D,QAAA,MAAM,eAAe,EAAE,iBAAiB,CAAC,mBAAmB,GAAG,YAAY,CA0D1E,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"TimePeriodInput.d.ts","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/RhsControls/TimePeriodInput.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAW/C,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,yBAAyB,CAAC;AAUjC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AA2E5D,QAAA,MAAM,eAAe,EAAE,iBAAiB,CAAC,mBAAmB,GAAG,YAAY,CA0D1E,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -57,7 +57,8 @@ const createDisplayValue = (rhsValue, t, locale) => {
57
57
  t,
58
58
  locale,
59
59
  format: 'short',
60
- variant: dateDisplayVariants[dateFunction]
60
+ variant: dateDisplayVariants[dateFunction],
61
+ timeZone: 'UTC'
61
62
  });
62
63
  }
63
64
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TimePeriodInput.js","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/RhsControls/TimePeriodInput.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState } from 'react';\nimport type { FunctionComponent } from 'react';\n\nimport {\n Flex,\n useConfiguration,\n useI18n,\n hasProp,\n CompositeInput,\n parseToDate,\n useAfterInitialEffect\n} from '@pega/cosmos-react-core';\nimport type {\n ForwardProps,\n TranslationFunction,\n TranslationPack,\n ExcludeStrict\n} from '@pega/cosmos-react-core';\nimport type { DateTimeVariant } from '@pega/cosmos-react-core/lib/components/DateTime/DateTime.types';\nimport { formatDateTime } from '@pega/cosmos-react-core/lib/components/DateTime/utils';\nimport { getDayOfWeekNamesMap } from '@pega/cosmos-react-core/lib/components/DateTime/Input/utils';\n\nimport type { RhsWithDateFunction, RhsWithRelativeDate } from '../ConditionBuilder.types';\nimport { formatRelativeDate } from '../core/formatter';\nimport type { DateFunction } from '../core/types';\n\nimport TimePeriodMenu from './TimePeriodMenu';\nimport type { TimePeriodMenuProps } from './TimePeriodMenu';\n\nconst dateDisplayVariants: Record<\n ExcludeStrict<DateFunction, 'MONTHS_OF_YEAR' | 'DAYS_OF_MONTH' | 'DAYS_OF_WEEK' | 'HOURS_OF_DAY'>,\n DateTimeVariant\n> = {\n YEARS: 'year',\n QUARTERS: 'quarteryear',\n MONTHS: 'monthyear',\n WEEKS: 'week',\n DAYS: 'date',\n HOURS: 'datetime',\n MINUTES: 'datetime',\n SECONDS: 'datetime'\n};\n\n/** Creating display value for the selected time period value */\nconst createDisplayValue = (\n rhsValue: RhsWithDateFunction | RhsWithRelativeDate,\n t: TranslationFunction<TranslationPack>,\n locale: string\n) => {\n if (hasProp(rhsValue, 'relativeDate')) {\n const {\n relativeDate: { timePeriod, interval, datePart }\n } = rhsValue;\n return formatRelativeDate(t, timePeriod, datePart, interval);\n }\n\n const { value, dateFunction } = rhsValue;\n\n if (!value && !(dateFunction === 'HOURS_OF_DAY' && value === 0)) {\n return t('condition_builder_select_placeholder');\n }\n\n switch (dateFunction) {\n case 'MONTHS_OF_YEAR':\n return new Date(2021, (value as number) - 1, 1).toLocaleString(locale, { month: 'long' });\n\n case 'DAYS_OF_MONTH':\n return t('condition_builder_day_number_of_month', [value], {\n count: Number(value),\n pluralType: 'ordinal'\n });\n case 'DAYS_OF_WEEK': {\n const dayOfWeekOptions = getDayOfWeekNamesMap();\n return dayOfWeekOptions[Number(value)];\n }\n case 'HOURS_OF_DAY':\n return t('condition_builder_hour_number_of_day', [`${value.toString().padStart(2, '0')}:00`]);\n case 'MINUTES':\n case 'SECONDS': {\n const result = dateFunction === 'SECONDS' ? t('seconds_text') : t('minutes_text');\n let output = formatDateTime(parseToDate(value), {\n t,\n locale,\n format: dateFunction === 'SECONDS' ? 'long' : 'short',\n variant: dateDisplayVariants[dateFunction],\n timeZone: 'UTC'\n });\n output += ` (${result.toLowerCase()})`;\n return output;\n }\n default: {\n return formatDateTime(parseToDate(value), {\n t,\n locale,\n format: 'short',\n variant: dateDisplayVariants[dateFunction]\n });\n }\n }\n};\n\nconst TimePeriodInput: FunctionComponent<TimePeriodMenuProps & ForwardProps> = (\n props: TimePeriodMenuProps\n) => {\n const { rhs, onChange, dateFunctionsList, status, fieldType } = props;\n const t = useI18n();\n const { locale } = useConfiguration();\n const [newRhsValue, setNewRhsValue] = useState<TimePeriodMenuProps['rhs']>(rhs);\n\n let info;\n if (status === 'error') {\n info = hasProp(rhs, 'relativeDate')\n ? t('condition_builder_invalid_relative_date')\n : t('condition_builder_invalid_time_period');\n }\n\n useAfterInitialEffect(() => {\n setNewRhsValue(rhs);\n }, [rhs]);\n\n return (\n <Flex container={{ direction: 'column', pad: [0, 0, 0.25] }}>\n <CompositeInput\n value={createDisplayValue(rhs, t, locale)}\n label={t('condition_builder_value_label')}\n status={status}\n info={info}\n dialog={{\n renderer: TimePeriodMenu,\n rendererProps: {\n rhs: newRhsValue,\n fieldType,\n onChange: setNewRhsValue,\n dateFunctionsList,\n status\n },\n onApply: ({ close }) => {\n if (newRhsValue) onChange(newRhsValue);\n close();\n },\n onCancel: ({ close }) => {\n close();\n }\n }}\n onClear={() => {\n if (hasProp(newRhsValue, 'relativeDate')) {\n onChange({\n relativeDate: {\n timePeriod: 'CURRENT',\n datePart: 'DAYS'\n }\n });\n } else if (hasProp(newRhsValue, 'dateFunction')) {\n onChange({ value: '', dateFunction: dateFunctionsList[0] });\n }\n }}\n />\n </Flex>\n );\n};\n\nexport default TimePeriodInput;\n"]}
1
+ {"version":3,"file":"TimePeriodInput.js","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/RhsControls/TimePeriodInput.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState } from 'react';\nimport type { FunctionComponent } from 'react';\n\nimport {\n Flex,\n useConfiguration,\n useI18n,\n hasProp,\n CompositeInput,\n parseToDate,\n useAfterInitialEffect\n} from '@pega/cosmos-react-core';\nimport type {\n ForwardProps,\n TranslationFunction,\n TranslationPack,\n ExcludeStrict\n} from '@pega/cosmos-react-core';\nimport type { DateTimeVariant } from '@pega/cosmos-react-core/lib/components/DateTime/DateTime.types';\nimport { formatDateTime } from '@pega/cosmos-react-core/lib/components/DateTime/utils';\nimport { getDayOfWeekNamesMap } from '@pega/cosmos-react-core/lib/components/DateTime/Input/utils';\n\nimport type { RhsWithDateFunction, RhsWithRelativeDate } from '../ConditionBuilder.types';\nimport { formatRelativeDate } from '../core/formatter';\nimport type { DateFunction } from '../core/types';\n\nimport TimePeriodMenu from './TimePeriodMenu';\nimport type { TimePeriodMenuProps } from './TimePeriodMenu';\n\nconst dateDisplayVariants: Record<\n ExcludeStrict<DateFunction, 'MONTHS_OF_YEAR' | 'DAYS_OF_MONTH' | 'DAYS_OF_WEEK' | 'HOURS_OF_DAY'>,\n DateTimeVariant\n> = {\n YEARS: 'year',\n QUARTERS: 'quarteryear',\n MONTHS: 'monthyear',\n WEEKS: 'week',\n DAYS: 'date',\n HOURS: 'datetime',\n MINUTES: 'datetime',\n SECONDS: 'datetime'\n};\n\n/** Creating display value for the selected time period value */\nconst createDisplayValue = (\n rhsValue: RhsWithDateFunction | RhsWithRelativeDate,\n t: TranslationFunction<TranslationPack>,\n locale: string\n) => {\n if (hasProp(rhsValue, 'relativeDate')) {\n const {\n relativeDate: { timePeriod, interval, datePart }\n } = rhsValue;\n return formatRelativeDate(t, timePeriod, datePart, interval);\n }\n\n const { value, dateFunction } = rhsValue;\n\n if (!value && !(dateFunction === 'HOURS_OF_DAY' && value === 0)) {\n return t('condition_builder_select_placeholder');\n }\n\n switch (dateFunction) {\n case 'MONTHS_OF_YEAR':\n return new Date(2021, (value as number) - 1, 1).toLocaleString(locale, { month: 'long' });\n\n case 'DAYS_OF_MONTH':\n return t('condition_builder_day_number_of_month', [value], {\n count: Number(value),\n pluralType: 'ordinal'\n });\n case 'DAYS_OF_WEEK': {\n const dayOfWeekOptions = getDayOfWeekNamesMap();\n return dayOfWeekOptions[Number(value)];\n }\n case 'HOURS_OF_DAY':\n return t('condition_builder_hour_number_of_day', [`${value.toString().padStart(2, '0')}:00`]);\n case 'MINUTES':\n case 'SECONDS': {\n const result = dateFunction === 'SECONDS' ? t('seconds_text') : t('minutes_text');\n let output = formatDateTime(parseToDate(value), {\n t,\n locale,\n format: dateFunction === 'SECONDS' ? 'long' : 'short',\n variant: dateDisplayVariants[dateFunction],\n timeZone: 'UTC'\n });\n output += ` (${result.toLowerCase()})`;\n return output;\n }\n default: {\n return formatDateTime(parseToDate(value), {\n t,\n locale,\n format: 'short',\n variant: dateDisplayVariants[dateFunction],\n timeZone: 'UTC'\n });\n }\n }\n};\n\nconst TimePeriodInput: FunctionComponent<TimePeriodMenuProps & ForwardProps> = (\n props: TimePeriodMenuProps\n) => {\n const { rhs, onChange, dateFunctionsList, status, fieldType } = props;\n const t = useI18n();\n const { locale } = useConfiguration();\n const [newRhsValue, setNewRhsValue] = useState<TimePeriodMenuProps['rhs']>(rhs);\n\n let info;\n if (status === 'error') {\n info = hasProp(rhs, 'relativeDate')\n ? t('condition_builder_invalid_relative_date')\n : t('condition_builder_invalid_time_period');\n }\n\n useAfterInitialEffect(() => {\n setNewRhsValue(rhs);\n }, [rhs]);\n\n return (\n <Flex container={{ direction: 'column', pad: [0, 0, 0.25] }}>\n <CompositeInput\n value={createDisplayValue(rhs, t, locale)}\n label={t('condition_builder_value_label')}\n status={status}\n info={info}\n dialog={{\n renderer: TimePeriodMenu,\n rendererProps: {\n rhs: newRhsValue,\n fieldType,\n onChange: setNewRhsValue,\n dateFunctionsList,\n status\n },\n onApply: ({ close }) => {\n if (newRhsValue) onChange(newRhsValue);\n close();\n },\n onCancel: ({ close }) => {\n close();\n }\n }}\n onClear={() => {\n if (hasProp(newRhsValue, 'relativeDate')) {\n onChange({\n relativeDate: {\n timePeriod: 'CURRENT',\n datePart: 'DAYS'\n }\n });\n } else if (hasProp(newRhsValue, 'dateFunction')) {\n onChange({ value: '', dateFunction: dateFunctionsList[0] });\n }\n }}\n />\n </Flex>\n );\n};\n\nexport default TimePeriodInput;\n"]}
@@ -1,5 +1,5 @@
1
- import type { FunctionComponent } from 'react';
2
- import type { BaseProps, ForwardProps } from '@pega/cosmos-react-core';
1
+ import type { FunctionComponent, Ref } from 'react';
2
+ import type { BaseProps, ForwardProps, HandleValue } 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
  /**
@@ -33,6 +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
+ /** Imperative handle */
37
+ handle?: Ref<HandleValue>;
36
38
  }
37
39
  /** A controlled component for controls on a Condition's RHS */
38
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,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,CAwGT;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,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,MAAM,CAkBtF;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;CACrC;AAED,+DAA+D;AAC/D,QAAA,MAAM,WAAW,EAAE,iBAAiB,CAAC,eAAe,GAAG,YAAY,CAkalE,CAAC;AACF,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/RhsControls/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAe,GAAG,EAAE,MAAM,OAAO,CAAC;AAcjE,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAMpF,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;AAyC3F;;;;;;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,CAiGT;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,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,MAAM,CAkBtF;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,wBAAwB;IACxB,MAAM,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;CAC3B;AAED,+DAA+D;AAC/D,QAAA,MAAM,WAAW,EAAE,iBAAiB,CAAC,eAAe,GAAG,YAAY,CAoblE,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, useMemo } from 'react';
3
- import { DateInput, DateTimeInput, Flex, Input, hasProp, TimeInput, useI18n, DateRangeInput, TimeRangeInput } from '@pega/cosmos-react-core';
2
+ import { useState, useEffect, useMemo } from 'react';
3
+ import { DateInput, DateTimeInput, Flex, Input, hasProp, TimeInput, useI18n, DateRangeInput, TimeRangeInput, NumberRangeInput } 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,8 +9,6 @@ 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';
14
12
  function isValidLiteralValue(value, fieldType, trimValues = false) {
15
13
  // Identify any invalid numbers (e.g. when `-` is entered)
16
14
  if (typeof value === 'number') {
@@ -104,11 +102,6 @@ export function isValidRhs(rhs, lhs, fields, fieldType, trimValues = false) {
104
102
  !isValidLiteralValue(rhs.end, fieldType, trimValues)) {
105
103
  return false;
106
104
  }
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
- }
112
105
  if (fieldType === 'TIME_ONLY') {
113
106
  if (typeof rhs.start === 'number' && typeof rhs.end === 'number')
114
107
  return rhs.start < rhs.end;
@@ -182,7 +175,7 @@ export function truncateISODateString(dateString, fieldType) {
182
175
  }
183
176
  /** A controlled component for controls on a Condition's RHS */
184
177
  const RhsControls = (props) => {
185
- const { lhs, comparator, rhs, fields, onChange, indicateErrors, itemDirection, validRhsTypes, dateFunctions } = props;
178
+ const { lhs, comparator, rhs, fields, onChange, indicateErrors, itemDirection, validRhsTypes, dateFunctions, handle } = props;
186
179
  const t = useI18n();
187
180
  const [apiError, setApiError] = useState(null);
188
181
  // Find the field corresponding to the LHS
@@ -210,6 +203,15 @@ const RhsControls = (props) => {
210
203
  };
211
204
  return findMatchingObjectType(fields, matchingField.type);
212
205
  }, [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]);
213
215
  // If a field is not selected or if the comparator doesn't need any RHS, don't render anything
214
216
  if (rhs === undefined) {
215
217
  return _jsx("div", {}); // Rendering a placeholder div to keep the layout consistent
@@ -220,7 +222,6 @@ const RhsControls = (props) => {
220
222
  return _jsx("div", {}); // Rendering a placeholder div to keep the layout consistent
221
223
  }
222
224
  const fieldType = matchingField.type;
223
- const fieldUnit = matchingField.unit;
224
225
  const parameters = matchingField.parameters !== undefined ? matchingField.parameters : [];
225
226
  // If errors should be indicated inline, validate the current rhs
226
227
  let showError = false;
@@ -297,20 +298,32 @@ const RhsControls = (props) => {
297
298
  onChange(onChangeParam);
298
299
  };
299
300
  const handleNumberRangeValueChange = ({ start, end }) => {
300
- const startValue = start;
301
- const endValue = end;
302
- const hasStartValue = startValue !== undefined;
303
- const hasEndValue = endValue !== undefined;
301
+ const startValue = start.trim();
302
+ const endValue = end.trim();
304
303
  onChange({
305
- start: hasStartValue ? Number(start) : '',
306
- end: hasEndValue ? Number(end) : ''
304
+ start: startValue ? Number(start) : '',
305
+ end: endValue ? Number(end) : ''
307
306
  },
308
307
  // checking one of values is empty, but not both
309
- ((!hasStartValue || !hasEndValue) && (hasStartValue || hasEndValue)) ||
310
- (hasStartValue && hasEndValue && startValue > endValue)
308
+ ((!startValue || !endValue) && (startValue || endValue)) ||
309
+ (startValue && endValue && startValue > endValue)
311
310
  ? 'error'
312
311
  : undefined);
313
312
  };
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
+ };
314
327
  // Render the menu directly if in a vertical layout
315
328
  const TimePeriodComp = itemDirection === 'column' ? TimePeriodMenu : TimePeriodInput;
316
329
  const alignItems = showError ? 'center' : 'end';
@@ -319,8 +332,8 @@ const RhsControls = (props) => {
319
332
  alignItems: itemDirection === 'column' ? 'stretch' : alignItems,
320
333
  justify: 'between',
321
334
  gap: 0.5
322
- }, 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') })), 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') &&
323
- (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') : '' })), fieldType === 'TIME_ONLY' && (_jsx(TimeRangeInput, { mode: 'time', value: {
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(Input, { value: csvInput, onChange: handleCSVChange, 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(NumberRangeInput, { value: { start: rhs.start.toString(), end: rhs.end.toString() }, onChange: handleNumberRangeValueChange, status: showError ? 'error' : undefined, label: t('condition_builder_value_label'), info: showError ? t('condition_builder_invalid_number_range') : undefined, handle: handle, numberOfDecimals: fieldType === 'INTEGER' ? 0 : undefined })), 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') : '' })), fieldType === 'TIME_ONLY' && (_jsx(TimeRangeInput, { mode: 'time', value: {
324
337
  start: rhs.start === '' ? undefined : rhs.start,
325
338
  end: rhs.end === '' ? undefined : rhs.end
326
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') : '' }))] }))] }));