From 25ae4441c4141c67a46d88a7d0462ed951e7eac4 Mon Sep 17 00:00:00 2001 From: Dishank Date: Tue, 16 Mar 2021 23:44:16 +0530 Subject: [PATCH 1/3] ADDON-34762: Added SaveValidator function --- .../ucc_ui_lib/src/main/webapp/util/Validator.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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..2e8c42ad5 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,8 +4,21 @@ 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); From 2d744110312b9b1e54354b385f76b8920c7d1c44 Mon Sep 17 00:00:00 2001 From: Dishank Date: Tue, 16 Mar 2021 23:46:43 +0530 Subject: [PATCH 2/3] ADDON-34762: Updated Validation functions --- .../src/main/webapp/util/Validator.js | 76 ++++++++++--------- 1 file changed, 42 insertions(+), 34 deletions(-) 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 2e8c42ad5..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 @@ -21,94 +21,96 @@ export function SaveValidator(validatorFunc, formData) { 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]]), }; } } @@ -117,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; } } @@ -132,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] ); @@ -142,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] ); @@ -152,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] ); @@ -162,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, @@ -174,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, @@ -186,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, @@ -198,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, From 47b9511b5d9e4001d550f750f9a5cfb62c6436c8 Mon Sep 17 00:00:00 2001 From: Dishank Date: Tue, 16 Mar 2021 23:56:04 +0530 Subject: [PATCH 3/3] ADDON-34762: Updated form Error handling functions --- .../main/webapp/components/BaseFormView.jsx | 41 ++++++++++++------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/splunk_add_on_ucc_framework/ucc_ui_lib/src/main/webapp/components/BaseFormView.jsx b/splunk_add_on_ucc_framework/ucc_ui_lib/src/main/webapp/components/BaseFormView.jsx index aa9b05085..9fabe35ef 100644 --- a/splunk_add_on_ucc_framework/ucc_ui_lib/src/main/webapp/components/BaseFormView.jsx +++ b/splunk_add_on_ucc_framework/ucc_ui_lib/src/main/webapp/components/BaseFormView.jsx @@ -130,11 +130,20 @@ class BaseFormView extends Component { } + // Set error message to display and set error in perticular field + setErrorFieldMsg = (field, msg) =>{ + const newFields = update(this.state ,{ data: { [field] : { error: {$set: true } } } } ); + newFields.ErrorMsg = msg; + this.setState(newFields); + } + + // Set error in perticular field setErrorField = (field) =>{ const newFields = update(this.state ,{ data: { [field] : { error: {$set: true } } } } ); this.setState(newFields); } + // Clear error message clearErrorMsg = () =>{ if(this.state.ErrorMsg){ const newFields = { ...this.state }; @@ -143,37 +152,39 @@ class BaseFormView extends Component { } } + // Set error message setErrorMsg = (msg) =>{ const newFields = { ...this.state }; newFields.ErrorMsg = msg; this.setState(newFields); } - - // Not tested yet - clearAllErrorMsg = () =>{ - const newFields = { ...this.state }; + // Clear error message and errors from fields + clearAllErrorMsg = (State) =>{ + const newFields = State ? { ...State } : {...this.state}; newFields.ErrorMsg = ""; - const newData = {...this.state.data} - - Object.keys(newData).map( (key) => { + const newData = State ? { ...State.data } : {...this.state.data}; + const temData ={} + Object.keys(newData).forEach( (key) => { if(newData[key].error){ const tem = {...newData[key]} tem.error = false; - return tem; + temData[key] = tem; } - return newData[key]; - }); - - newFields.data = newData; - this.setState(newFields); + else{ + temData[key] = newData[key]; + } + }); + newFields.data = temData; + return State ? newFields : null; } + // Display error message generateErrorMessage = () => { if (this.state.ErrorMsg) { return ( -
- +
+ {this.state.ErrorMsg}