/*! * 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 './HeatSetupConstants.js'; import differenceWith from 'lodash/differenceWith.js'; const emptyModule = (isBase, currentLength) => ({ name: `${isBase ? 'base_' : 'module_'}${currentLength + 1}`, isBase: isBase }); function syncUnassignedFilesWithArtifactsChanges( unassigned, artifacts, oldArtifacts ) { if (artifacts.length > oldArtifacts.length) { return differenceWith( unassigned, artifacts, (unassignedFile, artifact) => unassignedFile === artifact ); } else { const removedArtifact = differenceWith( oldArtifacts, artifacts, (oldArtifact, artifact) => artifact === oldArtifact ); return [...unassigned, removedArtifact[0]]; } } function findModuleIndexByName(modules, name) { return modules.findIndex(module => module.name === name); } function addDeletedModuleFilesToUnassigned(unassigned, deletedModule) { let files = []; for (let i in deletedModule) { if (deletedModule.hasOwnProperty(i)) { if ( typeof deletedModule[i] === 'string' && deletedModule[i] && i !== 'name' ) { files.push(deletedModule[i]); } } } return unassigned.concat(files); } export default (state = {}, action) => { switch (action.type) { case actionTypes.MANIFEST_LOADED: return { ...state, ...action.response, modules: action.response.modules.map(module => ({ ...module, name: module.name || module.yaml.substring(0, module.yaml.lastIndexOf('.')) })) }; case actionTypes.ARTIFACT_LIST_CHANGE: return { ...state, artifacts: action.data.artifacts, unassigned: syncUnassignedFilesWithArtifactsChanges( state.unassigned, action.data.artifacts, state.artifacts ) }; case actionTypes.ADD_ALL_UNASSIGNED_TO_ARTIFACTS: return { ...state, artifacts: [...state.artifacts, ...state.unassigned], unassigned: [] }; case actionTypes.ADD_ALL_ARTIFACTS_TO_UNASSIGNED: return { ...state, artifacts: [], unassigned: [...state.unassigned, ...state.artifacts] }; case actionTypes.ADD_MODULE: return { ...state, modules: state.modules.concat({ ...emptyModule(action.data.isBase, state.modules.length) }) }; case actionTypes.REMOVE_MODULE: const moduleIndexToDelete = findModuleIndexByName( state.modules, action.data.moduleName ); let unassigned = addDeletedModuleFilesToUnassigned( state.unassigned, state.modules[moduleIndexToDelete] ); return { ...state, unassigned, modules: [ ...state.modules.slice(0, moduleIndexToDelete), ...state.modules.slice(moduleIndexToDelete + 1) ] }; case actionTypes.RENAME_MODULE: const indexToRename = findModuleIndexByName( state.modules, action.data.oldName ); let moduleToRename = state.modules[indexToRename]; moduleToRename.name = action.data.newName; return { ...state, modules: [ ...state.modules.slice(0, indexToRename), moduleToRename, ...state.modules.slice(indexToRename + 1) ] }; case actionTypes.FILE_ASSIGN_CHANGED: let { module, value: { value }, type } = action.data; const moduleIndexToModify = findModuleIndexByName( state.modules, module.name ); let moduleToModify = state.modules[moduleIndexToModify]; let dumpedFile = moduleToModify[type]; if (dumpedFile !== value) { if (value) { moduleToModify[type] = value; } else { delete moduleToModify[type]; } const newUnassignedList = dumpedFile ? [ ...state.unassigned.filter(file => file !== value), dumpedFile ] : state.unassigned.filter(file => file !== value); return { ...state, modules: [ ...state.modules.slice(0, moduleIndexToModify), moduleToModify, ...state.modules.slice(moduleIndexToModify + 1) ], unassigned: newUnassignedList }; } else { return state; } default: return state; } };