| /*- |
| * ============LICENSE_START======================================================= |
| * SDC |
| * ================================================================================ |
| * 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. |
| * ============LICENSE_END========================================================= |
| */ |
| |
| import {actionTypes as softwareProductsActionTypes} from 'sdc-app/onboarding/softwareProduct/SoftwareProductConstants.js'; |
| import {actionTypes} from './AttachmentsConstants.js'; |
| |
| const mapVolumeData = ({fileName, env, errors}) => ({ |
| name: fileName, |
| expanded: true, |
| type: 'volume', |
| children: env && [{ |
| name: env.fileName, |
| errors: env.errors, |
| type: 'env' |
| }], |
| errors |
| }); |
| |
| const mapNetworkData = ({fileName, env, errors}) => ({ |
| name: fileName, |
| expanded: true, |
| type: 'network', |
| children: env && [{ |
| name: env.fileName, |
| errors: env.errors, |
| type: 'env' |
| }], |
| errors |
| }); |
| |
| const mapArtifactsData = ({fileName, errors}) => ({ |
| name: fileName, |
| type: 'artifact', |
| errors |
| }); |
| |
| const mapOtherData = ({fileName, errors}) => ({ |
| name: fileName, |
| type: 'other', |
| errors |
| }); |
| |
| |
| const mapHeatData = ({fileName, env, nested, volume, network, artifacts, errors, other}) => ({ |
| name: fileName, |
| expanded: true, |
| type: 'heat', |
| errors, |
| children: [ |
| ...(volume ? volume.map(mapVolumeData) : []), |
| ...(network ? network.map(mapNetworkData) : []), |
| ...(env ? [{ |
| name: env.fileName, |
| errors: env.errors, |
| type: 'env' |
| }] : []), |
| ...(artifacts ? artifacts.map(mapArtifactsData) : []), |
| ...(other ? other.map(mapOtherData) : []), |
| ...(nested ? nested.map(mapHeatData) : []) |
| ] |
| }); |
| |
| function createErrorList(node, parent, deep = 0, errorList = []) { |
| if (node.errors) { |
| errorList.push(...node.errors.map((error) => ({ |
| errorLevel: error.level, |
| errorMessage: error.message, |
| name: node.name, |
| hasParent: deep > 2, |
| parentName: parent.name, |
| type: node.type, |
| }))); |
| } |
| if (node.children && node.children.length) { |
| node.children.map((child) => createErrorList(child, node, deep + 1, errorList)); |
| } |
| return errorList; |
| } |
| |
| const mapValidationDataToTree = validationData => { |
| let {HEAT, volume, network, artifacts, other} = validationData.importStructure || {}; |
| return { |
| children: [ |
| { |
| name: 'HEAT', |
| expanded: true, |
| type: 'heat', |
| children: (HEAT ? HEAT.map(mapHeatData) : []) |
| }, |
| ...(artifacts ? [{ |
| name: 'artifacts', |
| expanded: true, |
| type: 'artifact', |
| children: (artifacts ? artifacts.map(mapArtifactsData) : []) |
| }] : []), |
| ...(network ? [{ |
| name: 'networks', |
| expanded: true, |
| type: 'network', |
| children: (network ? network.map(mapNetworkData) : []), |
| }] : []), |
| ...(volume ? [{ |
| name: 'volume', |
| expanded: true, |
| type: 'volume', |
| children: (volume ? volume.map(mapVolumeData) : []), |
| }] : []), |
| ...(other ? [{ |
| name: 'other', |
| expanded: true, |
| type: 'other', |
| children: (other ? other.map(mapOtherData) : []), |
| }] : []) |
| ] |
| }; |
| }; |
| |
| const toggleExpanded = (node, path) => { |
| let newNode = {...node}; |
| if (path.length === 0) { |
| newNode.expanded = !node.expanded; |
| } else { |
| let index = path[0]; |
| newNode.children = [ |
| ...node.children.slice(0, index), |
| toggleExpanded(node.children[index], path.slice(1)), |
| ...node.children.slice(index + 1) |
| ]; |
| } |
| return newNode; |
| }; |
| |
| const expandSelected = (node, selectedNode) => { |
| let shouldExpand = node.name === selectedNode; |
| let children = node.children && node.children.map(child => { |
| let {shouldExpand: shouldExpandChild, node: newChild} = expandSelected(child, selectedNode); |
| shouldExpand = shouldExpand || shouldExpandChild; |
| return newChild; |
| }); |
| |
| return { |
| node: { |
| ...node, |
| expanded: node.expanded || shouldExpand, |
| children |
| }, |
| shouldExpand |
| }; |
| }; |
| |
| export default (state = {attachmentsTree: {}}, action) => { |
| switch (action.type) { |
| case softwareProductsActionTypes.SOFTWARE_PRODUCT_LOADED: |
| let currentSoftwareProduct = action.response; |
| let attachmentsTree = currentSoftwareProduct.validationData ? mapValidationDataToTree(currentSoftwareProduct.validationData) : {}; |
| let errorList = createErrorList(attachmentsTree); |
| return { |
| ...state, |
| attachmentsTree, |
| errorList |
| }; |
| case actionTypes.TOGGLE_EXPANDED: |
| return { |
| ...state, |
| attachmentsTree: toggleExpanded(state.attachmentsTree, action.path) |
| }; |
| case actionTypes.SELECTED_NODE: |
| let selectedNode = action.nodeName; |
| return { |
| ...state, |
| attachmentsTree: expandSelected(state.attachmentsTree, selectedNode).node, |
| selectedNode |
| }; |
| case actionTypes.UNSELECTED_NODE: |
| return { |
| ...state, |
| selectedNode: undefined |
| }; |
| default: |
| return state; |
| } |
| }; |