@pega/cosmos-react-condition-builder 3.0.0-dev.15.0 → 3.0.0-dev.16.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 (34) hide show
  1. package/lib/components/ConditionBuilder/AtomicCondition.d.ts.map +1 -1
  2. package/lib/components/ConditionBuilder/AtomicCondition.js +6 -7
  3. package/lib/components/ConditionBuilder/AtomicCondition.js.map +1 -1
  4. package/lib/components/ConditionBuilder/ConditionBuilder.types.d.ts +15 -15
  5. package/lib/components/ConditionBuilder/ConditionBuilder.types.d.ts.map +1 -1
  6. package/lib/components/ConditionBuilder/ConditionBuilder.types.js.map +1 -1
  7. package/lib/components/ConditionBuilder/FieldCondition.types.d.ts +2 -2
  8. package/lib/components/ConditionBuilder/FieldCondition.types.d.ts.map +1 -1
  9. package/lib/components/ConditionBuilder/FieldCondition.types.js.map +1 -1
  10. package/lib/components/ConditionBuilder/RhsControls/FieldSelector.d.ts.map +1 -1
  11. package/lib/components/ConditionBuilder/RhsControls/FieldSelector.js +11 -19
  12. package/lib/components/ConditionBuilder/RhsControls/FieldSelector.js.map +1 -1
  13. package/lib/components/ConditionBuilder/RhsControls/ValueSelector.d.ts.map +1 -1
  14. package/lib/components/ConditionBuilder/RhsControls/ValueSelector.js +2 -1
  15. package/lib/components/ConditionBuilder/RhsControls/ValueSelector.js.map +1 -1
  16. package/lib/components/ConditionBuilder/RhsControls/index.d.ts.map +1 -1
  17. package/lib/components/ConditionBuilder/RhsControls/index.js +5 -4
  18. package/lib/components/ConditionBuilder/RhsControls/index.js.map +1 -1
  19. package/lib/components/ConditionBuilder/core/evaluator.d.ts.map +1 -1
  20. package/lib/components/ConditionBuilder/core/evaluator.js +3 -2
  21. package/lib/components/ConditionBuilder/core/evaluator.js.map +1 -1
  22. package/lib/components/ConditionBuilder/core/formatter.d.ts.map +1 -1
  23. package/lib/components/ConditionBuilder/core/formatter.js +7 -4
  24. package/lib/components/ConditionBuilder/core/formatter.js.map +1 -1
  25. package/lib/components/ConditionBuilder/core/transformer.d.ts.map +1 -1
  26. package/lib/components/ConditionBuilder/core/transformer.js +3 -2
  27. package/lib/components/ConditionBuilder/core/transformer.js.map +1 -1
  28. package/lib/components/ConditionBuilder/core/utils.d.ts +5 -1
  29. package/lib/components/ConditionBuilder/core/utils.d.ts.map +1 -1
  30. package/lib/components/ConditionBuilder/core/utils.js +18 -0
  31. package/lib/components/ConditionBuilder/core/utils.js.map +1 -1
  32. package/lib/components/ConditionInput/ConditionInput.js +1 -1
  33. package/lib/components/ConditionInput/ConditionInput.js.map +1 -1
  34. package/package.json +2 -2
@@ -1,5 +1,6 @@
1
1
  // cspell:ignore words YYYYQQ, YYYYMM, YYYYMMDD, YYYYMMDDHH
2
2
  import { hasProp } from '@pega/cosmos-react-core';
3
+ import { getItem } from './utils';
3
4
  import transformComplexCondition from './transformer';
4
5
  const QUOTE = '"';
5
6
  /** Evaluates leaf conditions with BOOLEAN fields */
@@ -190,8 +191,8 @@ function evaluateLeafCondition(leaf, data, fields) {
190
191
  return !isNullValue;
191
192
  }
192
193
  // For all other comparators, evaluate separately by field-type
193
- const field = fields.find(f => f.name === lhs.field);
194
- if (field === undefined) {
194
+ const field = getItem(fields, lhs.field);
195
+ if (field === undefined || !hasProp(field, 'type')) {
195
196
  return false; // If the corresponding field is not found in the input fields
196
197
  }
197
198
  switch (field.type) {
@@ -1 +1 @@
1
- {"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/evaluator.ts"],"names":[],"mappings":"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","sourcesContent":["// cspell:ignore words YYYYQQ, YYYYMM, YYYYMMDD, YYYYMMDDHH\nimport { hasProp } from '@pega/cosmos-react-core';\n\nimport { Condition, LeafCondition, Field, RhsWithDateFunction } from '../ConditionBuilder.types';\n\nimport { Comparator, FieldType } from './types';\nimport transformComplexCondition from './transformer';\n\nconst QUOTE = '\"';\n/** Evaluates leaf conditions with BOOLEAN fields */\nfunction evaluateBoolCondition(\n lhsValue: boolean,\n comparator: Comparator,\n rhsValue?: boolean // undefined for IS_TRUE/IS_FALSE comparators\n): boolean {\n switch (comparator) {\n case 'IS_TRUE':\n return lhsValue === true;\n case 'IS_FALSE':\n return lhsValue === false;\n case 'EQ':\n return lhsValue === rhsValue;\n case 'NEQ':\n return lhsValue !== rhsValue;\n default:\n return false; // Not needed\n }\n}\n\n/** Evaluates leaf conditions with TEXT fields */\nfunction evaluateTextCondition(\n lhsValue: string,\n comparator: Comparator,\n rhsValue: string | string[]\n): boolean {\n lhsValue = lhsValue.toLowerCase(); // Converting to lowerCase to perform case-insensitive comparisons\n\n // For IN/NOT_IN comparators, the rhsValue is of type `string[]`\n if (Array.isArray(rhsValue)) {\n const lhsInRhs = rhsValue\n .map(v => {\n v = v.toLowerCase().trim();\n // Handle text in quotes\n if (v.startsWith(QUOTE) && v.endsWith(QUOTE)) {\n v = v.slice(1, -1);\n }\n return v;\n })\n .includes(lhsValue); // Converting to lowerCase to perform case-insensitive comparisons\n return comparator === 'IN' ? lhsInRhs : !lhsInRhs; // Handling IN/NOT_IN comparators\n }\n // Converting to lowerCase to perform case-insensitive comparisons\n rhsValue = rhsValue.toLowerCase().trim();\n\n // Handle if rhs is in quotes\n if (rhsValue.startsWith(QUOTE) && rhsValue.endsWith(QUOTE)) {\n rhsValue = rhsValue.slice(1, -1);\n }\n switch (comparator) {\n case 'EQ':\n return lhsValue === rhsValue;\n case 'NEQ':\n return lhsValue !== rhsValue;\n case 'STARTS_WITH':\n return lhsValue.startsWith(rhsValue);\n case 'NOT_STARTS_WITH':\n return !lhsValue.startsWith(rhsValue);\n case 'ENDS_WITH':\n return lhsValue.endsWith(rhsValue);\n case 'NOT_ENDS_WITH':\n return !lhsValue.endsWith(rhsValue);\n case 'CONTAINS':\n return lhsValue.includes(rhsValue);\n case 'NOT_CONTAINS':\n return !lhsValue.includes(rhsValue);\n default:\n return false; // Not needed\n }\n}\n\n/** Evaluates leaf conditions with NUMBER fields */\nfunction evaluateNumericCondition(\n lhsValue: number,\n comparator: Comparator,\n rhsValue: number | number[]\n): boolean {\n // For IN/NOT_IN comparators, the rhsValue is of type `number[]`\n if (Array.isArray(rhsValue)) {\n const lhsInRhs: boolean = rhsValue.includes(lhsValue);\n return comparator === 'IN' ? lhsInRhs : !lhsInRhs; // Handling IN/NOT_IN comparators\n }\n\n switch (comparator) {\n case 'EQ':\n return lhsValue === rhsValue;\n case 'NEQ':\n return lhsValue !== rhsValue;\n case 'GT':\n return lhsValue > rhsValue;\n case 'GTE':\n return lhsValue >= rhsValue;\n case 'LT':\n return lhsValue < rhsValue;\n case 'LTE':\n return lhsValue <= rhsValue;\n default:\n return false; // Not needed\n }\n}\n\n/** Returns different date parts in local time from the given date object */\nfunction getDateParts(date: Date): {\n YYYY: string;\n QQ: string;\n MM: string;\n DD: string;\n HH: string;\n} {\n return {\n YYYY: date.getFullYear().toString().padStart(4, '0'),\n QQ: (3 * Math.floor(date.getMonth() / 3) + 1).toString().padStart(2, '0'), // MM value for the quarter's starting month\n MM: (date.getMonth() + 1).toString().padStart(2, '0'),\n DD: date.getDate().toString().padStart(2, '0'),\n HH: date.getHours().toString().padStart(2, '0')\n };\n}\n\n/** Evaluates leaf conditions with Date-functions */\nfunction evaluateDateFuncCondition(\n lhsValue: string,\n fieldType: FieldType,\n comparator: Comparator,\n rhs: RhsWithDateFunction\n): boolean {\n if (fieldType === 'DATE_ONLY') lhsValue += 'T00:00:00'; // `T00:00:00` is needed for the `Date()` constructor to treat it as local (not UTC)\n const lhsDateObj = new Date(lhsValue);\n const { YYYY: lhsYYYY, QQ: lhsQQ, MM: lhsMM, DD: lhsDD, HH: lhsHH } = getDateParts(lhsDateObj);\n\n // Determine a numeric representation of the values for the given date function\n let lhsNumVal = 0;\n let rhsNumVal = 0;\n switch (rhs.dateFunction) {\n case 'YEARS':\n // Using YYYY as a number\n lhsNumVal = Number(lhsYYYY);\n rhsNumVal = Number((rhs.value as string).slice(0, 4));\n break;\n case 'QUARTERS':\n // Using YYYYQQ as a number\n lhsNumVal = Number(`${lhsYYYY}${lhsQQ}`);\n rhsNumVal = Number((rhs.value as string).replace(/-/g, '').slice(0, 6));\n break;\n case 'MONTHS':\n // Using YYYYMM as a number\n lhsNumVal = Number(`${lhsYYYY}${lhsMM}`);\n rhsNumVal = Number((rhs.value as string).replace(/-/g, '').slice(0, 6));\n break;\n case 'WEEKS': {\n // Identify the start of week for the given LHS\n const lhsDayStart = new Date(`${lhsYYYY}-${lhsMM}-${lhsDD}T00:00:00`); // `T00:00:00` is needed for the `Date()` constructor to treat it as local (not UTC)\n const lhsDay = lhsDayStart.getDay() || 7; // 'getDay()' returns 0 for Sundays\n const lhsWeekStart = new Date(lhsDayStart.getTime() - (lhsDay - 1) * 24 * 60 * 60 * 1000);\n const { YYYY: weekStartYYYY, MM: weekStartMM, DD: weekStartDD } = getDateParts(lhsWeekStart);\n\n // Using YYYYMMDD of the week-start-day as a number\n lhsNumVal = Number(`${weekStartYYYY}${weekStartMM}${weekStartDD}`);\n rhsNumVal = Number((rhs.value as string).replace(/-/g, ''));\n break;\n }\n case 'DAYS':\n // Using YYYYMMDD as a number\n lhsNumVal = Number(`${lhsYYYY}${lhsMM}${lhsDD}`);\n rhsNumVal = Number((rhs.value as string).replace(/-/g, ''));\n break;\n case 'HOURS':\n // Using YYYYMMDDHH as a number\n lhsNumVal = Number(`${lhsYYYY}${lhsMM}${lhsDD}${lhsHH}`);\n rhsNumVal = Number((rhs.value as string).replace(/-|T/g, '').slice(0, 10));\n break;\n case 'MONTHS_OF_YEAR':\n lhsNumVal = Number(lhsMM);\n rhsNumVal = rhs.value as number;\n break;\n case 'DAYS_OF_MONTH':\n lhsNumVal = Number(lhsDD);\n rhsNumVal = rhs.value as number;\n break;\n case 'DAYS_OF_WEEK':\n lhsNumVal = lhsDateObj.getDay() || 7; // 'getDay()' returns 0 for Sundays\n rhsNumVal = rhs.value as number;\n break;\n default: // Not needed\n }\n\n // Compare the numeric representations\n return evaluateNumericCondition(lhsNumVal, comparator, rhsNumVal);\n}\n\n/** Evaluates a leaf node in a condition tree for the given data document */\nfunction evaluateLeafCondition(\n leaf: LeafCondition,\n data: { [fieldName: string]: any },\n fields: Field[]\n): boolean {\n // For safety against any malformed nodes or unexpected types/formats in data-values\n try {\n const { lhs, comparator, rhs } = leaf;\n\n // Determine LHS and RHS values\n const lhsValue: any = data[lhs.field];\n let rhsValue: any;\n if (rhs) {\n if (hasProp(rhs, 'field')) {\n rhsValue = data[rhs.field]; // If RHS is another field\n } else if (hasProp(rhs, 'value')) {\n rhsValue = rhs.value; // If RHS is a single value\n } else if (hasProp(rhs, 'relativeDate')) {\n rhsValue = true; // TODO: When we transform relative dates to LT/GT statements, we won't need this.\n } else {\n rhsValue = rhs.values; // If RHS is a list of values\n }\n }\n\n // Handle NULL comparators common to all field-types\n const isNullValue = lhsValue === null || lhsValue === undefined;\n if (comparator === 'IS_NULL') {\n return isNullValue;\n }\n if (comparator === 'IS_NOT_NULL') {\n return !isNullValue;\n }\n\n // For all other comparators, evaluate separately by field-type\n const field = fields.find(f => f.name === lhs.field);\n if (field === undefined) {\n return false; // If the corresponding field is not found in the input fields\n }\n switch (field.type) {\n case 'BOOLEAN':\n return evaluateBoolCondition(lhsValue, comparator, rhsValue);\n case 'TEXT':\n return evaluateTextCondition(lhsValue, comparator, rhsValue);\n case 'NUMBER':\n case 'TIME_ONLY':\n return evaluateNumericCondition(lhsValue, comparator, rhsValue);\n case 'DATE_TIME':\n case 'DATE_ONLY': {\n if (rhs && hasProp(rhs, 'dateFunction')) {\n return evaluateDateFuncCondition(lhsValue, field.type, comparator, rhs);\n }\n\n if (rhs && hasProp(rhs, 'relativeDate')) {\n return true; // TODO: When we transform relative dates to LT/GT statements, we won't need this.\n }\n\n // Both the values are expected to be in an ISO-8601 format\n const lhsAsTicks = new Date(lhsValue).getTime();\n const rhsAsTicks = new Date(rhsValue).getTime();\n return evaluateNumericCondition(lhsAsTicks, comparator, rhsAsTicks);\n }\n default:\n return false; // Not needed\n }\n } catch {\n return false;\n }\n}\n\n/**\n * Evaluates a condition tree for the given data document\n * NOTE: The output is nondeterministic if:\n * - any of the nodes in the input Condition are in an unexpected format (invalid keys, comparators etc.)\n * - any null/undefined values are encountered in the input data, unless they are used with an IS_NULL/IS_NOT_NULL comparator\n * - stringified values are encountered for BOOLEAN/NUMBER fields\n * - non-ISO strings are passed for DATE_TIME/DATE_ONLY fields\n * - TIME_ONLY data values are not passed as `number of milliseconds since the start of day`\n */\nexport default function evaluateCondition(\n condition: Condition,\n data: { [fieldName: string]: any },\n fields: Field[]\n): boolean {\n // For safety against any malformed trees\n try {\n // Update relative date conditions to be LT/GT date range conditions\n const updatedCondition: Condition = transformComplexCondition(condition, fields);\n if (hasProp(updatedCondition, 'AND')) {\n // Return true if all the child nodes are true\n return updatedCondition.AND.every(child => evaluateCondition(child, data, fields));\n }\n if (hasProp(updatedCondition, 'OR')) {\n // Return true if any one of the child nodes is true\n return updatedCondition.OR.some(child => evaluateCondition(child, data, fields));\n }\n if (hasProp(updatedCondition, 'NOT')) {\n return !evaluateCondition(updatedCondition.NOT, data, fields);\n }\n return evaluateLeafCondition(updatedCondition.condition, data, fields);\n } catch {\n return false;\n }\n}\n"]}
1
+ {"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/evaluator.ts"],"names":[],"mappings":"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","sourcesContent":["// cspell:ignore words YYYYQQ, YYYYMM, YYYYMMDD, YYYYMMDDHH\nimport { hasProp } from '@pega/cosmos-react-core';\n\nimport { Condition, LeafCondition, Field, RhsWithDateFunction } from '../ConditionBuilder.types';\n\nimport { getItem } from './utils';\nimport { Comparator, FieldType } from './types';\nimport transformComplexCondition from './transformer';\n\nconst QUOTE = '\"';\n/** Evaluates leaf conditions with BOOLEAN fields */\nfunction evaluateBoolCondition(\n lhsValue: boolean,\n comparator: Comparator,\n rhsValue?: boolean // undefined for IS_TRUE/IS_FALSE comparators\n): boolean {\n switch (comparator) {\n case 'IS_TRUE':\n return lhsValue === true;\n case 'IS_FALSE':\n return lhsValue === false;\n case 'EQ':\n return lhsValue === rhsValue;\n case 'NEQ':\n return lhsValue !== rhsValue;\n default:\n return false; // Not needed\n }\n}\n\n/** Evaluates leaf conditions with TEXT fields */\nfunction evaluateTextCondition(\n lhsValue: string,\n comparator: Comparator,\n rhsValue: string | string[]\n): boolean {\n lhsValue = lhsValue.toLowerCase(); // Converting to lowerCase to perform case-insensitive comparisons\n\n // For IN/NOT_IN comparators, the rhsValue is of type `string[]`\n if (Array.isArray(rhsValue)) {\n const lhsInRhs = rhsValue\n .map(v => {\n v = v.toLowerCase().trim();\n // Handle text in quotes\n if (v.startsWith(QUOTE) && v.endsWith(QUOTE)) {\n v = v.slice(1, -1);\n }\n return v;\n })\n .includes(lhsValue); // Converting to lowerCase to perform case-insensitive comparisons\n return comparator === 'IN' ? lhsInRhs : !lhsInRhs; // Handling IN/NOT_IN comparators\n }\n // Converting to lowerCase to perform case-insensitive comparisons\n rhsValue = rhsValue.toLowerCase().trim();\n\n // Handle if rhs is in quotes\n if (rhsValue.startsWith(QUOTE) && rhsValue.endsWith(QUOTE)) {\n rhsValue = rhsValue.slice(1, -1);\n }\n switch (comparator) {\n case 'EQ':\n return lhsValue === rhsValue;\n case 'NEQ':\n return lhsValue !== rhsValue;\n case 'STARTS_WITH':\n return lhsValue.startsWith(rhsValue);\n case 'NOT_STARTS_WITH':\n return !lhsValue.startsWith(rhsValue);\n case 'ENDS_WITH':\n return lhsValue.endsWith(rhsValue);\n case 'NOT_ENDS_WITH':\n return !lhsValue.endsWith(rhsValue);\n case 'CONTAINS':\n return lhsValue.includes(rhsValue);\n case 'NOT_CONTAINS':\n return !lhsValue.includes(rhsValue);\n default:\n return false; // Not needed\n }\n}\n\n/** Evaluates leaf conditions with NUMBER fields */\nfunction evaluateNumericCondition(\n lhsValue: number,\n comparator: Comparator,\n rhsValue: number | number[]\n): boolean {\n // For IN/NOT_IN comparators, the rhsValue is of type `number[]`\n if (Array.isArray(rhsValue)) {\n const lhsInRhs: boolean = rhsValue.includes(lhsValue);\n return comparator === 'IN' ? lhsInRhs : !lhsInRhs; // Handling IN/NOT_IN comparators\n }\n\n switch (comparator) {\n case 'EQ':\n return lhsValue === rhsValue;\n case 'NEQ':\n return lhsValue !== rhsValue;\n case 'GT':\n return lhsValue > rhsValue;\n case 'GTE':\n return lhsValue >= rhsValue;\n case 'LT':\n return lhsValue < rhsValue;\n case 'LTE':\n return lhsValue <= rhsValue;\n default:\n return false; // Not needed\n }\n}\n\n/** Returns different date parts in local time from the given date object */\nfunction getDateParts(date: Date): {\n YYYY: string;\n QQ: string;\n MM: string;\n DD: string;\n HH: string;\n} {\n return {\n YYYY: date.getFullYear().toString().padStart(4, '0'),\n QQ: (3 * Math.floor(date.getMonth() / 3) + 1).toString().padStart(2, '0'), // MM value for the quarter's starting month\n MM: (date.getMonth() + 1).toString().padStart(2, '0'),\n DD: date.getDate().toString().padStart(2, '0'),\n HH: date.getHours().toString().padStart(2, '0')\n };\n}\n\n/** Evaluates leaf conditions with Date-functions */\nfunction evaluateDateFuncCondition(\n lhsValue: string,\n fieldType: FieldType,\n comparator: Comparator,\n rhs: RhsWithDateFunction\n): boolean {\n if (fieldType === 'DATE_ONLY') lhsValue += 'T00:00:00'; // `T00:00:00` is needed for the `Date()` constructor to treat it as local (not UTC)\n const lhsDateObj = new Date(lhsValue);\n const { YYYY: lhsYYYY, QQ: lhsQQ, MM: lhsMM, DD: lhsDD, HH: lhsHH } = getDateParts(lhsDateObj);\n\n // Determine a numeric representation of the values for the given date function\n let lhsNumVal = 0;\n let rhsNumVal = 0;\n switch (rhs.dateFunction) {\n case 'YEARS':\n // Using YYYY as a number\n lhsNumVal = Number(lhsYYYY);\n rhsNumVal = Number((rhs.value as string).slice(0, 4));\n break;\n case 'QUARTERS':\n // Using YYYYQQ as a number\n lhsNumVal = Number(`${lhsYYYY}${lhsQQ}`);\n rhsNumVal = Number((rhs.value as string).replace(/-/g, '').slice(0, 6));\n break;\n case 'MONTHS':\n // Using YYYYMM as a number\n lhsNumVal = Number(`${lhsYYYY}${lhsMM}`);\n rhsNumVal = Number((rhs.value as string).replace(/-/g, '').slice(0, 6));\n break;\n case 'WEEKS': {\n // Identify the start of week for the given LHS\n const lhsDayStart = new Date(`${lhsYYYY}-${lhsMM}-${lhsDD}T00:00:00`); // `T00:00:00` is needed for the `Date()` constructor to treat it as local (not UTC)\n const lhsDay = lhsDayStart.getDay() || 7; // 'getDay()' returns 0 for Sundays\n const lhsWeekStart = new Date(lhsDayStart.getTime() - (lhsDay - 1) * 24 * 60 * 60 * 1000);\n const { YYYY: weekStartYYYY, MM: weekStartMM, DD: weekStartDD } = getDateParts(lhsWeekStart);\n\n // Using YYYYMMDD of the week-start-day as a number\n lhsNumVal = Number(`${weekStartYYYY}${weekStartMM}${weekStartDD}`);\n rhsNumVal = Number((rhs.value as string).replace(/-/g, ''));\n break;\n }\n case 'DAYS':\n // Using YYYYMMDD as a number\n lhsNumVal = Number(`${lhsYYYY}${lhsMM}${lhsDD}`);\n rhsNumVal = Number((rhs.value as string).replace(/-/g, ''));\n break;\n case 'HOURS':\n // Using YYYYMMDDHH as a number\n lhsNumVal = Number(`${lhsYYYY}${lhsMM}${lhsDD}${lhsHH}`);\n rhsNumVal = Number((rhs.value as string).replace(/-|T/g, '').slice(0, 10));\n break;\n case 'MONTHS_OF_YEAR':\n lhsNumVal = Number(lhsMM);\n rhsNumVal = rhs.value as number;\n break;\n case 'DAYS_OF_MONTH':\n lhsNumVal = Number(lhsDD);\n rhsNumVal = rhs.value as number;\n break;\n case 'DAYS_OF_WEEK':\n lhsNumVal = lhsDateObj.getDay() || 7; // 'getDay()' returns 0 for Sundays\n rhsNumVal = rhs.value as number;\n break;\n default: // Not needed\n }\n\n // Compare the numeric representations\n return evaluateNumericCondition(lhsNumVal, comparator, rhsNumVal);\n}\n\n/** Evaluates a leaf node in a condition tree for the given data document */\nfunction evaluateLeafCondition(\n leaf: LeafCondition,\n data: { [fieldName: string]: any },\n fields: Field[]\n): boolean {\n // For safety against any malformed nodes or unexpected types/formats in data-values\n try {\n const { lhs, comparator, rhs } = leaf;\n\n // Determine LHS and RHS values\n const lhsValue: any = data[lhs.field];\n let rhsValue: any;\n if (rhs) {\n if (hasProp(rhs, 'field')) {\n rhsValue = data[rhs.field]; // If RHS is another field\n } else if (hasProp(rhs, 'value')) {\n rhsValue = rhs.value; // If RHS is a single value\n } else if (hasProp(rhs, 'relativeDate')) {\n rhsValue = true; // TODO: When we transform relative dates to LT/GT statements, we won't need this.\n } else {\n rhsValue = rhs.values; // If RHS is a list of values\n }\n }\n\n // Handle NULL comparators common to all field-types\n const isNullValue = lhsValue === null || lhsValue === undefined;\n if (comparator === 'IS_NULL') {\n return isNullValue;\n }\n if (comparator === 'IS_NOT_NULL') {\n return !isNullValue;\n }\n\n // For all other comparators, evaluate separately by field-type\n const field = getItem(fields, lhs.field);\n if (field === undefined || !hasProp(field, 'type')) {\n return false; // If the corresponding field is not found in the input fields\n }\n switch (field.type) {\n case 'BOOLEAN':\n return evaluateBoolCondition(lhsValue, comparator, rhsValue);\n case 'TEXT':\n return evaluateTextCondition(lhsValue, comparator, rhsValue);\n case 'NUMBER':\n case 'TIME_ONLY':\n return evaluateNumericCondition(lhsValue, comparator, rhsValue);\n case 'DATE_TIME':\n case 'DATE_ONLY': {\n if (rhs && hasProp(rhs, 'dateFunction')) {\n return evaluateDateFuncCondition(lhsValue, field.type, comparator, rhs);\n }\n\n if (rhs && hasProp(rhs, 'relativeDate')) {\n return true; // TODO: When we transform relative dates to LT/GT statements, we won't need this.\n }\n\n // Both the values are expected to be in an ISO-8601 format\n const lhsAsTicks = new Date(lhsValue).getTime();\n const rhsAsTicks = new Date(rhsValue).getTime();\n return evaluateNumericCondition(lhsAsTicks, comparator, rhsAsTicks);\n }\n default:\n return false; // Not needed\n }\n } catch {\n return false;\n }\n}\n\n/**\n * Evaluates a condition tree for the given data document\n * NOTE: The output is nondeterministic if:\n * - any of the nodes in the input Condition are in an unexpected format (invalid keys, comparators etc.)\n * - any null/undefined values are encountered in the input data, unless they are used with an IS_NULL/IS_NOT_NULL comparator\n * - stringified values are encountered for BOOLEAN/NUMBER fields\n * - non-ISO strings are passed for DATE_TIME/DATE_ONLY fields\n * - TIME_ONLY data values are not passed as `number of milliseconds since the start of day`\n */\nexport default function evaluateCondition(\n condition: Condition,\n data: { [fieldName: string]: any },\n fields: Field[]\n): boolean {\n // For safety against any malformed trees\n try {\n // Update relative date conditions to be LT/GT date range conditions\n const updatedCondition: Condition = transformComplexCondition(condition, fields);\n if (hasProp(updatedCondition, 'AND')) {\n // Return true if all the child nodes are true\n return updatedCondition.AND.every(child => evaluateCondition(child, data, fields));\n }\n if (hasProp(updatedCondition, 'OR')) {\n // Return true if any one of the child nodes is true\n return updatedCondition.OR.some(child => evaluateCondition(child, data, fields));\n }\n if (hasProp(updatedCondition, 'NOT')) {\n return !evaluateCondition(updatedCondition.NOT, data, fields);\n }\n return evaluateLeafCondition(updatedCondition.condition, data, fields);\n } catch {\n return false;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/formatter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAW,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAEnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AAGjF,OAAO,EAAE,SAAS,EAAiB,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAE5E,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAM/C,kEAAkE;AAClE,UAAU,sBAAsB;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,mBAAmB,CAAC,eAAe,CAAC,EAC/C,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAQR;AAoLD;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,eAAe,CACrC,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,KAAK,EAAE,EACf,SAAS,EAAE,mBAAmB,CAAC,eAAe,CAAC,EAC/C,OAAO,CAAC,EAAE,sBAAsB,GAC/B,MAAM,CAUR"}
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/formatter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAW,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAEnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AAGjF,OAAO,EAAE,SAAS,EAAiB,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAG5E,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAM/C,kEAAkE;AAClE,UAAU,sBAAsB;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,mBAAmB,CAAC,eAAe,CAAC,EAC/C,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAQR;AAqLD;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,eAAe,CACrC,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,KAAK,EAAE,EACf,SAAS,EAAE,mBAAmB,CAAC,eAAe,CAAC,EAC/C,OAAO,CAAC,EAAE,sBAAsB,GAC/B,MAAM,CAUR"}
@@ -3,6 +3,7 @@
3
3
  import { hasProp } from '@pega/cosmos-react-core';
4
4
  import { getFormattedValue } from '@pega/cosmos-react-core/lib/components/Number/utils';
5
5
  import { getQuarter } from '@pega/cosmos-react-core/lib/components/DateTime/Input/utils';
6
+ import { getItem } from './utils';
6
7
  import { convertMsToTimeValue } from './time-utils';
7
8
  const LPAREN = '(';
8
9
  const RPAREN = ')';
@@ -18,14 +19,16 @@ export function formatRelativeDate(translate, timePeriod, datePart, interval) {
18
19
  function formatLeafCondition(leaf, fields, translate, { locale = 'en-US' } = {}) {
19
20
  const { lhs, comparator, rhs } = leaf;
20
21
  // Determine texts for LHS and RHS
21
- const lhsField = fields.find(f => f.name === lhs.field); // Expecting valid inputs
22
- const lhsText = lhsField.label || lhsField.name; // label is optional
22
+ const lhsField = getItem(fields, lhs.field); // Expecting valid inputs
23
+ const lhsText = lhsField.primary;
23
24
  let rhsText = '';
25
+ if (!hasProp(lhsField, 'type'))
26
+ return '';
24
27
  if (rhs) {
25
28
  if (hasProp(rhs, 'field')) {
26
29
  // If RHS is another field
27
- const rhsField = fields.find(f => f.name === rhs.field); // Expecting valid inputs
28
- rhsText = rhsField.label || rhsField.name; // label is optional
30
+ const rhsField = getItem(fields, rhs.field); // Expecting valid inputs
31
+ rhsText = rhsField.primary;
29
32
  }
30
33
  else if (hasProp(rhs, 'value')) {
31
34
  if (hasProp(rhs, 'dateFunction')) {
@@ -1 +1 @@
1
- {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/formatter.ts"],"names":[],"mappings":"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","sourcesContent":["// cSpell:words LPAREN RPAREN\n// FIXME: TR (Several constructs in this file need to be localized)\nimport { hasProp, TranslationPack } from '@pega/cosmos-react-core';\nimport { getFormattedValue } from '@pega/cosmos-react-core/lib/components/Number/utils';\nimport { TranslationFunction } from '@pega/cosmos-react-core/lib/i18n/translate';\nimport { getQuarter } from '@pega/cosmos-react-core/lib/components/DateTime/Input/utils';\n\nimport { Condition, LeafCondition, Field } from '../ConditionBuilder.types';\n\nimport { DatePart, TimePeriod } from './types';\nimport { convertMsToTimeValue } from './time-utils';\n\nconst LPAREN = '(';\nconst RPAREN = ')';\n\n/** Options object optionally passed to formatCondition method. */\ninterface ConditionFormatOptions {\n locale?: string;\n}\n\nexport function formatRelativeDate(\n translate: TranslationFunction<TranslationPack>,\n timePeriod: TimePeriod,\n datePart: DatePart,\n interval?: number\n): string {\n const translationKey =\n timePeriod === 'CURRENT'\n ? `condition_builder_current_${datePart.toLowerCase().slice(0, -1)}`\n : `condition_builder_${timePeriod.toLowerCase()}_X_${datePart.toLowerCase()}`;\n return translate(translationKey as keyof TranslationPack, [interval ?? 0], {\n count: interval ?? 0\n });\n}\n\n/** Returns a user-friendly text representation of a given leaf condition */\nfunction formatLeafCondition(\n leaf: LeafCondition,\n fields: Field[],\n translate: TranslationFunction<TranslationPack>,\n { locale = 'en-US' }: ConditionFormatOptions = {}\n): string {\n const { lhs, comparator, rhs } = leaf;\n\n // Determine texts for LHS and RHS\n const lhsField = fields.find(f => f.name === lhs.field) as Field; // Expecting valid inputs\n const lhsText = lhsField.label || lhsField.name; // label is optional\n let rhsText = '';\n if (rhs) {\n if (hasProp(rhs, 'field')) {\n // If RHS is another field\n const rhsField = fields.find(f => f.name === rhs.field) as Field; // Expecting valid inputs\n rhsText = rhsField.label || rhsField.name; // label is optional\n } else if (hasProp(rhs, 'value')) {\n if (hasProp(rhs, 'dateFunction')) {\n // If RHS is a date function value\n switch (rhs.dateFunction) {\n case 'YEARS':\n rhsText = new Date(`${rhs.value}T00:00:00`).toLocaleString(locale, {\n year: 'numeric'\n });\n break;\n case 'QUARTERS': {\n const formattedYear = new Date(`${rhs.value}T00:00:00`).toLocaleString(locale, {\n year: 'numeric'\n });\n const quarterNumber = getQuarter(rhs.value);\n rhsText = `${translate(`date_quarter_q${quarterNumber}`, [formattedYear])}`;\n break;\n }\n case 'MONTHS':\n rhsText = new Date(`${rhs.value}T00:00:00`).toLocaleString(locale, {\n year: 'numeric',\n month: 'short'\n });\n break;\n case 'WEEKS':\n rhsText = `Week of ${new Date(`${rhs.value}T00:00:00`).toLocaleString(locale, {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n })}`;\n break;\n case 'DAYS':\n rhsText = new Date(`${rhs.value}T00:00:00`).toLocaleString(locale, {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n });\n break;\n case 'HOURS':\n rhsText = new Date(rhs.value).toLocaleString(locale, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n hour12: true\n });\n break;\n case 'MONTHS_OF_YEAR':\n rhsText = new Date(2021, (rhs.value as number) - 1, 1).toLocaleString(locale, {\n month: 'long'\n });\n break;\n case 'DAYS_OF_MONTH':\n rhsText = `Day ${rhs.value} of month`;\n break;\n case 'DAYS_OF_WEEK':\n // Choosing Feb-2021 as it starts on a Monday\n rhsText = new Date(2021, 1, rhs.value as number).toLocaleString(locale, {\n weekday: 'long'\n });\n break;\n default: // Not needed\n }\n } else {\n // If RHS is a single literal value\n switch (lhsField.type) {\n case 'TIME_ONLY':\n // For these cases, rhs.value is stored as # of milliseconds since day-start\n rhsText = convertMsToTimeValue(rhs.value as number);\n break;\n case 'NUMBER':\n rhsText = getFormattedValue(rhs.value.toString(), locale, undefined, {\n useGrouping: true,\n maximumFractionDigits: 4\n });\n break;\n default:\n rhsText = rhs.value as string;\n }\n }\n } else if (hasProp(rhs, 'relativeDate')) {\n const {\n relativeDate: { timePeriod, interval, datePart }\n } = rhs;\n rhsText = formatRelativeDate(translate, timePeriod, datePart, interval);\n } else {\n rhsText = rhs.values.join(', '); // If RHS is a list of values\n }\n }\n\n switch (comparator) {\n case 'IS_NULL':\n return `${lhsText} is null`;\n case 'IS_NOT_NULL':\n return `${lhsText} is not null`;\n case 'IS_TRUE':\n return `${lhsText} is true`;\n case 'IS_FALSE':\n return `${lhsText} is false`;\n case 'EQ':\n return `${lhsText} is ${rhsText}`;\n case 'NEQ':\n return `${lhsText} isn't ${rhsText}`;\n case 'IN':\n return `${lhsText} is among ${rhsText}`;\n case 'NOT_IN':\n return `${lhsText} is not among ${rhsText}`;\n case 'GT':\n return `${lhsText} > ${rhsText}`;\n case 'GTE':\n return `${lhsText} >= ${rhsText}`;\n case 'LT':\n return `${lhsText} < ${rhsText}`;\n case 'LTE':\n return `${lhsText} <= ${rhsText}`;\n case 'STARTS_WITH':\n return `${lhsText} starts with ${rhsText}`;\n case 'NOT_STARTS_WITH':\n return `${lhsText} doesn't start with ${rhsText}`;\n case 'ENDS_WITH':\n return `${lhsText} ends with ${rhsText}`;\n case 'NOT_ENDS_WITH':\n return `${lhsText} doesn't end with ${rhsText}`;\n case 'CONTAINS':\n return `${lhsText} contains ${rhsText}`;\n case 'NOT_CONTAINS':\n return `${lhsText} doesn't contain ${rhsText}`;\n default:\n return ''; // Not needed\n }\n}\n\n/** Returns a user-friendly text representation of the given node in a condition */\nfunction formatConditionNode(\n node: Condition,\n fields: Field[],\n translate: TranslationFunction<TranslationPack>,\n options?: ConditionFormatOptions\n): string {\n if (hasProp(node, 'AND')) {\n const childStrings = node.AND.map(n => formatConditionNode(n, fields, translate, options));\n return `(${childStrings.join(' AND ')})`;\n }\n\n if (hasProp(node, 'OR')) {\n const childStrings = node.OR.map(n => formatConditionNode(n, fields, translate, options));\n return `(${childStrings.join(' OR ')})`;\n }\n\n if (hasProp(node, 'NOT')) {\n const childString = formatConditionNode(node.NOT, fields, translate, options);\n if (childString.startsWith(LPAREN) && childString.endsWith(RPAREN)) {\n // Avoid double brackets when the child node is an AND/OR node\n return `NOT ${childString}`;\n }\n return `NOT (${childString})`;\n }\n\n return formatLeafCondition(node.condition, fields, translate, options); // If leaf-level is reached\n}\n\n/**\n * Returns a user-friendly text representation of a given complex condition\n * The input `fields` are used to look up display labels for the fields\n */\nexport default function formatCondition(\n condition: Condition,\n fields: Field[],\n translate: TranslationFunction<TranslationPack>,\n options?: ConditionFormatOptions\n): string {\n // Recursively format the tree, starting at the root node\n let text = formatConditionNode(condition, fields, translate, options);\n\n // If the root node is AND/OR, there will be extra parentheses. Remove them\n if (text.startsWith(LPAREN) && text.endsWith(RPAREN)) {\n text = text.slice(1, -1);\n }\n\n return text;\n}\n"]}
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/formatter.ts"],"names":[],"mappings":"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","sourcesContent":["// cSpell:words LPAREN RPAREN\n// FIXME: TR (Several constructs in this file need to be localized)\nimport { hasProp, TranslationPack } from '@pega/cosmos-react-core';\nimport { getFormattedValue } from '@pega/cosmos-react-core/lib/components/Number/utils';\nimport { TranslationFunction } from '@pega/cosmos-react-core/lib/i18n/translate';\nimport { getQuarter } from '@pega/cosmos-react-core/lib/components/DateTime/Input/utils';\n\nimport { Condition, LeafCondition, Field } from '../ConditionBuilder.types';\n\nimport { getItem } from './utils';\nimport { DatePart, TimePeriod } from './types';\nimport { convertMsToTimeValue } from './time-utils';\n\nconst LPAREN = '(';\nconst RPAREN = ')';\n\n/** Options object optionally passed to formatCondition method. */\ninterface ConditionFormatOptions {\n locale?: string;\n}\n\nexport function formatRelativeDate(\n translate: TranslationFunction<TranslationPack>,\n timePeriod: TimePeriod,\n datePart: DatePart,\n interval?: number\n): string {\n const translationKey =\n timePeriod === 'CURRENT'\n ? `condition_builder_current_${datePart.toLowerCase().slice(0, -1)}`\n : `condition_builder_${timePeriod.toLowerCase()}_X_${datePart.toLowerCase()}`;\n return translate(translationKey as keyof TranslationPack, [interval ?? 0], {\n count: interval ?? 0\n });\n}\n\n/** Returns a user-friendly text representation of a given leaf condition */\nfunction formatLeafCondition(\n leaf: LeafCondition,\n fields: Field[],\n translate: TranslationFunction<TranslationPack>,\n { locale = 'en-US' }: ConditionFormatOptions = {}\n): string {\n const { lhs, comparator, rhs } = leaf;\n\n // Determine texts for LHS and RHS\n const lhsField = getItem(fields, lhs.field) as Field; // Expecting valid inputs\n const lhsText = lhsField.primary;\n let rhsText = '';\n if (!hasProp(lhsField, 'type')) return '';\n if (rhs) {\n if (hasProp(rhs, 'field')) {\n // If RHS is another field\n const rhsField = getItem(fields, rhs.field) as Field; // Expecting valid inputs\n rhsText = rhsField.primary;\n } else if (hasProp(rhs, 'value')) {\n if (hasProp(rhs, 'dateFunction')) {\n // If RHS is a date function value\n switch (rhs.dateFunction) {\n case 'YEARS':\n rhsText = new Date(`${rhs.value}T00:00:00`).toLocaleString(locale, {\n year: 'numeric'\n });\n break;\n case 'QUARTERS': {\n const formattedYear = new Date(`${rhs.value}T00:00:00`).toLocaleString(locale, {\n year: 'numeric'\n });\n const quarterNumber = getQuarter(rhs.value);\n rhsText = `${translate(`date_quarter_q${quarterNumber}`, [formattedYear])}`;\n break;\n }\n case 'MONTHS':\n rhsText = new Date(`${rhs.value}T00:00:00`).toLocaleString(locale, {\n year: 'numeric',\n month: 'short'\n });\n break;\n case 'WEEKS':\n rhsText = `Week of ${new Date(`${rhs.value}T00:00:00`).toLocaleString(locale, {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n })}`;\n break;\n case 'DAYS':\n rhsText = new Date(`${rhs.value}T00:00:00`).toLocaleString(locale, {\n year: 'numeric',\n month: 'short',\n day: 'numeric'\n });\n break;\n case 'HOURS':\n rhsText = new Date(rhs.value).toLocaleString(locale, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n hour12: true\n });\n break;\n case 'MONTHS_OF_YEAR':\n rhsText = new Date(2021, (rhs.value as number) - 1, 1).toLocaleString(locale, {\n month: 'long'\n });\n break;\n case 'DAYS_OF_MONTH':\n rhsText = `Day ${rhs.value} of month`;\n break;\n case 'DAYS_OF_WEEK':\n // Choosing Feb-2021 as it starts on a Monday\n rhsText = new Date(2021, 1, rhs.value as number).toLocaleString(locale, {\n weekday: 'long'\n });\n break;\n default: // Not needed\n }\n } else {\n // If RHS is a single literal value\n switch (lhsField.type) {\n case 'TIME_ONLY':\n // For these cases, rhs.value is stored as # of milliseconds since day-start\n rhsText = convertMsToTimeValue(rhs.value as number);\n break;\n case 'NUMBER':\n rhsText = getFormattedValue(rhs.value.toString(), locale, undefined, {\n useGrouping: true,\n maximumFractionDigits: 4\n });\n break;\n default:\n rhsText = rhs.value as string;\n }\n }\n } else if (hasProp(rhs, 'relativeDate')) {\n const {\n relativeDate: { timePeriod, interval, datePart }\n } = rhs;\n rhsText = formatRelativeDate(translate, timePeriod, datePart, interval);\n } else {\n rhsText = rhs.values.join(', '); // If RHS is a list of values\n }\n }\n\n switch (comparator) {\n case 'IS_NULL':\n return `${lhsText} is null`;\n case 'IS_NOT_NULL':\n return `${lhsText} is not null`;\n case 'IS_TRUE':\n return `${lhsText} is true`;\n case 'IS_FALSE':\n return `${lhsText} is false`;\n case 'EQ':\n return `${lhsText} is ${rhsText}`;\n case 'NEQ':\n return `${lhsText} isn't ${rhsText}`;\n case 'IN':\n return `${lhsText} is among ${rhsText}`;\n case 'NOT_IN':\n return `${lhsText} is not among ${rhsText}`;\n case 'GT':\n return `${lhsText} > ${rhsText}`;\n case 'GTE':\n return `${lhsText} >= ${rhsText}`;\n case 'LT':\n return `${lhsText} < ${rhsText}`;\n case 'LTE':\n return `${lhsText} <= ${rhsText}`;\n case 'STARTS_WITH':\n return `${lhsText} starts with ${rhsText}`;\n case 'NOT_STARTS_WITH':\n return `${lhsText} doesn't start with ${rhsText}`;\n case 'ENDS_WITH':\n return `${lhsText} ends with ${rhsText}`;\n case 'NOT_ENDS_WITH':\n return `${lhsText} doesn't end with ${rhsText}`;\n case 'CONTAINS':\n return `${lhsText} contains ${rhsText}`;\n case 'NOT_CONTAINS':\n return `${lhsText} doesn't contain ${rhsText}`;\n default:\n return ''; // Not needed\n }\n}\n\n/** Returns a user-friendly text representation of the given node in a condition */\nfunction formatConditionNode(\n node: Condition,\n fields: Field[],\n translate: TranslationFunction<TranslationPack>,\n options?: ConditionFormatOptions\n): string {\n if (hasProp(node, 'AND')) {\n const childStrings = node.AND.map(n => formatConditionNode(n, fields, translate, options));\n return `(${childStrings.join(' AND ')})`;\n }\n\n if (hasProp(node, 'OR')) {\n const childStrings = node.OR.map(n => formatConditionNode(n, fields, translate, options));\n return `(${childStrings.join(' OR ')})`;\n }\n\n if (hasProp(node, 'NOT')) {\n const childString = formatConditionNode(node.NOT, fields, translate, options);\n if (childString.startsWith(LPAREN) && childString.endsWith(RPAREN)) {\n // Avoid double brackets when the child node is an AND/OR node\n return `NOT ${childString}`;\n }\n return `NOT (${childString})`;\n }\n\n return formatLeafCondition(node.condition, fields, translate, options); // If leaf-level is reached\n}\n\n/**\n * Returns a user-friendly text representation of a given complex condition\n * The input `fields` are used to look up display labels for the fields\n */\nexport default function formatCondition(\n condition: Condition,\n fields: Field[],\n translate: TranslationFunction<TranslationPack>,\n options?: ConditionFormatOptions\n): string {\n // Recursively format the tree, starting at the root node\n let text = formatConditionNode(condition, fields, translate, options);\n\n // If the root node is AND/OR, there will be extra parentheses. Remove them\n if (text.startsWith(LPAREN) && text.endsWith(RPAREN)) {\n text = text.slice(1, -1);\n }\n\n return text;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"transformer.d.ts","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/transformer.ts"],"names":[],"mappings":"AAGA,OAAO,eAAe,CAAC;AAIvB,OAAO,EAAE,SAAS,EAAiB,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAiJ5E;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAC/C,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,KAAK,EAAE,EACf,eAAe,CAAC,EAAE,MAAM,GACvB,SAAS,CA0BX"}
1
+ {"version":3,"file":"transformer.d.ts","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/transformer.ts"],"names":[],"mappings":"AAGA,OAAO,eAAe,CAAC;AAIvB,OAAO,EAAE,SAAS,EAAiB,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAkJ5E;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAC/C,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,KAAK,EAAE,EACf,eAAe,CAAC,EAAE,MAAM,GACvB,SAAS,CA0BX"}
@@ -2,6 +2,7 @@
2
2
  import dayjs from 'dayjs';
3
3
  import './extendDayJs';
4
4
  import { hasProp } from '@pega/cosmos-react-core';
5
+ import { getItem } from './utils';
5
6
  const dayjsDateParts = {
6
7
  MINUTES: 'minute',
7
8
  HOURS: 'hour',
@@ -90,8 +91,8 @@ function getConditionFromRange(startDate, endDate, node, lhsFieldType) {
90
91
  }
91
92
  }
92
93
  function transformLeafCondition(node, fields, currentDateTime) {
93
- const field = fields.find(f => f.name === node.lhs.field);
94
- if (!field) {
94
+ const field = getItem(fields, node.lhs.field);
95
+ if (!field || !hasProp(field, 'type')) {
95
96
  return { condition: node }; // Safety check
96
97
  }
97
98
  // Transform Relative date filters into equivalent date range filters
@@ -1 +1 @@
1
- {"version":3,"file":"transformer.js","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/transformer.ts"],"names":[],"mappings":"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","sourcesContent":["// cSpell:words DDTHH\n\nimport dayjs, { QUnitType, Dayjs } from 'dayjs';\nimport './extendDayJs';\n\nimport { hasProp } from '@pega/cosmos-react-core';\n\nimport { Condition, LeafCondition, Field } from '../ConditionBuilder.types';\n\nimport { DatePart, FieldType } from './types';\n\nconst dayjsDateParts: Record<DatePart, QUnitType> = {\n MINUTES: 'minute',\n HOURS: 'hour',\n DAYS: 'day',\n WEEKS: 'week' as QUnitType,\n QUARTERS: 'quarter',\n MONTHS: 'month',\n YEARS: 'year'\n};\n\n/** Construct a date-range filter based on the given date bounds and the comparator */\nfunction getConditionFromRange(\n startDate: Dayjs,\n endDate: Dayjs,\n node: LeafCondition,\n lhsFieldType: FieldType\n): Condition {\n const dateFormat = lhsFieldType === 'DATE_ONLY' ? 'YYYY-MM-DD' : 'YYYY-MM-DDTHH:mm:ss';\n\n switch (node.comparator) {\n case 'EQ':\n return {\n AND: [\n {\n condition: {\n lhs: node.lhs,\n comparator: 'LTE',\n rhs: { value: endDate.format(dateFormat) }\n }\n },\n {\n condition: {\n lhs: node.lhs,\n comparator: 'GTE',\n rhs: { value: startDate.format(dateFormat) }\n }\n }\n ]\n };\n case 'NEQ':\n return {\n OR: [\n {\n condition: {\n lhs: node.lhs,\n comparator: 'GT',\n rhs: { value: endDate.format(dateFormat) }\n }\n },\n {\n condition: {\n lhs: node.lhs,\n comparator: 'LT',\n rhs: { value: startDate.format(dateFormat) }\n }\n }\n ]\n };\n case 'GT':\n return {\n condition: {\n lhs: node.lhs,\n comparator: 'GT',\n rhs: { value: endDate.format(dateFormat) }\n }\n };\n case 'GTE':\n return {\n condition: {\n lhs: node.lhs,\n comparator: 'GTE',\n rhs: { value: startDate.format(dateFormat) }\n }\n };\n case 'LT':\n return {\n condition: {\n lhs: node.lhs,\n comparator: 'LT',\n rhs: { value: startDate.format(dateFormat) }\n }\n };\n case 'LTE':\n return {\n condition: {\n lhs: node.lhs,\n comparator: 'LTE',\n rhs: { value: endDate.format(dateFormat) }\n }\n };\n default:\n return { condition: node };\n }\n}\n\nfunction transformLeafCondition(\n node: LeafCondition,\n fields: Field[],\n currentDateTime?: string\n): Condition {\n const field = fields.find(f => f.name === node.lhs.field);\n if (!field) {\n return { condition: node }; // Safety check\n }\n\n // Transform Relative date filters into equivalent date range filters\n if (node.rhs && hasProp(node.rhs, 'relativeDate')) {\n const { timePeriod, interval, datePart } = node.rhs.relativeDate;\n const dayjsDatePart = dayjsDateParts[datePart];\n const now = dayjs(currentDateTime);\n\n let startDate = now;\n let endDate = now;\n if (timePeriod === 'CURRENT') {\n startDate = now.startOf(dayjsDatePart);\n endDate = now.endOf(dayjsDatePart);\n } else if (timePeriod === 'LAST' && interval && interval >= 1) {\n startDate = now.subtract(interval, dayjsDatePart);\n } else if (timePeriod === 'PREVIOUS' && interval && interval >= 1) {\n startDate = now.startOf(dayjsDatePart).subtract(interval, dayjsDatePart);\n endDate = now.subtract(1, dayjsDatePart).endOf(dayjsDatePart);\n } else if (timePeriod === 'NEXT' && interval && interval >= 1) {\n startDate = now.add(1, dayjsDatePart).startOf(dayjsDatePart);\n endDate = now.endOf(dayjsDatePart).add(interval, dayjsDatePart);\n }\n\n return getConditionFromRange(startDate, endDate, node, field.type);\n }\n\n // Transform WEEKS-filters into equivalent date-range filters\n // NOTE: This is a work-around until we make startOfDay customizable for Weeks\n if (node.rhs && hasProp(node.rhs, 'dateFunction') && node.rhs.dateFunction === 'WEEKS') {\n const startDate = dayjs(node.rhs.value); // Since we store it as YYYY-MM-DD, it's already the start of day\n const endDate = startDate.add(6, 'day').endOf('day'); // Last millisecond on the 7th day from startDate\n return getConditionFromRange(startDate, endDate, node, field.type);\n }\n\n // For all other cases\n return { condition: node };\n}\n\n/** This function transforms Conditions with Relative Dates into Conditions with Date Ranges.\n * Do not use this function unless you need to convert Relative Dates into Date Ranges.\n */\nexport default function transformComplexCondition(\n condition: Condition,\n fields: Field[],\n currentDateTime?: string\n): Condition {\n if (hasProp(condition, 'AND')) {\n const childNodes: Condition[] = condition.AND.map(n =>\n transformComplexCondition(n, fields, currentDateTime)\n );\n return {\n AND: childNodes\n };\n }\n\n if (hasProp(condition, 'OR')) {\n const childNodes: Condition[] = condition.OR.map(n =>\n transformComplexCondition(n, fields, currentDateTime)\n );\n return {\n OR: childNodes\n };\n }\n\n if (hasProp(condition, 'NOT')) {\n return {\n NOT: transformComplexCondition(condition.NOT, fields, currentDateTime)\n };\n }\n\n return transformLeafCondition(condition.condition, fields, currentDateTime);\n}\n"]}
1
+ {"version":3,"file":"transformer.js","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/transformer.ts"],"names":[],"mappings":"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","sourcesContent":["// cSpell:words DDTHH\n\nimport dayjs, { QUnitType, Dayjs } from 'dayjs';\nimport './extendDayJs';\n\nimport { hasProp } from '@pega/cosmos-react-core';\n\nimport { Condition, LeafCondition, Field } from '../ConditionBuilder.types';\n\nimport { getItem } from './utils';\nimport { DatePart, FieldType } from './types';\n\nconst dayjsDateParts: Record<DatePart, QUnitType> = {\n MINUTES: 'minute',\n HOURS: 'hour',\n DAYS: 'day',\n WEEKS: 'week' as QUnitType,\n QUARTERS: 'quarter',\n MONTHS: 'month',\n YEARS: 'year'\n};\n\n/** Construct a date-range filter based on the given date bounds and the comparator */\nfunction getConditionFromRange(\n startDate: Dayjs,\n endDate: Dayjs,\n node: LeafCondition,\n lhsFieldType: FieldType\n): Condition {\n const dateFormat = lhsFieldType === 'DATE_ONLY' ? 'YYYY-MM-DD' : 'YYYY-MM-DDTHH:mm:ss';\n\n switch (node.comparator) {\n case 'EQ':\n return {\n AND: [\n {\n condition: {\n lhs: node.lhs,\n comparator: 'LTE',\n rhs: { value: endDate.format(dateFormat) }\n }\n },\n {\n condition: {\n lhs: node.lhs,\n comparator: 'GTE',\n rhs: { value: startDate.format(dateFormat) }\n }\n }\n ]\n };\n case 'NEQ':\n return {\n OR: [\n {\n condition: {\n lhs: node.lhs,\n comparator: 'GT',\n rhs: { value: endDate.format(dateFormat) }\n }\n },\n {\n condition: {\n lhs: node.lhs,\n comparator: 'LT',\n rhs: { value: startDate.format(dateFormat) }\n }\n }\n ]\n };\n case 'GT':\n return {\n condition: {\n lhs: node.lhs,\n comparator: 'GT',\n rhs: { value: endDate.format(dateFormat) }\n }\n };\n case 'GTE':\n return {\n condition: {\n lhs: node.lhs,\n comparator: 'GTE',\n rhs: { value: startDate.format(dateFormat) }\n }\n };\n case 'LT':\n return {\n condition: {\n lhs: node.lhs,\n comparator: 'LT',\n rhs: { value: startDate.format(dateFormat) }\n }\n };\n case 'LTE':\n return {\n condition: {\n lhs: node.lhs,\n comparator: 'LTE',\n rhs: { value: endDate.format(dateFormat) }\n }\n };\n default:\n return { condition: node };\n }\n}\n\nfunction transformLeafCondition(\n node: LeafCondition,\n fields: Field[],\n currentDateTime?: string\n): Condition {\n const field = getItem(fields, node.lhs.field);\n if (!field || !hasProp(field, 'type')) {\n return { condition: node }; // Safety check\n }\n\n // Transform Relative date filters into equivalent date range filters\n if (node.rhs && hasProp(node.rhs, 'relativeDate')) {\n const { timePeriod, interval, datePart } = node.rhs.relativeDate;\n const dayjsDatePart = dayjsDateParts[datePart];\n const now = dayjs(currentDateTime);\n\n let startDate = now;\n let endDate = now;\n if (timePeriod === 'CURRENT') {\n startDate = now.startOf(dayjsDatePart);\n endDate = now.endOf(dayjsDatePart);\n } else if (timePeriod === 'LAST' && interval && interval >= 1) {\n startDate = now.subtract(interval, dayjsDatePart);\n } else if (timePeriod === 'PREVIOUS' && interval && interval >= 1) {\n startDate = now.startOf(dayjsDatePart).subtract(interval, dayjsDatePart);\n endDate = now.subtract(1, dayjsDatePart).endOf(dayjsDatePart);\n } else if (timePeriod === 'NEXT' && interval && interval >= 1) {\n startDate = now.add(1, dayjsDatePart).startOf(dayjsDatePart);\n endDate = now.endOf(dayjsDatePart).add(interval, dayjsDatePart);\n }\n\n return getConditionFromRange(startDate, endDate, node, field.type);\n }\n\n // Transform WEEKS-filters into equivalent date-range filters\n // NOTE: This is a work-around until we make startOfDay customizable for Weeks\n if (node.rhs && hasProp(node.rhs, 'dateFunction') && node.rhs.dateFunction === 'WEEKS') {\n const startDate = dayjs(node.rhs.value); // Since we store it as YYYY-MM-DD, it's already the start of day\n const endDate = startDate.add(6, 'day').endOf('day'); // Last millisecond on the 7th day from startDate\n return getConditionFromRange(startDate, endDate, node, field.type);\n }\n\n // For all other cases\n return { condition: node };\n}\n\n/** This function transforms Conditions with Relative Dates into Conditions with Date Ranges.\n * Do not use this function unless you need to convert Relative Dates into Date Ranges.\n */\nexport default function transformComplexCondition(\n condition: Condition,\n fields: Field[],\n currentDateTime?: string\n): Condition {\n if (hasProp(condition, 'AND')) {\n const childNodes: Condition[] = condition.AND.map(n =>\n transformComplexCondition(n, fields, currentDateTime)\n );\n return {\n AND: childNodes\n };\n }\n\n if (hasProp(condition, 'OR')) {\n const childNodes: Condition[] = condition.OR.map(n =>\n transformComplexCondition(n, fields, currentDateTime)\n );\n return {\n OR: childNodes\n };\n }\n\n if (hasProp(condition, 'NOT')) {\n return {\n NOT: transformComplexCondition(condition.NOT, fields, currentDateTime)\n };\n }\n\n return transformLeafCondition(condition.condition, fields, currentDateTime);\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { Condition, ConditionRow, LeafCondition } from '../ConditionBuilder.types';
1
+ import { Condition, ConditionRow, LeafCondition, Field } from '../ConditionBuilder.types';
2
2
  /** Parses a logic-expression into a condition object. */
3
3
  export declare function parseLogicString(expression: string, conditionLookup: {
4
4
  [label: string]: LeafCondition;
@@ -34,4 +34,8 @@ export declare function getBasicModeOperators(logic: string): ('AND' | 'OR')[];
34
34
  * Takes a list of operators from between the Basic mode rows and constructs a logic-string out of them
35
35
  */
36
36
  export declare function getLogicFromBasicMode(operatorsList: ('AND' | 'OR')[]): string;
37
+ /**
38
+ * Takes a list of objects and id of the object to be found and recursively finds and returns the object
39
+ */
40
+ export declare function getItem(items: Field[], id: string): Field | undefined;
37
41
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/utils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAiQnF,yDAAyD;AACzD,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAA;CAAE,EAAE,4CAA4C;AACjG,WAAW,GAAE,OAAe,EAC5B,kBAAkB,GAAE,OAAe,GAClC;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAqB9C;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CA0D5D;AAkDD,uFAAuF;AACvF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,SAAS,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,YAAY,EAAE,CAAA;CAAE,CAUjG;AAGD,mIAAmI;AACnI,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,SAAS,EACf,WAAW,GAAE,MAAW,GACvB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE;QAAE,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAA;KAAE,CAAA;CAAE,CAkBnE;AAED,qHAAqH;AACrH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAwBnE;AAED,8FAA8F;AAC9F,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAMrE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,GAAG,MAAM,CAG7E"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/utils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAiQ1F,yDAAyD;AACzD,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAA;CAAE,EAAE,4CAA4C;AACjG,WAAW,GAAE,OAAe,EAC5B,kBAAkB,GAAE,OAAe,GAClC;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAqB9C;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CA0D5D;AAkDD,uFAAuF;AACvF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,SAAS,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,YAAY,EAAE,CAAA;CAAE,CAUjG;AAGD,mIAAmI;AACnI,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,SAAS,EACf,WAAW,GAAE,MAAW,GACvB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE;QAAE,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAA;KAAE,CAAA;CAAE,CAkBnE;AAED,qHAAqH;AACrH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAwBnE;AAED,8FAA8F;AAC9F,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAMrE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,GAAG,MAAM,CAG7E;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAiBrE"}
@@ -436,4 +436,22 @@ export function getLogicFromBasicMode(operatorsList) {
436
436
  const logicString = operatorsList.reduce((logic, op, i) => `${logic} ${op} ${i + 2}`, '1');
437
437
  return disambiguateLogic(logicString); // Disambiguating the logic string by placing parentheses at appropriate places
438
438
  }
439
+ /**
440
+ * Takes a list of objects and id of the object to be found and recursively finds and returns the object
441
+ */
442
+ export function getItem(items, id) {
443
+ let found;
444
+ items.some(item => {
445
+ if (item.id === id) {
446
+ found = item;
447
+ return true;
448
+ }
449
+ if (hasProp(item, 'items')) {
450
+ found = getItem(item.items, id);
451
+ return !!found;
452
+ }
453
+ return false;
454
+ });
455
+ return found;
456
+ }
439
457
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// cSpell:words LPAREN LPARENs RPAREN RPARENs\n\nimport { createUID, hasProp } from '@pega/cosmos-react-core';\n\nimport { Condition, ConditionRow, LeafCondition } from '../ConditionBuilder.types';\n\nconst AND = 'AND';\nconst OR = 'OR';\nconst NOT = 'NOT';\nconst LPAREN = '(';\nconst RPAREN = ')';\n\nconst precedenceMap: { [op: string]: number } = { OR: 1, AND: 2, NOT: 3 }; // Operator precedence. NOT has the highest precedence over the others\nconst operatorTokens = new Set([AND, OR, NOT]); // Valid logical operators\nconst validTokens = new Set([AND, OR, NOT, LPAREN, RPAREN]); // Other than these, integer tokens are valid\n\nconst isIntegerToken = (token: string): boolean => /^\\d+$/.test(token); // Checks if the input token is an integer\nconst isOperatorToken = (token: string): boolean => operatorTokens.has(token); // Checks if the input token is an operator\n\n/**\n * Tokenize the input expression.\n * Valid tokens are 'AND', 'OR', 'NOT', '(', ')' and any integer token.\n * Throws an error if an invalid token is found.\n */\nfunction tokenizeExpression(\n expression: string,\n disallowNOT: boolean = false\n): { tokens: string[] } | { error: string } {\n expression = expression.trim().toUpperCase(); // To simplify comparisons below; the tokens AND/OR/NOT are anyways expected to be in uppercase\n const words = expression.match(/[A-Z]+|[0-9]+|_|\\W/g); // Split contiguous alphabets and contiguous numbers into the same token. For all other characters, create a token for each character. Although `_` is not expected to be used, handling it just for completeness\n const tokens: string[] = []; // Final list of valid tokens\n const invalidWords: string[] = []; // Any invalid words are captured here\n\n // `words` will never be null because of the regex we used. Using `!` to indicate the same to TS\n words!.forEach(word => {\n // Ignore white-space characters\n if (word.trim().length > 0) {\n // If it's a token from the above Set or if it's an integer token\n if (isIntegerToken(word) || (validTokens.has(word) && !(word === NOT && disallowNOT))) {\n tokens.push(word);\n } else {\n invalidWords.push(word);\n }\n }\n });\n\n // Return an error if any invalid tokens are present\n if (invalidWords.length > 0) {\n return { error: `Unexpected words/characters: ${invalidWords.join(' ')}` }; // FIXME: TR\n }\n\n return { tokens };\n}\n\n/**\n * Captures any invalid/unexpected token patterns\n * NOTE: This does not expect any invalid tokens to be passed in the input\n * NOTE: This doesn't handle mismatched parentheses. That is handled separately in getPostfixFromInfix\n * Returns an error message about the first invalid sequence present in the input. Returns `null` if none found\n */\nfunction findInvalidPatterns(tokens: string[]): string | null {\n // These patterns are identified based on which token can precede/succeed which.\n // A table with all such permutations can be found in DOC-38200\n\n for (let i = 0; i < tokens.length; i += 1) {\n const NUMBER = 'NUMBER'; // To avoid repeating a string literal\n const token = tokens[i];\n const tokenType = isIntegerToken(token) ? NUMBER : token; // To simplify comparisons below\n\n // The expression can only start with NOT, LPAREN or NUMBER\n if (i === 0 && ![NOT, LPAREN, NUMBER].includes(tokenType)) {\n return `Unexpected \"${token}\" at the beginning.`; // FIXME: TR\n }\n\n // The expression can only end with RPAREN or NUMBER\n if (i === tokens.length - 1 && ![RPAREN, NUMBER].includes(tokenType)) {\n return `Unexpected \"${token}\" at the end.`; // FIXME: TR\n }\n\n // If there is a previous token, check if it is supposed to precede the current token\n if (i > 0) {\n const prevToken = tokens[i - 1];\n const prevTokenType = isIntegerToken(prevToken) ? NUMBER : prevToken; // To simplify comparisons below\n switch (tokenType) {\n // AND/OR/RPAREN can only be preceded by RPAREN or NUMBER\n case AND:\n case OR:\n case RPAREN:\n if (![RPAREN, NUMBER].includes(prevTokenType)) {\n return `Unexpected \"${token}\" after \"${prevToken}\"`; // FIXME: TR\n }\n break;\n\n // NOT/LPAREN/NUMBER can not be preceded by RPAREN or NUMBER\n case NOT:\n case LPAREN:\n case NUMBER:\n if ([RPAREN, NUMBER].includes(prevTokenType)) {\n return `Unexpected \"${token}\" after \"${prevToken}\"`; // FIXME: TR\n }\n break;\n default: // do nothing\n }\n }\n }\n\n // Return null if no invalid sequences\n return null;\n}\n\n/**\n * Converts an input array of Infix tokens into a Postfix array.\n * Uses the ShuntingYard algorithm.\n * NOTE: This does not expect any invalid tokens to be passed in the input\n */\nfunction getPostfixFromInfix(tokens: string[]): { postfixArr: string[] } | { error: string } {\n // Refer these for the ShuntingYard algorithm:\n // * https://brilliant.org/wiki/shunting-yard-algorithm/\n // * https://en.wikipedia.org/wiki/Shunting-yard_algorithm#The_algorithm_in_detail\n const postfixQueue: string[] = []; // Output queue\n const stack: string[] = []; // Operations stack\n\n // While there are tokens to be read\n for (let i = 0; i < tokens.length; i += 1) {\n const token = tokens[i];\n\n if (isIntegerToken(token)) {\n // If it's a number add it to queue\n postfixQueue.push(token);\n } else if (isOperatorToken(token)) {\n // If it's an operator\n // While there's an operator on the top of the stack with greater precedence (or equal precedence and the token is left-associative), pop operators from the stack onto the output queue\n if (token !== NOT) {\n // Unary operators should not cause any operators to be popped from the stack.\n // See http://wcipeg.com/wiki/Shunting_yard_algorithm#Unary_operators\n while (stack.length > 0) {\n const stackTop = stack[stack.length - 1];\n if (isOperatorToken(stackTop) && precedenceMap[stackTop] >= precedenceMap[token]) {\n postfixQueue.push(stack.pop()!);\n } else {\n break;\n }\n }\n }\n // Push the current operator onto the stack\n stack.push(token);\n } else if (token === LPAREN) {\n // If it's a left parenthesis, push it onto the stack\n stack.push(token);\n } else {\n // If it's a right parenthesis (RPAREN)\n // While there's not a left parenthesis at the top of the stack, pop operators from the stack onto the output queue\n while (stack.length > 0) {\n const stackTop = stack[stack.length - 1];\n if (stackTop === LPAREN) break;\n postfixQueue.push(stack.pop()!);\n }\n\n // Pop the left parenthesis from the stack and discard it\n if (stack.length > 0) {\n stack.pop();\n } else {\n // FIXME: TR\n return { error: 'Please fix mismatched parentheses.' }; // If no LPAREN found for the current RPAREN\n }\n }\n }\n\n // While there are operators on the stack, pop them to the queue\n while (stack.length > 0) {\n if (stack[stack.length - 1] === LPAREN) {\n // FIXME: TR\n return { error: 'Please fix mismatched parentheses.' }; // If there were excess LPARENs. (Excess RPARENs are already handled in the above loop. Also, RPARENs are never pushed to the stack)\n }\n postfixQueue.push(stack.pop()!);\n }\n\n return { postfixArr: postfixQueue };\n}\n\n/**\n * Converts an input array of Postfix tokens into a Condition tree.\n * NOTE: This expects a properly formed Postfix array as input\n */\nfunction getConditionFromPostfix(\n postfixArr: string[],\n conditionLookup: { [label: string]: LeafCondition },\n ignoreUnusedLabels: boolean\n): { condition: Condition } | { error: string } {\n // To learn more about the below algorithm, refer this: https://brilliant.org/wiki/shunting-yard-algorithm/#reverse-polish\n const operandsStack: Condition[] = [];\n const labelsWithNoRows: string[] = []; // Labels for which there is no corresponding op in conditionLookup\n const usedLabels: string[] = []; // A list of all labels used in the condition. This is used to warn about any unused operations\n postfixArr.forEach(token => {\n if (isIntegerToken(token)) {\n // If it's a numeric token (leaf condition), push it to the stack\n const conditionRow = conditionLookup[token]; // Identify the corresponding condition row\n operandsStack.push({ condition: conditionRow }); // Push it even if null so that the conversion goes on smoothly and identifies any other issues\n if (!conditionRow) {\n labelsWithNoRows.push(token); // Mark it as missing\n } else {\n usedLabels.push(token); // Mark it as used\n }\n } else if (token === NOT) {\n // If it's the NOT operator\n // Pop an operand, perform the operation and push the result back to the stack\n const operand = operandsStack.pop()!;\n operandsStack.push({ NOT: operand });\n } else {\n // If it's the AND/OR operator\n // Pop two operands, perform the operation and push the result back to the stack\n const operand2 = operandsStack.pop()!;\n const operand1 = operandsStack.pop()!;\n\n // If the inner operation is the same as the current one, consolidate them\n // e.g. `1 AND (2 AND 3)` should be consolidated as `1 AND 2 AND 3`\n // e.g. `1 OR (2 OR 3)` should be consolidated as `1 OR 2 OR 3`\n if (token === 'AND') {\n const operands = [\n ...(hasProp(operand1, 'AND') ? operand1.AND : [operand1]),\n ...(hasProp(operand2, 'AND') ? operand2.AND : [operand2])\n ];\n operandsStack.push({ AND: operands });\n } else {\n const operands = [\n ...(hasProp(operand1, 'OR') ? operand1.OR : [operand1]),\n ...(hasProp(operand2, 'OR') ? operand2.OR : [operand2])\n ];\n operandsStack.push({ OR: operands });\n }\n }\n });\n\n // If any labels are used for which there are no corresponding condition-rows\n if (labelsWithNoRows.length > 0) {\n if (labelsWithNoRows.length === 1) {\n return {\n error: `Condition ${labelsWithNoRows[0]} used in the logical string is not defined.` // FIXME: TR\n };\n }\n return {\n error: `Conditions ${labelsWithNoRows.join(', ')} used in the logical string are not defined.` // FIXME: TR\n };\n }\n\n // Warn if any of the condition rows are unused\n if (!ignoreUnusedLabels) {\n const unusedLabels = Object.keys(conditionLookup).filter(l => !usedLabels.includes(l));\n if (unusedLabels.length > 0) {\n if (unusedLabels.length === 1) {\n return { error: `Condition ${unusedLabels[0]} is not used in the logic expression.` }; // FIXME: TR\n }\n return {\n error: `Conditions ${unusedLabels.join(', ')} are not used in the logic expression.` // FIXME: TR\n };\n }\n }\n\n return { condition: operandsStack[0] };\n}\n\n/** Parses a logic-expression into a condition object. */\nexport function parseLogicString(\n expression: string,\n conditionLookup: { [label: string]: LeafCondition }, // To look up condition-rows from the labels\n disallowNOT: boolean = false,\n ignoreUnusedLabels: boolean = false\n): { condition: Condition } | { error: string } {\n // Handle empty expressions\n if (!expression.trim().length) return { error: 'Please provide a logic expression.' }; // FIXME: TR\n\n // Split the expression into individual tokens\n const tokeningResult = tokenizeExpression(expression, disallowNOT);\n if (hasProp(tokeningResult, 'error')) return tokeningResult;\n const { tokens } = tokeningResult;\n\n // Capture any invalid/unexpected token patterns\n // NOTE: This doesn't handle mismatched parentheses. That is handled below in getPostfixFromInfix\n const badPatternError = findInvalidPatterns(tokens);\n if (badPatternError !== null) return { error: badPatternError };\n\n // Convert the Infix tokens to a Postfix notation using the ShuntingYard algorithm\n const postfixResult = getPostfixFromInfix(tokens);\n if (hasProp(postfixResult, 'error')) return postfixResult;\n const { postfixArr } = postfixResult;\n\n // Convert the Postfix token to a Condition tree\n return getConditionFromPostfix(postfixArr, conditionLookup, ignoreUnusedLabels);\n}\n\n/**\n * Takes a valid logic string and formats it with parentheses at appropriate places to keep things unambiguous\n * For example, `1 AND 2 OR 3` is disambiguated as `(1 AND 2) OR 3`\n * NOTE: This expects only valid logic strings to be passed as an input\n */\nexport function disambiguateLogic(expression: string): string {\n // Split the expression into individual tokens\n const tokeningResult = tokenizeExpression(expression);\n const { tokens } = tokeningResult as { tokens: string[] }; // Only valid expressions are expected as inputs\n\n // Convert the Infix tokens to a Postfix notation using the ShuntingYard algorithm\n const postfixResult = getPostfixFromInfix(tokens);\n const { postfixArr } = postfixResult as { postfixArr: string[] };\n\n // Convert the postfix back to infix with parentheses at appropriate places\n // To learn more about the below algorithm, refer this: https://brilliant.org/wiki/shunting-yard-algorithm/#reverse-polish\n const operandsStack: string[] = [];\n postfixArr.forEach(token => {\n if (isIntegerToken(token)) {\n // If it's a numeric token (leaf condition), push it to the stack\n operandsStack.push(token);\n } else if (token === NOT) {\n // If it's the NOT operator\n // Pop an operand, perform the operation and push the result back to the stack\n const operand = operandsStack.pop()!;\n operandsStack.push(`NOT ${operand}`);\n } else {\n // If it's the AND/OR operator\n // Pop two operands, perform the operation and push the result back to the stack\n let operand2 = operandsStack.pop()!;\n let operand1 = operandsStack.pop()!;\n\n // If the inner operation is the same as the current one, consolidate them\n // e.g. `1 AND (2 AND 3)` should be consolidated as `1 AND 2 AND 3`\n // e.g. `1 OR (2 OR 3)` should be consolidated as `1 OR 2 OR 3`\n if (token === 'AND') {\n // Remove any wrapping parentheses if an operand contains just AND(s)\n if (operand1.startsWith(LPAREN) && !operand1.includes(OR) && !operand1.includes(NOT)) {\n operand1 = operand1.slice(1, -1);\n }\n if (operand2.startsWith(LPAREN) && !operand2.includes(OR) && !operand2.includes(NOT)) {\n operand2 = operand2.slice(1, -1);\n }\n operandsStack.push(`(${operand1} AND ${operand2})`);\n } else {\n // Remove any wrapping parentheses if an operand contains just OR(s)\n if (operand1.startsWith(LPAREN) && !operand1.includes(AND) && !operand1.includes(NOT)) {\n operand1 = operand1.slice(1, -1);\n }\n if (operand2.startsWith(LPAREN) && !operand2.includes(AND) && !operand2.includes(NOT)) {\n operand2 = operand2.slice(1, -1);\n }\n operandsStack.push(`(${operand1} OR ${operand2})`);\n }\n }\n });\n\n // If the root node is AND/OR, there will be extra parentheses. Remove them\n let outputLogic = operandsStack[0];\n if (outputLogic.startsWith(LPAREN) && outputLogic.endsWith(RPAREN)) {\n outputLogic = outputLogic.slice(1, -1);\n }\n return outputLogic;\n}\n\n/**\n * Recursively splits the input condition node into a logic-string and a list of condition-rows\n * NOTE: Returns an empty string and an empty array if the condition is malformed\n */\nfunction splitConditionNode(\n node: Condition,\n labelsSoFar: string[]\n): { logic: string; rows: ConditionRow[] } {\n // Using a try-catch block for safety against any malformed conditions\n try {\n let logic: string;\n const rows: ConditionRow[] = [];\n\n if (hasProp(node, 'AND')) {\n const childStrings: string[] = [];\n node.AND.forEach(n => {\n const splitResult = splitConditionNode(n, labelsSoFar); // Recursively get child rows and logic\n childStrings.push(splitResult.logic);\n rows.push(...splitResult.rows);\n });\n logic = `(${childStrings.join(' AND ')})`;\n } else if (hasProp(node, 'OR')) {\n const childStrings: string[] = [];\n node.OR.forEach(n => {\n const splitResult = splitConditionNode(n, labelsSoFar); // Recursively get child rows and logic\n childStrings.push(splitResult.logic);\n rows.push(...splitResult.rows);\n });\n logic = `(${childStrings.join(' OR ')})`;\n } else if (hasProp(node, 'NOT')) {\n const splitResult = splitConditionNode(node.NOT, labelsSoFar); // Recursively get child rows and logic\n logic = `NOT ${splitResult.logic}`;\n rows.push(...splitResult.rows);\n } else {\n // If leaf-level is reached\n const newLabel = `${labelsSoFar.length + 1}`; // Get a new label for the node\n labelsSoFar.push(newLabel); // Update for the next time\n logic = newLabel;\n rows.push({ ...node.condition, label: newLabel, id: createUID() });\n }\n\n return { logic, rows };\n } catch {\n return { logic: '', rows: [] }; // For safety against any malformed conditions\n }\n}\n\n// Splitter for internal consumption\n/** Splits the input condition tree into a logic-string and a list of condition-rows */\nexport function splitConditionForBuilder(tree: Condition): { logic: string; rows: ConditionRow[] } {\n // Recursively split the tree, starting at the root node\n const splitResult = splitConditionNode(tree, []);\n\n // If the root node is AND/OR, there will be extra parentheses. Remove them\n if (splitResult.logic.startsWith(LPAREN) && splitResult.logic.endsWith(RPAREN)) {\n splitResult.logic = splitResult.logic.slice(1, -1);\n }\n\n return splitResult;\n}\n\n// Splitter for public consumption\n/** Converts the input nested condition into a flat tree with the leaf-conditions and a logic string representing the input tree */\nexport function splitConditionTree(\n tree: Condition,\n labelPrefix: string = ''\n): { logic: string; conditions: { [label: string]: LeafCondition } } {\n // Split using the internal splitter\n const { logic, rows } = splitConditionForBuilder(tree);\n\n // Build a condition-lookup from the ConditionRow objects\n const conditionLookup: { [label: string]: LeafCondition } = {};\n rows.forEach(row => {\n const { id, label, ...leaf } = row; // Discard the excess properties set up by ConditionRow when extending LeafCondition interface\n conditionLookup[`${labelPrefix}${label}`] = leaf;\n });\n\n // Prepend labelPrefix to all numeric tokens in the logic\n let outputLogic = logic;\n if (labelPrefix !== '') {\n outputLogic = logic.replace(/\\d+/g, `${labelPrefix}$&`);\n }\n\n return { logic: outputLogic, conditions: conditionLookup };\n}\n\n/** Checks if the input Condition is simple enough to be displayed in the `Basic mode` without loss of information */\nexport function isBasicModeApplicable(condition: Condition): boolean {\n // If an OR condition is present at the outer level,\n // each child should either be a leaf condition or an AND with all leaf nodes inside\n if (hasProp(condition, 'OR')) {\n return condition.OR.every(node => {\n if (hasProp(node, 'condition')) {\n return true;\n }\n if (hasProp(node, 'AND')) {\n return node.AND.every(subNode => hasProp(subNode, 'condition'));\n }\n return false;\n });\n }\n // If an AND condition is present at the outer level, it can't have any nested levels\n if (hasProp(condition, 'AND')) {\n return condition.AND.every(node => hasProp(node, 'condition'));\n }\n // NOT operator is not supported in Basic-mode\n if (hasProp(condition, 'NOT')) {\n return false;\n }\n // If a single leaf condition is present at the outer level\n return true;\n}\n\n/** Returns a list of operators to show in the Basic mode, using a logicString as the input */\nexport function getBasicModeOperators(logic: string): ('AND' | 'OR')[] {\n const matches = logic.match(/(AND|OR)/g);\n if (matches === null) {\n return [];\n }\n return matches as ('AND' | 'OR')[];\n}\n\n/**\n * Takes a list of operators from between the Basic mode rows and constructs a logic-string out of them\n */\nexport function getLogicFromBasicMode(operatorsList: ('AND' | 'OR')[]): string {\n const logicString = operatorsList.reduce((logic, op, i) => `${logic} ${op} ${i + 2}`, '1');\n return disambiguateLogic(logicString); // Disambiguating the logic string by placing parentheses at appropriate places\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/components/ConditionBuilder/core/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// cSpell:words LPAREN LPARENs RPAREN RPARENs\n\nimport { createUID, hasProp } from '@pega/cosmos-react-core';\n\nimport { Condition, ConditionRow, LeafCondition, Field } from '../ConditionBuilder.types';\n\nconst AND = 'AND';\nconst OR = 'OR';\nconst NOT = 'NOT';\nconst LPAREN = '(';\nconst RPAREN = ')';\n\nconst precedenceMap: { [op: string]: number } = { OR: 1, AND: 2, NOT: 3 }; // Operator precedence. NOT has the highest precedence over the others\nconst operatorTokens = new Set([AND, OR, NOT]); // Valid logical operators\nconst validTokens = new Set([AND, OR, NOT, LPAREN, RPAREN]); // Other than these, integer tokens are valid\n\nconst isIntegerToken = (token: string): boolean => /^\\d+$/.test(token); // Checks if the input token is an integer\nconst isOperatorToken = (token: string): boolean => operatorTokens.has(token); // Checks if the input token is an operator\n\n/**\n * Tokenize the input expression.\n * Valid tokens are 'AND', 'OR', 'NOT', '(', ')' and any integer token.\n * Throws an error if an invalid token is found.\n */\nfunction tokenizeExpression(\n expression: string,\n disallowNOT: boolean = false\n): { tokens: string[] } | { error: string } {\n expression = expression.trim().toUpperCase(); // To simplify comparisons below; the tokens AND/OR/NOT are anyways expected to be in uppercase\n const words = expression.match(/[A-Z]+|[0-9]+|_|\\W/g); // Split contiguous alphabets and contiguous numbers into the same token. For all other characters, create a token for each character. Although `_` is not expected to be used, handling it just for completeness\n const tokens: string[] = []; // Final list of valid tokens\n const invalidWords: string[] = []; // Any invalid words are captured here\n\n // `words` will never be null because of the regex we used. Using `!` to indicate the same to TS\n words!.forEach(word => {\n // Ignore white-space characters\n if (word.trim().length > 0) {\n // If it's a token from the above Set or if it's an integer token\n if (isIntegerToken(word) || (validTokens.has(word) && !(word === NOT && disallowNOT))) {\n tokens.push(word);\n } else {\n invalidWords.push(word);\n }\n }\n });\n\n // Return an error if any invalid tokens are present\n if (invalidWords.length > 0) {\n return { error: `Unexpected words/characters: ${invalidWords.join(' ')}` }; // FIXME: TR\n }\n\n return { tokens };\n}\n\n/**\n * Captures any invalid/unexpected token patterns\n * NOTE: This does not expect any invalid tokens to be passed in the input\n * NOTE: This doesn't handle mismatched parentheses. That is handled separately in getPostfixFromInfix\n * Returns an error message about the first invalid sequence present in the input. Returns `null` if none found\n */\nfunction findInvalidPatterns(tokens: string[]): string | null {\n // These patterns are identified based on which token can precede/succeed which.\n // A table with all such permutations can be found in DOC-38200\n\n for (let i = 0; i < tokens.length; i += 1) {\n const NUMBER = 'NUMBER'; // To avoid repeating a string literal\n const token = tokens[i];\n const tokenType = isIntegerToken(token) ? NUMBER : token; // To simplify comparisons below\n\n // The expression can only start with NOT, LPAREN or NUMBER\n if (i === 0 && ![NOT, LPAREN, NUMBER].includes(tokenType)) {\n return `Unexpected \"${token}\" at the beginning.`; // FIXME: TR\n }\n\n // The expression can only end with RPAREN or NUMBER\n if (i === tokens.length - 1 && ![RPAREN, NUMBER].includes(tokenType)) {\n return `Unexpected \"${token}\" at the end.`; // FIXME: TR\n }\n\n // If there is a previous token, check if it is supposed to precede the current token\n if (i > 0) {\n const prevToken = tokens[i - 1];\n const prevTokenType = isIntegerToken(prevToken) ? NUMBER : prevToken; // To simplify comparisons below\n switch (tokenType) {\n // AND/OR/RPAREN can only be preceded by RPAREN or NUMBER\n case AND:\n case OR:\n case RPAREN:\n if (![RPAREN, NUMBER].includes(prevTokenType)) {\n return `Unexpected \"${token}\" after \"${prevToken}\"`; // FIXME: TR\n }\n break;\n\n // NOT/LPAREN/NUMBER can not be preceded by RPAREN or NUMBER\n case NOT:\n case LPAREN:\n case NUMBER:\n if ([RPAREN, NUMBER].includes(prevTokenType)) {\n return `Unexpected \"${token}\" after \"${prevToken}\"`; // FIXME: TR\n }\n break;\n default: // do nothing\n }\n }\n }\n\n // Return null if no invalid sequences\n return null;\n}\n\n/**\n * Converts an input array of Infix tokens into a Postfix array.\n * Uses the ShuntingYard algorithm.\n * NOTE: This does not expect any invalid tokens to be passed in the input\n */\nfunction getPostfixFromInfix(tokens: string[]): { postfixArr: string[] } | { error: string } {\n // Refer these for the ShuntingYard algorithm:\n // * https://brilliant.org/wiki/shunting-yard-algorithm/\n // * https://en.wikipedia.org/wiki/Shunting-yard_algorithm#The_algorithm_in_detail\n const postfixQueue: string[] = []; // Output queue\n const stack: string[] = []; // Operations stack\n\n // While there are tokens to be read\n for (let i = 0; i < tokens.length; i += 1) {\n const token = tokens[i];\n\n if (isIntegerToken(token)) {\n // If it's a number add it to queue\n postfixQueue.push(token);\n } else if (isOperatorToken(token)) {\n // If it's an operator\n // While there's an operator on the top of the stack with greater precedence (or equal precedence and the token is left-associative), pop operators from the stack onto the output queue\n if (token !== NOT) {\n // Unary operators should not cause any operators to be popped from the stack.\n // See http://wcipeg.com/wiki/Shunting_yard_algorithm#Unary_operators\n while (stack.length > 0) {\n const stackTop = stack[stack.length - 1];\n if (isOperatorToken(stackTop) && precedenceMap[stackTop] >= precedenceMap[token]) {\n postfixQueue.push(stack.pop()!);\n } else {\n break;\n }\n }\n }\n // Push the current operator onto the stack\n stack.push(token);\n } else if (token === LPAREN) {\n // If it's a left parenthesis, push it onto the stack\n stack.push(token);\n } else {\n // If it's a right parenthesis (RPAREN)\n // While there's not a left parenthesis at the top of the stack, pop operators from the stack onto the output queue\n while (stack.length > 0) {\n const stackTop = stack[stack.length - 1];\n if (stackTop === LPAREN) break;\n postfixQueue.push(stack.pop()!);\n }\n\n // Pop the left parenthesis from the stack and discard it\n if (stack.length > 0) {\n stack.pop();\n } else {\n // FIXME: TR\n return { error: 'Please fix mismatched parentheses.' }; // If no LPAREN found for the current RPAREN\n }\n }\n }\n\n // While there are operators on the stack, pop them to the queue\n while (stack.length > 0) {\n if (stack[stack.length - 1] === LPAREN) {\n // FIXME: TR\n return { error: 'Please fix mismatched parentheses.' }; // If there were excess LPARENs. (Excess RPARENs are already handled in the above loop. Also, RPARENs are never pushed to the stack)\n }\n postfixQueue.push(stack.pop()!);\n }\n\n return { postfixArr: postfixQueue };\n}\n\n/**\n * Converts an input array of Postfix tokens into a Condition tree.\n * NOTE: This expects a properly formed Postfix array as input\n */\nfunction getConditionFromPostfix(\n postfixArr: string[],\n conditionLookup: { [label: string]: LeafCondition },\n ignoreUnusedLabels: boolean\n): { condition: Condition } | { error: string } {\n // To learn more about the below algorithm, refer this: https://brilliant.org/wiki/shunting-yard-algorithm/#reverse-polish\n const operandsStack: Condition[] = [];\n const labelsWithNoRows: string[] = []; // Labels for which there is no corresponding op in conditionLookup\n const usedLabels: string[] = []; // A list of all labels used in the condition. This is used to warn about any unused operations\n postfixArr.forEach(token => {\n if (isIntegerToken(token)) {\n // If it's a numeric token (leaf condition), push it to the stack\n const conditionRow = conditionLookup[token]; // Identify the corresponding condition row\n operandsStack.push({ condition: conditionRow }); // Push it even if null so that the conversion goes on smoothly and identifies any other issues\n if (!conditionRow) {\n labelsWithNoRows.push(token); // Mark it as missing\n } else {\n usedLabels.push(token); // Mark it as used\n }\n } else if (token === NOT) {\n // If it's the NOT operator\n // Pop an operand, perform the operation and push the result back to the stack\n const operand = operandsStack.pop()!;\n operandsStack.push({ NOT: operand });\n } else {\n // If it's the AND/OR operator\n // Pop two operands, perform the operation and push the result back to the stack\n const operand2 = operandsStack.pop()!;\n const operand1 = operandsStack.pop()!;\n\n // If the inner operation is the same as the current one, consolidate them\n // e.g. `1 AND (2 AND 3)` should be consolidated as `1 AND 2 AND 3`\n // e.g. `1 OR (2 OR 3)` should be consolidated as `1 OR 2 OR 3`\n if (token === 'AND') {\n const operands = [\n ...(hasProp(operand1, 'AND') ? operand1.AND : [operand1]),\n ...(hasProp(operand2, 'AND') ? operand2.AND : [operand2])\n ];\n operandsStack.push({ AND: operands });\n } else {\n const operands = [\n ...(hasProp(operand1, 'OR') ? operand1.OR : [operand1]),\n ...(hasProp(operand2, 'OR') ? operand2.OR : [operand2])\n ];\n operandsStack.push({ OR: operands });\n }\n }\n });\n\n // If any labels are used for which there are no corresponding condition-rows\n if (labelsWithNoRows.length > 0) {\n if (labelsWithNoRows.length === 1) {\n return {\n error: `Condition ${labelsWithNoRows[0]} used in the logical string is not defined.` // FIXME: TR\n };\n }\n return {\n error: `Conditions ${labelsWithNoRows.join(', ')} used in the logical string are not defined.` // FIXME: TR\n };\n }\n\n // Warn if any of the condition rows are unused\n if (!ignoreUnusedLabels) {\n const unusedLabels = Object.keys(conditionLookup).filter(l => !usedLabels.includes(l));\n if (unusedLabels.length > 0) {\n if (unusedLabels.length === 1) {\n return { error: `Condition ${unusedLabels[0]} is not used in the logic expression.` }; // FIXME: TR\n }\n return {\n error: `Conditions ${unusedLabels.join(', ')} are not used in the logic expression.` // FIXME: TR\n };\n }\n }\n\n return { condition: operandsStack[0] };\n}\n\n/** Parses a logic-expression into a condition object. */\nexport function parseLogicString(\n expression: string,\n conditionLookup: { [label: string]: LeafCondition }, // To look up condition-rows from the labels\n disallowNOT: boolean = false,\n ignoreUnusedLabels: boolean = false\n): { condition: Condition } | { error: string } {\n // Handle empty expressions\n if (!expression.trim().length) return { error: 'Please provide a logic expression.' }; // FIXME: TR\n\n // Split the expression into individual tokens\n const tokeningResult = tokenizeExpression(expression, disallowNOT);\n if (hasProp(tokeningResult, 'error')) return tokeningResult;\n const { tokens } = tokeningResult;\n\n // Capture any invalid/unexpected token patterns\n // NOTE: This doesn't handle mismatched parentheses. That is handled below in getPostfixFromInfix\n const badPatternError = findInvalidPatterns(tokens);\n if (badPatternError !== null) return { error: badPatternError };\n\n // Convert the Infix tokens to a Postfix notation using the ShuntingYard algorithm\n const postfixResult = getPostfixFromInfix(tokens);\n if (hasProp(postfixResult, 'error')) return postfixResult;\n const { postfixArr } = postfixResult;\n\n // Convert the Postfix token to a Condition tree\n return getConditionFromPostfix(postfixArr, conditionLookup, ignoreUnusedLabels);\n}\n\n/**\n * Takes a valid logic string and formats it with parentheses at appropriate places to keep things unambiguous\n * For example, `1 AND 2 OR 3` is disambiguated as `(1 AND 2) OR 3`\n * NOTE: This expects only valid logic strings to be passed as an input\n */\nexport function disambiguateLogic(expression: string): string {\n // Split the expression into individual tokens\n const tokeningResult = tokenizeExpression(expression);\n const { tokens } = tokeningResult as { tokens: string[] }; // Only valid expressions are expected as inputs\n\n // Convert the Infix tokens to a Postfix notation using the ShuntingYard algorithm\n const postfixResult = getPostfixFromInfix(tokens);\n const { postfixArr } = postfixResult as { postfixArr: string[] };\n\n // Convert the postfix back to infix with parentheses at appropriate places\n // To learn more about the below algorithm, refer this: https://brilliant.org/wiki/shunting-yard-algorithm/#reverse-polish\n const operandsStack: string[] = [];\n postfixArr.forEach(token => {\n if (isIntegerToken(token)) {\n // If it's a numeric token (leaf condition), push it to the stack\n operandsStack.push(token);\n } else if (token === NOT) {\n // If it's the NOT operator\n // Pop an operand, perform the operation and push the result back to the stack\n const operand = operandsStack.pop()!;\n operandsStack.push(`NOT ${operand}`);\n } else {\n // If it's the AND/OR operator\n // Pop two operands, perform the operation and push the result back to the stack\n let operand2 = operandsStack.pop()!;\n let operand1 = operandsStack.pop()!;\n\n // If the inner operation is the same as the current one, consolidate them\n // e.g. `1 AND (2 AND 3)` should be consolidated as `1 AND 2 AND 3`\n // e.g. `1 OR (2 OR 3)` should be consolidated as `1 OR 2 OR 3`\n if (token === 'AND') {\n // Remove any wrapping parentheses if an operand contains just AND(s)\n if (operand1.startsWith(LPAREN) && !operand1.includes(OR) && !operand1.includes(NOT)) {\n operand1 = operand1.slice(1, -1);\n }\n if (operand2.startsWith(LPAREN) && !operand2.includes(OR) && !operand2.includes(NOT)) {\n operand2 = operand2.slice(1, -1);\n }\n operandsStack.push(`(${operand1} AND ${operand2})`);\n } else {\n // Remove any wrapping parentheses if an operand contains just OR(s)\n if (operand1.startsWith(LPAREN) && !operand1.includes(AND) && !operand1.includes(NOT)) {\n operand1 = operand1.slice(1, -1);\n }\n if (operand2.startsWith(LPAREN) && !operand2.includes(AND) && !operand2.includes(NOT)) {\n operand2 = operand2.slice(1, -1);\n }\n operandsStack.push(`(${operand1} OR ${operand2})`);\n }\n }\n });\n\n // If the root node is AND/OR, there will be extra parentheses. Remove them\n let outputLogic = operandsStack[0];\n if (outputLogic.startsWith(LPAREN) && outputLogic.endsWith(RPAREN)) {\n outputLogic = outputLogic.slice(1, -1);\n }\n return outputLogic;\n}\n\n/**\n * Recursively splits the input condition node into a logic-string and a list of condition-rows\n * NOTE: Returns an empty string and an empty array if the condition is malformed\n */\nfunction splitConditionNode(\n node: Condition,\n labelsSoFar: string[]\n): { logic: string; rows: ConditionRow[] } {\n // Using a try-catch block for safety against any malformed conditions\n try {\n let logic: string;\n const rows: ConditionRow[] = [];\n\n if (hasProp(node, 'AND')) {\n const childStrings: string[] = [];\n node.AND.forEach(n => {\n const splitResult = splitConditionNode(n, labelsSoFar); // Recursively get child rows and logic\n childStrings.push(splitResult.logic);\n rows.push(...splitResult.rows);\n });\n logic = `(${childStrings.join(' AND ')})`;\n } else if (hasProp(node, 'OR')) {\n const childStrings: string[] = [];\n node.OR.forEach(n => {\n const splitResult = splitConditionNode(n, labelsSoFar); // Recursively get child rows and logic\n childStrings.push(splitResult.logic);\n rows.push(...splitResult.rows);\n });\n logic = `(${childStrings.join(' OR ')})`;\n } else if (hasProp(node, 'NOT')) {\n const splitResult = splitConditionNode(node.NOT, labelsSoFar); // Recursively get child rows and logic\n logic = `NOT ${splitResult.logic}`;\n rows.push(...splitResult.rows);\n } else {\n // If leaf-level is reached\n const newLabel = `${labelsSoFar.length + 1}`; // Get a new label for the node\n labelsSoFar.push(newLabel); // Update for the next time\n logic = newLabel;\n rows.push({ ...node.condition, label: newLabel, id: createUID() });\n }\n\n return { logic, rows };\n } catch {\n return { logic: '', rows: [] }; // For safety against any malformed conditions\n }\n}\n\n// Splitter for internal consumption\n/** Splits the input condition tree into a logic-string and a list of condition-rows */\nexport function splitConditionForBuilder(tree: Condition): { logic: string; rows: ConditionRow[] } {\n // Recursively split the tree, starting at the root node\n const splitResult = splitConditionNode(tree, []);\n\n // If the root node is AND/OR, there will be extra parentheses. Remove them\n if (splitResult.logic.startsWith(LPAREN) && splitResult.logic.endsWith(RPAREN)) {\n splitResult.logic = splitResult.logic.slice(1, -1);\n }\n\n return splitResult;\n}\n\n// Splitter for public consumption\n/** Converts the input nested condition into a flat tree with the leaf-conditions and a logic string representing the input tree */\nexport function splitConditionTree(\n tree: Condition,\n labelPrefix: string = ''\n): { logic: string; conditions: { [label: string]: LeafCondition } } {\n // Split using the internal splitter\n const { logic, rows } = splitConditionForBuilder(tree);\n\n // Build a condition-lookup from the ConditionRow objects\n const conditionLookup: { [label: string]: LeafCondition } = {};\n rows.forEach(row => {\n const { id, label, ...leaf } = row; // Discard the excess properties set up by ConditionRow when extending LeafCondition interface\n conditionLookup[`${labelPrefix}${label}`] = leaf;\n });\n\n // Prepend labelPrefix to all numeric tokens in the logic\n let outputLogic = logic;\n if (labelPrefix !== '') {\n outputLogic = logic.replace(/\\d+/g, `${labelPrefix}$&`);\n }\n\n return { logic: outputLogic, conditions: conditionLookup };\n}\n\n/** Checks if the input Condition is simple enough to be displayed in the `Basic mode` without loss of information */\nexport function isBasicModeApplicable(condition: Condition): boolean {\n // If an OR condition is present at the outer level,\n // each child should either be a leaf condition or an AND with all leaf nodes inside\n if (hasProp(condition, 'OR')) {\n return condition.OR.every(node => {\n if (hasProp(node, 'condition')) {\n return true;\n }\n if (hasProp(node, 'AND')) {\n return node.AND.every(subNode => hasProp(subNode, 'condition'));\n }\n return false;\n });\n }\n // If an AND condition is present at the outer level, it can't have any nested levels\n if (hasProp(condition, 'AND')) {\n return condition.AND.every(node => hasProp(node, 'condition'));\n }\n // NOT operator is not supported in Basic-mode\n if (hasProp(condition, 'NOT')) {\n return false;\n }\n // If a single leaf condition is present at the outer level\n return true;\n}\n\n/** Returns a list of operators to show in the Basic mode, using a logicString as the input */\nexport function getBasicModeOperators(logic: string): ('AND' | 'OR')[] {\n const matches = logic.match(/(AND|OR)/g);\n if (matches === null) {\n return [];\n }\n return matches as ('AND' | 'OR')[];\n}\n\n/**\n * Takes a list of operators from between the Basic mode rows and constructs a logic-string out of them\n */\nexport function getLogicFromBasicMode(operatorsList: ('AND' | 'OR')[]): string {\n const logicString = operatorsList.reduce((logic, op, i) => `${logic} ${op} ${i + 2}`, '1');\n return disambiguateLogic(logicString); // Disambiguating the logic string by placing parentheses at appropriate places\n}\n\n/**\n * Takes a list of objects and id of the object to be found and recursively finds and returns the object\n */\nexport function getItem(items: Field[], id: string): Field | undefined {\n let found: Field | undefined;\n items.some(item => {\n if (item.id === id) {\n found = item;\n return true;\n }\n\n if (hasProp(item, 'items')) {\n found = getItem(item.items, id);\n return !!found;\n }\n\n return false;\n });\n\n return found;\n}\n"]}
@@ -36,7 +36,7 @@ const ConditionInput = forwardRef(({ fieldName, fieldType, condition: conditionP
36
36
  const t = useI18n();
37
37
  const basicType = basicFieldMap[fieldType] ?? fieldType;
38
38
  const fields = [
39
- { name: fieldName, type: basicType, label: fieldLabel }
39
+ { id: fieldName, type: basicType, primary: fieldLabel || fieldName }
40
40
  ];
41
41
  const condition = conditionProp ??
42
42
  (fieldType === 'BOOLEAN'