summaryrefslogtreecommitdiff
path: root/src/containers/app/map
diff options
context:
space:
mode:
Diffstat (limited to 'src/containers/app/map')
-rw-r--r--src/containers/app/map/DatacenterContainer.js19
-rw-r--r--src/containers/app/map/GrayContainer.js16
-rw-r--r--src/containers/app/map/MapStage.js26
-rw-r--r--src/containers/app/map/RackContainer.js26
-rw-r--r--src/containers/app/map/RackEnergyFillContainer.js28
-rw-r--r--src/containers/app/map/RackSpaceFillContainer.js16
-rw-r--r--src/containers/app/map/RoomContainer.js24
-rw-r--r--src/containers/app/map/TileContainer.js40
-rw-r--r--src/containers/app/map/WallContainer.js14
-rw-r--r--src/containers/app/map/controls/ScaleIndicatorContainer.js14
-rw-r--r--src/containers/app/map/controls/ZoomControlContainer.js22
-rw-r--r--src/containers/app/map/layers/MapLayer.js15
-rw-r--r--src/containers/app/map/layers/ObjectHoverLayer.js37
-rw-r--r--src/containers/app/map/layers/RoomHoverLayer.js50
14 files changed, 347 insertions, 0 deletions
diff --git a/src/containers/app/map/DatacenterContainer.js b/src/containers/app/map/DatacenterContainer.js
new file mode 100644
index 00000000..6859f2d8
--- /dev/null
+++ b/src/containers/app/map/DatacenterContainer.js
@@ -0,0 +1,19 @@
+import {connect} from "react-redux";
+import DatacenterGroup from "../../../components/app/map/groups/DatacenterGroup";
+
+const mapStateToProps = state => {
+ if (state.currentDatacenterId === -1) {
+ return {};
+ }
+
+ return {
+ datacenter: state.objects.datacenter[state.currentDatacenterId],
+ interactionLevel: state.interactionLevel,
+ };
+};
+
+const DatacenterContainer = connect(
+ mapStateToProps
+)(DatacenterGroup);
+
+export default DatacenterContainer;
diff --git a/src/containers/app/map/GrayContainer.js b/src/containers/app/map/GrayContainer.js
new file mode 100644
index 00000000..a22ef3c8
--- /dev/null
+++ b/src/containers/app/map/GrayContainer.js
@@ -0,0 +1,16 @@
+import {connect} from "react-redux";
+import {goDownOneInteractionLevel} from "../../../actions/interaction-level";
+import GrayLayer from "../../../components/app/map/elements/GrayLayer";
+
+const mapDispatchToProps = dispatch => {
+ return {
+ onClick: () => dispatch(goDownOneInteractionLevel())
+ };
+};
+
+const GrayContainer = connect(
+ undefined,
+ mapDispatchToProps
+)(GrayLayer);
+
+export default GrayContainer;
diff --git a/src/containers/app/map/MapStage.js b/src/containers/app/map/MapStage.js
new file mode 100644
index 00000000..e0c85651
--- /dev/null
+++ b/src/containers/app/map/MapStage.js
@@ -0,0 +1,26 @@
+import {connect} from "react-redux";
+import {setMapDimensions, setMapPosition, setMapScale} from "../../../actions/map";
+import MapStageComponent from "../../../components/app/map/MapStageComponent";
+
+const mapStateToProps = state => {
+ return {
+ mapPosition: state.map.position,
+ mapDimensions: state.map.dimensions,
+ mapScale: state.map.scale,
+ };
+};
+
+const mapDispatchToProps = dispatch => {
+ return {
+ setMapPosition: (x, y) => dispatch(setMapPosition(x, y)),
+ setMapDimensions: (width, height) => dispatch(setMapDimensions(width, height)),
+ setMapScale: (scale) => dispatch(setMapScale(scale)),
+ };
+};
+
+const MapStage = connect(
+ mapStateToProps,
+ mapDispatchToProps
+)(MapStageComponent);
+
+export default MapStage;
diff --git a/src/containers/app/map/RackContainer.js b/src/containers/app/map/RackContainer.js
new file mode 100644
index 00000000..38f01efc
--- /dev/null
+++ b/src/containers/app/map/RackContainer.js
@@ -0,0 +1,26 @@
+import {connect} from "react-redux";
+import RackGroup from "../../../components/app/map/groups/RackGroup";
+import {getStateLoad} from "../../../util/simulation-load";
+
+const mapStateToProps = (state, ownProps) => {
+ const inSimulation = state.currentExperimentId !== -1;
+
+ let rackLoad = undefined;
+ if (inSimulation) {
+ if (state.states.rack[state.currentTick] && state.states.rack[state.currentTick][ownProps.tile.objectId]) {
+ rackLoad = getStateLoad(state.loadMetric, state.states.rack[state.currentTick][ownProps.tile.objectId]);
+ }
+ }
+
+ return {
+ interactionLevel: state.interactionLevel,
+ inSimulation,
+ rackLoad,
+ };
+};
+
+const RackContainer = connect(
+ mapStateToProps
+)(RackGroup);
+
+export default RackContainer;
diff --git a/src/containers/app/map/RackEnergyFillContainer.js b/src/containers/app/map/RackEnergyFillContainer.js
new file mode 100644
index 00000000..d83dc386
--- /dev/null
+++ b/src/containers/app/map/RackEnergyFillContainer.js
@@ -0,0 +1,28 @@
+import {connect} from "react-redux";
+import RackFillBar from "../../../components/app/map/elements/RackFillBar";
+
+const mapStateToProps = (state, ownProps) => {
+ let energyConsumptionTotal = 0;
+ const rack = state.objects.rack[state.objects.tile[ownProps.tileId].objectId];
+ const machineIds = rack.machineIds;
+ machineIds.forEach(machineId => {
+ if (machineId !== null) {
+ const machine = state.objects.machine[machineId];
+ machine.cpuIds.forEach(id => energyConsumptionTotal += state.objects.cpu[id].energyConsumptionW);
+ machine.gpuIds.forEach(id => energyConsumptionTotal += state.objects.gpu[id].energyConsumptionW);
+ machine.memoryIds.forEach(id => energyConsumptionTotal += state.objects.memory[id].energyConsumptionW);
+ machine.storageIds.forEach(id => energyConsumptionTotal += state.objects.storage[id].energyConsumptionW);
+ }
+ });
+
+ return {
+ type: "energy",
+ fillFraction: Math.min(1, energyConsumptionTotal / rack.powerCapacityW),
+ };
+};
+
+const RackSpaceFillContainer = connect(
+ mapStateToProps
+)(RackFillBar);
+
+export default RackSpaceFillContainer;
diff --git a/src/containers/app/map/RackSpaceFillContainer.js b/src/containers/app/map/RackSpaceFillContainer.js
new file mode 100644
index 00000000..bbcf4e2e
--- /dev/null
+++ b/src/containers/app/map/RackSpaceFillContainer.js
@@ -0,0 +1,16 @@
+import {connect} from "react-redux";
+import RackFillBar from "../../../components/app/map/elements/RackFillBar";
+
+const mapStateToProps = (state, ownProps) => {
+ const machineIds = state.objects.rack[state.objects.tile[ownProps.tileId].objectId].machineIds;
+ return {
+ type: "space",
+ fillFraction: machineIds.filter(id => id !== null).length / machineIds.length,
+ };
+};
+
+const RackSpaceFillContainer = connect(
+ mapStateToProps
+)(RackFillBar);
+
+export default RackSpaceFillContainer;
diff --git a/src/containers/app/map/RoomContainer.js b/src/containers/app/map/RoomContainer.js
new file mode 100644
index 00000000..c8e146d6
--- /dev/null
+++ b/src/containers/app/map/RoomContainer.js
@@ -0,0 +1,24 @@
+import {connect} from "react-redux";
+import {goFromBuildingToRoom} from "../../../actions/interaction-level";
+import RoomGroup from "../../../components/app/map/groups/RoomGroup";
+
+const mapStateToProps = (state, ownProps) => {
+ return {
+ interactionLevel: state.interactionLevel,
+ currentRoomInConstruction: state.construction.currentRoomInConstruction,
+ room: state.objects.room[ownProps.roomId],
+ };
+};
+
+const mapDispatchToProps = (dispatch, ownProps) => {
+ return {
+ onClick: () => dispatch(goFromBuildingToRoom(ownProps.roomId)),
+ };
+};
+
+const RoomContainer = connect(
+ mapStateToProps,
+ mapDispatchToProps
+)(RoomGroup);
+
+export default RoomContainer;
diff --git a/src/containers/app/map/TileContainer.js b/src/containers/app/map/TileContainer.js
new file mode 100644
index 00000000..299016d1
--- /dev/null
+++ b/src/containers/app/map/TileContainer.js
@@ -0,0 +1,40 @@
+import {connect} from "react-redux";
+import {goFromRoomToRack} from "../../../actions/interaction-level";
+import TileGroup from "../../../components/app/map/groups/TileGroup";
+import {getStateLoad} from "../../../util/simulation-load";
+
+const mapStateToProps = (state, ownProps) => {
+ const tile = state.objects.tile[ownProps.tileId];
+ const inSimulation = state.currentExperimentId !== -1;
+
+ let roomLoad = undefined;
+ if (inSimulation) {
+ if (state.states.room[state.currentTick] && state.states.room[state.currentTick][tile.roomId]) {
+ roomLoad = getStateLoad(state.loadMetric, state.states.room[state.currentTick][tile.roomId]);
+ }
+ }
+
+ return {
+ interactionLevel: state.interactionLevel,
+ tile,
+ inSimulation,
+ roomLoad,
+ };
+};
+
+const mapDispatchToProps = dispatch => {
+ return {
+ onClick: tile => {
+ if (tile.objectType) {
+ dispatch(goFromRoomToRack(tile.id))
+ }
+ }
+ };
+};
+
+const TileContainer = connect(
+ mapStateToProps,
+ mapDispatchToProps
+)(TileGroup);
+
+export default TileContainer;
diff --git a/src/containers/app/map/WallContainer.js b/src/containers/app/map/WallContainer.js
new file mode 100644
index 00000000..0ce8875a
--- /dev/null
+++ b/src/containers/app/map/WallContainer.js
@@ -0,0 +1,14 @@
+import {connect} from "react-redux";
+import WallGroup from "../../../components/app/map/groups/WallGroup";
+
+const mapStateToProps = (state, ownProps) => {
+ return {
+ tiles: state.objects.room[ownProps.roomId].tileIds.map(tileId => state.objects.tile[tileId]),
+ };
+};
+
+const WallContainer = connect(
+ mapStateToProps
+)(WallGroup);
+
+export default WallContainer;
diff --git a/src/containers/app/map/controls/ScaleIndicatorContainer.js b/src/containers/app/map/controls/ScaleIndicatorContainer.js
new file mode 100644
index 00000000..12596c9c
--- /dev/null
+++ b/src/containers/app/map/controls/ScaleIndicatorContainer.js
@@ -0,0 +1,14 @@
+import {connect} from "react-redux";
+import ScaleIndicatorComponent from "../../../../components/app/map/controls/ScaleIndicatorComponent";
+
+const mapStateToProps = state => {
+ return {
+ scale: state.map.scale,
+ };
+};
+
+const ScaleIndicatorContainer = connect(
+ mapStateToProps
+)(ScaleIndicatorComponent);
+
+export default ScaleIndicatorContainer;
diff --git a/src/containers/app/map/controls/ZoomControlContainer.js b/src/containers/app/map/controls/ZoomControlContainer.js
new file mode 100644
index 00000000..b9cf0a63
--- /dev/null
+++ b/src/containers/app/map/controls/ZoomControlContainer.js
@@ -0,0 +1,22 @@
+import {connect} from "react-redux";
+import {setMapScale} from "../../../../actions/map";
+import ZoomControlComponent from "../../../../components/app/map/controls/ZoomControlComponent";
+
+const mapStateToProps = state => {
+ return {
+ mapScale: state.map.scale,
+ };
+};
+
+const mapDispatchToProps = dispatch => {
+ return {
+ setMapScale: scale => dispatch(setMapScale(scale)),
+ };
+};
+
+const ZoomControlContainer = connect(
+ mapStateToProps,
+ mapDispatchToProps
+)(ZoomControlComponent);
+
+export default ZoomControlContainer;
diff --git a/src/containers/app/map/layers/MapLayer.js b/src/containers/app/map/layers/MapLayer.js
new file mode 100644
index 00000000..ea3a0b57
--- /dev/null
+++ b/src/containers/app/map/layers/MapLayer.js
@@ -0,0 +1,15 @@
+import {connect} from "react-redux";
+import MapLayerComponent from "../../../../components/app/map/layers/MapLayerComponent";
+
+const mapStateToProps = state => {
+ return {
+ mapPosition: state.map.position,
+ mapScale: state.map.scale,
+ };
+};
+
+const MapLayer = connect(
+ mapStateToProps
+)(MapLayerComponent);
+
+export default MapLayer;
diff --git a/src/containers/app/map/layers/ObjectHoverLayer.js b/src/containers/app/map/layers/ObjectHoverLayer.js
new file mode 100644
index 00000000..d905fd42
--- /dev/null
+++ b/src/containers/app/map/layers/ObjectHoverLayer.js
@@ -0,0 +1,37 @@
+import {connect} from "react-redux";
+import {addRackToTile} from "../../../../actions/topology/room";
+import ObjectHoverLayerComponent from "../../../../components/app/map/layers/ObjectHoverLayerComponent";
+import {findTileWithPosition} from "../../../../util/tile-calculations";
+
+const mapStateToProps = state => {
+ return {
+ mapPosition: state.map.position,
+ mapScale: state.map.scale,
+ isEnabled: () => state.construction.inRackConstructionMode,
+ isValid: (x, y) => {
+ if (state.interactionLevel.mode !== "ROOM") {
+ return false;
+ }
+
+ const currentRoom = state.objects.room[state.interactionLevel.roomId];
+ const tiles = currentRoom.tileIds.map(tileId => state.objects.tile[tileId]);
+ const tile = findTileWithPosition(tiles, x, y);
+
+ return !(tile === null || tile.objectType);
+
+ },
+ };
+};
+
+const mapDispatchToProps = dispatch => {
+ return {
+ onClick: (x, y) => dispatch(addRackToTile(x, y)),
+ };
+};
+
+const ObjectHoverLayer = connect(
+ mapStateToProps,
+ mapDispatchToProps
+)(ObjectHoverLayerComponent);
+
+export default ObjectHoverLayer;
diff --git a/src/containers/app/map/layers/RoomHoverLayer.js b/src/containers/app/map/layers/RoomHoverLayer.js
new file mode 100644
index 00000000..801ce549
--- /dev/null
+++ b/src/containers/app/map/layers/RoomHoverLayer.js
@@ -0,0 +1,50 @@
+import {connect} from "react-redux";
+import {toggleTileAtLocation} from "../../../../actions/topology/building";
+import RoomHoverLayerComponent from "../../../../components/app/map/layers/RoomHoverLayerComponent";
+import {
+ deriveValidNextTilePositions,
+ findPositionInPositions,
+ findPositionInRooms
+} from "../../../../util/tile-calculations";
+
+const mapStateToProps = state => {
+ return {
+ mapPosition: state.map.position,
+ mapScale: state.map.scale,
+ isEnabled: () => state.construction.currentRoomInConstruction !== -1,
+ isValid: (x, y) => {
+ if (state.interactionLevel.mode !== "BUILDING") {
+ return false;
+ }
+
+ const newRoom = Object.assign({}, state.objects.room[state.construction.currentRoomInConstruction]);
+ const oldRooms = Object.keys(state.objects.room)
+ .map(id => Object.assign({}, state.objects.room[id]))
+ .filter(room => room.datacenterId === state.currentDatacenterId
+ && room.id !== state.construction.currentRoomInConstruction);
+
+ [...oldRooms, newRoom].forEach(room => {
+ room.tiles = room.tileIds.map(tileId => state.objects.tile[tileId]);
+ });
+ if (newRoom.tileIds.length === 0) {
+ return findPositionInRooms(oldRooms, x, y) === -1;
+ }
+
+ const validNextPositions = deriveValidNextTilePositions(oldRooms, newRoom.tiles);
+ return findPositionInPositions(validNextPositions, x, y) !== -1;
+ },
+ };
+};
+
+const mapDispatchToProps = dispatch => {
+ return {
+ onClick: (x, y) => dispatch(toggleTileAtLocation(x, y)),
+ };
+};
+
+const RoomHoverLayer = connect(
+ mapStateToProps,
+ mapDispatchToProps
+)(RoomHoverLayerComponent);
+
+export default RoomHoverLayer;