summaryrefslogtreecommitdiff
path: root/opendc-web/opendc-web-ui/src
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2021-05-17 12:16:10 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2021-05-18 15:46:43 +0200
commit53623fad76274e39206b8e073e371775ea96946b (patch)
treea57d23d9c1f6a924753dbb4a3a9bc9cbca5385dd /opendc-web/opendc-web-ui/src
parent688a25e560db3355e2a3ee369c2e6f4b55aab2a6 (diff)
ui: Migrate to FontAwesome 5 React library
This change updates the frontend to use the FontAwesome 5 React library that renders SVG icons as opposed to CSS icon fonts. This migration resolves a couple of issues we had with server-side rendering of the previous FontAwesome icons.
Diffstat (limited to 'opendc-web/opendc-web-ui/src')
-rw-r--r--opendc-web/opendc-web-ui/src/components/app/map/LoadingScreen.js5
-rw-r--r--opendc-web/opendc-web-ui/src/components/app/map/controls/ExportCanvasComponent.js4
-rw-r--r--opendc-web/opendc-web-ui/src/components/app/map/controls/ZoomControlComponent.js6
-rw-r--r--opendc-web/opendc-web-ui/src/components/app/sidebars/Sidebar.js6
-rw-r--r--opendc-web/opendc-web-ui/src/components/app/sidebars/project/PortfolioListComponent.js20
-rw-r--r--opendc-web/opendc-web-ui/src/components/app/sidebars/project/ScenarioListComponent.js16
-rw-r--r--opendc-web/opendc-web-ui/src/components/app/sidebars/project/TopologyListComponent.js21
-rw-r--r--opendc-web/opendc-web-ui/src/components/app/sidebars/topology/NameComponent.js5
-rw-r--r--opendc-web/opendc-web-ui/src/components/app/sidebars/topology/building/NewRoomConstructionComponent.js17
-rw-r--r--opendc-web/opendc-web-ui/src/components/app/sidebars/topology/machine/BackToRackComponent.js4
-rw-r--r--opendc-web/opendc-web-ui/src/components/app/sidebars/topology/machine/UnitAddComponent.js25
-rw-r--r--opendc-web/opendc-web-ui/src/components/app/sidebars/topology/machine/UnitComponent.js10
-rw-r--r--opendc-web/opendc-web-ui/src/components/app/sidebars/topology/machine/UnitTabsComponent.js28
-rw-r--r--opendc-web/opendc-web-ui/src/components/app/sidebars/topology/rack/AddPrefabComponent.js9
-rw-r--r--opendc-web/opendc-web-ui/src/components/app/sidebars/topology/rack/BackToRoomComponent.js9
-rw-r--r--opendc-web/opendc-web-ui/src/components/app/sidebars/topology/rack/EmptySlotComponent.js17
-rw-r--r--opendc-web/opendc-web-ui/src/components/app/sidebars/topology/rack/MachineComponent.js26
-rw-r--r--opendc-web/opendc-web-ui/src/components/app/sidebars/topology/room/BackToBuildingComponent.js4
-rw-r--r--opendc-web/opendc-web-ui/src/components/app/sidebars/topology/room/DeleteRoomComponent.js9
-rw-r--r--opendc-web/opendc-web-ui/src/components/app/sidebars/topology/room/RackConstructionComponent.js23
-rw-r--r--opendc-web/opendc-web-ui/src/components/home/ContactSection.js21
-rw-r--r--opendc-web/opendc-web-ui/src/components/home/IntroSection.js10
-rw-r--r--opendc-web/opendc-web-ui/src/components/home/JumbotronHeader.js9
-rw-r--r--opendc-web/opendc-web-ui/src/components/home/ScreenshotSection.js12
-rw-r--r--opendc-web/opendc-web-ui/src/components/home/SimulationSection.js17
-rw-r--r--opendc-web/opendc-web-ui/src/components/home/TeamSection.js59
-rw-r--r--opendc-web/opendc-web-ui/src/components/home/TechnologiesSection.js11
-rw-r--r--opendc-web/opendc-web-ui/src/components/navigation/AppNavbarComponent.js5
-rw-r--r--opendc-web/opendc-web-ui/src/components/navigation/LogoutButton.js5
-rw-r--r--opendc-web/opendc-web-ui/src/components/navigation/Navbar.js9
-rw-r--r--opendc-web/opendc-web-ui/src/components/not-found/TerminalWindow.js4
-rw-r--r--opendc-web/opendc-web-ui/src/components/projects/ProjectActionButtons.js8
-rw-r--r--opendc-web/opendc-web-ui/src/components/projects/ProjectList.js4
-rw-r--r--opendc-web/opendc-web-ui/src/components/projects/ProjectRow.js4
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/machine/DeleteMachineContainer.js4
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/DeleteRackContainer.js4
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/DeleteRoomContainer.js4
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/EditRoomContainer.js6
-rw-r--r--opendc-web/opendc-web-ui/src/containers/auth/Login.js4
-rw-r--r--opendc-web/opendc-web-ui/src/containers/projects/NewProjectContainer.js4
-rw-r--r--opendc-web/opendc-web-ui/src/pages/_document.js1
-rw-r--r--opendc-web/opendc-web-ui/src/util/authorizations.js8
42 files changed, 297 insertions, 180 deletions
diff --git a/opendc-web/opendc-web-ui/src/components/app/map/LoadingScreen.js b/opendc-web/opendc-web-ui/src/components/app/map/LoadingScreen.js
index 7efea9b0..ddb94990 100644
--- a/opendc-web/opendc-web-ui/src/components/app/map/LoadingScreen.js
+++ b/opendc-web/opendc-web-ui/src/components/app/map/LoadingScreen.js
@@ -1,9 +1,10 @@
import React from 'react'
-import FontAwesome from 'react-fontawesome'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faSpinner } from '@fortawesome/free-solid-svg-icons'
const LoadingScreen = () => (
<div className="display-4">
- <FontAwesome name="refresh" className="mr-4" spin />
+ <FontAwesomeIcon icon={faSpinner} spin className="mr-4" />
Loading your project...
</div>
)
diff --git a/opendc-web/opendc-web-ui/src/components/app/map/controls/ExportCanvasComponent.js b/opendc-web/opendc-web-ui/src/components/app/map/controls/ExportCanvasComponent.js
index 8487f47b..9e8cb36a 100644
--- a/opendc-web/opendc-web-ui/src/components/app/map/controls/ExportCanvasComponent.js
+++ b/opendc-web/opendc-web-ui/src/components/app/map/controls/ExportCanvasComponent.js
@@ -1,4 +1,6 @@
import React from 'react'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faCamera } from '@fortawesome/free-solid-svg-icons'
const ExportCanvasComponent = () => (
<button
@@ -6,7 +8,7 @@ const ExportCanvasComponent = () => (
title="Export Canvas to PNG Image"
onClick={() => window['exportCanvasToImage']()}
>
- <span className="fa fa-camera" />
+ <FontAwesomeIcon icon={faCamera} />
</button>
)
diff --git a/opendc-web/opendc-web-ui/src/components/app/map/controls/ZoomControlComponent.js b/opendc-web/opendc-web-ui/src/components/app/map/controls/ZoomControlComponent.js
index 65944bea..6bae792c 100644
--- a/opendc-web/opendc-web-ui/src/components/app/map/controls/ZoomControlComponent.js
+++ b/opendc-web/opendc-web-ui/src/components/app/map/controls/ZoomControlComponent.js
@@ -1,4 +1,6 @@
import React from 'react'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faPlus, faMinus } from '@fortawesome/free-solid-svg-icons'
const ZoomControlComponent = ({ zoomInOnCenter }) => {
return (
@@ -8,14 +10,14 @@ const ZoomControlComponent = ({ zoomInOnCenter }) => {
title="Zoom in"
onClick={() => zoomInOnCenter(true)}
>
- <span className="fa fa-plus" />
+ <FontAwesomeIcon icon={faPlus} />
</button>
<button
className="btn btn-default btn-circle btn-sm mr-1"
title="Zoom out"
onClick={() => zoomInOnCenter(false)}
>
- <span className="fa fa-minus" />
+ <FontAwesomeIcon icon={faMinus} />
</button>
</span>
)
diff --git a/opendc-web/opendc-web-ui/src/components/app/sidebars/Sidebar.js b/opendc-web/opendc-web-ui/src/components/app/sidebars/Sidebar.js
index 64e95014..ccaa4144 100644
--- a/opendc-web/opendc-web-ui/src/components/app/sidebars/Sidebar.js
+++ b/opendc-web/opendc-web-ui/src/components/app/sidebars/Sidebar.js
@@ -2,6 +2,8 @@ import PropTypes from 'prop-types'
import classNames from 'classnames'
import React, { useState } from 'react'
import { collapseButton, collapseButtonRight, sidebar, sidebarRight } from './Sidebar.module.scss'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faAngleLeft, faAngleRight } from '@fortawesome/free-solid-svg-icons'
function Sidebar({ isRight, collapsible = true, children }) {
const [isCollapsed, setCollapsed] = useState(false)
@@ -14,9 +16,9 @@ function Sidebar({ isRight, collapsible = true, children }) {
onClick={() => setCollapsed(!isCollapsed)}
>
{(isCollapsed && isRight) || (!isCollapsed && !isRight) ? (
- <span className="fa fa-angle-left" title={isRight ? 'Expand' : 'Collapse'} />
+ <FontAwesomeIcon icon={faAngleLeft} title={isRight ? 'Expand' : 'Collapse'} />
) : (
- <span className="fa fa-angle-right" title={isRight ? 'Collapse' : 'Expand'} />
+ <FontAwesomeIcon icon={faAngleRight} title={isRight ? 'Collapse' : 'Expand'} />
)}
</div>
)
diff --git a/opendc-web/opendc-web-ui/src/components/app/sidebars/project/PortfolioListComponent.js b/opendc-web/opendc-web-ui/src/components/app/sidebars/project/PortfolioListComponent.js
index ae965939..9dd36d5e 100644
--- a/opendc-web/opendc-web-ui/src/components/app/sidebars/project/PortfolioListComponent.js
+++ b/opendc-web/opendc-web-ui/src/components/app/sidebars/project/PortfolioListComponent.js
@@ -2,10 +2,11 @@ import PropTypes from 'prop-types'
import React from 'react'
import { Portfolio } from '../../../../shapes'
import Link from 'next/link'
-import FontAwesome from 'react-fontawesome'
import ScenarioListContainer from '../../../../containers/app/sidebars/project/ScenarioListContainer'
import { Button, Col, Row } from 'reactstrap'
import classNames from 'classnames'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faPlus, faPlay, faTrash } from '@fortawesome/free-solid-svg-icons'
function PortfolioListComponent({
portfolios,
@@ -20,7 +21,7 @@ function PortfolioListComponent({
<h2>
Portfolios
<Button color="primary" outline className="float-right" onClick={(e) => onNewPortfolio(e)}>
- <FontAwesome name="plus" />
+ <FontAwesomeIcon icon={faPlus} />
</Button>
</h2>
@@ -40,16 +41,15 @@ function PortfolioListComponent({
<Button
color="primary"
outline
- className="mr-1 fa fa-play"
+ className="mr-1"
onClick={() => onChoosePortfolio(portfolio._id)}
- />
+ >
+ <FontAwesomeIcon icon={faPlay} />
+ </Button>
</Link>
- <Button
- color="danger"
- outline
- className="fa fa-trash"
- onClick={() => onDeletePortfolio(portfolio._id)}
- />
+ <Button color="danger" outline onClick={() => onDeletePortfolio(portfolio._id)}>
+ <FontAwesomeIcon icon={faTrash} />
+ </Button>
</Col>
</Row>
<ScenarioListContainer portfolioId={portfolio._id} />
diff --git a/opendc-web/opendc-web-ui/src/components/app/sidebars/project/ScenarioListComponent.js b/opendc-web/opendc-web-ui/src/components/app/sidebars/project/ScenarioListComponent.js
index 168b8e02..131a00b5 100644
--- a/opendc-web/opendc-web-ui/src/components/app/sidebars/project/ScenarioListComponent.js
+++ b/opendc-web/opendc-web-ui/src/components/app/sidebars/project/ScenarioListComponent.js
@@ -2,9 +2,10 @@ import PropTypes from 'prop-types'
import React from 'react'
import { Scenario } from '../../../../shapes'
import Link from 'next/link'
-import FontAwesome from 'react-fontawesome'
import { Button, Col, Row } from 'reactstrap'
import classNames from 'classnames'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faPlus, faPlay, faTrash } from '@fortawesome/free-solid-svg-icons'
function ScenarioListComponent({
scenarios,
@@ -35,23 +36,26 @@ function ScenarioListComponent({
color="primary"
outline
disabled
- className="mr-1 fa fa-play"
+ className="mr-1"
onClick={() => onChooseScenario(scenario.portfolioId, scenario._id)}
- />
+ >
+ <FontAwesomeIcon icon={faPlay} />
+ </Button>
</Link>
<Button
color="danger"
outline
- className="fa fa-trash"
disabled={idx === 0}
onClick={() => (idx !== 0 ? onDeleteScenario(scenario._id) : undefined)}
- />
+ >
+ <FontAwesomeIcon icon={faTrash} />
+ </Button>
</Col>
</Row>
))}
<div className="pl-4 mb-2">
<Button color="primary" outline onClick={() => onNewScenario(portfolioId)}>
- <FontAwesome name="plus" className="mr-1" />
+ <FontAwesomeIcon icon={faPlus} className="mr-1" />
New scenario
</Button>
</div>
diff --git a/opendc-web/opendc-web-ui/src/components/app/sidebars/project/TopologyListComponent.js b/opendc-web/opendc-web-ui/src/components/app/sidebars/project/TopologyListComponent.js
index d5627abc..ac58669b 100644
--- a/opendc-web/opendc-web-ui/src/components/app/sidebars/project/TopologyListComponent.js
+++ b/opendc-web/opendc-web-ui/src/components/app/sidebars/project/TopologyListComponent.js
@@ -1,9 +1,10 @@
import PropTypes from 'prop-types'
import React from 'react'
import { Topology } from '../../../../shapes'
-import FontAwesome from 'react-fontawesome'
import { Button, Col, Row } from 'reactstrap'
import classNames from 'classnames'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faPlus, faPlay, faTrash } from '@fortawesome/free-solid-svg-icons'
function TopologyListComponent({ topologies, currentTopologyId, onChooseTopology, onNewTopology, onDeleteTopology }) {
return (
@@ -11,7 +12,7 @@ function TopologyListComponent({ topologies, currentTopologyId, onChooseTopology
<h2>
Topologies
<Button color="primary" outline className="float-right" onClick={onNewTopology}>
- <FontAwesome name="plus" />
+ <FontAwesomeIcon icon={faPlus} />
</Button>
</h2>
@@ -26,19 +27,17 @@ function TopologyListComponent({ topologies, currentTopologyId, onChooseTopology
{topology.name}
</Col>
<Col xs="5" className="text-right">
- <Button
- color="primary"
- outline
- className="mr-1 fa fa-play"
- onClick={() => onChooseTopology(topology._id)}
- />
+ <Button color="primary" outline className="mr-1" onClick={() => onChooseTopology(topology._id)}>
+ <FontAwesomeIcon icon={faPlay} />
+ </Button>
<Button
color="danger"
outline
- className="fa fa-trash"
- disable={idx === 0}
+ disabled={idx === 0}
onClick={() => (idx !== 0 ? onDeleteTopology(topology._id) : undefined)}
- />
+ >
+ <FontAwesomeIcon icon={faTrash} />
+ </Button>
</Col>
</Row>
))}
diff --git a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/NameComponent.js b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/NameComponent.js
index 5fb0dc55..b4cbc78f 100644
--- a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/NameComponent.js
+++ b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/NameComponent.js
@@ -1,11 +1,12 @@
import React from 'react'
-import FontAwesome from 'react-fontawesome'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faPencilAlt } from '@fortawesome/free-solid-svg-icons'
const NameComponent = ({ name, onEdit }) => (
<h2>
{name}
<button className="btn btn-outline-secondary float-right" onClick={onEdit}>
- <FontAwesome name="pencil" />
+ <FontAwesomeIcon icon={faPencilAlt} />
</button>
</h2>
)
diff --git a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/building/NewRoomConstructionComponent.js b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/building/NewRoomConstructionComponent.js
index fd552c1e..b1461743 100644
--- a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/building/NewRoomConstructionComponent.js
+++ b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/building/NewRoomConstructionComponent.js
@@ -1,24 +1,27 @@
import React from 'react'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faPlus, faCheck, faTimes } from '@fortawesome/free-solid-svg-icons'
+import { Button } from 'reactstrap'
const NewRoomConstructionComponent = ({ onStart, onFinish, onCancel, currentRoomInConstruction }) => {
if (currentRoomInConstruction === '-1') {
return (
<div className="btn btn-outline-primary btn-block" onClick={onStart}>
- <span className="fa fa-plus mr-2" />
+ <FontAwesomeIcon icon={faPlus} className="mr-2" />
Construct a new room
</div>
)
}
return (
<div>
- <div className="btn btn-primary btn-block" onClick={onFinish}>
- <span className="fa fa-check mr-2" />
+ <Button color="primary" block onClick={onFinish}>
+ <FontAwesomeIcon icon={faCheck} className="mr-2" />
Finalize new room
- </div>
- <div className="btn btn-default btn-block" onClick={onCancel}>
- <span className="fa fa-times mr-2" />
+ </Button>
+ <Button color="default" block onClick={onCancel}>
+ <FontAwesomeIcon icon={faTimes} className="mr-2" />
Cancel construction
- </div>
+ </Button>
</div>
)
}
diff --git a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/machine/BackToRackComponent.js b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/machine/BackToRackComponent.js
index 70d522b2..eac99643 100644
--- a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/machine/BackToRackComponent.js
+++ b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/machine/BackToRackComponent.js
@@ -1,8 +1,10 @@
import React from 'react'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faAngleLeft } from '@fortawesome/free-solid-svg-icons'
const BackToRackComponent = ({ onClick }) => (
<div className="btn btn-secondary btn-block" onClick={onClick}>
- <span className="fa fa-angle-left mr-2" />
+ <FontAwesomeIcon icon={faAngleLeft} className="mr-2" />
Back to rack
</div>
)
diff --git a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/machine/UnitAddComponent.js b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/machine/UnitAddComponent.js
index f80fccc8..532add37 100644
--- a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/machine/UnitAddComponent.js
+++ b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/machine/UnitAddComponent.js
@@ -1,29 +1,28 @@
import PropTypes from 'prop-types'
import React, { useRef } from 'react'
+import { Button, Form, FormGroup, Input } from 'reactstrap'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faPlus } from '@fortawesome/free-solid-svg-icons'
function UnitAddComponent({ units, onAdd }) {
const unitSelect = useRef(null)
return (
- <div className="form-inline">
- <div className="form-group w-100">
- <select className="form-control w-70 mr-1" ref={unitSelect}>
+ <Form inline>
+ <FormGroup className="w-100">
+ <Input type="select" className="w-70 mr-1" innerRef={unitSelect}>
{units.map((unit) => (
<option value={unit._id} key={unit._id}>
{unit.name}
</option>
))}
- </select>
- <button
- type="submit"
- className="btn btn-outline-primary"
- onClick={() => onAdd(unitSelect.current.value)}
- >
- <span className="fa fa-plus mr-2" />
+ </Input>
+ <Button color="primary" outline onClick={() => onAdd(unitSelect.current.value)}>
+ <FontAwesomeIcon icon={faPlus} className="mr-2" />
Add
- </button>
- </div>
- </div>
+ </Button>
+ </FormGroup>
+ </Form>
)
}
diff --git a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/machine/UnitComponent.js b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/machine/UnitComponent.js
index de55e506..aa473f91 100644
--- a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/machine/UnitComponent.js
+++ b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/machine/UnitComponent.js
@@ -1,5 +1,7 @@
import React from 'react'
import { UncontrolledPopover, PopoverHeader, PopoverBody, Button } from 'reactstrap'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faTrash, faInfoCircle } from '@fortawesome/free-solid-svg-icons'
function UnitComponent({ index, unitType, unit, onDelete }) {
let unitInfo
@@ -37,13 +39,17 @@ function UnitComponent({ index, unitType, unit, onDelete }) {
<li className="d-flex list-group-item justify-content-between align-items-center">
<span style={{ maxWidth: '60%' }}>{unit.name}</span>
<span>
- <Button outline={true} color="info" className="mr-1 fa fa-info-circle" id={`unit-${index}`} />
+ <Button outline={true} color="info" className="mr-1" id={`unit-${index}`}>
+ <FontAwesomeIcon icon={faInfoCircle} />
+ </Button>
<UncontrolledPopover trigger="focus" placement="left" target={`unit-${index}`}>
<PopoverHeader>Unit Information</PopoverHeader>
<PopoverBody>{unitInfo}</PopoverBody>
</UncontrolledPopover>
- <span className="btn btn-outline-danger fa fa-trash" onClick={onDelete} />
+ <Button outline color="danger" onClick={onDelete}>
+ <FontAwesomeIcon icon={faTrash} />
+ </Button>
</span>
</li>
)
diff --git a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/machine/UnitTabsComponent.js b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/machine/UnitTabsComponent.js
index 6599fefd..ebb5f479 100644
--- a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/machine/UnitTabsComponent.js
+++ b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/machine/UnitTabsComponent.js
@@ -1,5 +1,5 @@
import React, { useState } from 'react'
-import { Nav, NavItem, NavLink, TabContent, TabPane } from 'reactstrap'
+import { Nav, NavItem, NavLink, Row, TabContent, TabPane } from 'reactstrap'
import UnitAddContainer from '../../../../../containers/app/sidebars/topology/machine/UnitAddContainer'
import UnitListContainer from '../../../../../containers/app/sidebars/topology/machine/UnitListContainer'
@@ -10,7 +10,7 @@ const UnitTabsComponent = () => {
}
return (
- <div>
+ <div className="mt-2">
<Nav tabs>
<NavItem>
<NavLink
@@ -55,20 +55,28 @@ const UnitTabsComponent = () => {
</Nav>
<TabContent activeTab={activeTab}>
<TabPane tabId="cpu-units">
- <UnitAddContainer unitType="cpu" />
- <UnitListContainer unitType="cpu" />
+ <div className="py-2">
+ <UnitAddContainer unitType="cpu" />
+ <UnitListContainer unitType="cpu" />
+ </div>
</TabPane>
<TabPane tabId="gpu-units">
- <UnitAddContainer unitType="gpu" />
- <UnitListContainer unitType="gpu" />
+ <div className="py-2">
+ <UnitAddContainer unitType="gpu" />
+ <UnitListContainer unitType="gpu" />
+ </div>
</TabPane>
<TabPane tabId="memory-units">
- <UnitAddContainer unitType="memory" />
- <UnitListContainer unitType="memory" />
+ <div className="py-2">
+ <UnitAddContainer unitType="memory" />
+ <UnitListContainer unitType="memory" />
+ </div>
</TabPane>
<TabPane tabId="storage-units">
- <UnitAddContainer unitType="storage" />
- <UnitListContainer unitType="storage" />
+ <div className="py-2">
+ <UnitAddContainer unitType="storage" />
+ <UnitListContainer unitType="storage" />
+ </div>
</TabPane>
</TabContent>
</div>
diff --git a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/rack/AddPrefabComponent.js b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/rack/AddPrefabComponent.js
index 75418f9d..d0218f38 100644
--- a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/rack/AddPrefabComponent.js
+++ b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/rack/AddPrefabComponent.js
@@ -1,10 +1,13 @@
import React from 'react'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faSave } from '@fortawesome/free-solid-svg-icons'
+import { Button } from 'reactstrap'
const AddPrefabComponent = ({ onClick }) => (
- <div className="btn btn-primary btn-block" onClick={onClick}>
- <span className="fa fa-floppy-o mr-2" />
+ <Button color="primary" block onClick={onClick}>
+ <FontAwesomeIcon icon={faSave} className="mr-2" />
Save this rack to a prefab
- </div>
+ </Button>
)
export default AddPrefabComponent
diff --git a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/rack/BackToRoomComponent.js b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/rack/BackToRoomComponent.js
index c14775bf..f6a6f79b 100644
--- a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/rack/BackToRoomComponent.js
+++ b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/rack/BackToRoomComponent.js
@@ -1,10 +1,13 @@
import React from 'react'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faAngleLeft } from '@fortawesome/free-solid-svg-icons'
+import { Button } from 'reactstrap'
const BackToRoomComponent = ({ onClick }) => (
- <div className="btn btn-secondary btn-block mb-2" onClick={onClick}>
- <span className="fa fa-angle-left mr-2" />
+ <Button color="secondary" block className="mb-2" onClick={onClick}>
+ <FontAwesomeIcon icon={faAngleLeft} className="mr-2" />
Back to room
- </div>
+ </Button>
)
export default BackToRoomComponent
diff --git a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/rack/EmptySlotComponent.js b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/rack/EmptySlotComponent.js
index d7e30f1d..d6fa9dc9 100644
--- a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/rack/EmptySlotComponent.js
+++ b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/rack/EmptySlotComponent.js
@@ -1,13 +1,18 @@
import React from 'react'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faPlus } from '@fortawesome/free-solid-svg-icons'
+import { ListGroupItem, Badge, Button } from 'reactstrap'
const EmptySlotComponent = ({ position, onAdd }) => (
- <li className="list-group-item d-flex justify-content-between align-items-center">
- <span className="badge badge-default badge-info mr-1 disabled">{position}</span>
- <button className="btn btn-outline-primary" onClick={onAdd}>
- <span className="fa fa-plus mr-2" />
+ <ListGroupItem className="d-flex justify-content-between align-items-center">
+ <Badge color="info" className="mr-1">
+ {position}
+ </Badge>
+ <Button color="primary" outline onClick={onAdd}>
+ <FontAwesomeIcon icon={faPlus} className="mr-2" />
Add machine
- </button>
- </li>
+ </Button>
+ </ListGroupItem>
)
export default EmptySlotComponent
diff --git a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/rack/MachineComponent.js b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/rack/MachineComponent.js
index 4db0e7fe..36b15c71 100644
--- a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/rack/MachineComponent.js
+++ b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/rack/MachineComponent.js
@@ -1,13 +1,16 @@
import React from 'react'
+import Image from 'next/image'
import { Machine } from '../../../../../shapes'
+import { Badge, ListGroupItem } from 'reactstrap'
const UnitIcon = ({ id, type }) => (
- <div>
- <img
+ <div className="ml-1">
+ <Image
src={'/img/topology/' + id + '-icon.png'}
alt={'Machine contains ' + type + ' units'}
- className="img-fluid ml-1"
- style={{ maxHeight: '35px' }}
+ layout="intrinsic"
+ height={35}
+ width={35}
/>
</div>
)
@@ -17,22 +20,23 @@ const MachineComponent = ({ position, machine, onClick }) => {
machine.cpuIds.length + machine.gpuIds.length + machine.memoryIds.length + machine.storageIds.length === 0
return (
- <li
- className="d-flex list-group-item list-group-item-action justify-content-between align-items-center"
+ <ListGroupItem
+ action
+ className="d-flex justify-content-between align-items-center"
onClick={onClick}
style={{ backgroundColor: 'white' }}
>
- <span className="badge badge-default badge-info mr-1">{position}</span>
+ <Badge color="info" className="mr-1">
+ {position}
+ </Badge>
<div className="d-inline-flex">
{machine.cpuIds.length > 0 ? <UnitIcon id="cpu" type="CPU" /> : undefined}
{machine.gpuIds.length > 0 ? <UnitIcon id="gpu" type="GPU" /> : undefined}
{machine.memoryIds.length > 0 ? <UnitIcon id="memory" type="memory" /> : undefined}
{machine.storageIds.length > 0 ? <UnitIcon id="storage" type="storage" /> : undefined}
- {hasNoUnits ? (
- <span className="badge badge-default badge-warning">Machine with no units</span>
- ) : undefined}
+ {hasNoUnits ? <Badge color="warning">Machine with no units</Badge> : undefined}
</div>
- </li>
+ </ListGroupItem>
)
}
diff --git a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/room/BackToBuildingComponent.js b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/room/BackToBuildingComponent.js
index 64c0a1f6..696b345b 100644
--- a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/room/BackToBuildingComponent.js
+++ b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/room/BackToBuildingComponent.js
@@ -1,8 +1,10 @@
import React from 'react'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faAngleLeft } from '@fortawesome/free-solid-svg-icons'
const BackToBuildingComponent = ({ onClick }) => (
<div className="btn btn-secondary btn-block mb-2" onClick={onClick}>
- <span className="fa fa-angle-left mr-2" />
+ <FontAwesomeIcon icon={faAngleLeft} className="mr-2" />
Back to building
</div>
)
diff --git a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/room/DeleteRoomComponent.js b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/room/DeleteRoomComponent.js
index 78417359..242f7a2b 100644
--- a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/room/DeleteRoomComponent.js
+++ b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/room/DeleteRoomComponent.js
@@ -1,10 +1,13 @@
import React from 'react'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faTrash } from '@fortawesome/free-solid-svg-icons'
+import { Button } from 'reactstrap'
const DeleteRoomComponent = ({ onClick }) => (
- <div className="btn btn-outline-danger btn-block" onClick={onClick}>
- <span className="fa fa-trash mr-2" />
+ <Button color="danger" outline block onClick={onClick}>
+ <FontAwesomeIcon icon={faTrash} className="mr-2" />
Delete this room
- </div>
+ </Button>
)
export default DeleteRoomComponent
diff --git a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/room/RackConstructionComponent.js b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/room/RackConstructionComponent.js
index 44566f61..19d6b309 100644
--- a/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/room/RackConstructionComponent.js
+++ b/opendc-web/opendc-web-ui/src/components/app/sidebars/topology/room/RackConstructionComponent.js
@@ -1,26 +1,29 @@
-import classNames from 'classnames'
import React from 'react'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faTimes, faPlus } from '@fortawesome/free-solid-svg-icons'
+import { Button } from 'reactstrap'
const RackConstructionComponent = ({ onStart, onStop, inRackConstructionMode, isEditingRoom }) => {
if (inRackConstructionMode) {
return (
- <div className="btn btn-primary btn-block" onClick={onStop}>
- <span className="fa fa-times mr-2" />
+ <Button color="primary" block onClick={onStop}>
+ <FontAwesomeIcon icon={faTimes} className="mr-2" />
Stop rack construction
- </div>
+ </Button>
)
}
return (
- <div
- className={classNames('btn btn-outline-primary btn-block', {
- disabled: isEditingRoom,
- })}
+ <Button
+ color="primary"
+ outline
+ block
+ disabled={isEditingRoom}
onClick={() => (isEditingRoom ? undefined : onStart())}
>
- <span className="fa fa-plus mr-2" />
+ <FontAwesomeIcon icon={faPlus} className="mr-2" />
Start rack construction
- </div>
+ </Button>
)
}
diff --git a/opendc-web/opendc-web-ui/src/components/home/ContactSection.js b/opendc-web/opendc-web-ui/src/components/home/ContactSection.js
index 25daaccf..60a7e6a3 100644
--- a/opendc-web/opendc-web-ui/src/components/home/ContactSection.js
+++ b/opendc-web/opendc-web-ui/src/components/home/ContactSection.js
@@ -1,8 +1,10 @@
import React from 'react'
-import FontAwesome from 'react-fontawesome'
+import Image from 'next/image'
import { Row, Col } from 'reactstrap'
import ContentSection from './ContentSection'
-
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faExclamationTriangle, faEnvelope } from '@fortawesome/free-solid-svg-icons'
+import { faGithub } from '@fortawesome/free-brands-svg-icons'
import { contactSection, tudelftIcon } from './ContactSection.module.scss'
const ContactSection = () => (
@@ -10,14 +12,14 @@ const ContactSection = () => (
<Row className="justify-content-center">
<Col md="4">
<a href="https://github.com/atlarge-research/opendc">
- <FontAwesome name="github" size="3x" className="mb-2" />
+ <FontAwesomeIcon icon={faGithub} size="3x" className="mb-2" />
<div className="w-100" />
atlarge-research/opendc
</a>
</Col>
<Col md="4">
<a href="mailto:opendc@atlarge-research.com">
- <FontAwesome name="envelope" size="3x" className="mb-2" />
+ <FontAwesomeIcon icon={faEnvelope} size="3x" className="mb-2" />
<div className="w-100" />
opendc@atlarge-research.com
</a>
@@ -25,7 +27,14 @@ const ContactSection = () => (
</Row>
<Row>
<Col className="text-center">
- <img src="img/tudelft-icon.png" className={`img-fluid ${tudelftIcon}`} height="100" alt="TU Delft" />
+ <Image
+ src="/img/tudelft-icon.png"
+ className={tudelftIcon}
+ layout="intrinsic"
+ width={162}
+ height={100}
+ alt="TU Delft"
+ />
</Col>
</Row>
<Row>
@@ -39,7 +48,7 @@ const ContactSection = () => (
</Row>
<Row>
<Col className="text-center disclaimer mt-5 small">
- <FontAwesome name="exclamation-triangle" size="2x" className="mr-2" />
+ <FontAwesomeIcon icon={faExclamationTriangle} size="2x" className="mr-2" />
<br />
<strong>Disclaimer: </strong>
OpenDC is an experimental tool. Your data may get lost, overwritten, or otherwise become unavailable.
diff --git a/opendc-web/opendc-web-ui/src/components/home/IntroSection.js b/opendc-web/opendc-web-ui/src/components/home/IntroSection.js
index 7b467889..67e8cd8b 100644
--- a/opendc-web/opendc-web-ui/src/components/home/IntroSection.js
+++ b/opendc-web/opendc-web-ui/src/components/home/IntroSection.js
@@ -1,4 +1,5 @@
import React from 'react'
+import Image from 'next/image'
import { Container, Row, Col } from 'reactstrap'
const IntroSection = ({ className }) => (
@@ -14,9 +15,12 @@ const IntroSection = ({ className }) => (
</ul>
</Col>
<Col xl="4" lg="4" md="4" sm="8">
- <img
- src="img/datacenter-drawing.png"
- className="col-12 img-fluid"
+ <Image
+ src="/img/datacenter-drawing.png"
+ className="col-12"
+ layout="intrinsic"
+ width={350}
+ height={197}
alt="Schematic top-down view of a datacenter"
/>
<p className="col-12 figure-caption text-center">
diff --git a/opendc-web/opendc-web-ui/src/components/home/JumbotronHeader.js b/opendc-web/opendc-web-ui/src/components/home/JumbotronHeader.js
index 0d3217f9..98aa0af2 100644
--- a/opendc-web/opendc-web-ui/src/components/home/JumbotronHeader.js
+++ b/opendc-web/opendc-web-ui/src/components/home/JumbotronHeader.js
@@ -1,6 +1,9 @@
import React from 'react'
+import Image from 'next/image'
import { Container, Jumbotron, Button } from 'reactstrap'
import { jumbotronHeader, jumbotron, dc } from './JumbotronHeader.module.scss'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faExternalLinkAlt } from '@fortawesome/free-solid-svg-icons'
const JumbotronHeader = () => (
<section className={jumbotronHeader}>
@@ -10,7 +13,9 @@ const JumbotronHeader = () => (
Open<span className={dc}>DC</span>
</h1>
<p className="lead">Collaborative Datacenter Simulation and Exploration for Everybody</p>
- <img src="img/logo.png" className="img-responsive mt-3" alt="OpenDC" />
+ <div className="mt-5">
+ <Image src="/img/logo.png" layout="intrinsic" height={110} width={110} alt="OpenDC" />
+ </div>
<p className="lead mt-5">
<Button
tag="a"
@@ -18,7 +23,7 @@ const JumbotronHeader = () => (
href="https://atlarge-research.com/pdfs/ccgrid21-opendc-paper.pdf"
color="warning"
>
- Read about <strong>OpenDC 2.0</strong> <i className="fa fa-external-link" />
+ Read about <strong>OpenDC 2.0</strong> <FontAwesomeIcon icon={faExternalLinkAlt} />
</Button>
</p>
</Jumbotron>
diff --git a/opendc-web/opendc-web-ui/src/components/home/ScreenshotSection.js b/opendc-web/opendc-web-ui/src/components/home/ScreenshotSection.js
index 4f634b28..9673b7b7 100644
--- a/opendc-web/opendc-web-ui/src/components/home/ScreenshotSection.js
+++ b/opendc-web/opendc-web-ui/src/components/home/ScreenshotSection.js
@@ -1,4 +1,5 @@
import React from 'react'
+import Image from 'next/image'
import { Row, Col } from 'reactstrap'
import ContentSection from './ContentSection'
import { screenshot } from './ScreenshotSection.module.scss'
@@ -6,11 +7,18 @@ import { screenshot } from './ScreenshotSection.module.scss'
const ScreenshotSection = ({ className, name, title, imageUrl, caption, imageIsRight, children }) => (
<ContentSection name={name} title={title} className={className}>
<Row>
- <Col xl="5" lg="5" md="5" sm="12" className={`text-left ${!imageIsRight ? 'order-1' : ''}`}>
+ <Col xl="5" lg="5" md="5" sm="12" className={`text-left my-auto ${!imageIsRight ? 'order-1' : ''}`}>
{children}
</Col>
<Col xl="7" lg="7" md="7" sm="12">
- <img src={imageUrl} className={`col-12 ${screenshot}`} alt={caption} />
+ <Image
+ src={imageUrl}
+ className={`col-12 ${screenshot}`}
+ layout="intrinsic"
+ width={635}
+ height={419}
+ alt={caption}
+ />
<div className="row text-muted justify-content-center">{caption}</div>
</Col>
</Row>
diff --git a/opendc-web/opendc-web-ui/src/components/home/SimulationSection.js b/opendc-web/opendc-web-ui/src/components/home/SimulationSection.js
index 44ce905b..c154cc26 100644
--- a/opendc-web/opendc-web-ui/src/components/home/SimulationSection.js
+++ b/opendc-web/opendc-web-ui/src/components/home/SimulationSection.js
@@ -1,4 +1,5 @@
import React from 'react'
+import Image from 'next/image'
import { Col, Row } from 'reactstrap'
import ContentSection from './ContentSection'
@@ -18,9 +19,12 @@ const SimulationSection = ({ className }) => {
</ul>
</Col>
<Col xl="7" lg="7" md="7" sm="12">
- <img
+ <Image
src="/img/screenshot-simulation.png"
- className="col-12 screenshot"
+ className="col-12"
+ layout="intrinsic"
+ width={635}
+ height={419}
alt="Running an experiment in OpenDC"
/>
<Row className="text-muted justify-content-center">Running an experiment in OpenDC</Row>
@@ -39,7 +43,14 @@ const SimulationSection = ({ className }) => {
</Col>
<Col xl="7" lg="7" md="7" sm="12">
- <img src="/img/opendc-architecture.png" className="col-12 screenshot" alt="OpenDC's Architecture" />
+ <Image
+ src="/img/opendc-architecture.png"
+ className="col-12"
+ layout="intrinsic"
+ width={635}
+ height={232}
+ alt="OpenDC's Architecture"
+ />
<Row className="text-muted justify-content-center">OpenDC's Architecture</Row>
</Col>
</Row>
diff --git a/opendc-web/opendc-web-ui/src/components/home/TeamSection.js b/opendc-web/opendc-web-ui/src/components/home/TeamSection.js
index 4e8a3906..bbbe241e 100644
--- a/opendc-web/opendc-web-ui/src/components/home/TeamSection.js
+++ b/opendc-web/opendc-web-ui/src/components/home/TeamSection.js
@@ -1,43 +1,44 @@
import React from 'react'
+import Image from 'next/image'
import { Row, Col } from 'reactstrap'
import ContentSection from './ContentSection'
const TeamLead = ({ photoId, name, description }) => (
<Col xl="3" lg="3" md="4" sm="6" className="justify-content-center">
- <Col
- tag="img"
- src={'img/portraits/' + photoId + '.png'}
- xl="10"
- lg="10"
- md="10"
- sm="8"
- col="5"
- className="mb-2 mt-2"
- alt={name}
- />
- <Col>
- <h4>{name}</h4>
- <div className="team-member-description">{description}</div>
- </Col>
+ <Row>
+ <Col xl="10" lg="10" md="10" sm="8" col="5" className="my-2 mx-auto" alt={name}>
+ <Image
+ src={'/img/portraits/' + photoId + '.png'}
+ layout="intrinsic"
+ width={182}
+ height={182}
+ alt={name}
+ />
+ </Col>
+ <Col>
+ <h4>{name}</h4>
+ <div className="team-member-description">{description}</div>
+ </Col>
+ </Row>
</Col>
)
const TeamMember = ({ photoId, name }) => (
<Col xl="2" lg="2" md="3" sm="4" className="justify-content-center">
- <Col
- tag="img"
- src={'img/portraits/' + photoId + '.png'}
- xl="10"
- lg="10"
- md="10"
- sm="8"
- col="5"
- className="mb-2 mt-2"
- alt={name}
- />
- <Col>
- <h5>{name}</h5>
- </Col>
+ <Row>
+ <Col xl="10" lg="10" md="10" sm="8" xs="5" className="my-2 mx-auto">
+ <Image
+ src={'/img/portraits/' + photoId + '.png'}
+ layout="intrinsic"
+ width={100}
+ height={100}
+ alt={name}
+ />
+ </Col>
+ <Col>
+ <h5>{name}</h5>
+ </Col>
+ </Row>
</Col>
)
diff --git a/opendc-web/opendc-web-ui/src/components/home/TechnologiesSection.js b/opendc-web/opendc-web-ui/src/components/home/TechnologiesSection.js
index 6fdf4e5c..efedebb7 100644
--- a/opendc-web/opendc-web-ui/src/components/home/TechnologiesSection.js
+++ b/opendc-web/opendc-web-ui/src/components/home/TechnologiesSection.js
@@ -1,35 +1,36 @@
import React from 'react'
-import FontAwesome from 'react-fontawesome'
import { ListGroup, ListGroupItem } from 'reactstrap'
import ContentSection from './ContentSection'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faWindowMaximize, faTv, faDatabase, faCogs } from '@fortawesome/free-solid-svg-icons'
const TechnologiesSection = ({ className }) => (
<ContentSection name="technologies" title="Technologies" className={className}>
<ListGroup className="list-group text-left">
<ListGroupItem color="primary" className="d-flex justify-content-between align-items-center">
<span style={{ minWidth: 100 }}>
- <FontAwesome name="window-maximize" className="mr-2" />
+ <FontAwesomeIcon icon={faWindowMaximize} className="mr-2" />
<strong className="">Browser</strong>
</span>
<span className="text-right">JavaScript, React, Redux, Konva</span>
</ListGroupItem>
<ListGroupItem color="warning" className="d-flex justify-content-between align-items-center">
<span style={{ minWidth: 100 }}>
- <FontAwesome name="television" className="mr-2" />
+ <FontAwesomeIcon icon={faTv} className="mr-2" />
<strong>Server</strong>
</span>
<span className="text-right">Python, Flask, FlaskSocketIO, OpenAPI</span>
</ListGroupItem>
<ListGroupItem color="success" className="d-flex justify-content-between align-items-center">
<span style={{ minWidth: 100 }}>
- <FontAwesome name="database" className="mr-2" />
+ <FontAwesomeIcon icon={faDatabase} className="mr-2" />
<strong>Database</strong>
</span>
<span className="text-right">MongoDB</span>
</ListGroupItem>
<ListGroupItem color="danger" className="d-flex justify-content-between align-items-center">
<span style={{ minWidth: 100 }}>
- <FontAwesome name="cogs" className="mr-2" />
+ <FontAwesomeIcon icon={faCogs} className="mr-2" />
<strong>Simulator</strong>
</span>
<span className="text-right">Kotlin</span>
diff --git a/opendc-web/opendc-web-ui/src/components/navigation/AppNavbarComponent.js b/opendc-web/opendc-web-ui/src/components/navigation/AppNavbarComponent.js
index 7b1eaae2..28207968 100644
--- a/opendc-web/opendc-web-ui/src/components/navigation/AppNavbarComponent.js
+++ b/opendc-web/opendc-web-ui/src/components/navigation/AppNavbarComponent.js
@@ -1,16 +1,17 @@
import React from 'react'
-import FontAwesome from 'react-fontawesome'
import Link from 'next/link'
import { NavLink } from 'reactstrap'
import Navbar, { NavItem } from './Navbar'
import {} from './Navbar.module.scss'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faList } from '@fortawesome/free-solid-svg-icons'
const AppNavbarComponent = ({ project, fullWidth }) => (
<Navbar fullWidth={fullWidth}>
<NavItem route="/projects">
<Link href="/projects">
<NavLink title="My Projects">
- <FontAwesome name="list" className="mr-2" />
+ <FontAwesomeIcon icon={faList} className="mr-2" />
My Projects
</NavLink>
</Link>
diff --git a/opendc-web/opendc-web-ui/src/components/navigation/LogoutButton.js b/opendc-web/opendc-web-ui/src/components/navigation/LogoutButton.js
index 0c0feeb1..4ab577e0 100644
--- a/opendc-web/opendc-web-ui/src/components/navigation/LogoutButton.js
+++ b/opendc-web/opendc-web-ui/src/components/navigation/LogoutButton.js
@@ -1,11 +1,12 @@
import PropTypes from 'prop-types'
import React from 'react'
-import FontAwesome from 'react-fontawesome'
import { NavLink } from 'reactstrap'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faSignOutAlt } from '@fortawesome/free-solid-svg-icons'
const LogoutButton = ({ onLogout }) => (
<NavLink className="logout" title="Sign out" onClick={onLogout}>
- <FontAwesome name="power-off" size="lg" />
+ <FontAwesomeIcon icon={faSignOutAlt} size="lg" />
</NavLink>
)
diff --git a/opendc-web/opendc-web-ui/src/components/navigation/Navbar.js b/opendc-web/opendc-web-ui/src/components/navigation/Navbar.js
index 5c9ea1b8..690a7bdf 100644
--- a/opendc-web/opendc-web-ui/src/components/navigation/Navbar.js
+++ b/opendc-web/opendc-web-ui/src/components/navigation/Navbar.js
@@ -1,6 +1,7 @@
import React, { useState } from 'react'
import Link from 'next/link'
import { useRouter } from 'next/router'
+import Image from 'next/image'
import {
Navbar as RNavbar,
NavItem as RNavItem,
@@ -16,6 +17,8 @@ import Logout from '../../containers/auth/Logout'
import ProfileName from '../../containers/auth/ProfileName'
import { login, navbar, opendcBrand } from './Navbar.module.scss'
import { useAuth } from '../../auth'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faGithub } from '@fortawesome/free-brands-svg-icons'
export const NAVBAR_HEIGHT = 60
@@ -25,7 +28,7 @@ const GitHubLink = () => (
className="ml-2 mr-3 text-dark"
style={{ position: 'relative', top: 7 }}
>
- <span aria-hidden className="fa fa-github fa-2x" />
+ <FontAwesomeIcon icon={faGithub} size="2x" />
</a>
)
@@ -87,7 +90,9 @@ const Navbar = ({ fullWidth, children }) => {
<Container fluid={fullWidth}>
<NavbarToggler onClick={toggle} />
<NavbarBrand href="/" title="OpenDC" className={opendcBrand}>
- <img src="/img/logo.png" alt="OpenDC" />
+ <div className="mb-n1">
+ <Image src="/img/logo.png" layout="fixed" width={30} height={30} alt="OpenDC" />
+ </div>
</NavbarBrand>
<Collapse isOpen={isOpen} navbar>
diff --git a/opendc-web/opendc-web-ui/src/components/not-found/TerminalWindow.js b/opendc-web/opendc-web-ui/src/components/not-found/TerminalWindow.js
index 28fd81e9..e6200b10 100644
--- a/opendc-web/opendc-web-ui/src/components/not-found/TerminalWindow.js
+++ b/opendc-web/opendc-web-ui/src/components/not-found/TerminalWindow.js
@@ -3,6 +3,8 @@ import Link from 'next/link'
import BlinkingCursor from './BlinkingCursor'
import CodeBlock from './CodeBlock'
import { terminalWindow, terminalHeader, terminalBody, segfault, subTitle, homeBtn } from './TerminalWindow.module.scss'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faHome } from '@fortawesome/free-solid-svg-icons'
const TerminalWindow = () => (
<div className={terminalWindow}>
@@ -25,7 +27,7 @@ const TerminalWindow = () => (
</div>
<Link href="/">
<a className={homeBtn}>
- <span className="fa fa-home" /> GET ME BACK TO OPENDC
+ <FontAwesomeIcon icon={faHome} /> GET ME BACK TO OPENDC
</a>
</Link>
</div>
diff --git a/opendc-web/opendc-web-ui/src/components/projects/ProjectActionButtons.js b/opendc-web/opendc-web-ui/src/components/projects/ProjectActionButtons.js
index 96970fd9..0725e42b 100644
--- a/opendc-web/opendc-web-ui/src/components/projects/ProjectActionButtons.js
+++ b/opendc-web/opendc-web-ui/src/components/projects/ProjectActionButtons.js
@@ -2,12 +2,14 @@ import PropTypes from 'prop-types'
import React from 'react'
import Link from 'next/link'
import { Button } from 'reactstrap'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faPlay, faUsers, faTrash } from '@fortawesome/free-solid-svg-icons'
const ProjectActionButtons = ({ projectId, onViewUsers, onDelete }) => (
<td className="text-right">
<Link href={`/projects/${projectId}`}>
<Button color="primary" outline size="sm" className="mr-2" title="Open this project">
- <span className="fa fa-play" />
+ <FontAwesomeIcon icon={faPlay} />
</Button>
</Link>
<Button
@@ -19,10 +21,10 @@ const ProjectActionButtons = ({ projectId, onViewUsers, onDelete }) => (
title="View and edit collaborators (not supported currently)"
onClick={() => onViewUsers(projectId)}
>
- <span className="fa fa-users" />
+ <FontAwesomeIcon icon={faUsers} />
</Button>
<Button color="danger" outline size="sm" title="Delete this project" onClick={() => onDelete(projectId)}>
- <span className="fa fa-trash" />
+ <FontAwesomeIcon icon={faTrash} />
</Button>
</td>
)
diff --git a/opendc-web/opendc-web-ui/src/components/projects/ProjectList.js b/opendc-web/opendc-web-ui/src/components/projects/ProjectList.js
index cb17b835..dc3f85ec 100644
--- a/opendc-web/opendc-web-ui/src/components/projects/ProjectList.js
+++ b/opendc-web/opendc-web-ui/src/components/projects/ProjectList.js
@@ -2,13 +2,15 @@ import PropTypes from 'prop-types'
import React from 'react'
import { Project } from '../../shapes'
import ProjectRow from './ProjectRow'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faQuestionCircle } from '@fortawesome/free-solid-svg-icons'
const ProjectList = ({ projects }) => {
return (
<div className="vertically-expanding-container">
{projects.length === 0 ? (
<div className="alert alert-info">
- <span className="info-icon fa fa-question-circle mr-2" />
+ <FontAwesomeIcon icon={faQuestionCircle} className="info-icon mr-2" />
<strong>No projects here yet...</strong> Add some with the 'New Project' button!
</div>
) : (
diff --git a/opendc-web/opendc-web-ui/src/components/projects/ProjectRow.js b/opendc-web/opendc-web-ui/src/components/projects/ProjectRow.js
index 9a95b777..91368de8 100644
--- a/opendc-web/opendc-web-ui/src/components/projects/ProjectRow.js
+++ b/opendc-web/opendc-web-ui/src/components/projects/ProjectRow.js
@@ -1,10 +1,10 @@
-import classNames from 'classnames'
import React from 'react'
import ProjectActions from '../../containers/projects/ProjectActions'
import { Project } from '../../shapes'
import { AUTH_DESCRIPTION_MAP, AUTH_ICON_MAP } from '../../util/authorizations'
import { parseAndFormatDateTime } from '../../util/date-time'
import { useAuth } from '../../auth'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
const ProjectRow = ({ project }) => {
const { user } = useAuth()
@@ -14,7 +14,7 @@ const ProjectRow = ({ project }) => {
<td className="pt-3">{project.name}</td>
<td className="pt-3">{parseAndFormatDateTime(project.datetimeLastEdited)}</td>
<td className="pt-3">
- <span className={classNames('fa', 'fa-' + AUTH_ICON_MAP[level], 'mr-2')} />
+ <FontAwesomeIcon icon={AUTH_ICON_MAP[level]} className="mr-2" />
{AUTH_DESCRIPTION_MAP[level]}
</td>
<ProjectActions projectId={project._id} />
diff --git a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/machine/DeleteMachineContainer.js b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/machine/DeleteMachineContainer.js
index f3344424..54e406f4 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/machine/DeleteMachineContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/machine/DeleteMachineContainer.js
@@ -3,6 +3,8 @@ import { useDispatch } from 'react-redux'
import ConfirmationModal from '../../../../../components/modals/ConfirmationModal'
import { deleteMachine } from '../../../../../redux/actions/topology/machine'
import { Button } from 'reactstrap'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faTrash } from '@fortawesome/free-solid-svg-icons'
const DeleteMachineContainer = () => {
const dispatch = useDispatch()
@@ -16,7 +18,7 @@ const DeleteMachineContainer = () => {
return (
<>
<Button color="danger" outline block onClick={() => setVisible(true)}>
- <span className="fa fa-trash mr-2" />
+ <FontAwesomeIcon icon={faTrash} className="mr-2" />
Delete this machine
</Button>
<ConfirmationModal
diff --git a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/DeleteRackContainer.js b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/DeleteRackContainer.js
index 290803c2..4463530e 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/DeleteRackContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/DeleteRackContainer.js
@@ -3,6 +3,8 @@ import { useDispatch } from 'react-redux'
import ConfirmationModal from '../../../../../components/modals/ConfirmationModal'
import { deleteRack } from '../../../../../redux/actions/topology/rack'
import { Button } from 'reactstrap'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faTrash } from '@fortawesome/free-solid-svg-icons'
const DeleteRackContainer = () => {
const dispatch = useDispatch()
@@ -16,7 +18,7 @@ const DeleteRackContainer = () => {
return (
<>
<Button color="danger" outline block onClick={() => setVisible(true)}>
- <span className="fa fa-trash mr-2" />
+ <FontAwesomeIcon icon={faTrash} className="mr-2" />
Delete this rack
</Button>
<ConfirmationModal
diff --git a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/DeleteRoomContainer.js b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/DeleteRoomContainer.js
index 3560c381..0fbbb036 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/DeleteRoomContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/DeleteRoomContainer.js
@@ -3,6 +3,8 @@ import { useDispatch } from 'react-redux'
import { Button } from 'reactstrap'
import ConfirmationModal from '../../../../../components/modals/ConfirmationModal'
import { deleteRoom } from '../../../../../redux/actions/topology/room'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faTrash } from '@fortawesome/free-solid-svg-icons'
const DeleteRoomContainer = () => {
const dispatch = useDispatch()
@@ -16,7 +18,7 @@ const DeleteRoomContainer = () => {
return (
<>
<Button color="danger" outline block onClick={() => setVisible(true)}>
- <span className="fa fa-trash mr-2" />
+ <FontAwesomeIcon icon={faTrash} className="mr-2" />
Delete this room
</Button>
<ConfirmationModal
diff --git a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/EditRoomContainer.js b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/EditRoomContainer.js
index 2ecdfbcf..ec4f586b 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/EditRoomContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/EditRoomContainer.js
@@ -2,6 +2,8 @@ import React from 'react'
import { useDispatch, useSelector } from 'react-redux'
import { finishRoomEdit, startRoomEdit } from '../../../../../redux/actions/topology/building'
import { Button } from 'reactstrap'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faCheck, faPencilAlt } from '@fortawesome/free-solid-svg-icons'
const EditRoomContainer = () => {
const isEditing = useSelector((state) => state.construction.currentRoomInConstruction !== '-1')
@@ -13,7 +15,7 @@ const EditRoomContainer = () => {
return isEditing ? (
<Button color="info" outline block onClick={onFinish}>
- <span className="fa fa-check mr-2" />
+ <FontAwesomeIcon icon={faCheck} className="mr-2" />
Finish editing room
</Button>
) : (
@@ -24,7 +26,7 @@ const EditRoomContainer = () => {
disabled={isInRackConstructionMode}
onClick={() => (isInRackConstructionMode ? undefined : onEdit())}
>
- <span className="fa fa-pencil mr-2" />
+ <FontAwesomeIcon icon={faPencilAlt} className="mr-2" />
Edit the tiles of this room
</Button>
)
diff --git a/opendc-web/opendc-web-ui/src/containers/auth/Login.js b/opendc-web/opendc-web-ui/src/containers/auth/Login.js
index 8459ef5f..d8083d89 100644
--- a/opendc-web/opendc-web-ui/src/containers/auth/Login.js
+++ b/opendc-web/opendc-web-ui/src/containers/auth/Login.js
@@ -1,6 +1,8 @@
import React from 'react'
import { Button } from 'reactstrap'
import { useAuth } from '../../auth'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faSignInAlt } from '@fortawesome/free-solid-svg-icons'
function Login({ visible, className }) {
const { loginWithRedirect } = useAuth()
@@ -11,7 +13,7 @@ function Login({ visible, className }) {
return (
<Button color="primary" onClick={() => loginWithRedirect()} className={className}>
- <span aria-hidden className="fa fa-sign-in" /> Sign In
+ <FontAwesomeIcon icon={faSignInAlt} /> Sign In
</Button>
)
}
diff --git a/opendc-web/opendc-web-ui/src/containers/projects/NewProjectContainer.js b/opendc-web/opendc-web-ui/src/containers/projects/NewProjectContainer.js
index a0e607b2..e03b5c07 100644
--- a/opendc-web/opendc-web-ui/src/containers/projects/NewProjectContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/projects/NewProjectContainer.js
@@ -3,6 +3,8 @@ import { useDispatch } from 'react-redux'
import { addProject } from '../../redux/actions/projects'
import TextInputModal from '../../components/modals/TextInputModal'
import { Button } from 'reactstrap'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faPlus } from '@fortawesome/free-solid-svg-icons'
/**
* A container for creating a new project.
@@ -21,7 +23,7 @@ const NewProjectContainer = () => {
<>
<div className="bottom-btn-container">
<Button color="primary" className="float-right" onClick={() => setVisible(true)}>
- <span className="fa fa-plus mr-2" />
+ <FontAwesomeIcon icon={faPlus} className="mr-2" />
New Project
</Button>
</div>
diff --git a/opendc-web/opendc-web-ui/src/pages/_document.js b/opendc-web/opendc-web-ui/src/pages/_document.js
index 943ae395..8e4680c0 100644
--- a/opendc-web/opendc-web-ui/src/pages/_document.js
+++ b/opendc-web/opendc-web-ui/src/pages/_document.js
@@ -69,7 +69,6 @@ class OpenDCDocument extends Document {
href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap"
rel="stylesheet"
/>
- <script async src="https://use.fontawesome.com/ece66a2e7c.js" />
{/* Google Analytics */}
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-84285092-3" />
diff --git a/opendc-web/opendc-web-ui/src/util/authorizations.js b/opendc-web/opendc-web-ui/src/util/authorizations.js
index 4086b35d..eb492d26 100644
--- a/opendc-web/opendc-web-ui/src/util/authorizations.js
+++ b/opendc-web/opendc-web-ui/src/util/authorizations.js
@@ -1,7 +1,9 @@
+import { faHome, faPencilAlt, faEye } from '@fortawesome/free-solid-svg-icons'
+
export const AUTH_ICON_MAP = {
- OWN: 'home',
- EDIT: 'pencil',
- VIEW: 'eye',
+ OWN: faHome,
+ EDIT: faPencilAlt,
+ VIEW: faEye,
}
export const AUTH_DESCRIPTION_MAP = {