import OpenFilters from '../../data/open_filters.json' class FormPropertyLogicRule { property = null logic = null isConditionCorrect = true isActionCorrect = true ACTIONS_VALUES = [ 'show-block', 'hide-block', 'make-it-optional', 'require-answer', 'enable-block', 'disable-block' ] CONDITION_MAPPING = OpenFilters constructor (property) { this.property = property this.logic = (property.logic !== undefined && property.logic) ? property.logic : null } isValid () { if (this.logic && this.logic['conditions']) { this.checkConditions(this.logic['conditions']) this.checkActions((this.logic && this.logic['actions']) ? this.logic['actions'] : null) } return this.isConditionCorrect && this.isActionCorrect } checkConditions (conditions) { if (conditions && conditions['operatorIdentifier']) { if ((conditions['operatorIdentifier'] !== 'and') && (conditions['operatorIdentifier'] !== 'or')) { this.isConditionCorrect = false return } if (conditions['operatorIdentifier']['children'] !== undefined || !Array.isArray(conditions['children'])) { this.isConditionCorrect = false return } conditions['children'].forEach(childrenCondition => { this.checkConditions(childrenCondition) }) } else if (conditions && conditions['identifier']) { this.checkBaseCondition(conditions) } } checkBaseCondition (condition) { if (condition['value'] === undefined || condition['value']['property_meta'] === undefined || condition['value']['property_meta']['type'] === undefined || condition['value']['operator'] === undefined || condition['value']['value'] === undefined ) { this.isConditionCorrect = false return } const typeField = condition['value']['property_meta']['type'] const operator = condition['value']['operator'] const value = condition['value']['value'] if (this.CONDITION_MAPPING[typeField] === undefined || this.CONDITION_MAPPING[typeField]['comparators'][operator] === undefined ) { this.isConditionCorrect = false return } const type = this.CONDITION_MAPPING[typeField]['comparators'][operator]['expected_type'] if (Array.isArray(type)) { let foundCorrectType = false type.forEach(subtype => { if (this.valueHasCorrectType(subtype, value)) { foundCorrectType = true } }) if (!foundCorrectType) { this.isConditionCorrect = false } } else { if (!this.valueHasCorrectType(type, value)) { this.isConditionCorrect = false } } } valueHasCorrectType (type, value) { if ( (type === 'string' && typeof value !== 'string') || (type === 'boolean' && typeof value !== 'boolean') || (type === 'number' && typeof value !== 'number') || (type === 'object' && !Array.isArray(value)) ) { return false } return true } checkActions (conditions) { if (Array.isArray(conditions) && conditions.length > 0) { conditions.forEach(val => { if (this.ACTIONS_VALUES.indexOf(val) === -1 || (['nf-text', 'nf-code', 'nf-page-break', 'nf-divider', 'nf-image'].indexOf(this.property["type"]) > -1 && ['hide-block', 'show-block'].indexOf(val) === -1) || (this.property["hidden"] !== undefined && this.property["hidden"] && ['show-block', 'require-answer'].indexOf(val) === -1) || (this.property["required"] !== undefined && this.property["required"] && ['make-it-optional', 'hide-block', 'disable-block'].indexOf(val) === -1) || (this.property["disabled"] !== undefined && this.property["disabled"] && ['enable-block', 'require-answer', 'make-it-optional'].indexOf(val) === -1) ) { this.isActionCorrect = false return } }) } else { this.isActionCorrect = false } } } export default FormPropertyLogicRule