diff --git a/lib/core/src/lib/card-view/models/card-view-baseitem.model.spec.ts b/lib/core/src/lib/card-view/models/card-view-baseitem.model.spec.ts index 169ee18175..0546730b3c 100644 --- a/lib/core/src/lib/card-view/models/card-view-baseitem.model.spec.ts +++ b/lib/core/src/lib/card-view/models/card-view-baseitem.model.spec.ts @@ -119,5 +119,63 @@ describe('CardViewBaseItemModel', () => { expect(isValid).toBe(false); expect(itemModel.getValidationErrors('test-against-this')).toEqual([validator1, validator3 ]); }); + + it('should validate field with special character and return false when there is REGEX constraint and requiresMatch is false', () => { + const constrainedProperties: CardViewItemProperties = { + ...properties, + value: 'test.', + constraints: [{ + id: 'constraint-id', + type: 'REGEX', + parameters: { expression: '(.*[\\"\\*\\\\\\>\\<\\?\\/\\:\\|]+.*)|(.*[\\.]?.*[\\.]+$)|(.*[ ]+$)', requiresMatch: false } + }] + }; + + const itemModel = new CarViewCustomItemModel(constrainedProperties); + expect(itemModel.isValid(itemModel.value)).toBe(false); + }); + + it('should validate field without special character and return true when there is REGEX constraint and requiresMatch is false', () => { + const constrainedProperties: CardViewItemProperties = { + ...properties, + constraints: [{ + id: 'constraint-id', + type: 'REGEX', + parameters: { expression: '(.*[\\"\\*\\\\\\>\\<\\?\\/\\:\\|]+.*)|(.*[\\.]?.*[\\.]+$)|(.*[ ]+$)', requiresMatch: false } + }] + }; + + const itemModel = new CarViewCustomItemModel(constrainedProperties); + expect(itemModel.isValid(itemModel.value)).toBe(true); + }); + + it('should validate field without special character and return false when there is REGEX constraint and requiresMatch is true', () => { + const constrainedProperties: CardViewItemProperties = { + ...properties, + constraints: [{ + id: 'constraint-id', + type: 'REGEX', + parameters: { expression: '(.*[\\"\\*\\\\\\>\\<\\?\\/\\:\\|]+.*)|(.*[\\.]?.*[\\.]+$)|(.*[ ]+$)', requiresMatch: true } + }] + }; + + const itemModel = new CarViewCustomItemModel(constrainedProperties); + expect(itemModel.isValid(itemModel.value)).toBe(false); + }); + + it('should validate field without special character and return true when there is REGEX constraint and requiresMatch is true', () => { + const constrainedProperties: CardViewItemProperties = { + ...properties, + value: 'test.', + constraints: [{ + id: 'constraint-id', + type: 'REGEX', + parameters: { expression: '(.*[\\"\\*\\\\\\>\\<\\?\\/\\:\\|]+.*)|(.*[\\.]?.*[\\.]+$)|(.*[ ]+$)', requiresMatch: true } + }] + }; + + const itemModel = new CarViewCustomItemModel(constrainedProperties); + expect(itemModel.isValid(itemModel.value)).toBe(true); + }); }); }); diff --git a/lib/core/src/lib/card-view/models/card-view-textitem.model.spec.ts b/lib/core/src/lib/card-view/models/card-view-textitem.model.spec.ts index 477627fa41..ad21bf9f63 100644 --- a/lib/core/src/lib/card-view/models/card-view-textitem.model.spec.ts +++ b/lib/core/src/lib/card-view/models/card-view-textitem.model.spec.ts @@ -86,16 +86,15 @@ describe('CardViewTextItemModel', () => { }); }); - it('should validate based on defined constraints', () => { - const constrainedProperties = { + it('should validate based on defined constraints and require a match to be valid', () => { + const constrainedProperties: CardViewTextItemProperties = { label: 'Tribe', value: 'test', key: 'tribe', - dataType: 'd:text', constraints: [{ id: 'constraint-id', type: 'REGEX', - parameters: { expression: '^(?=.*test).*' } + parameters: { expression: '^(?=.*test).*', requiresMatch: true } }] }; @@ -105,4 +104,23 @@ describe('CardViewTextItemModel', () => { itemModel.value = 'dummy'; expect(itemModel.isValid(itemModel.value)).toBe(false, '`dummy` is not a constraint expression pattern'); }); + + it('should validate based on defined constraints and not require a match to be valid', () => { + const constrainedProperties: CardViewTextItemProperties = { + label: 'Tribe', + value: 'test', + key: 'tribe', + constraints: [{ + id: 'constraint-id', + type: 'REGEX', + parameters: { expression: '^(?=.*test).*', requiresMatch: false } + }] + }; + + const itemModel = new CardViewTextItemModel(constrainedProperties); + expect(itemModel.isValid(itemModel.value)).toBe(false); + + itemModel.value = 'dummy'; + expect(itemModel.isValid(itemModel.value)).toBe(true); + }); }); diff --git a/lib/core/src/lib/card-view/validators/card-view-item-match.valiator.ts b/lib/core/src/lib/card-view/validators/card-view-item-match.valiator.ts index 79d4f0f573..44ff86bbd7 100644 --- a/lib/core/src/lib/card-view/validators/card-view-item-match.valiator.ts +++ b/lib/core/src/lib/card-view/validators/card-view-item-match.valiator.ts @@ -20,15 +20,17 @@ import { CardViewItemValidator } from '../interfaces/card-view.interfaces'; export interface MatchValidatorParams { expression: string; flags?: string; + requiresMatch?: boolean; } export class CardViewItemMatchValidator implements CardViewItemValidator { message = 'CORE.CARDVIEW.VALIDATORS.MATCH_VALIDATION_ERROR'; - constructor(private expression: string, private flags?: string) {} + constructor(private expression: string, private flags?: string, private requiresMatch?: boolean) { + } isValid(value: string): boolean { const regex = new RegExp(this.expression, this.flags); - return value === '' || regex.test(value); + return value === '' || this.requiresMatch ? regex.test(value) : !regex.test(value); } } diff --git a/lib/core/src/lib/card-view/validators/validators.map.ts b/lib/core/src/lib/card-view/validators/validators.map.ts index de9674e6b2..6dcfdb0e6e 100644 --- a/lib/core/src/lib/card-view/validators/validators.map.ts +++ b/lib/core/src/lib/card-view/validators/validators.map.ts @@ -21,7 +21,7 @@ import { CardViewItemLengthValidator, LengthValidatorParams } from './card-view- const validators = { minmax: (parameters: MinMaxValidatorParams) => new CardViewItemMinMaxValidator(parameters.minValue, parameters.maxValue), - regex: (parameters: MatchValidatorParams) => new CardViewItemMatchValidator(parameters.expression), + regex: (parameters: MatchValidatorParams) => new CardViewItemMatchValidator(parameters.expression, parameters.flags, parameters.requiresMatch), length: (parameters: LengthValidatorParams) => new CardViewItemLengthValidator(parameters.minLength, parameters.maxLength) }; export default validators;