diff --git a/splunk_add_on_ucc_framework/ucc_ui_lib/src/main/webapp/util/Validator.js b/splunk_add_on_ucc_framework/ucc_ui_lib/src/main/webapp/util/Validator.js index 417808598..871bb2ba2 100644 --- a/splunk_add_on_ucc_framework/ucc_ui_lib/src/main/webapp/util/Validator.js +++ b/splunk_add_on_ucc_framework/ucc_ui_lib/src/main/webapp/util/Validator.js @@ -4,98 +4,113 @@ import { parseNumberValidator, parseRegexRawStr, parseStringValidator, + parseFunctionRawStr } from './uccConfigurationValidators'; +// Validate provided saveValidator function +export function SaveValidator(validatorFunc, formData) { + const { error, result } = parseFunctionRawStr(validatorFunc); + if (error) { + return { errorMsg: error }; + } + let ret = result(formData); + if (typeof ret === 'string') { + return { errorMsg: ret }; + } +} + class Validator { constructor(entities) { - this.entities = JSON.parse(entities); + this.entities = entities; } checkIsFieldHasInput = (attrValue) => { return attrValue !== undefined && attrValue !== ''; }; - RequiredValidator(field, data) { + // Validate the required field has value + RequiredValidator(field, label, data) { if (!this.checkIsFieldHasInput(data)) { - return { error: true, msg: getFormattedMessage(6, field) }; + return { errorField: field, errorMsg: getFormattedMessage(6, [label]) }; } } - StringValidator(field, validator, data) { + // Validate the string length of field + StringValidator(field, label, validator, data) { const { error } = parseStringValidator(validator.minLength, validator.maxLength); if (error) { - return { error: true, msg: error }; + return { errorField: field, errorMsg: error }; } if (this.checkIsFieldHasInput(data) && data.length > validator.maxLength) { return { - error: true, - msg: validator.errorMsg + errorField: field, + errorMsg: validator.errorMsg ? validator.errorMsg - : getFormattedMessage(18, [field, validator.maxLength]), + : getFormattedMessage(18, [label, validator.maxLength]), }; } if (this.checkIsFieldHasInput(data) && data.length < validator.minLength) { return { - error: true, - msg: validator.errorMsg + errorField: field, + errorMsg: validator.errorMsg ? validator.errorMsg - : getFormattedMessage(17, [field, validator.minLength]), + : getFormattedMessage(17, [label, validator.minLength]), }; } } - RegexValidator(field, validator, data) { + // Validate the field should match the provided Regex + RegexValidator(field, label, validator, data) { const { error, result: regex } = parseRegexRawStr(validator.pattern); if (error) { - return { error: true, msg: error }; + return { errorField: field, errorMsg: error }; } if (this.checkIsFieldHasInput(data) && !regex.test(data)) { return { - error: true, - msg: validator.errorMsg + errorField: field, + errorMsg: validator.errorMsg ? validator.errorMsg - : getFormattedMessage(15, [field, validator.pattern]), + : getFormattedMessage(15, [label, validator.pattern]), }; } } - PreDefinedRegexValidator(field, validator, data, pattern, inputValueType) { + // Validate the field should match predefined Regexes + PreDefinedRegexValidator(field, label, validator, data, pattern, inputValueType) { const { error, result: regex } = parseRegexRawStr(pattern); if (error) { - return { error: true, msg: error }; + return { errorField: field, errorMsg: error }; } if (this.checkIsFieldHasInput(data) && !regex.test(data)) { return { - error: true, - msg: validator.errorMsg + errorField: field, + errorMsg: validator.errorMsg ? validator.errorMsg - : getFormattedMessage(19, [field, inputValueType]), + : getFormattedMessage(19, [label, inputValueType]), }; } } - NumberValidator(field, validator, data) { + // Validate the range of numeric field + NumberValidator(field, label, validator, data) { const { error } = parseNumberValidator(validator.range); if (error) { - return { error: true, msg: error }; + return { errorField: field, errorMsg: error }; } const val = Number(data); if (_.isNaN(val)) { return { - error: true, - msg: validator.errorMsg ? validator.errorMsg : getFormattedMessage(16, field), + errorField: field, + errorMsg: validator.errorMsg ? validator.errorMsg : getFormattedMessage(16, [label]), }; } - if ( - (this.checkIsFieldHasInput(data) && val > validator.range[1]) || - val < validator.range[0] - ) { + if ((this.checkIsFieldHasInput(data) && val > validator.range[1]) || val < validator.range[0]) { return { - error: true, - msg: validator.errorMsg + errorField: field, + errorMsg: validator.errorMsg ? validator.errorMsg - : getFormattedMessage(8, [field, validator.range[0], validator.range[1]]), + : getFormattedMessage(8, [label, validator.range[0], validator.range[1]]), }; } } @@ -104,9 +119,8 @@ class Validator { let ret; for (var i = 0; i < this.entities.length; i++) { if (this.entities[i].required === true) { - ret = this.RequiredValidator(this.entities[i].field, data[this.entities[i].field]); + ret = this.RequiredValidator(this.entities[i].field, this.entities[i].label, data[this.entities[i].field]); if (ret) { - console.log(ret); return ret; } } @@ -119,6 +133,7 @@ class Validator { case 'string': ret = this.StringValidator( this.entities[i].field, + this.entities[i].label, this.entities[i].validators[j], data[this.entities[i].field] ); @@ -129,6 +144,7 @@ class Validator { case 'regex': ret = this.RegexValidator( this.entities[i].field, + this.entities[i].label, this.entities[i].validators[j], data[this.entities[i].field] ); @@ -139,6 +155,7 @@ class Validator { case 'number': ret = this.NumberValidator( this.entities[i].field, + this.entities[i].label, this.entities[i].validators[j], data[this.entities[i].field] ); @@ -149,6 +166,7 @@ class Validator { case 'url': ret = this.PreDefinedRegexValidator( this.entities[i].field, + this.entities[i].label, this.entities[i].validators[j], data[this.entities[i].field], PREDEFINED_VALIDATORS_DICT.url.regex, @@ -161,6 +179,7 @@ class Validator { case 'date': ret = this.PreDefinedRegexValidator( this.entities[i].field, + this.entities[i].label, this.entities[i].validators[j], data[this.entities[i].field], PREDEFINED_VALIDATORS_DICT.date.regex, @@ -173,6 +192,7 @@ class Validator { case 'email': ret = this.PreDefinedRegexValidator( this.entities[i].field, + this.entities[i].label, this.entities[i].validators[j], data[this.entities[i].field], PREDEFINED_VALIDATORS_DICT.email.regex, @@ -185,6 +205,7 @@ class Validator { case 'ipv4': ret = this.PreDefinedRegexValidator( this.entities[i].field, + this.entities[i].label, this.entities[i].validators[j], data[this.entities[i].field], PREDEFINED_VALIDATORS_DICT.ipv4.regex,