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-20 14:59:58 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2021-07-22 14:08:57 +0200
commit28a4259c43e6180723b15a8c36a9b36871420f8a (patch)
treeaa64139dc1134e69626df3ce8c783a329fb9e2bd /opendc-web/opendc-web-ui/src/components/topologies/RoomTable.js
parentebab0cc12e293a57cbc58d2dd51b3c9d7cd4ee92 (diff)
feat(ui): Add table view for topology rooms
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.js70
1 files changed, 70 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..8a5c401f
--- /dev/null
+++ b/opendc-web/opendc-web-ui/src/components/topologies/RoomTable.js
@@ -0,0 +1,70 @@
+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 { goToRoom } from '../../redux/actions/interaction-level'
+import { deleteRoom } from '../../redux/actions/topology/room'
+import TableEmptyState from '../util/TableEmptyState'
+
+function RoomTable({ topologyId }) {
+ const dispatch = useDispatch()
+ const { status, data: topology } = useTopology(topologyId)
+
+ const onClick = (room) => dispatch(goToRoom(room._id))
+ 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={() => onClick(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,
+}
+
+export default RoomTable