summaryrefslogtreecommitdiff
path: root/opendc-web/opendc-web-ui/src/components/topologies/RoomTable.js
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2021-07-22 14:57:21 +0200
committerGitHub <noreply@github.com>2021-07-22 14:57:21 +0200
commitb0c5681b28d1c3c87b7d24d8b8d166f5566e7699 (patch)
tree4f7269996928ea480499e3cbe912b15ba994e43f /opendc-web/opendc-web-ui/src/components/topologies/RoomTable.js
parent51c759e74b088d405b63fdb3e374822308d21366 (diff)
parent7f083b47c2e2333819823fd7835332a0f486b626 (diff)
merge: Address technical debt in topology view v2 (#163)
This pull request aims to address some of the technical debt in the topology view of the OpenDC frontend (v2). * Perform Saga mutations through React Query * Add table view for topology view * Extract topology construction out of Sagas * Toggle to Floor Plan on room select
Diffstat (limited to 'opendc-web/opendc-web-ui/src/components/topologies/RoomTable.js')
-rw-r--r--opendc-web/opendc-web-ui/src/components/topologies/RoomTable.js69
1 files changed, 69 insertions, 0 deletions
diff --git a/opendc-web/opendc-web-ui/src/components/topologies/RoomTable.js b/opendc-web/opendc-web-ui/src/components/topologies/RoomTable.js
new file mode 100644
index 00000000..9bf369e9
--- /dev/null
+++ b/opendc-web/opendc-web-ui/src/components/topologies/RoomTable.js
@@ -0,0 +1,69 @@
+import { Button } from '@patternfly/react-core'
+import PropTypes from 'prop-types'
+import React from 'react'
+import { useDispatch } from 'react-redux'
+import { useTopology } from '../../data/topology'
+import { Table, TableBody, TableHeader } from '@patternfly/react-table'
+import { deleteRoom } from '../../redux/actions/topology/room'
+import TableEmptyState from '../util/TableEmptyState'
+
+function RoomTable({ topologyId, onSelect }) {
+ const dispatch = useDispatch()
+ const { status, data: topology } = useTopology(topologyId)
+
+ const onDelete = (room) => dispatch(deleteRoom(room._id))
+
+ const columns = ['Name', 'Tiles', 'Racks']
+ const rows =
+ topology?.rooms.length > 0
+ ? topology.rooms.map((room) => {
+ const tileCount = room.tiles.length
+ const rackCount = room.tiles.filter((tile) => tile.rack).length
+ return [
+ {
+ title: (
+ <Button variant="link" isInline onClick={() => onSelect(room)}>
+ {room.name}
+ </Button>
+ ),
+ },
+ tileCount === 1 ? '1 tile' : `${tileCount} tiles`,
+ rackCount === 1 ? '1 rack' : `${rackCount} racks`,
+ ]
+ })
+ : [
+ {
+ heightAuto: true,
+ cells: [
+ {
+ props: { colSpan: 3 },
+ title: <TableEmptyState status={status} loadingTitle="Loading Rooms" />,
+ },
+ ],
+ },
+ ]
+
+ const actions =
+ topology?.rooms.length > 0
+ ? [
+ {
+ title: 'Delete room',
+ onClick: (_, rowId) => onDelete(topology.rooms[rowId]),
+ },
+ ]
+ : []
+
+ return (
+ <Table aria-label="Room list" variant="compact" cells={columns} rows={rows} actions={actions}>
+ <TableHeader />
+ <TableBody />
+ </Table>
+ )
+}
+
+RoomTable.propTypes = {
+ topologyId: PropTypes.string,
+ onSelect: PropTypes.func,
+}
+
+export default RoomTable