summaryrefslogtreecommitdiff
path: root/frontend/src/containers/app/sidebars
diff options
context:
space:
mode:
authorGeorgios Andreadis <info@gandreadis.com>2020-06-29 15:47:09 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2020-08-24 16:08:41 +0200
commit90fae26aa4bd0e0eb3272ff6e6524060e9004fbb (patch)
treebf6943882f5fa5f3114c01fc571503c79ee1056d /frontend/src/containers/app/sidebars
parent7032a007d4431f5a0c4c5e2d3f3bd20462d49950 (diff)
Prepare frontend repository for monorepo
This change prepares the frontend Git repository for the monorepo residing at https://github.com/atlarge-research.com/opendc. To accomodate for this, we move all files into a frontend subdirectory.
Diffstat (limited to 'frontend/src/containers/app/sidebars')
-rw-r--r--frontend/src/containers/app/sidebars/elements/LoadBarContainer.js32
-rw-r--r--frontend/src/containers/app/sidebars/elements/LoadChartContainer.js31
-rw-r--r--frontend/src/containers/app/sidebars/simulation/ExperimentMetadataContainer.js38
-rw-r--r--frontend/src/containers/app/sidebars/simulation/LoadMetricContainer.js12
-rw-r--r--frontend/src/containers/app/sidebars/simulation/TaskContainer.js26
-rw-r--r--frontend/src/containers/app/sidebars/simulation/TraceContainer.js25
-rw-r--r--frontend/src/containers/app/sidebars/topology/TopologySidebar.js12
-rw-r--r--frontend/src/containers/app/sidebars/topology/building/BuildingSidebarContainer.js14
-rw-r--r--frontend/src/containers/app/sidebars/topology/building/NewRoomConstructionContainer.js27
-rw-r--r--frontend/src/containers/app/sidebars/topology/machine/BackToRackContainer.js15
-rw-r--r--frontend/src/containers/app/sidebars/topology/machine/DeleteMachineContainer.js15
-rw-r--r--frontend/src/containers/app/sidebars/topology/machine/MachineNameContainer.js12
-rw-r--r--frontend/src/containers/app/sidebars/topology/machine/MachineSidebarContainer.js18
-rw-r--r--frontend/src/containers/app/sidebars/topology/machine/UnitAddContainer.js21
-rw-r--r--frontend/src/containers/app/sidebars/topology/machine/UnitContainer.js22
-rw-r--r--frontend/src/containers/app/sidebars/topology/machine/UnitListContainer.js18
-rw-r--r--frontend/src/containers/app/sidebars/topology/machine/UnitTabsContainer.js12
-rw-r--r--frontend/src/containers/app/sidebars/topology/rack/BackToRoomContainer.js15
-rw-r--r--frontend/src/containers/app/sidebars/topology/rack/DeleteRackContainer.js15
-rw-r--r--frontend/src/containers/app/sidebars/topology/rack/EmptySlotContainer.js21
-rw-r--r--frontend/src/containers/app/sidebars/topology/rack/MachineContainer.js40
-rw-r--r--frontend/src/containers/app/sidebars/topology/rack/MachineListContainer.js15
-rw-r--r--frontend/src/containers/app/sidebars/topology/rack/RackNameContainer.js24
-rw-r--r--frontend/src/containers/app/sidebars/topology/rack/RackSidebarContainer.js13
-rw-r--r--frontend/src/containers/app/sidebars/topology/room/BackToBuildingContainer.js15
-rw-r--r--frontend/src/containers/app/sidebars/topology/room/DeleteRoomContainer.js15
-rw-r--r--frontend/src/containers/app/sidebars/topology/room/EditRoomContainer.js26
-rw-r--r--frontend/src/containers/app/sidebars/topology/room/RackConstructionContainer.js26
-rw-r--r--frontend/src/containers/app/sidebars/topology/room/RoomNameContainer.js21
-rw-r--r--frontend/src/containers/app/sidebars/topology/room/RoomSidebarContainer.js14
-rw-r--r--frontend/src/containers/app/sidebars/topology/room/RoomTypeContainer.js12
31 files changed, 622 insertions, 0 deletions
diff --git a/frontend/src/containers/app/sidebars/elements/LoadBarContainer.js b/frontend/src/containers/app/sidebars/elements/LoadBarContainer.js
new file mode 100644
index 00000000..2e637f9a
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/elements/LoadBarContainer.js
@@ -0,0 +1,32 @@
+import { connect } from "react-redux";
+import LoadBarComponent from "../../../../components/app/sidebars/elements/LoadBarComponent";
+import { getStateLoad } from "../../../../util/simulation-load";
+
+const mapStateToProps = (state, ownProps) => {
+ let percent = 0;
+ let enabled = false;
+
+ const objectStates = state.states[ownProps.objectType];
+ if (
+ objectStates[state.currentTick] &&
+ objectStates[state.currentTick][ownProps.objectId]
+ ) {
+ percent = Math.floor(
+ 100 *
+ getStateLoad(
+ state.loadMetric,
+ objectStates[state.currentTick][ownProps.objectId]
+ )
+ );
+ enabled = true;
+ }
+
+ return {
+ percent,
+ enabled
+ };
+};
+
+const LoadBarContainer = connect(mapStateToProps)(LoadBarComponent);
+
+export default LoadBarContainer;
diff --git a/frontend/src/containers/app/sidebars/elements/LoadChartContainer.js b/frontend/src/containers/app/sidebars/elements/LoadChartContainer.js
new file mode 100644
index 00000000..57bfec38
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/elements/LoadChartContainer.js
@@ -0,0 +1,31 @@
+import { connect } from "react-redux";
+import LoadChartComponent from "../../../../components/app/sidebars/elements/LoadChartComponent";
+import { getStateLoad } from "../../../../util/simulation-load";
+
+const mapStateToProps = (state, ownProps) => {
+ const data = [];
+
+ if (state.lastSimulatedTick !== -1) {
+ const objectStates = state.states[ownProps.objectType];
+ Object.keys(objectStates).forEach(tick => {
+ if (objectStates[tick][ownProps.objectId]) {
+ data.push({
+ x: tick,
+ y: getStateLoad(
+ state.loadMetric,
+ objectStates[tick][ownProps.objectId]
+ )
+ });
+ }
+ });
+ }
+
+ return {
+ data,
+ currentTick: state.currentTick
+ };
+};
+
+const LoadChartContainer = connect(mapStateToProps)(LoadChartComponent);
+
+export default LoadChartContainer;
diff --git a/frontend/src/containers/app/sidebars/simulation/ExperimentMetadataContainer.js b/frontend/src/containers/app/sidebars/simulation/ExperimentMetadataContainer.js
new file mode 100644
index 00000000..25a0d9e9
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/simulation/ExperimentMetadataContainer.js
@@ -0,0 +1,38 @@
+import { connect } from "react-redux";
+import ExperimentMetadataComponent from "../../../../components/app/sidebars/simulation/ExperimentMetadataComponent";
+
+const mapStateToProps = state => {
+ if (!state.objects.experiment[state.currentExperimentId]) {
+ return {
+ experimentName: "Loading experiment",
+ pathName: "",
+ traceName: "",
+ schedulerName: ""
+ };
+ }
+
+ const path =
+ state.objects.path[
+ state.objects.experiment[state.currentExperimentId].pathId
+ ];
+ const pathName = path.name ? path.name : "Path " + path.id;
+
+ return {
+ experimentName: state.objects.experiment[state.currentExperimentId].name,
+ pathName,
+ traceName:
+ state.objects.trace[
+ state.objects.experiment[state.currentExperimentId].traceId
+ ].name,
+ schedulerName:
+ state.objects.scheduler[
+ state.objects.experiment[state.currentExperimentId].schedulerName
+ ].name
+ };
+};
+
+const ExperimentMetadataContainer = connect(mapStateToProps)(
+ ExperimentMetadataComponent
+);
+
+export default ExperimentMetadataContainer;
diff --git a/frontend/src/containers/app/sidebars/simulation/LoadMetricContainer.js b/frontend/src/containers/app/sidebars/simulation/LoadMetricContainer.js
new file mode 100644
index 00000000..0c66b582
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/simulation/LoadMetricContainer.js
@@ -0,0 +1,12 @@
+import { connect } from "react-redux";
+import LoadMetricComponent from "../../../../components/app/sidebars/simulation/LoadMetricComponent";
+
+const mapStateToProps = state => {
+ return {
+ loadMetric: state.loadMetric
+ };
+};
+
+const LoadMetricContainer = connect(mapStateToProps)(LoadMetricComponent);
+
+export default LoadMetricContainer;
diff --git a/frontend/src/containers/app/sidebars/simulation/TaskContainer.js b/frontend/src/containers/app/sidebars/simulation/TaskContainer.js
new file mode 100644
index 00000000..093d4266
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/simulation/TaskContainer.js
@@ -0,0 +1,26 @@
+import { connect } from "react-redux";
+import TaskComponent from "../../../../components/app/sidebars/simulation/TaskComponent";
+
+const mapStateToProps = (state, ownProps) => {
+ let flopsLeft = state.objects.task[ownProps.taskId].totalFlopCount;
+
+ if (
+ state.states.task[state.currentTick] &&
+ state.states.task[state.currentTick][ownProps.taskId]
+ ) {
+ flopsLeft = state.states.task[state.currentTick][ownProps.taskId].flopsLeft;
+ } else if (
+ state.objects.task[ownProps.taskId].startTick < state.currentTick
+ ) {
+ flopsLeft = 0;
+ }
+
+ return {
+ task: state.objects.task[ownProps.taskId],
+ flopsLeft
+ };
+};
+
+const TaskContainer = connect(mapStateToProps)(TaskComponent);
+
+export default TaskContainer;
diff --git a/frontend/src/containers/app/sidebars/simulation/TraceContainer.js b/frontend/src/containers/app/sidebars/simulation/TraceContainer.js
new file mode 100644
index 00000000..682b6cc9
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/simulation/TraceContainer.js
@@ -0,0 +1,25 @@
+import { connect } from "react-redux";
+import TraceComponent from "../../../../components/app/sidebars/simulation/TraceComponent";
+
+const mapStateToProps = state => {
+ if (
+ !state.objects.experiment[state.currentExperimentId] ||
+ !state.objects.trace[
+ state.objects.experiment[state.currentExperimentId].traceId
+ ].jobIds
+ ) {
+ return {
+ jobs: []
+ };
+ }
+
+ return {
+ jobs: state.objects.trace[
+ state.objects.experiment[state.currentExperimentId].traceId
+ ].jobIds.map(id => state.objects.job[id])
+ };
+};
+
+const TraceContainer = connect(mapStateToProps)(TraceComponent);
+
+export default TraceContainer;
diff --git a/frontend/src/containers/app/sidebars/topology/TopologySidebar.js b/frontend/src/containers/app/sidebars/topology/TopologySidebar.js
new file mode 100644
index 00000000..31c902fc
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/topology/TopologySidebar.js
@@ -0,0 +1,12 @@
+import { connect } from "react-redux";
+import TopologySidebarComponent from "../../../../components/app/sidebars/topology/TopologySidebarComponent";
+
+const mapStateToProps = state => {
+ return {
+ interactionLevel: state.interactionLevel
+ };
+};
+
+const TopologySidebar = connect(mapStateToProps)(TopologySidebarComponent);
+
+export default TopologySidebar;
diff --git a/frontend/src/containers/app/sidebars/topology/building/BuildingSidebarContainer.js b/frontend/src/containers/app/sidebars/topology/building/BuildingSidebarContainer.js
new file mode 100644
index 00000000..da24b8f0
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/topology/building/BuildingSidebarContainer.js
@@ -0,0 +1,14 @@
+import { connect } from "react-redux";
+import BuildingSidebarComponent from "../../../../../components/app/sidebars/topology/building/BuildingSidebarComponent";
+
+const mapStateToProps = state => {
+ return {
+ inSimulation: state.currentExperimentId !== -1
+ };
+};
+
+const BuildingSidebarContainer = connect(mapStateToProps)(
+ BuildingSidebarComponent
+);
+
+export default BuildingSidebarContainer;
diff --git a/frontend/src/containers/app/sidebars/topology/building/NewRoomConstructionContainer.js b/frontend/src/containers/app/sidebars/topology/building/NewRoomConstructionContainer.js
new file mode 100644
index 00000000..bb64cbb4
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/topology/building/NewRoomConstructionContainer.js
@@ -0,0 +1,27 @@
+import { connect } from "react-redux";
+import {
+ cancelNewRoomConstruction,
+ finishNewRoomConstruction,
+ startNewRoomConstruction
+} from "../../../../../actions/topology/building";
+import StartNewRoomConstructionComponent from "../../../../../components/app/sidebars/topology/building/NewRoomConstructionComponent";
+
+const mapStateToProps = state => {
+ return {
+ currentRoomInConstruction: state.construction.currentRoomInConstruction
+ };
+};
+
+const mapDispatchToProps = dispatch => {
+ return {
+ onStart: () => dispatch(startNewRoomConstruction()),
+ onFinish: () => dispatch(finishNewRoomConstruction()),
+ onCancel: () => dispatch(cancelNewRoomConstruction())
+ };
+};
+
+const NewRoomConstructionButton = connect(mapStateToProps, mapDispatchToProps)(
+ StartNewRoomConstructionComponent
+);
+
+export default NewRoomConstructionButton;
diff --git a/frontend/src/containers/app/sidebars/topology/machine/BackToRackContainer.js b/frontend/src/containers/app/sidebars/topology/machine/BackToRackContainer.js
new file mode 100644
index 00000000..885c533d
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/topology/machine/BackToRackContainer.js
@@ -0,0 +1,15 @@
+import { connect } from "react-redux";
+import { goDownOneInteractionLevel } from "../../../../../actions/interaction-level";
+import BackToRackComponent from "../../../../../components/app/sidebars/topology/machine/BackToRackComponent";
+
+const mapDispatchToProps = dispatch => {
+ return {
+ onClick: () => dispatch(goDownOneInteractionLevel())
+ };
+};
+
+const BackToRackContainer = connect(undefined, mapDispatchToProps)(
+ BackToRackComponent
+);
+
+export default BackToRackContainer;
diff --git a/frontend/src/containers/app/sidebars/topology/machine/DeleteMachineContainer.js b/frontend/src/containers/app/sidebars/topology/machine/DeleteMachineContainer.js
new file mode 100644
index 00000000..f42c8ba7
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/topology/machine/DeleteMachineContainer.js
@@ -0,0 +1,15 @@
+import { connect } from "react-redux";
+import { openDeleteMachineModal } from "../../../../../actions/modals/topology";
+import DeleteMachineComponent from "../../../../../components/app/sidebars/topology/machine/DeleteMachineComponent";
+
+const mapDispatchToProps = dispatch => {
+ return {
+ onClick: () => dispatch(openDeleteMachineModal())
+ };
+};
+
+const DeleteMachineContainer = connect(undefined, mapDispatchToProps)(
+ DeleteMachineComponent
+);
+
+export default DeleteMachineContainer;
diff --git a/frontend/src/containers/app/sidebars/topology/machine/MachineNameContainer.js b/frontend/src/containers/app/sidebars/topology/machine/MachineNameContainer.js
new file mode 100644
index 00000000..05d2bf80
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/topology/machine/MachineNameContainer.js
@@ -0,0 +1,12 @@
+import { connect } from "react-redux";
+import MachineNameComponent from "../../../../../components/app/sidebars/topology/machine/MachineNameComponent";
+
+const mapStateToProps = state => {
+ return {
+ position: state.interactionLevel.position
+ };
+};
+
+const MachineNameContainer = connect(mapStateToProps)(MachineNameComponent);
+
+export default MachineNameContainer;
diff --git a/frontend/src/containers/app/sidebars/topology/machine/MachineSidebarContainer.js b/frontend/src/containers/app/sidebars/topology/machine/MachineSidebarContainer.js
new file mode 100644
index 00000000..7729385e
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/topology/machine/MachineSidebarContainer.js
@@ -0,0 +1,18 @@
+import { connect } from "react-redux";
+import MachineSidebarComponent from "../../../../../components/app/sidebars/topology/machine/MachineSidebarComponent";
+
+const mapStateToProps = state => {
+ return {
+ inSimulation: state.currentExperimentId !== -1,
+ machineId:
+ state.objects.rack[
+ state.objects.tile[state.interactionLevel.tileId].objectId
+ ].machineIds[state.interactionLevel.position - 1]
+ };
+};
+
+const MachineSidebarContainer = connect(mapStateToProps)(
+ MachineSidebarComponent
+);
+
+export default MachineSidebarContainer;
diff --git a/frontend/src/containers/app/sidebars/topology/machine/UnitAddContainer.js b/frontend/src/containers/app/sidebars/topology/machine/UnitAddContainer.js
new file mode 100644
index 00000000..0e5a6073
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/topology/machine/UnitAddContainer.js
@@ -0,0 +1,21 @@
+import { connect } from "react-redux";
+import { addUnit } from "../../../../../actions/topology/machine";
+import UnitAddComponent from "../../../../../components/app/sidebars/topology/machine/UnitAddComponent";
+
+const mapStateToProps = (state, ownProps) => {
+ return {
+ units: Object.values(state.objects[ownProps.unitType])
+ };
+};
+
+const mapDispatchToProps = (dispatch, ownProps) => {
+ return {
+ onAdd: id => dispatch(addUnit(ownProps.unitType, id))
+ };
+};
+
+const UnitAddContainer = connect(mapStateToProps, mapDispatchToProps)(
+ UnitAddComponent
+);
+
+export default UnitAddContainer;
diff --git a/frontend/src/containers/app/sidebars/topology/machine/UnitContainer.js b/frontend/src/containers/app/sidebars/topology/machine/UnitContainer.js
new file mode 100644
index 00000000..a919e8d3
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/topology/machine/UnitContainer.js
@@ -0,0 +1,22 @@
+import { connect } from "react-redux";
+import { deleteUnit } from "../../../../../actions/topology/machine";
+import UnitComponent from "../../../../../components/app/sidebars/topology/machine/UnitComponent";
+
+const mapStateToProps = (state, ownProps) => {
+ return {
+ unit: state.objects[ownProps.unitType][ownProps.unitId],
+ inSimulation: state.currentExperimentId !== -1
+ };
+};
+
+const mapDispatchToProps = (dispatch, ownProps) => {
+ return {
+ onDelete: () => dispatch(deleteUnit(ownProps.unitType, ownProps.index))
+ };
+};
+
+const UnitContainer = connect(mapStateToProps, mapDispatchToProps)(
+ UnitComponent
+);
+
+export default UnitContainer;
diff --git a/frontend/src/containers/app/sidebars/topology/machine/UnitListContainer.js b/frontend/src/containers/app/sidebars/topology/machine/UnitListContainer.js
new file mode 100644
index 00000000..6554b8f8
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/topology/machine/UnitListContainer.js
@@ -0,0 +1,18 @@
+import { connect } from "react-redux";
+import UnitListComponent from "../../../../../components/app/sidebars/topology/machine/UnitListComponent";
+
+const mapStateToProps = (state, ownProps) => {
+ return {
+ unitIds:
+ state.objects.machine[
+ state.objects.rack[
+ state.objects.tile[state.interactionLevel.tileId].objectId
+ ].machineIds[state.interactionLevel.position - 1]
+ ][ownProps.unitType + "Ids"],
+ inSimulation: state.currentExperimentId !== -1
+ };
+};
+
+const UnitListContainer = connect(mapStateToProps)(UnitListComponent);
+
+export default UnitListContainer;
diff --git a/frontend/src/containers/app/sidebars/topology/machine/UnitTabsContainer.js b/frontend/src/containers/app/sidebars/topology/machine/UnitTabsContainer.js
new file mode 100644
index 00000000..85d83877
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/topology/machine/UnitTabsContainer.js
@@ -0,0 +1,12 @@
+import { connect } from "react-redux";
+import UnitTabsComponent from "../../../../../components/app/sidebars/topology/machine/UnitTabsComponent";
+
+const mapStateToProps = state => {
+ return {
+ inSimulation: state.currentExperimentId !== -1
+ };
+};
+
+const UnitTabsContainer = connect(mapStateToProps)(UnitTabsComponent);
+
+export default UnitTabsContainer;
diff --git a/frontend/src/containers/app/sidebars/topology/rack/BackToRoomContainer.js b/frontend/src/containers/app/sidebars/topology/rack/BackToRoomContainer.js
new file mode 100644
index 00000000..1b1bb2b0
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/topology/rack/BackToRoomContainer.js
@@ -0,0 +1,15 @@
+import { connect } from "react-redux";
+import { goDownOneInteractionLevel } from "../../../../../actions/interaction-level";
+import BackToRoomComponent from "../../../../../components/app/sidebars/topology/rack/BackToRoomComponent";
+
+const mapDispatchToProps = dispatch => {
+ return {
+ onClick: () => dispatch(goDownOneInteractionLevel())
+ };
+};
+
+const BackToRoomContainer = connect(undefined, mapDispatchToProps)(
+ BackToRoomComponent
+);
+
+export default BackToRoomContainer;
diff --git a/frontend/src/containers/app/sidebars/topology/rack/DeleteRackContainer.js b/frontend/src/containers/app/sidebars/topology/rack/DeleteRackContainer.js
new file mode 100644
index 00000000..a54ceb23
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/topology/rack/DeleteRackContainer.js
@@ -0,0 +1,15 @@
+import { connect } from "react-redux";
+import { openDeleteRackModal } from "../../../../../actions/modals/topology";
+import DeleteRackComponent from "../../../../../components/app/sidebars/topology/rack/DeleteRackComponent";
+
+const mapDispatchToProps = dispatch => {
+ return {
+ onClick: () => dispatch(openDeleteRackModal())
+ };
+};
+
+const DeleteRackContainer = connect(undefined, mapDispatchToProps)(
+ DeleteRackComponent
+);
+
+export default DeleteRackContainer;
diff --git a/frontend/src/containers/app/sidebars/topology/rack/EmptySlotContainer.js b/frontend/src/containers/app/sidebars/topology/rack/EmptySlotContainer.js
new file mode 100644
index 00000000..527805a2
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/topology/rack/EmptySlotContainer.js
@@ -0,0 +1,21 @@
+import { connect } from "react-redux";
+import { addMachine } from "../../../../../actions/topology/rack";
+import EmptySlotComponent from "../../../../../components/app/sidebars/topology/rack/EmptySlotComponent";
+
+const mapStateToProps = state => {
+ return {
+ inSimulation: state.currentExperimentId !== -1
+ };
+};
+
+const mapDispatchToProps = (dispatch, ownProps) => {
+ return {
+ onAdd: () => dispatch(addMachine(ownProps.position))
+ };
+};
+
+const EmptySlotContainer = connect(mapStateToProps, mapDispatchToProps)(
+ EmptySlotComponent
+);
+
+export default EmptySlotContainer;
diff --git a/frontend/src/containers/app/sidebars/topology/rack/MachineContainer.js b/frontend/src/containers/app/sidebars/topology/rack/MachineContainer.js
new file mode 100644
index 00000000..8cd177e7
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/topology/rack/MachineContainer.js
@@ -0,0 +1,40 @@
+import { connect } from "react-redux";
+import { goFromRackToMachine } from "../../../../../actions/interaction-level";
+import MachineComponent from "../../../../../components/app/sidebars/topology/rack/MachineComponent";
+import { getStateLoad } from "../../../../../util/simulation-load";
+
+const mapStateToProps = (state, ownProps) => {
+ const machine = state.objects.machine[ownProps.machineId];
+ const inSimulation = state.currentExperimentId !== -1;
+
+ let machineLoad = undefined;
+ if (inSimulation) {
+ if (
+ state.states.machine[state.currentTick] &&
+ state.states.machine[state.currentTick][machine.id]
+ ) {
+ machineLoad = getStateLoad(
+ state.loadMetric,
+ state.states.machine[state.currentTick][machine.id]
+ );
+ }
+ }
+
+ return {
+ machine,
+ inSimulation,
+ machineLoad
+ };
+};
+
+const mapDispatchToProps = (dispatch, ownProps) => {
+ return {
+ onClick: () => dispatch(goFromRackToMachine(ownProps.position))
+ };
+};
+
+const MachineContainer = connect(mapStateToProps, mapDispatchToProps)(
+ MachineComponent
+);
+
+export default MachineContainer;
diff --git a/frontend/src/containers/app/sidebars/topology/rack/MachineListContainer.js b/frontend/src/containers/app/sidebars/topology/rack/MachineListContainer.js
new file mode 100644
index 00000000..b19a50ae
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/topology/rack/MachineListContainer.js
@@ -0,0 +1,15 @@
+import { connect } from "react-redux";
+import MachineListComponent from "../../../../../components/app/sidebars/topology/rack/MachineListComponent";
+
+const mapStateToProps = state => {
+ return {
+ machineIds:
+ state.objects.rack[
+ state.objects.tile[state.interactionLevel.tileId].objectId
+ ].machineIds
+ };
+};
+
+const MachineListContainer = connect(mapStateToProps)(MachineListComponent);
+
+export default MachineListContainer;
diff --git a/frontend/src/containers/app/sidebars/topology/rack/RackNameContainer.js b/frontend/src/containers/app/sidebars/topology/rack/RackNameContainer.js
new file mode 100644
index 00000000..8f364ca0
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/topology/rack/RackNameContainer.js
@@ -0,0 +1,24 @@
+import { connect } from "react-redux";
+import { openEditRackNameModal } from "../../../../../actions/modals/topology";
+import RackNameComponent from "../../../../../components/app/sidebars/topology/rack/RackNameComponent";
+
+const mapStateToProps = state => {
+ return {
+ rackName:
+ state.objects.rack[
+ state.objects.tile[state.interactionLevel.tileId].objectId
+ ].name
+ };
+};
+
+const mapDispatchToProps = dispatch => {
+ return {
+ onEdit: () => dispatch(openEditRackNameModal())
+ };
+};
+
+const RackNameContainer = connect(mapStateToProps, mapDispatchToProps)(
+ RackNameComponent
+);
+
+export default RackNameContainer;
diff --git a/frontend/src/containers/app/sidebars/topology/rack/RackSidebarContainer.js b/frontend/src/containers/app/sidebars/topology/rack/RackSidebarContainer.js
new file mode 100644
index 00000000..0a2bfdcc
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/topology/rack/RackSidebarContainer.js
@@ -0,0 +1,13 @@
+import { connect } from "react-redux";
+import RackSidebarComponent from "../../../../../components/app/sidebars/topology/rack/RackSidebarComponent";
+
+const mapStateToProps = state => {
+ return {
+ rackId: state.objects.tile[state.interactionLevel.tileId].objectId,
+ inSimulation: state.currentExperimentId !== -1
+ };
+};
+
+const RackSidebarContainer = connect(mapStateToProps)(RackSidebarComponent);
+
+export default RackSidebarContainer;
diff --git a/frontend/src/containers/app/sidebars/topology/room/BackToBuildingContainer.js b/frontend/src/containers/app/sidebars/topology/room/BackToBuildingContainer.js
new file mode 100644
index 00000000..02288b7b
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/topology/room/BackToBuildingContainer.js
@@ -0,0 +1,15 @@
+import { connect } from "react-redux";
+import { goDownOneInteractionLevel } from "../../../../../actions/interaction-level";
+import BackToBuildingComponent from "../../../../../components/app/sidebars/topology/room/BackToBuildingComponent";
+
+const mapDispatchToProps = dispatch => {
+ return {
+ onClick: () => dispatch(goDownOneInteractionLevel())
+ };
+};
+
+const BackToBuildingContainer = connect(undefined, mapDispatchToProps)(
+ BackToBuildingComponent
+);
+
+export default BackToBuildingContainer;
diff --git a/frontend/src/containers/app/sidebars/topology/room/DeleteRoomContainer.js b/frontend/src/containers/app/sidebars/topology/room/DeleteRoomContainer.js
new file mode 100644
index 00000000..5223061d
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/topology/room/DeleteRoomContainer.js
@@ -0,0 +1,15 @@
+import { connect } from "react-redux";
+import { openDeleteRoomModal } from "../../../../../actions/modals/topology";
+import DeleteRoomComponent from "../../../../../components/app/sidebars/topology/room/DeleteRoomComponent";
+
+const mapDispatchToProps = dispatch => {
+ return {
+ onClick: () => dispatch(openDeleteRoomModal())
+ };
+};
+
+const DeleteRoomContainer = connect(undefined, mapDispatchToProps)(
+ DeleteRoomComponent
+);
+
+export default DeleteRoomContainer;
diff --git a/frontend/src/containers/app/sidebars/topology/room/EditRoomContainer.js b/frontend/src/containers/app/sidebars/topology/room/EditRoomContainer.js
new file mode 100644
index 00000000..81052f54
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/topology/room/EditRoomContainer.js
@@ -0,0 +1,26 @@
+import { connect } from "react-redux";
+import {
+ finishRoomEdit,
+ startRoomEdit
+} from "../../../../../actions/topology/building";
+import EditRoomComponent from "../../../../../components/app/sidebars/topology/room/EditRoomComponent";
+
+const mapStateToProps = state => {
+ return {
+ isEditing: state.construction.currentRoomInConstruction !== -1,
+ isInRackConstructionMode: state.construction.inRackConstructionMode
+ };
+};
+
+const mapDispatchToProps = dispatch => {
+ return {
+ onEdit: () => dispatch(startRoomEdit()),
+ onFinish: () => dispatch(finishRoomEdit())
+ };
+};
+
+const EditRoomContainer = connect(mapStateToProps, mapDispatchToProps)(
+ EditRoomComponent
+);
+
+export default EditRoomContainer;
diff --git a/frontend/src/containers/app/sidebars/topology/room/RackConstructionContainer.js b/frontend/src/containers/app/sidebars/topology/room/RackConstructionContainer.js
new file mode 100644
index 00000000..c784d3ae
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/topology/room/RackConstructionContainer.js
@@ -0,0 +1,26 @@
+import { connect } from "react-redux";
+import {
+ startRackConstruction,
+ stopRackConstruction
+} from "../../../../../actions/topology/room";
+import RackConstructionComponent from "../../../../../components/app/sidebars/topology/room/RackConstructionComponent";
+
+const mapStateToProps = state => {
+ return {
+ inRackConstructionMode: state.construction.inRackConstructionMode,
+ isEditingRoom: state.construction.currentRoomInConstruction !== -1
+ };
+};
+
+const mapDispatchToProps = dispatch => {
+ return {
+ onStart: () => dispatch(startRackConstruction()),
+ onStop: () => dispatch(stopRackConstruction())
+ };
+};
+
+const RackConstructionContainer = connect(mapStateToProps, mapDispatchToProps)(
+ RackConstructionComponent
+);
+
+export default RackConstructionContainer;
diff --git a/frontend/src/containers/app/sidebars/topology/room/RoomNameContainer.js b/frontend/src/containers/app/sidebars/topology/room/RoomNameContainer.js
new file mode 100644
index 00000000..36125521
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/topology/room/RoomNameContainer.js
@@ -0,0 +1,21 @@
+import { connect } from "react-redux";
+import { openEditRoomNameModal } from "../../../../../actions/modals/topology";
+import RoomNameComponent from "../../../../../components/app/sidebars/topology/room/RoomNameComponent";
+
+const mapStateToProps = state => {
+ return {
+ roomName: state.objects.room[state.interactionLevel.roomId].name
+ };
+};
+
+const mapDispatchToProps = dispatch => {
+ return {
+ onEdit: () => dispatch(openEditRoomNameModal())
+ };
+};
+
+const RoomNameContainer = connect(mapStateToProps, mapDispatchToProps)(
+ RoomNameComponent
+);
+
+export default RoomNameContainer;
diff --git a/frontend/src/containers/app/sidebars/topology/room/RoomSidebarContainer.js b/frontend/src/containers/app/sidebars/topology/room/RoomSidebarContainer.js
new file mode 100644
index 00000000..38d5fb80
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/topology/room/RoomSidebarContainer.js
@@ -0,0 +1,14 @@
+import { connect } from "react-redux";
+import RoomSidebarComponent from "../../../../../components/app/sidebars/topology/room/RoomSidebarComponent";
+
+const mapStateToProps = state => {
+ return {
+ roomId: state.interactionLevel.roomId,
+ roomType: state.objects.room[state.interactionLevel.roomId].roomType,
+ inSimulation: state.currentExperimentId !== -1
+ };
+};
+
+const RoomSidebarContainer = connect(mapStateToProps)(RoomSidebarComponent);
+
+export default RoomSidebarContainer;
diff --git a/frontend/src/containers/app/sidebars/topology/room/RoomTypeContainer.js b/frontend/src/containers/app/sidebars/topology/room/RoomTypeContainer.js
new file mode 100644
index 00000000..414852f1
--- /dev/null
+++ b/frontend/src/containers/app/sidebars/topology/room/RoomTypeContainer.js
@@ -0,0 +1,12 @@
+import { connect } from "react-redux";
+import RoomTypeComponent from "../../../../../components/app/sidebars/topology/room/RoomTypeComponent";
+
+const mapStateToProps = state => {
+ return {
+ roomType: state.objects.room[state.interactionLevel.roomId].roomType
+ };
+};
+
+const RoomNameContainer = connect(mapStateToProps)(RoomTypeComponent);
+
+export default RoomNameContainer;