diff --git a/apps/builder/src/features/blocks/logic/condition/components/ComparisonItem.tsx b/apps/builder/src/features/blocks/logic/condition/components/ComparisonItem.tsx index a76d6360ac0..c13eb700279 100644 --- a/apps/builder/src/features/blocks/logic/condition/components/ComparisonItem.tsx +++ b/apps/builder/src/features/blocks/logic/condition/components/ComparisonItem.tsx @@ -38,13 +38,14 @@ export const ComparisonItem = ({ items={Object.values(ComparisonOperators)} placeholder="Select an operator" /> - {item.comparisonOperator !== ComparisonOperators.IS_SET && ( - - )} + {item.comparisonOperator !== ComparisonOperators.IS_SET && + item.comparisonOperator !== ComparisonOperators.IS_EMPTY && ( + + )} ) } diff --git a/apps/viewer/src/features/blocks/logic/condition/executeCondition.ts b/apps/viewer/src/features/blocks/logic/condition/executeCondition.ts index 5ec6f999b82..214c543cb7e 100644 --- a/apps/viewer/src/features/blocks/logic/condition/executeCondition.ts +++ b/apps/viewer/src/features/blocks/logic/condition/executeCondition.ts @@ -31,7 +31,8 @@ export const executeCondition = ( } const executeComparison = - (variables: Variable[]) => (comparison: Comparison) => { + (variables: Variable[]) => + (comparison: Comparison): boolean => { if (!comparison?.variableId) return false const inputValue = variables.find((v) => v.id === comparison.variableId)?.value ?? '' @@ -39,6 +40,7 @@ const executeComparison = findUniqueVariableValue(variables)(comparison.value) ?? parseVariables(variables)(comparison.value) if (isNotDefined(value)) return false + if (isNotDefined(comparison.comparisonOperator)) return false switch (comparison.comparisonOperator) { case ComparisonOperators.CONTAINS: { const contains = (a: string | null, b: string | null) => { @@ -47,6 +49,13 @@ const executeComparison = } return compare(contains, inputValue, value) } + case ComparisonOperators.NOT_CONTAINS: { + const notContains = (a: string | null, b: string | null) => { + if (b === '' || !b || !a) return false + return !a.toLowerCase().trim().includes(b.toLowerCase().trim()) + } + return compare(notContains, inputValue, value) + } case ComparisonOperators.EQUAL: { return compare((a, b) => a === b, inputValue, value) } @@ -76,6 +85,23 @@ const executeComparison = case ComparisonOperators.IS_SET: { return isDefined(inputValue) && inputValue.length > 0 } + case ComparisonOperators.IS_EMPTY: { + return isNotDefined(inputValue) || inputValue.length === 0 + } + case ComparisonOperators.STARTS_WITH: { + const startsWith = (a: string | null, b: string | null) => { + if (b === '' || !b || !a) return false + return a.toLowerCase().trim().startsWith(b.toLowerCase().trim()) + } + return compare(startsWith, inputValue, value) + } + case ComparisonOperators.ENDS_WITH: { + const endsWith = (a: string | null, b: string | null) => { + if (b === '' || !b || !a) return false + return a.toLowerCase().trim().endsWith(b.toLowerCase().trim()) + } + return compare(endsWith, inputValue, value) + } } } diff --git a/packages/schemas/features/blocks/logic/condition.ts b/packages/schemas/features/blocks/logic/condition.ts index 9346fbf7236..e1ee26cbc72 100644 --- a/packages/schemas/features/blocks/logic/condition.ts +++ b/packages/schemas/features/blocks/logic/condition.ts @@ -13,9 +13,13 @@ export enum ComparisonOperators { EQUAL = 'Equal to', NOT_EQUAL = 'Not equal', CONTAINS = 'Contains', + NOT_CONTAINS = 'Does not contain', GREATER = 'Greater than', LESS = 'Less than', IS_SET = 'Is set', + IS_EMPTY = 'Is empty', + STARTS_WITH = 'Starts with', + ENDS_WITH = 'Ends with', } const comparisonSchema = z.object({