diff options
Diffstat (limited to 'openecomp-ui/src/sdc-app/common/reducers')
4 files changed, 284 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); + } + }; +}; + + + + + + + diff --git a/openecomp-ui/src/sdc-app/common/reducers/JSONSchemaReducerConstants.js b/openecomp-ui/src/sdc-app/common/reducers/JSONSchemaReducerConstants.js new file mode 100644 index 0000000000..6007b878dd --- /dev/null +++ b/openecomp-ui/src/sdc-app/common/reducers/JSONSchemaReducerConstants.js @@ -0,0 +1,23 @@ +/*! + * 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 keyMirror from 'nfvo-utils/KeyMirror.js'; + +export const actionTypes = keyMirror({ + DATA_LOADED: null, + DATA_CHANGED: null, + VALIDATE_FORM: null, + VALIDATE_DATA: null +}); diff --git a/openecomp-ui/src/sdc-app/common/reducers/PlainDataReducer.js b/openecomp-ui/src/sdc-app/common/reducers/PlainDataReducer.js new file mode 100644 index 0000000000..0bbb5e63be --- /dev/null +++ b/openecomp-ui/src/sdc-app/common/reducers/PlainDataReducer.js @@ -0,0 +1,94 @@ +/*! + * 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 './PlainDataReducerConstants.js'; +import Validator from 'nfvo-utils/Validator.js'; +import forOwn from 'lodash/forOwn.js'; + +function updateDataAndValidateReducer(state = {}, action) { + let genericFieldInfoCopy; + switch (action.type) { + case actionTypes.DATA_CHANGED: + let changed = action.deltaData; + if (!action.formName || (state.formName !== action.formName)) {return {...state};} + genericFieldInfoCopy = {...state.genericFieldInfo}; + forOwn(changed,(value, key) => { + if (state.genericFieldInfo[key]) { + let result = Validator.validate(key, value, state.genericFieldInfo[key].validations, state, action.customValidations); + genericFieldInfoCopy[key] = {...genericFieldInfoCopy[key], isValid: result.isValid, errorText: result.errorText}; + } + }); + return { + ...state, + formReady: null, + data: { + ...state.data, + ...action.deltaData + }, + genericFieldInfo: genericFieldInfoCopy + }; + case actionTypes.VALIDATE_FORM: + if (!action.formName || (state.formName !== action.formName)) {return {...state};} + genericFieldInfoCopy = {...state.genericFieldInfo}; + let formReady = true; + forOwn(state.genericFieldInfo,(value, key) => { + let val = state.data && state.data[key] ? state.data[key] : ''; + let result = Validator.validate(key, val, state.genericFieldInfo[key].validations, state, {}); + genericFieldInfoCopy[key] = {...genericFieldInfoCopy[key], isValid: result.isValid, errorText: result.errorText}; + if (!result.isValid) { + formReady = false; + } + }); + return { + ...state, + formReady, + genericFieldInfo: genericFieldInfoCopy + }; + case actionTypes.VALIDATE_DATA: + let specificFields = action.data; + if (!action.formName || (state.formName !== action.formName)) {return {...state};} + genericFieldInfoCopy = {...state.genericFieldInfo}; + forOwn(specificFields,(value, key) => { + let result = Validator.validate(key, value, state.genericFieldInfo[key].validations, state, action.customValidations); + genericFieldInfoCopy[key] = {...genericFieldInfoCopy[key], isValid: result.isValid, errorText: result.errorText}; + }); + return { + ...state, + formReady: null, + genericFieldInfo: genericFieldInfoCopy + }; + default: + return state; + } +}; + +export function createPlainDataReducer(loadReducer) { + return (state = {}, action) => { + if(action.type === actionTypes.VALIDATE_DATA || + action.type === actionTypes.VALIDATE_FORM || + action.type === actionTypes.DATA_CHANGED + ) { + return updateDataAndValidateReducer(state, action); + } else { + return loadReducer(state, action); + } + }; +}; + + + + + + diff --git a/openecomp-ui/src/sdc-app/common/reducers/PlainDataReducerConstants.js b/openecomp-ui/src/sdc-app/common/reducers/PlainDataReducerConstants.js new file mode 100644 index 0000000000..135361dd20 --- /dev/null +++ b/openecomp-ui/src/sdc-app/common/reducers/PlainDataReducerConstants.js @@ -0,0 +1,22 @@ +/*! + * 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 keyMirror from 'nfvo-utils/KeyMirror.js'; + +export const actionTypes = keyMirror({ + DATA_CHANGED: null, + VALIDATE_FORM: null, + VALIDATE_DATA: null +}); |