diff options
| author | Georgios Andreadis <info@gandreadis.com> | 2020-07-10 10:21:46 +0200 |
|---|---|---|
| committer | Fabian Mastenbroek <mail.fabianm@gmail.com> | 2020-08-24 19:48:01 +0200 |
| commit | 8aa174e70c01631ae4e00a6d208966fcd77cf972 (patch) | |
| tree | 35ec6527e8d7a0b4093e18c8cb501c293a18b5eb /frontend/src/containers | |
| parent | 607e8c72d85bf79dcd9bf28df96b239e2764bc30 (diff) | |
Add implementation of portfolio and scenario UI structure
Diffstat (limited to 'frontend/src/containers')
10 files changed, 192 insertions, 126 deletions
diff --git a/frontend/src/containers/app/sidebars/project/PortfolioListContainer.js b/frontend/src/containers/app/sidebars/project/PortfolioListContainer.js new file mode 100644 index 00000000..d32a5c60 --- /dev/null +++ b/frontend/src/containers/app/sidebars/project/PortfolioListContainer.js @@ -0,0 +1,47 @@ +import { connect } from 'react-redux' +import { withRouter } from 'react-router-dom' +import PortfolioListComponent from '../../../../components/app/sidebars/project/PortfolioListComponent' +import { deletePortfolio, setCurrentPortfolio } from '../../../../actions/portfolios' +import { openNewPortfolioModal } from '../../../../actions/modals/portfolios' +import { getState } from '../../../../util/state-utils' +import { setCurrentTopology } from '../../../../actions/topology/building' + +const mapStateToProps = state => { + let portfolios = state.objects.project[state.currentProjectId] ? state.objects.project[state.currentProjectId].portfolioIds.map(t => ( + state.objects.portfolio[t] + )) : [] + if (portfolios.filter(t => !t).length > 0) { + portfolios = [] + } + + return { + currentProjectId: state.currentProjectId, + currentPortfolioId: state.currentPortfolioId, + portfolios, + } +} + +const mapDispatchToProps = (dispatch, ownProps) => { + return { + onNewPortfolio: () => { + dispatch(openNewPortfolioModal()) + }, + onChoosePortfolio: (portfolioId) => { + dispatch(setCurrentPortfolio(portfolioId)) + }, + onDeletePortfolio: async (id) => { + if (id) { + const state = await getState(dispatch) + dispatch(deletePortfolio(id)) + dispatch(setCurrentTopology(state.objects.project[state.currentProjectId].topologyIds[0])) + ownProps.history.push(`/projects/${state.currentProjectId}`) + } + }, + } +} + +const PortfolioListContainer = withRouter(connect(mapStateToProps, mapDispatchToProps)( + PortfolioListComponent, +)) + +export default PortfolioListContainer diff --git a/frontend/src/containers/app/sidebars/project/ProjectSidebarContainer.js b/frontend/src/containers/app/sidebars/project/ProjectSidebarContainer.js index ced0b18b..3951c24a 100644 --- a/frontend/src/containers/app/sidebars/project/ProjectSidebarContainer.js +++ b/frontend/src/containers/app/sidebars/project/ProjectSidebarContainer.js @@ -1,5 +1,10 @@ +import React from 'react' +import { withRouter } from 'react-router-dom' import ProjectSidebarComponent from '../../../../components/app/sidebars/project/ProjectSidebarComponent' -const ProjectSidebarContainer = ProjectSidebarComponent +const ProjectSidebarContainer = withRouter(({ location, ...props }) => ( + <ProjectSidebarComponent + collapsible={location.pathname.indexOf('portfolios') === -1 && location.pathname.indexOf('scenarios') === -1} {...props}/> +)) export default ProjectSidebarContainer diff --git a/frontend/src/containers/app/sidebars/project/ScenarioListContainer.js b/frontend/src/containers/app/sidebars/project/ScenarioListContainer.js new file mode 100644 index 00000000..2fd56d2b --- /dev/null +++ b/frontend/src/containers/app/sidebars/project/ScenarioListContainer.js @@ -0,0 +1,45 @@ +import { connect } from 'react-redux' +import ScenarioListComponent from '../../../../components/app/sidebars/project/ScenarioListComponent' +import { openNewScenarioModal } from '../../../../actions/modals/scenarios' +import { deleteScenario, setCurrentScenario } from '../../../../actions/scenarios' +import { setCurrentPortfolio } from '../../../../actions/portfolios' + +const mapStateToProps = (state, ownProps) => { + let scenarios = state.objects.portfolio[ownProps.portfolioId] ? state.objects.portfolio[ownProps.portfolioId].scenarioIds.map(t => ( + state.objects.scenario[t] + )) : [] + if (scenarios.filter(t => !t).length > 0) { + scenarios = [] + } + + return { + currentProjectId: state.currentProjectId, + currentScenarioId: state.currentScenarioId, + scenarios, + } +} + +const mapDispatchToProps = dispatch => { + return { + onNewScenario: (currentPortfolioId) => { + dispatch(setCurrentPortfolio(currentPortfolioId)) + dispatch(openNewScenarioModal()) + }, + onChooseScenario: (portfolioId, scenarioId) => { + dispatch(setCurrentScenario(portfolioId, scenarioId)) + }, + onDeleteScenario: (id) => { + if (id) { + dispatch( + deleteScenario(id), + ) + } + }, + } +} + +const ScenarioListContainer = connect(mapStateToProps, mapDispatchToProps)( + ScenarioListComponent, +) + +export default ScenarioListContainer diff --git a/frontend/src/containers/app/sidebars/project/TopologyListContainer.js b/frontend/src/containers/app/sidebars/project/TopologyListContainer.js index cab47c8d..6905c7c5 100644 --- a/frontend/src/containers/app/sidebars/project/TopologyListContainer.js +++ b/frontend/src/containers/app/sidebars/project/TopologyListContainer.js @@ -2,7 +2,9 @@ import { connect } from 'react-redux' import TopologyListComponent from '../../../../components/app/sidebars/project/TopologyListComponent' import { setCurrentTopology } from '../../../../actions/topology/building' import { openNewTopologyModal } from '../../../../actions/modals/topology' -import { deleteTopology } from '../../../../actions/topologies' +import { withRouter } from 'react-router-dom' +import { getState } from '../../../../util/state-utils' +import { deleteScenario } from '../../../../actions/scenarios' const mapStateToProps = state => { let topologies = state.objects.project[state.currentProjectId] ? state.objects.project[state.currentProjectId].topologyIds.map(t => ( @@ -13,34 +15,35 @@ const mapStateToProps = state => { } return { - show: state.modals.changeTopologyModalVisible, currentTopologyId: state.currentTopologyId, topologies, + } } -const mapDispatchToProps = dispatch => { +const mapDispatchToProps = (dispatch, ownProps) => { return { - onChooseTopology: (id) => { - dispatch( - setCurrentTopology(id), - ) + onChooseTopology: async (id) => { + dispatch(setCurrentTopology(id)) + const state = await getState(dispatch) + ownProps.history.push(`/projects/${state.currentProjectId}`) }, onNewTopology: () => { dispatch(openNewTopologyModal()) }, - onDeleteTopology: (id) => { + onDeleteTopology: async (id) => { if (id) { - dispatch( - deleteTopology(id), - ) + const state = await getState(dispatch) + dispatch(deleteScenario(id)) + dispatch(setCurrentTopology(state.objects.project[state.currentProjectId].topologyIds[0])) + ownProps.history.push(`/projects/${state.currentProjectId}`) } }, } } -const TopologyListContainer = connect(mapStateToProps, mapDispatchToProps)( +const TopologyListContainer = withRouter(connect(mapStateToProps, mapDispatchToProps)( TopologyListComponent, -) +)) export default TopologyListContainer diff --git a/frontend/src/containers/experiments/ExperimentListContainer.js b/frontend/src/containers/experiments/ExperimentListContainer.js deleted file mode 100644 index 0b3b70ca..00000000 --- a/frontend/src/containers/experiments/ExperimentListContainer.js +++ /dev/null @@ -1,28 +0,0 @@ -import { connect } from 'react-redux' -import ExperimentListComponent from '../../components/experiments/ExperimentListComponent' - -const mapStateToProps = state => { - if ( - state.currentProjectId === '-1' || - !('experimentIds' in state.objects.project[state.currentProjectId]) - ) { - return { - loading: true, - experimentIds: [], - } - } - - const experimentIds = - state.objects.project[state.currentProjectId].experimentIds - if (experimentIds) { - return { - experimentIds, - } - } -} - -const ExperimentListContainer = connect(mapStateToProps)( - ExperimentListComponent, -) - -export default ExperimentListContainer diff --git a/frontend/src/containers/experiments/ExperimentRowContainer.js b/frontend/src/containers/experiments/ExperimentRowContainer.js deleted file mode 100644 index 87d8af67..00000000 --- a/frontend/src/containers/experiments/ExperimentRowContainer.js +++ /dev/null @@ -1,30 +0,0 @@ -import { connect } from 'react-redux' -import { deleteExperiment } from '../../actions/experiments' -import ExperimentRowComponent from '../../components/experiments/ExperimentRowComponent' - -const mapStateToProps = (state, ownProps) => { - const experiment = Object.assign( - {}, - state.objects.experiment[ownProps.experimentId], - ) - experiment.trace = state.objects.trace[experiment.traceId] - experiment.scheduler = state.objects.scheduler[experiment.schedulerName] - experiment.topology = state.objects.topology[experiment.topologyId] - - return { - experiment, - projectId: state.currentProjectId, - } -} - -const mapDispatchToProps = dispatch => { - return { - onDelete: id => dispatch(deleteExperiment(id)), - } -} - -const ExperimentRowContainer = connect(mapStateToProps, mapDispatchToProps)( - ExperimentRowComponent, -) - -export default ExperimentRowContainer diff --git a/frontend/src/containers/experiments/NewExperimentButtonContainer.js b/frontend/src/containers/experiments/NewExperimentButtonContainer.js deleted file mode 100644 index 41895d8a..00000000 --- a/frontend/src/containers/experiments/NewExperimentButtonContainer.js +++ /dev/null @@ -1,15 +0,0 @@ -import { connect } from 'react-redux' -import { openNewExperimentModal } from '../../actions/modals/experiments' -import NewExperimentButtonComponent from '../../components/experiments/NewExperimentButtonComponent' - -const mapDispatchToProps = dispatch => { - return { - onClick: () => dispatch(openNewExperimentModal()), - } -} - -const NewExperimentButtonContainer = connect(undefined, mapDispatchToProps)( - NewExperimentButtonComponent, -) - -export default NewExperimentButtonContainer diff --git a/frontend/src/containers/modals/NewExperimentModal.js b/frontend/src/containers/modals/NewExperimentModal.js deleted file mode 100644 index f07b53e6..00000000 --- a/frontend/src/containers/modals/NewExperimentModal.js +++ /dev/null @@ -1,39 +0,0 @@ -import { connect } from 'react-redux' -import { addExperiment } from '../../actions/experiments' -import { closeNewExperimentModal } from '../../actions/modals/experiments' -import NewExperimentModalComponent from '../../components/modals/custom-components/NewExperimentModalComponent' - -const mapStateToProps = state => { - return { - show: state.modals.newExperimentModalVisible, - topologies: state.objects.project[state.currentProjectId].topologyIds.map(t => ( - state.objects.topology[t] - )), - traces: Object.values(state.objects.trace), - schedulers: Object.values(state.objects.scheduler), - } -} - -const mapDispatchToProps = dispatch => { - return { - callback: (name, topologyId, traceId, schedulerName) => { - if (name) { - dispatch( - addExperiment({ - name, - topologyId, - traceId, - schedulerName, - }), - ) - } - dispatch(closeNewExperimentModal()) - }, - } -} - -const NewExperimentModal = connect(mapStateToProps, mapDispatchToProps)( - NewExperimentModalComponent, -) - -export default NewExperimentModal diff --git a/frontend/src/containers/modals/NewPortfolioModal.js b/frontend/src/containers/modals/NewPortfolioModal.js new file mode 100644 index 00000000..5c4644d5 --- /dev/null +++ b/frontend/src/containers/modals/NewPortfolioModal.js @@ -0,0 +1,32 @@ +import { connect } from 'react-redux' +import NewPortfolioModalComponent from '../../components/modals/custom-components/NewPortfolioModalComponent' +import { addPortfolio } from '../../actions/portfolios' +import { closeNewPortfolioModal } from '../../actions/modals/portfolios' + +const mapStateToProps = state => { + return { + show: state.modals.newPortfolioModalVisible, + } +} + +const mapDispatchToProps = dispatch => { + return { + callback: (name, targets) => { + if (name) { + dispatch( + addPortfolio({ + name, + targets + }), + ) + } + dispatch(closeNewPortfolioModal()) + }, + } +} + +const NewPortfolioModal = connect(mapStateToProps, mapDispatchToProps)( + NewPortfolioModalComponent, +) + +export default NewPortfolioModal diff --git a/frontend/src/containers/modals/NewScenarioModal.js b/frontend/src/containers/modals/NewScenarioModal.js new file mode 100644 index 00000000..0b273ed0 --- /dev/null +++ b/frontend/src/containers/modals/NewScenarioModal.js @@ -0,0 +1,46 @@ +import { connect } from 'react-redux' +import NewScenarioModalComponent from '../../components/modals/custom-components/NewScenarioModalComponent' +import { addScenario } from '../../actions/scenarios' +import { closeNewScenarioModal } from '../../actions/modals/scenarios' + +const mapStateToProps = state => { + let topologies = state.currentProjectId !== '-1' ? state.objects.project[state.currentProjectId].topologyIds.map(t => ( + state.objects.topology[t] + )) : [] + if (topologies.filter(t => !t).length > 0) { + topologies = [] + } + + return { + show: state.modals.newScenarioModalVisible, + currentPortfolioId: state.currentPortfolioId, + traces: Object.values(state.objects.trace), + topologies, + schedulers: Object.values(state.objects.scheduler), + } +} + +const mapDispatchToProps = dispatch => { + return { + callback: (name, portfolioId, trace, topology, operational) => { + if (name) { + dispatch( + addScenario({ + portfolioId, + name, + trace, + topology, + operational, + }), + ) + } + dispatch(closeNewScenarioModal()) + }, + } +} + +const NewScenarioModal = connect(mapStateToProps, mapDispatchToProps)( + NewScenarioModalComponent, +) + +export default NewScenarioModal |
