diff options
Diffstat (limited to 'src/containers/app/map')
| -rw-r--r-- | src/containers/app/map/DatacenterContainer.js | 19 | ||||
| -rw-r--r-- | src/containers/app/map/GrayContainer.js | 16 | ||||
| -rw-r--r-- | src/containers/app/map/MapStage.js | 26 | ||||
| -rw-r--r-- | src/containers/app/map/RackContainer.js | 26 | ||||
| -rw-r--r-- | src/containers/app/map/RackEnergyFillContainer.js | 28 | ||||
| -rw-r--r-- | src/containers/app/map/RackSpaceFillContainer.js | 16 | ||||
| -rw-r--r-- | src/containers/app/map/RoomContainer.js | 24 | ||||
| -rw-r--r-- | src/containers/app/map/TileContainer.js | 40 | ||||
| -rw-r--r-- | src/containers/app/map/WallContainer.js | 14 | ||||
| -rw-r--r-- | src/containers/app/map/controls/ScaleIndicatorContainer.js | 14 | ||||
| -rw-r--r-- | src/containers/app/map/controls/ZoomControlContainer.js | 22 | ||||
| -rw-r--r-- | src/containers/app/map/layers/MapLayer.js | 15 | ||||
| -rw-r--r-- | src/containers/app/map/layers/ObjectHoverLayer.js | 37 | ||||
| -rw-r--r-- | src/containers/app/map/layers/RoomHoverLayer.js | 50 |
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; |
