summaryrefslogtreecommitdiff
path: root/frontend/src/containers/app/map
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/map
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/map')
-rw-r--r--frontend/src/containers/app/map/DatacenterContainer.js17
-rw-r--r--frontend/src/containers/app/map/GrayContainer.js13
-rw-r--r--frontend/src/containers/app/map/MapStage.js31
-rw-r--r--frontend/src/containers/app/map/RackContainer.js30
-rw-r--r--frontend/src/containers/app/map/RackEnergyFillContainer.js40
-rw-r--r--frontend/src/containers/app/map/RackSpaceFillContainer.js16
-rw-r--r--frontend/src/containers/app/map/RoomContainer.js21
-rw-r--r--frontend/src/containers/app/map/TileContainer.js43
-rw-r--r--frontend/src/containers/app/map/WallContainer.js14
-rw-r--r--frontend/src/containers/app/map/controls/ScaleIndicatorContainer.js14
-rw-r--r--frontend/src/containers/app/map/controls/ZoomControlContainer.js21
-rw-r--r--frontend/src/containers/app/map/layers/MapLayer.js13
-rw-r--r--frontend/src/containers/app/map/layers/ObjectHoverLayer.js37
-rw-r--r--frontend/src/containers/app/map/layers/RoomHoverLayer.js55
14 files changed, 365 insertions, 0 deletions
diff --git a/frontend/src/containers/app/map/DatacenterContainer.js b/frontend/src/containers/app/map/DatacenterContainer.js
new file mode 100644
index 00000000..125739f3
--- /dev/null
+++ b/frontend/src/containers/app/map/DatacenterContainer.js
@@ -0,0 +1,17 @@
+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/frontend/src/containers/app/map/GrayContainer.js b/frontend/src/containers/app/map/GrayContainer.js
new file mode 100644
index 00000000..d215bf6c
--- /dev/null
+++ b/frontend/src/containers/app/map/GrayContainer.js
@@ -0,0 +1,13 @@
+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/frontend/src/containers/app/map/MapStage.js b/frontend/src/containers/app/map/MapStage.js
new file mode 100644
index 00000000..a8467171
--- /dev/null
+++ b/frontend/src/containers/app/map/MapStage.js
@@ -0,0 +1,31 @@
+import { connect } from "react-redux";
+import {
+ setMapDimensions,
+ setMapPositionWithBoundsCheck,
+ zoomInOnPosition
+} from "../../../actions/map";
+import MapStageComponent from "../../../components/app/map/MapStageComponent";
+
+const mapStateToProps = state => {
+ return {
+ mapPosition: state.map.position,
+ mapDimensions: state.map.dimensions
+ };
+};
+
+const mapDispatchToProps = dispatch => {
+ return {
+ zoomInOnPosition: (zoomIn, x, y) =>
+ dispatch(zoomInOnPosition(zoomIn, x, y)),
+ setMapPositionWithBoundsCheck: (x, y) =>
+ dispatch(setMapPositionWithBoundsCheck(x, y)),
+ setMapDimensions: (width, height) =>
+ dispatch(setMapDimensions(width, height))
+ };
+};
+
+const MapStage = connect(mapStateToProps, mapDispatchToProps)(
+ MapStageComponent
+);
+
+export default MapStage;
diff --git a/frontend/src/containers/app/map/RackContainer.js b/frontend/src/containers/app/map/RackContainer.js
new file mode 100644
index 00000000..365bb062
--- /dev/null
+++ b/frontend/src/containers/app/map/RackContainer.js
@@ -0,0 +1,30 @@
+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/frontend/src/containers/app/map/RackEnergyFillContainer.js b/frontend/src/containers/app/map/RackEnergyFillContainer.js
new file mode 100644
index 00000000..0b7921d9
--- /dev/null
+++ b/frontend/src/containers/app/map/RackEnergyFillContainer.js
@@ -0,0 +1,40 @@
+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/frontend/src/containers/app/map/RackSpaceFillContainer.js b/frontend/src/containers/app/map/RackSpaceFillContainer.js
new file mode 100644
index 00000000..cc4d1251
--- /dev/null
+++ b/frontend/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/frontend/src/containers/app/map/RoomContainer.js b/frontend/src/containers/app/map/RoomContainer.js
new file mode 100644
index 00000000..b83c7fa0
--- /dev/null
+++ b/frontend/src/containers/app/map/RoomContainer.js
@@ -0,0 +1,21 @@
+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/frontend/src/containers/app/map/TileContainer.js b/frontend/src/containers/app/map/TileContainer.js
new file mode 100644
index 00000000..9e179924
--- /dev/null
+++ b/frontend/src/containers/app/map/TileContainer.js
@@ -0,0 +1,43 @@
+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/frontend/src/containers/app/map/WallContainer.js b/frontend/src/containers/app/map/WallContainer.js
new file mode 100644
index 00000000..38192b05
--- /dev/null
+++ b/frontend/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/frontend/src/containers/app/map/controls/ScaleIndicatorContainer.js b/frontend/src/containers/app/map/controls/ScaleIndicatorContainer.js
new file mode 100644
index 00000000..f075cde5
--- /dev/null
+++ b/frontend/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/frontend/src/containers/app/map/controls/ZoomControlContainer.js b/frontend/src/containers/app/map/controls/ZoomControlContainer.js
new file mode 100644
index 00000000..50910bd6
--- /dev/null
+++ b/frontend/src/containers/app/map/controls/ZoomControlContainer.js
@@ -0,0 +1,21 @@
+import { connect } from "react-redux";
+import { zoomInOnCenter } from "../../../../actions/map";
+import ZoomControlComponent from "../../../../components/app/map/controls/ZoomControlComponent";
+
+const mapStateToProps = state => {
+ return {
+ mapScale: state.map.scale
+ };
+};
+
+const mapDispatchToProps = dispatch => {
+ return {
+ zoomInOnCenter: zoomIn => dispatch(zoomInOnCenter(zoomIn))
+ };
+};
+
+const ZoomControlContainer = connect(mapStateToProps, mapDispatchToProps)(
+ ZoomControlComponent
+);
+
+export default ZoomControlContainer;
diff --git a/frontend/src/containers/app/map/layers/MapLayer.js b/frontend/src/containers/app/map/layers/MapLayer.js
new file mode 100644
index 00000000..cf971350
--- /dev/null
+++ b/frontend/src/containers/app/map/layers/MapLayer.js
@@ -0,0 +1,13 @@
+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/frontend/src/containers/app/map/layers/ObjectHoverLayer.js b/frontend/src/containers/app/map/layers/ObjectHoverLayer.js
new file mode 100644
index 00000000..9b28575e
--- /dev/null
+++ b/frontend/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/frontend/src/containers/app/map/layers/RoomHoverLayer.js b/frontend/src/containers/app/map/layers/RoomHoverLayer.js
new file mode 100644
index 00000000..020102bf
--- /dev/null
+++ b/frontend/src/containers/app/map/layers/RoomHoverLayer.js
@@ -0,0 +1,55 @@
+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) => {
+ 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 =>
+ state.objects.datacenter[state.currentDatacenterId].roomIds.indexOf(
+ room.id
+ ) !== -1 && 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;