diff options
author | AviZi <avi.ziv@amdocs.com> | 2017-06-09 02:39:56 +0300 |
---|---|---|
committer | AviZi <avi.ziv@amdocs.com> | 2017-06-09 02:39:56 +0300 |
commit | 280f8015d06af1f41a3ef12e8300801c7a5e0d54 (patch) | |
tree | 9c1d3978c04cd28068f02073038c936bb49ca9e0 /openecomp-ui/src/sdc-app/common/reducers/JSONSchemaReducer.js | |
parent | fd3821dad11780d33c5373d74c957c442489945e (diff) |
[SDC-29] Amdocs OnBoard 1707 initial commit.
Change-Id: Ie4d12a3f574008b792899b368a0902a8b46b5370
Signed-off-by: AviZi <avi.ziv@amdocs.com>
Diffstat (limited to 'openecomp-ui/src/sdc-app/common/reducers/JSONSchemaReducer.js')
-rw-r--r-- | openecomp-ui/src/sdc-app/common/reducers/JSONSchemaReducer.js | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/openecomp-ui/src/sdc-app/common/reducers/JSONSchemaReducer.js b/openecomp-ui/src/sdc-app/common/reducers/JSONSchemaReducer.js new file mode 100644 index 0000000000..35b2f936ce --- /dev/null +++ b/openecomp-ui/src/sdc-app/common/reducers/JSONSchemaReducer.js @@ -0,0 +1,145 @@ +/*! + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ +import {actionTypes} from './JSONSchemaReducerConstants.js'; +import Validator from 'nfvo-utils/Validator.js'; +import JSONSchema from 'nfvo-utils/json/JSONSchema.js'; +import JSONPointer from 'nfvo-utils/json/JSONPointer.js'; +import forOwn from 'lodash/forOwn.js'; +import isArray from 'lodash/isArray.js'; + + +function flattenData(data, result, pointer = '') { + let newPointer = pointer; + if (typeof data === 'object' && !isArray(data)) { + for (let i in data) { + newPointer = newPointer ? newPointer + '/' + i : i; + flattenData(data[i], result, newPointer); + newPointer = pointer; + } + } else { + result[newPointer] = data; + } +} + +function updateSchemaDataAndValidateReducer (state = {}, action, questionnaireName) { + let genericFieldInfoClone; + switch (action.type) { + case actionTypes.DATA_LOADED: + if (questionnaireName !== action.qName) {return {...state};} + const schema = action.payload.qschema; + let schemaLoader = new JSONSchema(); + schemaLoader.setSchema(schema); + schemaLoader.setSupportedValidationFunctions(Object.keys(Validator.globalValidationFunctions)); + let {genericFieldInfo} = schemaLoader.flattenSchema(); + + let data = action.payload.qdata; + let dataMap = {}; + flattenData(data, dataMap); + + return { + ...state, + qdata: action.payload.qdata, // the original hierarchical data. to be used for submit and save + qgenericFieldInfo : genericFieldInfo, // information about the fields that the view will require and reducer will need, such as validations, enum to use, etc. + dataMap // flattened schema data for ease of use + }; + + case actionTypes.DATA_CHANGED: + let changedData = action.deltaData; + if (questionnaireName !== action.qName) {return {...state};} + + genericFieldInfoClone = {...state.qgenericFieldInfo}; + let qDataClone = {...state.qdata}; + let dataMapClone = {...state.dataMap}; + + forOwn(changedData,(value, key) => { + if (state.qgenericFieldInfo[key]) { + let result = Validator.validate(key, value, state.qgenericFieldInfo[key].validations, state, action.customValidations); + genericFieldInfoClone[key] = {...genericFieldInfoClone[key], isValid: result.isValid, errorText: result.errorText}; + qDataClone = JSONPointer.setValue(state.qdata, '/' + key, value); + dataMapClone[key] = value; + } + }); + + return { + ...state, + qdata: qDataClone, + dataMap: dataMapClone, + qgenericFieldInfo: genericFieldInfoClone + }; + + case actionTypes.VALIDATE_DATA: + let specificFields = action.data; + if (questionnaireName !== action.qName) {return {...state};} + genericFieldInfoClone = {...state.qgenericFieldInfo}; + forOwn(specificFields,(value, key) => { + let result = Validator.validate(key, value, state.qgenericFieldInfo[key].validations, state, action.customValidations); + genericFieldInfoClone[key] = {...genericFieldInfoClone[key], isValid: result.isValid, errorText: result.errorText}; + }); + return { + ...state, + formReady: null, + qgenericFieldInfo: genericFieldInfoClone + }; + + case actionTypes.VALIDATE_FORM: + if (questionnaireName !== action.qName) {return {...state};} + genericFieldInfoClone = {...state.qgenericFieldInfo}; + let formReady = true; + forOwn(state.qgenericFieldInfo,(value, key) => { + let val = state.data[key] ? state.data[key] : ''; + let result = Validator.validate(key, val, state.qgenericFieldInfo[key].validations, state, {}); + genericFieldInfoClone[key] = {...genericFieldInfoClone[key], isValid: result.isValid, errorText: result.errorText}; + if (!result.isValid) { + formReady = false; + } + }); + return { + ...state, + formReady, + qgenericFieldInfo: genericFieldInfoClone + }; + + default: + return state; + } +}; + +export function createJSONSchemaReducer(questionnaireName) { + return (state = {}, action) => { + return updateSchemaDataAndValidateReducer(state, action, questionnaireName); + }; +}; + +export function createComposedJSONSchemaReducer(questionnaireName, additionalActionsReducer) { + return (state = {}, action) => { + if(action.type === actionTypes.VALIDATE_DATA || + action.type === actionTypes.VALIDATE_FORM || + action.type === actionTypes.DATA_CHANGED || + action.type === actionTypes.DATA_LOADED + ) { + return updateSchemaDataAndValidateReducer(state, action, questionnaireName); + } else { + return additionalActionsReducer(state, action); + } + }; +}; + + + + + + + |