summaryrefslogtreecommitdiff
path: root/opendc-web
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2021-05-16 17:07:58 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2021-05-17 17:06:50 +0200
commitd9e65dceb38cdb8dc4e464d388755f9456620566 (patch)
treedbc369de8c4a0effce95ca4a54ff6dbfad2b47f5 /opendc-web
parent1edbae1a0224e30bafb98638f419e1f967a9286f (diff)
ui: Restructure OpenDC frontend
This change updates the structure of the OpenDC frontend in order to improve the maintainability of the frontend.
Diffstat (limited to 'opendc-web')
-rw-r--r--opendc-web/opendc-web-ui/src/api/portfolios.js (renamed from opendc-web/opendc-web-ui/src/auth/hook.js)30
-rw-r--r--opendc-web/opendc-web-ui/src/api/prefabs.js39
-rw-r--r--opendc-web/opendc-web-ui/src/api/projects.js39
-rw-r--r--opendc-web/opendc-web-ui/src/api/routes/portfolios.js17
-rw-r--r--opendc-web/opendc-web-ui/src/api/routes/prefabs.js17
-rw-r--r--opendc-web/opendc-web-ui/src/api/routes/projects.js17
-rw-r--r--opendc-web/opendc-web-ui/src/api/routes/scenarios.js17
-rw-r--r--opendc-web/opendc-web-ui/src/api/routes/schedulers.js5
-rw-r--r--opendc-web/opendc-web-ui/src/api/routes/token-signin.js10
-rw-r--r--opendc-web/opendc-web-ui/src/api/routes/topologies.js17
-rw-r--r--opendc-web/opendc-web-ui/src/api/routes/traces.js5
-rw-r--r--opendc-web/opendc-web-ui/src/api/routes/users.js17
-rw-r--r--opendc-web/opendc-web-ui/src/api/scenarios.js39
-rw-r--r--opendc-web/opendc-web-ui/src/api/schedulers.js27
-rw-r--r--opendc-web/opendc-web-ui/src/api/token-signin.js32
-rw-r--r--opendc-web/opendc-web-ui/src/api/topologies.js39
-rw-r--r--opendc-web/opendc-web-ui/src/api/traces.js27
-rw-r--r--opendc-web/opendc-web-ui/src/api/users.js39
-rw-r--r--opendc-web/opendc-web-ui/src/auth.js (renamed from opendc-web/opendc-web-ui/src/auth/index.js)30
-rw-r--r--opendc-web/opendc-web-ui/src/components/app/map/groups/WallGroup.js2
-rw-r--r--opendc-web/opendc-web-ui/src/components/app/sidebars/Sidebar.module.scss4
-rw-r--r--opendc-web/opendc-web-ui/src/components/home/ContentSection.module.scss2
-rw-r--r--opendc-web/opendc-web-ui/src/components/navigation/Navbar.js2
-rw-r--r--opendc-web/opendc-web-ui/src/components/navigation/Navbar.module.scss4
-rw-r--r--opendc-web/opendc-web-ui/src/components/projects/ProjectRow.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/App.js12
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/map/GrayContainer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/map/MapStage.js4
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/map/RoomContainer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/map/TileContainer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/map/TopologyContainer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/map/controls/ScaleIndicatorContainer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/map/controls/ZoomControlContainer.js4
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/map/layers/MapLayer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/map/layers/ObjectHoverLayer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/map/layers/RoomHoverLayer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/project/PortfolioListContainer.js6
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/project/ScenarioListContainer.js10
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/project/TopologyListContainer.js6
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/building/NewRoomConstructionContainer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/machine/BackToRackContainer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/machine/DeleteMachineContainer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/machine/UnitAddContainer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/machine/UnitContainer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/AddPrefabContainer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/BackToRoomContainer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/DeleteRackContainer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/EmptySlotContainer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/MachineContainer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/RackNameContainer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/BackToBuildingContainer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/DeleteRoomContainer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/EditRoomContainer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/RackConstructionContainer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/RoomNameContainer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/auth/Login.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/auth/Logout.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/auth/ProfileName.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/navigation/AppNavbarContainer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/projects/NewProjectContainer.js2
-rw-r--r--opendc-web/opendc-web-ui/src/containers/projects/ProjectActions.js2
-rw-r--r--opendc-web/opendc-web-ui/src/data/experiments.js (renamed from opendc-web/opendc-web-ui/src/store/hooks/experiments.js)0
-rw-r--r--opendc-web/opendc-web-ui/src/data/map.js (renamed from opendc-web/opendc-web-ui/src/store/hooks/map.js)0
-rw-r--r--opendc-web/opendc-web-ui/src/data/project.js (renamed from opendc-web/opendc-web-ui/src/store/hooks/project.js)0
-rw-r--r--opendc-web/opendc-web-ui/src/data/topology.js (renamed from opendc-web/opendc-web-ui/src/store/hooks/topology.js)0
-rw-r--r--opendc-web/opendc-web-ui/src/hotkeys.js (renamed from opendc-web/opendc-web-ui/src/shortcuts/keymap.js)4
-rw-r--r--opendc-web/opendc-web-ui/src/index.scss4
-rw-r--r--opendc-web/opendc-web-ui/src/pages/_app.js2
-rw-r--r--opendc-web/opendc-web-ui/src/pages/profile.js26
-rw-r--r--opendc-web/opendc-web-ui/src/pages/projects/index.js4
-rw-r--r--opendc-web/opendc-web-ui/src/redux/actions/auth.js (renamed from opendc-web/opendc-web-ui/src/actions/auth.js)0
-rw-r--r--opendc-web/opendc-web-ui/src/redux/actions/interaction-level.js (renamed from opendc-web/opendc-web-ui/src/actions/interaction-level.js)0
-rw-r--r--opendc-web/opendc-web-ui/src/redux/actions/map.js (renamed from opendc-web/opendc-web-ui/src/actions/map.js)2
-rw-r--r--opendc-web/opendc-web-ui/src/redux/actions/objects.js (renamed from opendc-web/opendc-web-ui/src/actions/objects.js)0
-rw-r--r--opendc-web/opendc-web-ui/src/redux/actions/portfolios.js (renamed from opendc-web/opendc-web-ui/src/actions/portfolios.js)0
-rw-r--r--opendc-web/opendc-web-ui/src/redux/actions/prefabs.js (renamed from opendc-web/opendc-web-ui/src/actions/prefabs.js)0
-rw-r--r--opendc-web/opendc-web-ui/src/redux/actions/projects.js (renamed from opendc-web/opendc-web-ui/src/actions/projects.js)0
-rw-r--r--opendc-web/opendc-web-ui/src/redux/actions/scenarios.js (renamed from opendc-web/opendc-web-ui/src/actions/scenarios.js)0
-rw-r--r--opendc-web/opendc-web-ui/src/redux/actions/topologies.js (renamed from opendc-web/opendc-web-ui/src/actions/topologies.js)0
-rw-r--r--opendc-web/opendc-web-ui/src/redux/actions/topology/building.js (renamed from opendc-web/opendc-web-ui/src/actions/topology/building.js)0
-rw-r--r--opendc-web/opendc-web-ui/src/redux/actions/topology/machine.js (renamed from opendc-web/opendc-web-ui/src/actions/topology/machine.js)0
-rw-r--r--opendc-web/opendc-web-ui/src/redux/actions/topology/rack.js (renamed from opendc-web/opendc-web-ui/src/actions/topology/rack.js)0
-rw-r--r--opendc-web/opendc-web-ui/src/redux/actions/topology/room.js (renamed from opendc-web/opendc-web-ui/src/actions/topology/room.js)2
-rw-r--r--opendc-web/opendc-web-ui/src/redux/actions/users.js (renamed from opendc-web/opendc-web-ui/src/actions/users.js)0
-rw-r--r--opendc-web/opendc-web-ui/src/redux/index.js (renamed from opendc-web/opendc-web-ui/src/store/configure-store.js)8
-rw-r--r--opendc-web/opendc-web-ui/src/redux/middleware/viewport-adjustment.js (renamed from opendc-web/opendc-web-ui/src/store/middlewares/viewport-adjustment.js)4
-rw-r--r--opendc-web/opendc-web-ui/src/redux/reducers/auth.js (renamed from opendc-web/opendc-web-ui/src/reducers/auth.js)0
-rw-r--r--opendc-web/opendc-web-ui/src/redux/reducers/construction-mode.js (renamed from opendc-web/opendc-web-ui/src/reducers/construction-mode.js)0
-rw-r--r--opendc-web/opendc-web-ui/src/redux/reducers/current-ids.js (renamed from opendc-web/opendc-web-ui/src/reducers/current-ids.js)0
-rw-r--r--opendc-web/opendc-web-ui/src/redux/reducers/index.js (renamed from opendc-web/opendc-web-ui/src/reducers/index.js)0
-rw-r--r--opendc-web/opendc-web-ui/src/redux/reducers/interaction-level.js (renamed from opendc-web/opendc-web-ui/src/reducers/interaction-level.js)0
-rw-r--r--opendc-web/opendc-web-ui/src/redux/reducers/map.js (renamed from opendc-web/opendc-web-ui/src/reducers/map.js)0
-rw-r--r--opendc-web/opendc-web-ui/src/redux/reducers/objects.js (renamed from opendc-web/opendc-web-ui/src/reducers/objects.js)2
-rw-r--r--opendc-web/opendc-web-ui/src/redux/reducers/project-list.js (renamed from opendc-web/opendc-web-ui/src/reducers/project-list.js)0
-rw-r--r--opendc-web/opendc-web-ui/src/redux/sagas/index.js (renamed from opendc-web/opendc-web-ui/src/sagas/index.js)0
-rw-r--r--opendc-web/opendc-web-ui/src/redux/sagas/objects.js (renamed from opendc-web/opendc-web-ui/src/sagas/objects.js)10
-rw-r--r--opendc-web/opendc-web-ui/src/redux/sagas/portfolios.js (renamed from opendc-web/opendc-web-ui/src/sagas/portfolios.js)6
-rw-r--r--opendc-web/opendc-web-ui/src/redux/sagas/prefabs.js (renamed from opendc-web/opendc-web-ui/src/sagas/prefabs.js)2
-rw-r--r--opendc-web/opendc-web-ui/src/redux/sagas/profile.js (renamed from opendc-web/opendc-web-ui/src/sagas/profile.js)2
-rw-r--r--opendc-web/opendc-web-ui/src/redux/sagas/projects.js (renamed from opendc-web/opendc-web-ui/src/sagas/projects.js)2
-rw-r--r--opendc-web/opendc-web-ui/src/redux/sagas/scenarios.js (renamed from opendc-web/opendc-web-ui/src/sagas/scenarios.js)4
-rw-r--r--opendc-web/opendc-web-ui/src/redux/sagas/topology.js (renamed from opendc-web/opendc-web-ui/src/sagas/topology.js)4
-rw-r--r--opendc-web/opendc-web-ui/src/redux/sagas/users.js (renamed from opendc-web/opendc-web-ui/src/sagas/users.js)6
-rw-r--r--opendc-web/opendc-web-ui/src/shapes.js (renamed from opendc-web/opendc-web-ui/src/shapes/index.js)0
-rw-r--r--opendc-web/opendc-web-ui/src/style/_mixins.scss (renamed from opendc-web/opendc-web-ui/src/style-globals/_mixins.scss)0
-rw-r--r--opendc-web/opendc-web-ui/src/style/_variables.scss (renamed from opendc-web/opendc-web-ui/src/style-globals/_variables.scss)0
106 files changed, 435 insertions, 240 deletions
diff --git a/opendc-web/opendc-web-ui/src/auth/hook.js b/opendc-web/opendc-web-ui/src/api/portfolios.js
index 8dd85fdd..6202e702 100644
--- a/opendc-web/opendc-web-ui/src/auth/hook.js
+++ b/opendc-web/opendc-web-ui/src/api/portfolios.js
@@ -20,30 +20,20 @@
* SOFTWARE.
*/
-import { useEffect, useState } from 'react'
-import { userIsLoggedIn } from './index'
-import { useRouter } from 'next/router'
-import { useSelector } from 'react-redux'
+import { request } from './index'
-export function useIsLoggedIn() {
- const [isLoggedIn, setLoggedIn] = useState(false)
-
- useEffect(() => {
- setLoggedIn(userIsLoggedIn())
- }, [])
+export function addPortfolio(projectId, portfolio) {
+ return request(`projects/${projectId}/portfolios`, 'POST', { portfolio })
+}
- return isLoggedIn
+export function getPortfolio(portfolioId) {
+ return request(`portfolios/${portfolioId}`)
}
-export function useRequireAuth() {
- const router = useRouter()
- useEffect(() => {
- if (!userIsLoggedIn()) {
- router.replace('/')
- }
- })
+export function updatePortfolio(portfolioId, portfolio) {
+ return request(`portfolios/${portfolioId}`, 'PUT', { portfolio })
}
-export function useUser() {
- return useSelector((state) => state.auth)
+export function deletePortfolio(portfolioId) {
+ return request(`portfolios/${portfolioId}`, 'DELETE')
}
diff --git a/opendc-web/opendc-web-ui/src/api/prefabs.js b/opendc-web/opendc-web-ui/src/api/prefabs.js
new file mode 100644
index 00000000..a8bd3f3b
--- /dev/null
+++ b/opendc-web/opendc-web-ui/src/api/prefabs.js
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2021 AtLarge Research
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+import { request } from './index'
+
+export function getPrefab(prefabId) {
+ return request(`prefabs/${prefabId}`)
+}
+
+export function addPrefab(prefab) {
+ return request('prefabs', 'POST', { prefab })
+}
+
+export function updatePrefab(prefab) {
+ return request(`prefabs/${prefab._id}`, 'PUT', { prefab })
+}
+
+export function deletePrefab(prefabId) {
+ return request(`prefabs/${prefabId}`, 'DELETE')
+}
diff --git a/opendc-web/opendc-web-ui/src/api/projects.js b/opendc-web/opendc-web-ui/src/api/projects.js
new file mode 100644
index 00000000..9ff7deda
--- /dev/null
+++ b/opendc-web/opendc-web-ui/src/api/projects.js
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2021 AtLarge Research
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+import { request } from './index'
+
+export function getProject(projectId) {
+ return request(`projects/${projectId}`)
+}
+
+export function addProject(project) {
+ return request('projects', 'POST', { project })
+}
+
+export function updateProject(project) {
+ return request(`projects/${project._id}`, 'PUT', { project })
+}
+
+export function deleteProject(projectId) {
+ return request(`projects/${projectId}`, 'DELETE')
+}
diff --git a/opendc-web/opendc-web-ui/src/api/routes/portfolios.js b/opendc-web/opendc-web-ui/src/api/routes/portfolios.js
deleted file mode 100644
index ba15e828..00000000
--- a/opendc-web/opendc-web-ui/src/api/routes/portfolios.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import { request } from '../index'
-
-export function addPortfolio(projectId, portfolio) {
- return request(`projects/${projectId}/portfolios`, 'POST', { portfolio })
-}
-
-export function getPortfolio(portfolioId) {
- return request(`portfolios/${portfolioId}`)
-}
-
-export function updatePortfolio(portfolioId, portfolio) {
- return request(`portfolios/${portfolioId}`, 'PUT', { portfolio })
-}
-
-export function deletePortfolio(portfolioId) {
- return request(`portfolios/${portfolioId}`, 'DELETE')
-}
diff --git a/opendc-web/opendc-web-ui/src/api/routes/prefabs.js b/opendc-web/opendc-web-ui/src/api/routes/prefabs.js
deleted file mode 100644
index 032e12bc..00000000
--- a/opendc-web/opendc-web-ui/src/api/routes/prefabs.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import { request } from '../index'
-
-export function getPrefab(prefabId) {
- return request(`prefabs/${prefabId}`)
-}
-
-export function addPrefab(prefab) {
- return request('prefabs', 'POST', { prefab })
-}
-
-export function updatePrefab(prefab) {
- return request(`prefabs/${prefab._id}`, 'PUT', { prefab })
-}
-
-export function deletePrefab(prefabId) {
- return request(`prefabs/${prefabId}`, 'DELETE')
-}
diff --git a/opendc-web/opendc-web-ui/src/api/routes/projects.js b/opendc-web/opendc-web-ui/src/api/routes/projects.js
deleted file mode 100644
index cd46036f..00000000
--- a/opendc-web/opendc-web-ui/src/api/routes/projects.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import { request } from '../index'
-
-export function getProject(projectId) {
- return request(`projects/${projectId}`)
-}
-
-export function addProject(project) {
- return request('projects', 'POST', { project })
-}
-
-export function updateProject(project) {
- return request(`projects/${project._id}`, 'PUT', { project })
-}
-
-export function deleteProject(projectId) {
- return request(`projects/${projectId}`, 'DELETE')
-}
diff --git a/opendc-web/opendc-web-ui/src/api/routes/scenarios.js b/opendc-web/opendc-web-ui/src/api/routes/scenarios.js
deleted file mode 100644
index 00cc1eb0..00000000
--- a/opendc-web/opendc-web-ui/src/api/routes/scenarios.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import { request } from '../index'
-
-export function addScenario(portfolioId, scenario) {
- return request(`portfolios/${portfolioId}/scenarios`, 'POST', { scenario })
-}
-
-export function getScenario(scenarioId) {
- return request(`scenarios/${scenarioId}`)
-}
-
-export function updateScenario(scenarioId, scenario) {
- return request(`scenarios/${scenarioId}`, 'PUT', { scenario })
-}
-
-export function deleteScenario(scenarioId) {
- return request(`scenarios/${scenarioId}`, 'DELETE')
-}
diff --git a/opendc-web/opendc-web-ui/src/api/routes/schedulers.js b/opendc-web/opendc-web-ui/src/api/routes/schedulers.js
deleted file mode 100644
index 5e129d33..00000000
--- a/opendc-web/opendc-web-ui/src/api/routes/schedulers.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { request } from '../index'
-
-export function getAllSchedulers() {
- return request('schedulers')
-}
diff --git a/opendc-web/opendc-web-ui/src/api/routes/token-signin.js b/opendc-web/opendc-web-ui/src/api/routes/token-signin.js
deleted file mode 100644
index 1c285bdb..00000000
--- a/opendc-web/opendc-web-ui/src/api/routes/token-signin.js
+++ /dev/null
@@ -1,10 +0,0 @@
-export function performTokenSignIn(token) {
- const apiUrl = process.env.NEXT_PUBLIC_API_BASE_URL
-
- return fetch(`${apiUrl}/tokensignin`, {
- method: 'POST',
- body: new URLSearchParams({
- idtoken: token,
- }),
- }).then((res) => res.json())
-}
diff --git a/opendc-web/opendc-web-ui/src/api/routes/topologies.js b/opendc-web/opendc-web-ui/src/api/routes/topologies.js
deleted file mode 100644
index 076895ff..00000000
--- a/opendc-web/opendc-web-ui/src/api/routes/topologies.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import { request } from '../index'
-
-export function addTopology(topology) {
- return request(`projects/${topology.projectId}/topologies`, 'POST', { topology })
-}
-
-export function getTopology(topologyId) {
- return request(`topologies/${topologyId}`)
-}
-
-export function updateTopology(topology) {
- return request(`topologies/${topology._id}`, 'PUT', { topology })
-}
-
-export function deleteTopology(topologyId) {
- return request(`topologies/${topologyId}`, 'DELETE')
-}
diff --git a/opendc-web/opendc-web-ui/src/api/routes/traces.js b/opendc-web/opendc-web-ui/src/api/routes/traces.js
deleted file mode 100644
index eb2526ee..00000000
--- a/opendc-web/opendc-web-ui/src/api/routes/traces.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { request } from '../index'
-
-export function getAllTraces() {
- return request('traces')
-}
diff --git a/opendc-web/opendc-web-ui/src/api/routes/users.js b/opendc-web/opendc-web-ui/src/api/routes/users.js
deleted file mode 100644
index 619aec1f..00000000
--- a/opendc-web/opendc-web-ui/src/api/routes/users.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import { request } from '../index'
-
-export function getUserByEmail(email) {
- return request(`users` + new URLSearchParams({ email }))
-}
-
-export function addUser(user) {
- return request('users', 'POST', { user })
-}
-
-export function getUser(userId) {
- return request(`users/${userId}`)
-}
-
-export function deleteUser(userId) {
- return request(`users/${userId}`, 'DELETE')
-}
diff --git a/opendc-web/opendc-web-ui/src/api/scenarios.js b/opendc-web/opendc-web-ui/src/api/scenarios.js
new file mode 100644
index 00000000..9f8c717b
--- /dev/null
+++ b/opendc-web/opendc-web-ui/src/api/scenarios.js
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2021 AtLarge Research
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+import { request } from './index'
+
+export function addScenario(portfolioId, scenario) {
+ return request(`portfolios/${portfolioId}/scenarios`, 'POST', { scenario })
+}
+
+export function getScenario(scenarioId) {
+ return request(`scenarios/${scenarioId}`)
+}
+
+export function updateScenario(scenarioId, scenario) {
+ return request(`scenarios/${scenarioId}`, 'PUT', { scenario })
+}
+
+export function deleteScenario(scenarioId) {
+ return request(`scenarios/${scenarioId}`, 'DELETE')
+}
diff --git a/opendc-web/opendc-web-ui/src/api/schedulers.js b/opendc-web/opendc-web-ui/src/api/schedulers.js
new file mode 100644
index 00000000..7791e51e
--- /dev/null
+++ b/opendc-web/opendc-web-ui/src/api/schedulers.js
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2021 AtLarge Research
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+import { request } from './index'
+
+export function getAllSchedulers() {
+ return request('schedulers')
+}
diff --git a/opendc-web/opendc-web-ui/src/api/token-signin.js b/opendc-web/opendc-web-ui/src/api/token-signin.js
new file mode 100644
index 00000000..a3761fa1
--- /dev/null
+++ b/opendc-web/opendc-web-ui/src/api/token-signin.js
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2021 AtLarge Research
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+export function performTokenSignIn(token) {
+ const apiUrl = process.env.NEXT_PUBLIC_API_BASE_URL
+
+ return fetch(`${apiUrl}/tokensignin`, {
+ method: 'POST',
+ body: new URLSearchParams({
+ idtoken: token,
+ }),
+ }).then((res) => res.json())
+}
diff --git a/opendc-web/opendc-web-ui/src/api/topologies.js b/opendc-web/opendc-web-ui/src/api/topologies.js
new file mode 100644
index 00000000..e6df73c7
--- /dev/null
+++ b/opendc-web/opendc-web-ui/src/api/topologies.js
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2021 AtLarge Research
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+import { request } from './index'
+
+export function addTopology(topology) {
+ return request(`projects/${topology.projectId}/topologies`, 'POST', { topology })
+}
+
+export function getTopology(topologyId) {
+ return request(`topologies/${topologyId}`)
+}
+
+export function updateTopology(topology) {
+ return request(`topologies/${topology._id}`, 'PUT', { topology })
+}
+
+export function deleteTopology(topologyId) {
+ return request(`topologies/${topologyId}`, 'DELETE')
+}
diff --git a/opendc-web/opendc-web-ui/src/api/traces.js b/opendc-web/opendc-web-ui/src/api/traces.js
new file mode 100644
index 00000000..1c5cfa1d
--- /dev/null
+++ b/opendc-web/opendc-web-ui/src/api/traces.js
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2021 AtLarge Research
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+import { request } from './index'
+
+export function getAllTraces() {
+ return request('traces')
+}
diff --git a/opendc-web/opendc-web-ui/src/api/users.js b/opendc-web/opendc-web-ui/src/api/users.js
new file mode 100644
index 00000000..3da030ad
--- /dev/null
+++ b/opendc-web/opendc-web-ui/src/api/users.js
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2021 AtLarge Research
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+import { request } from './index'
+
+export function getUserByEmail(email) {
+ return request(`users` + new URLSearchParams({ email }))
+}
+
+export function addUser(user) {
+ return request('users', 'POST', { user })
+}
+
+export function getUser(userId) {
+ return request(`users/${userId}`)
+}
+
+export function deleteUser(userId) {
+ return request(`users/${userId}`, 'DELETE')
+}
diff --git a/opendc-web/opendc-web-ui/src/auth/index.js b/opendc-web/opendc-web-ui/src/auth.js
index 148e2e13..faed9829 100644
--- a/opendc-web/opendc-web-ui/src/auth/index.js
+++ b/opendc-web/opendc-web-ui/src/auth.js
@@ -1,5 +1,8 @@
-import { LOG_IN_SUCCEEDED, LOG_OUT } from '../actions/auth'
-import { DELETE_CURRENT_USER_SUCCEEDED } from '../actions/users'
+import { LOG_IN_SUCCEEDED, LOG_OUT } from './redux/actions/auth'
+import { DELETE_CURRENT_USER_SUCCEEDED } from './redux/actions/users'
+import { useEffect, useState } from 'react'
+import { useRouter } from 'next/router'
+import { useSelector } from 'react-redux'
const getAuthObject = () => {
const authItem = global.localStorage && localStorage.getItem('auth')
@@ -55,3 +58,26 @@ export const authRedirectMiddleware = (store) => (next) => (action) => {
next(action)
}
+
+export function useIsLoggedIn() {
+ const [isLoggedIn, setLoggedIn] = useState(false)
+
+ useEffect(() => {
+ setLoggedIn(userIsLoggedIn())
+ }, [])
+
+ return isLoggedIn
+}
+
+export function useRequireAuth() {
+ const router = useRouter()
+ useEffect(() => {
+ if (!userIsLoggedIn()) {
+ router.replace('/')
+ }
+ })
+}
+
+export function useUser() {
+ return useSelector((state) => state.auth)
+}
diff --git a/opendc-web/opendc-web-ui/src/components/app/map/groups/WallGroup.js b/opendc-web/opendc-web-ui/src/components/app/map/groups/WallGroup.js
index 855d444f..c73a95a7 100644
--- a/opendc-web/opendc-web-ui/src/components/app/map/groups/WallGroup.js
+++ b/opendc-web/opendc-web-ui/src/components/app/map/groups/WallGroup.js
@@ -1,7 +1,7 @@
import PropTypes from 'prop-types'
import React from 'react'
import { Group } from 'react-konva'
-import { Tile } from '../../../../shapes/index'
+import { Tile } from '../../../../shapes'
import { deriveWallLocations } from '../../../../util/tile-calculations'
import WallSegment from '../elements/WallSegment'
diff --git a/opendc-web/opendc-web-ui/src/components/app/sidebars/Sidebar.module.scss b/opendc-web/opendc-web-ui/src/components/app/sidebars/Sidebar.module.scss
index d6be4d9b..19c6a97f 100644
--- a/opendc-web/opendc-web-ui/src/components/app/sidebars/Sidebar.module.scss
+++ b/opendc-web/opendc-web-ui/src/components/app/sidebars/Sidebar.module.scss
@@ -1,5 +1,5 @@
-@import '../../../style-globals/_variables.scss';
-@import '../../../style-globals/_mixins.scss';
+@import 'src/style/_variables.scss';
+@import 'src/style/_mixins.scss';
.collapseButton {
position: absolute;
diff --git a/opendc-web/opendc-web-ui/src/components/home/ContentSection.module.scss b/opendc-web/opendc-web-ui/src/components/home/ContentSection.module.scss
index 3d150c93..d27a0ce0 100644
--- a/opendc-web/opendc-web-ui/src/components/home/ContentSection.module.scss
+++ b/opendc-web/opendc-web-ui/src/components/home/ContentSection.module.scss
@@ -1,4 +1,4 @@
-@import '../../style-globals/_variables.scss';
+@import 'src/style/_variables.scss';
.contentSection {
padding-top: 50px;
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 025d33a1..f16a3feb 100644
--- a/opendc-web/opendc-web-ui/src/components/navigation/Navbar.js
+++ b/opendc-web/opendc-web-ui/src/components/navigation/Navbar.js
@@ -15,7 +15,7 @@ import Login from '../../containers/auth/Login'
import Logout from '../../containers/auth/Logout'
import ProfileName from '../../containers/auth/ProfileName'
import { login, navbar, opendcBrand } from './Navbar.module.scss'
-import { useIsLoggedIn } from '../../auth/hook'
+import { useIsLoggedIn } from '../../auth'
export const NAVBAR_HEIGHT = 60
diff --git a/opendc-web/opendc-web-ui/src/components/navigation/Navbar.module.scss b/opendc-web/opendc-web-ui/src/components/navigation/Navbar.module.scss
index 2ea59a0f..8b9e4c97 100644
--- a/opendc-web/opendc-web-ui/src/components/navigation/Navbar.module.scss
+++ b/opendc-web/opendc-web-ui/src/components/navigation/Navbar.module.scss
@@ -1,5 +1,5 @@
-@import '../../style-globals/_mixins.scss';
-@import '../../style-globals/_variables.scss';
+@import 'src/style/_mixins.scss';
+@import 'src/style/_variables.scss';
.navbar {
border-top: $blue 3px solid;
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 bc63c805..a0aac098 100644
--- a/opendc-web/opendc-web-ui/src/components/projects/ProjectRow.js
+++ b/opendc-web/opendc-web-ui/src/components/projects/ProjectRow.js
@@ -1,7 +1,7 @@
import classNames from 'classnames'
import React from 'react'
import ProjectActions from '../../containers/projects/ProjectActions'
-import { Authorization } from '../../shapes/index'
+import { Authorization } from '../../shapes'
import { AUTH_DESCRIPTION_MAP, AUTH_ICON_MAP } from '../../util/authorizations'
import { parseAndFormatDateTime } from '../../util/date-time'
diff --git a/opendc-web/opendc-web-ui/src/containers/app/App.js b/opendc-web/opendc-web-ui/src/containers/app/App.js
index 432435cf..ec9714ce 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/App.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/App.js
@@ -25,8 +25,8 @@ import React, { useEffect } from 'react'
import Head from 'next/head'
import { HotKeys } from 'react-hotkeys'
import { useDispatch, useSelector } from 'react-redux'
-import { openPortfolioSucceeded } from '../../actions/portfolios'
-import { openProjectSucceeded } from '../../actions/projects'
+import { openPortfolioSucceeded } from '../../redux/actions/portfolios'
+import { openProjectSucceeded } from '../../redux/actions/projects'
import ToolPanelComponent from '../../components/app/map/controls/ToolPanelComponent'
import LoadingScreen from '../../components/app/map/LoadingScreen'
import ScaleIndicatorContainer from '../../containers/app/map/controls/ScaleIndicatorContainer'
@@ -34,11 +34,11 @@ import MapStage from '../../containers/app/map/MapStage'
import TopologySidebarContainer from '../../containers/app/sidebars/topology/TopologySidebarContainer'
import AppNavbarContainer from '../../containers/navigation/AppNavbarContainer'
import ProjectSidebarContainer from '../../containers/app/sidebars/project/ProjectSidebarContainer'
-import { openScenarioSucceeded } from '../../actions/scenarios'
+import { openScenarioSucceeded } from '../../redux/actions/scenarios'
import PortfolioResultsContainer from '../../containers/app/results/PortfolioResultsContainer'
-import KeymapConfiguration from '../../shortcuts/keymap'
-import { useRequireAuth } from '../../auth/hook'
-import { useActiveProject } from '../../store/hooks/project'
+import { KeymapConfiguration } from '../../hotkeys'
+import { useRequireAuth } from '../../auth'
+import { useActiveProject } from '../../data/project'
const App = ({ projectId, portfolioId, scenarioId }) => {
useRequireAuth()
diff --git a/opendc-web/opendc-web-ui/src/containers/app/map/GrayContainer.js b/opendc-web/opendc-web-ui/src/containers/app/map/GrayContainer.js
index 651b3459..bac24c8b 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/map/GrayContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/map/GrayContainer.js
@@ -1,6 +1,6 @@
import React from 'react'
import { useDispatch } from 'react-redux'
-import { goDownOneInteractionLevel } from '../../../actions/interaction-level'
+import { goDownOneInteractionLevel } from '../../../redux/actions/interaction-level'
import GrayLayer from '../../../components/app/map/elements/GrayLayer'
const GrayContainer = () => {
diff --git a/opendc-web/opendc-web-ui/src/containers/app/map/MapStage.js b/opendc-web/opendc-web-ui/src/containers/app/map/MapStage.js
index db9a2dd1..91ceb35d 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/map/MapStage.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/map/MapStage.js
@@ -1,8 +1,8 @@
import React from 'react'
import { useDispatch } from 'react-redux'
-import { setMapDimensions, setMapPositionWithBoundsCheck, zoomInOnPosition } from '../../../actions/map'
+import { setMapDimensions, setMapPositionWithBoundsCheck, zoomInOnPosition } from '../../../redux/actions/map'
import MapStageComponent from '../../../components/app/map/MapStageComponent'
-import { useMapDimensions, useMapPosition } from '../../../store/hooks/map'
+import { useMapDimensions, useMapPosition } from '../../../data/map'
const MapStage = () => {
const position = useMapPosition()
diff --git a/opendc-web/opendc-web-ui/src/containers/app/map/RoomContainer.js b/opendc-web/opendc-web-ui/src/containers/app/map/RoomContainer.js
index 877233fc..52d48317 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/map/RoomContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/map/RoomContainer.js
@@ -1,6 +1,6 @@
import React from 'react'
import { useDispatch, useSelector } from 'react-redux'
-import { goFromBuildingToRoom } from '../../../actions/interaction-level'
+import { goFromBuildingToRoom } from '../../../redux/actions/interaction-level'
import RoomGroup from '../../../components/app/map/groups/RoomGroup'
const RoomContainer = (props) => {
diff --git a/opendc-web/opendc-web-ui/src/containers/app/map/TileContainer.js b/opendc-web/opendc-web-ui/src/containers/app/map/TileContainer.js
index ad7301a7..f97e89a1 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/map/TileContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/map/TileContainer.js
@@ -1,6 +1,6 @@
import React from 'react'
import { useDispatch, useSelector } from 'react-redux'
-import { goFromRoomToRack } from '../../../actions/interaction-level'
+import { goFromRoomToRack } from '../../../redux/actions/interaction-level'
import TileGroup from '../../../components/app/map/groups/TileGroup'
const TileContainer = (props) => {
diff --git a/opendc-web/opendc-web-ui/src/containers/app/map/TopologyContainer.js b/opendc-web/opendc-web-ui/src/containers/app/map/TopologyContainer.js
index 25fbe3c0..e7ab3c72 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/map/TopologyContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/map/TopologyContainer.js
@@ -1,7 +1,7 @@
import React from 'react'
import { useSelector } from 'react-redux'
import TopologyGroup from '../../../components/app/map/groups/TopologyGroup'
-import { useActiveTopology } from '../../../store/hooks/topology'
+import { useActiveTopology } from '../../../data/topology'
const TopologyContainer = () => {
const topology = useActiveTopology()
diff --git a/opendc-web/opendc-web-ui/src/containers/app/map/controls/ScaleIndicatorContainer.js b/opendc-web/opendc-web-ui/src/containers/app/map/controls/ScaleIndicatorContainer.js
index 03834188..a10eea22 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/map/controls/ScaleIndicatorContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/map/controls/ScaleIndicatorContainer.js
@@ -1,6 +1,6 @@
import React from 'react'
import ScaleIndicatorComponent from '../../../../components/app/map/controls/ScaleIndicatorComponent'
-import { useMapScale } from '../../../../store/hooks/map'
+import { useMapScale } from '../../../../data/map'
const ScaleIndicatorContainer = (props) => {
const scale = useMapScale()
diff --git a/opendc-web/opendc-web-ui/src/containers/app/map/controls/ZoomControlContainer.js b/opendc-web/opendc-web-ui/src/containers/app/map/controls/ZoomControlContainer.js
index 797bdf7f..a39c6077 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/map/controls/ZoomControlContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/map/controls/ZoomControlContainer.js
@@ -1,8 +1,8 @@
import React from 'react'
import { useDispatch } from 'react-redux'
-import { zoomInOnCenter } from '../../../../actions/map'
+import { zoomInOnCenter } from '../../../../redux/actions/map'
import ZoomControlComponent from '../../../../components/app/map/controls/ZoomControlComponent'
-import { useMapScale } from '../../../../store/hooks/map'
+import { useMapScale } from '../../../../data/map'
const ZoomControlContainer = () => {
const dispatch = useDispatch()
diff --git a/opendc-web/opendc-web-ui/src/containers/app/map/layers/MapLayer.js b/opendc-web/opendc-web-ui/src/containers/app/map/layers/MapLayer.js
index ccd0ea8f..633ebcc7 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/map/layers/MapLayer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/map/layers/MapLayer.js
@@ -1,6 +1,6 @@
import React from 'react'
import MapLayerComponent from '../../../../components/app/map/layers/MapLayerComponent'
-import { useMapPosition, useMapScale } from '../../../../store/hooks/map'
+import { useMapPosition, useMapScale } from '../../../../data/map'
const MapLayer = (props) => {
const position = useMapPosition()
diff --git a/opendc-web/opendc-web-ui/src/containers/app/map/layers/ObjectHoverLayer.js b/opendc-web/opendc-web-ui/src/containers/app/map/layers/ObjectHoverLayer.js
index cefdf35c..8e934a01 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/map/layers/ObjectHoverLayer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/map/layers/ObjectHoverLayer.js
@@ -1,6 +1,6 @@
import React from 'react'
import { useDispatch, useSelector } from 'react-redux'
-import { addRackToTile } from '../../../../actions/topology/room'
+import { addRackToTile } from '../../../../redux/actions/topology/room'
import ObjectHoverLayerComponent from '../../../../components/app/map/layers/ObjectHoverLayerComponent'
import { findTileWithPosition } from '../../../../util/tile-calculations'
diff --git a/opendc-web/opendc-web-ui/src/containers/app/map/layers/RoomHoverLayer.js b/opendc-web/opendc-web-ui/src/containers/app/map/layers/RoomHoverLayer.js
index 2717d890..1bfadb6d 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/map/layers/RoomHoverLayer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/map/layers/RoomHoverLayer.js
@@ -1,6 +1,6 @@
import React from 'react'
import { useDispatch, useSelector } from 'react-redux'
-import { toggleTileAtLocation } from '../../../../actions/topology/building'
+import { toggleTileAtLocation } from '../../../../redux/actions/topology/building'
import RoomHoverLayerComponent from '../../../../components/app/map/layers/RoomHoverLayerComponent'
import {
deriveValidNextTilePositions,
diff --git a/opendc-web/opendc-web-ui/src/containers/app/sidebars/project/PortfolioListContainer.js b/opendc-web/opendc-web-ui/src/containers/app/sidebars/project/PortfolioListContainer.js
index dca7d7db..a36997ff 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/sidebars/project/PortfolioListContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/sidebars/project/PortfolioListContainer.js
@@ -2,11 +2,11 @@ import React, { useState } from 'react'
import { useDispatch } from 'react-redux'
import { useRouter } from 'next/router'
import PortfolioListComponent from '../../../../components/app/sidebars/project/PortfolioListComponent'
-import { addPortfolio, deletePortfolio, setCurrentPortfolio } from '../../../../actions/portfolios'
+import { addPortfolio, deletePortfolio, setCurrentPortfolio } from '../../../../redux/actions/portfolios'
import { getState } from '../../../../util/state-utils'
-import { setCurrentTopology } from '../../../../actions/topology/building'
+import { setCurrentTopology } from '../../../../redux/actions/topology/building'
import NewPortfolioModalComponent from '../../../../components/modals/custom-components/NewPortfolioModalComponent'
-import { useActivePortfolio, useActiveProject, usePortfolios } from '../../../../store/hooks/project'
+import { useActivePortfolio, useActiveProject, usePortfolios } from '../../../../data/project'
const PortfolioListContainer = () => {
const currentProjectId = useActiveProject()?._id
diff --git a/opendc-web/opendc-web-ui/src/containers/app/sidebars/project/ScenarioListContainer.js b/opendc-web/opendc-web-ui/src/containers/app/sidebars/project/ScenarioListContainer.js
index 5d747820..7aaa1886 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/sidebars/project/ScenarioListContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/sidebars/project/ScenarioListContainer.js
@@ -1,12 +1,12 @@
import React, { useState } from 'react'
import { useDispatch } from 'react-redux'
import ScenarioListComponent from '../../../../components/app/sidebars/project/ScenarioListComponent'
-import { addScenario, deleteScenario, setCurrentScenario } from '../../../../actions/scenarios'
-import { setCurrentPortfolio } from '../../../../actions/portfolios'
+import { addScenario, deleteScenario, setCurrentScenario } from '../../../../redux/actions/scenarios'
+import { setCurrentPortfolio } from '../../../../redux/actions/portfolios'
import NewScenarioModalComponent from '../../../../components/modals/custom-components/NewScenarioModalComponent'
-import { useProjectTopologies } from '../../../../store/hooks/topology'
-import { useActiveScenario, useActiveProject, useScenarios } from '../../../../store/hooks/project'
-import { useSchedulers, useTraces } from '../../../../store/hooks/experiments'
+import { useProjectTopologies } from '../../../../data/topology'
+import { useActiveScenario, useActiveProject, useScenarios } from '../../../../data/project'
+import { useSchedulers, useTraces } from '../../../../data/experiments'
const ScenarioListContainer = ({ portfolioId }) => {
const currentProjectId = useActiveProject()?._id
diff --git a/opendc-web/opendc-web-ui/src/containers/app/sidebars/project/TopologyListContainer.js b/opendc-web/opendc-web-ui/src/containers/app/sidebars/project/TopologyListContainer.js
index 3779705a..266ca495 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/sidebars/project/TopologyListContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/sidebars/project/TopologyListContainer.js
@@ -1,12 +1,12 @@
import React, { useState } from 'react'
import { useDispatch } from 'react-redux'
import TopologyListComponent from '../../../../components/app/sidebars/project/TopologyListComponent'
-import { setCurrentTopology } from '../../../../actions/topology/building'
+import { setCurrentTopology } from '../../../../redux/actions/topology/building'
import { useRouter } from 'next/router'
import { getState } from '../../../../util/state-utils'
-import { addTopology, deleteTopology } from '../../../../actions/topologies'
+import { addTopology, deleteTopology } from '../../../../redux/actions/topologies'
import NewTopologyModalComponent from '../../../../components/modals/custom-components/NewTopologyModalComponent'
-import { useActiveTopology, useProjectTopologies } from '../../../../store/hooks/topology'
+import { useActiveTopology, useProjectTopologies } from '../../../../data/topology'
const TopologyListContainer = () => {
const dispatch = useDispatch()
diff --git a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/building/NewRoomConstructionContainer.js b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/building/NewRoomConstructionContainer.js
index ea36539c..96f42a44 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/building/NewRoomConstructionContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/building/NewRoomConstructionContainer.js
@@ -4,7 +4,7 @@ import {
cancelNewRoomConstruction,
finishNewRoomConstruction,
startNewRoomConstruction,
-} from '../../../../../actions/topology/building'
+} from '../../../../../redux/actions/topology/building'
import StartNewRoomConstructionComponent from '../../../../../components/app/sidebars/topology/building/NewRoomConstructionComponent'
const NewRoomConstructionButton = (props) => {
diff --git a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/machine/BackToRackContainer.js b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/machine/BackToRackContainer.js
index 46862472..ea250767 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/machine/BackToRackContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/machine/BackToRackContainer.js
@@ -1,6 +1,6 @@
import React from 'react'
import { useDispatch } from 'react-redux'
-import { goDownOneInteractionLevel } from '../../../../../actions/interaction-level'
+import { goDownOneInteractionLevel } from '../../../../../redux/actions/interaction-level'
import BackToRackComponent from '../../../../../components/app/sidebars/topology/machine/BackToRackComponent'
const BackToRackContainer = (props) => {
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 2f171ce8..f3344424 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
@@ -1,7 +1,7 @@
import React, { useState } from 'react'
import { useDispatch } from 'react-redux'
import ConfirmationModal from '../../../../../components/modals/ConfirmationModal'
-import { deleteMachine } from '../../../../../actions/topology/machine'
+import { deleteMachine } from '../../../../../redux/actions/topology/machine'
import { Button } from 'reactstrap'
const DeleteMachineContainer = () => {
diff --git a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/machine/UnitAddContainer.js b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/machine/UnitAddContainer.js
index 3795cdff..0f85aa76 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/machine/UnitAddContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/machine/UnitAddContainer.js
@@ -1,6 +1,6 @@
import React from 'react'
import { useDispatch, useSelector } from 'react-redux'
-import { addUnit } from '../../../../../actions/topology/machine'
+import { addUnit } from '../../../../../redux/actions/topology/machine'
import UnitAddComponent from '../../../../../components/app/sidebars/topology/machine/UnitAddComponent'
const UnitAddContainer = (props) => {
diff --git a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/machine/UnitContainer.js b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/machine/UnitContainer.js
index 3d24859e..acb16a21 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/machine/UnitContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/machine/UnitContainer.js
@@ -1,6 +1,6 @@
import React from 'react'
import { useDispatch, useSelector } from 'react-redux'
-import { deleteUnit } from '../../../../../actions/topology/machine'
+import { deleteUnit } from '../../../../../redux/actions/topology/machine'
import UnitComponent from '../../../../../components/app/sidebars/topology/machine/UnitComponent'
const UnitContainer = ({ unitId, unitType }) => {
diff --git a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/AddPrefabContainer.js b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/AddPrefabContainer.js
index 3708e33e..c2a0fc48 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/AddPrefabContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/AddPrefabContainer.js
@@ -1,6 +1,6 @@
import React from 'react'
import { useDispatch } from 'react-redux'
-import { addPrefab } from '../../../../../actions/prefabs'
+import { addPrefab } from '../../../../../redux/actions/prefabs'
import AddPrefabComponent from '../../../../../components/app/sidebars/topology/rack/AddPrefabComponent'
const AddPrefabContainer = (props) => {
diff --git a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/BackToRoomContainer.js b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/BackToRoomContainer.js
index 93bb749f..a98728a6 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/BackToRoomContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/BackToRoomContainer.js
@@ -1,6 +1,6 @@
import React from 'react'
import { useDispatch } from 'react-redux'
-import { goDownOneInteractionLevel } from '../../../../../actions/interaction-level'
+import { goDownOneInteractionLevel } from '../../../../../redux/actions/interaction-level'
import BackToRoomComponent from '../../../../../components/app/sidebars/topology/rack/BackToRoomComponent'
const BackToRoomContainer = (props) => {
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 4c7fd8bf..290803c2 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
@@ -1,7 +1,7 @@
import React, { useState } from 'react'
import { useDispatch } from 'react-redux'
import ConfirmationModal from '../../../../../components/modals/ConfirmationModal'
-import { deleteRack } from '../../../../../actions/topology/rack'
+import { deleteRack } from '../../../../../redux/actions/topology/rack'
import { Button } from 'reactstrap'
const DeleteRackContainer = () => {
diff --git a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/EmptySlotContainer.js b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/EmptySlotContainer.js
index 5bb2c784..2134e411 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/EmptySlotContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/EmptySlotContainer.js
@@ -1,6 +1,6 @@
import React from 'react'
import { useDispatch } from 'react-redux'
-import { addMachine } from '../../../../../actions/topology/rack'
+import { addMachine } from '../../../../../redux/actions/topology/rack'
import EmptySlotComponent from '../../../../../components/app/sidebars/topology/rack/EmptySlotComponent'
const EmptySlotContainer = (props) => {
diff --git a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/MachineContainer.js b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/MachineContainer.js
index 149b4d18..7d8e32c1 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/MachineContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/MachineContainer.js
@@ -1,6 +1,6 @@
import React from 'react'
import { useDispatch, useSelector } from 'react-redux'
-import { goFromRackToMachine } from '../../../../../actions/interaction-level'
+import { goFromRackToMachine } from '../../../../../redux/actions/interaction-level'
import MachineComponent from '../../../../../components/app/sidebars/topology/rack/MachineComponent'
const MachineContainer = (props) => {
diff --git a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/RackNameContainer.js b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/RackNameContainer.js
index dd9b05fc..eaa1e78e 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/RackNameContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/rack/RackNameContainer.js
@@ -2,7 +2,7 @@ import React, { useState } from 'react'
import { useDispatch, useSelector } from 'react-redux'
import NameComponent from '../../../../../components/app/sidebars/topology/NameComponent'
import TextInputModal from '../../../../../components/modals/TextInputModal'
-import { editRackName } from '../../../../../actions/topology/rack'
+import { editRackName } from '../../../../../redux/actions/topology/rack'
const RackNameContainer = () => {
const [isVisible, setVisible] = useState(false)
diff --git a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/BackToBuildingContainer.js b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/BackToBuildingContainer.js
index a48bf0a7..9fa1e95f 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/BackToBuildingContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/BackToBuildingContainer.js
@@ -1,6 +1,6 @@
import React from 'react'
import { useDispatch } from 'react-redux'
-import { goDownOneInteractionLevel } from '../../../../../actions/interaction-level'
+import { goDownOneInteractionLevel } from '../../../../../redux/actions/interaction-level'
import BackToBuildingComponent from '../../../../../components/app/sidebars/topology/room/BackToBuildingComponent'
const BackToBuildingContainer = () => {
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 2062462f..3560c381 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
@@ -2,7 +2,7 @@ import React, { useState } from 'react'
import { useDispatch } from 'react-redux'
import { Button } from 'reactstrap'
import ConfirmationModal from '../../../../../components/modals/ConfirmationModal'
-import { deleteRoom } from '../../../../../actions/topology/room'
+import { deleteRoom } from '../../../../../redux/actions/topology/room'
const DeleteRoomContainer = () => {
const dispatch = useDispatch()
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 f03b0efb..2ecdfbcf 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
@@ -1,6 +1,6 @@
import React from 'react'
import { useDispatch, useSelector } from 'react-redux'
-import { finishRoomEdit, startRoomEdit } from '../../../../../actions/topology/building'
+import { finishRoomEdit, startRoomEdit } from '../../../../../redux/actions/topology/building'
import { Button } from 'reactstrap'
const EditRoomContainer = () => {
diff --git a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/RackConstructionContainer.js b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/RackConstructionContainer.js
index 726e9d37..79584e98 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/RackConstructionContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/RackConstructionContainer.js
@@ -1,6 +1,6 @@
import React from 'react'
import { useDispatch, useSelector } from 'react-redux'
-import { startRackConstruction, stopRackConstruction } from '../../../../../actions/topology/room'
+import { startRackConstruction, stopRackConstruction } from '../../../../../redux/actions/topology/room'
import RackConstructionComponent from '../../../../../components/app/sidebars/topology/room/RackConstructionComponent'
const RackConstructionContainer = (props) => {
diff --git a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/RoomNameContainer.js b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/RoomNameContainer.js
index 946bb864..3b35a849 100644
--- a/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/RoomNameContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/app/sidebars/topology/room/RoomNameContainer.js
@@ -2,7 +2,7 @@ import React, { useState } from 'react'
import { useDispatch, useSelector } from 'react-redux'
import NameComponent from '../../../../../components/app/sidebars/topology/NameComponent'
import TextInputModal from '../../../../../components/modals/TextInputModal'
-import { editRoomName } from '../../../../../actions/topology/room'
+import { editRoomName } from '../../../../../redux/actions/topology/room'
const RoomNameContainer = () => {
const [isVisible, setVisible] = useState(false)
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 178f269e..b0da0d0e 100644
--- a/opendc-web/opendc-web-ui/src/containers/auth/Login.js
+++ b/opendc-web/opendc-web-ui/src/containers/auth/Login.js
@@ -1,7 +1,7 @@
import React from 'react'
import GoogleLogin from 'react-google-login'
import { useDispatch } from 'react-redux'
-import { logIn } from '../../actions/auth'
+import { logIn } from '../../redux/actions/auth'
import { Button } from 'reactstrap'
function Login({ visible, className }) {
diff --git a/opendc-web/opendc-web-ui/src/containers/auth/Logout.js b/opendc-web/opendc-web-ui/src/containers/auth/Logout.js
index 66f0f6db..94d4d061 100644
--- a/opendc-web/opendc-web-ui/src/containers/auth/Logout.js
+++ b/opendc-web/opendc-web-ui/src/containers/auth/Logout.js
@@ -1,6 +1,6 @@
import React from 'react'
import { useDispatch } from 'react-redux'
-import { logOut } from '../../actions/auth'
+import { logOut } from '../../redux/actions/auth'
import LogoutButton from '../../components/navigation/LogoutButton'
const Logout = (props) => {
diff --git a/opendc-web/opendc-web-ui/src/containers/auth/ProfileName.js b/opendc-web/opendc-web-ui/src/containers/auth/ProfileName.js
index cbbe42b4..3992c00f 100644
--- a/opendc-web/opendc-web-ui/src/containers/auth/ProfileName.js
+++ b/opendc-web/opendc-web-ui/src/containers/auth/ProfileName.js
@@ -1,5 +1,5 @@
import React from 'react'
-import { useUser } from '../../auth/hook'
+import { useUser } from '../../auth'
function ProfileName() {
const user = useUser()
diff --git a/opendc-web/opendc-web-ui/src/containers/navigation/AppNavbarContainer.js b/opendc-web/opendc-web-ui/src/containers/navigation/AppNavbarContainer.js
index 47988827..6742bc26 100644
--- a/opendc-web/opendc-web-ui/src/containers/navigation/AppNavbarContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/navigation/AppNavbarContainer.js
@@ -1,6 +1,6 @@
import React from 'react'
import AppNavbarComponent from '../../components/navigation/AppNavbarComponent'
-import { useActiveProject } from '../../store/hooks/project'
+import { useActiveProject } from '../../data/project'
const AppNavbarContainer = (props) => {
const project = useActiveProject()
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 5a8a2dcf..a0e607b2 100644
--- a/opendc-web/opendc-web-ui/src/containers/projects/NewProjectContainer.js
+++ b/opendc-web/opendc-web-ui/src/containers/projects/NewProjectContainer.js
@@ -1,6 +1,6 @@
import React, { useState } from 'react'
import { useDispatch } from 'react-redux'
-import { addProject } from '../../actions/projects'
+import { addProject } from '../../redux/actions/projects'
import TextInputModal from '../../components/modals/TextInputModal'
import { Button } from 'reactstrap'
diff --git a/opendc-web/opendc-web-ui/src/containers/projects/ProjectActions.js b/opendc-web/opendc-web-ui/src/containers/projects/ProjectActions.js
index a13034e9..bdb422dc 100644
--- a/opendc-web/opendc-web-ui/src/containers/projects/ProjectActions.js
+++ b/opendc-web/opendc-web-ui/src/containers/projects/ProjectActions.js
@@ -1,6 +1,6 @@
import React from 'react'
import { useDispatch } from 'react-redux'
-import { deleteProject } from '../../actions/projects'
+import { deleteProject } from '../../redux/actions/projects'
import ProjectActionButtons from '../../components/projects/ProjectActionButtons'
const ProjectActions = (props) => {
diff --git a/opendc-web/opendc-web-ui/src/store/hooks/experiments.js b/opendc-web/opendc-web-ui/src/data/experiments.js
index aef512e5..aef512e5 100644
--- a/opendc-web/opendc-web-ui/src/store/hooks/experiments.js
+++ b/opendc-web/opendc-web-ui/src/data/experiments.js
diff --git a/opendc-web/opendc-web-ui/src/store/hooks/map.js b/opendc-web/opendc-web-ui/src/data/map.js
index 6aef6ac5..6aef6ac5 100644
--- a/opendc-web/opendc-web-ui/src/store/hooks/map.js
+++ b/opendc-web/opendc-web-ui/src/data/map.js
diff --git a/opendc-web/opendc-web-ui/src/store/hooks/project.js b/opendc-web/opendc-web-ui/src/data/project.js
index 0db49fdd..0db49fdd 100644
--- a/opendc-web/opendc-web-ui/src/store/hooks/project.js
+++ b/opendc-web/opendc-web-ui/src/data/project.js
diff --git a/opendc-web/opendc-web-ui/src/store/hooks/topology.js b/opendc-web/opendc-web-ui/src/data/topology.js
index d3ffb3e1..d3ffb3e1 100644
--- a/opendc-web/opendc-web-ui/src/store/hooks/topology.js
+++ b/opendc-web/opendc-web-ui/src/data/topology.js
diff --git a/opendc-web/opendc-web-ui/src/shortcuts/keymap.js b/opendc-web/opendc-web-ui/src/hotkeys.js
index 8260ace2..1c4d2621 100644
--- a/opendc-web/opendc-web-ui/src/shortcuts/keymap.js
+++ b/opendc-web/opendc-web-ui/src/hotkeys.js
@@ -1,8 +1,6 @@
-const KeymapConfiguration = {
+export const KeymapConfiguration = {
MOVE_LEFT: ['a', 'left'],
MOVE_RIGHT: ['d', 'right'],
MOVE_UP: ['w', 'up'],
MOVE_DOWN: ['s', 'down'],
}
-
-export default KeymapConfiguration
diff --git a/opendc-web/opendc-web-ui/src/index.scss b/opendc-web/opendc-web-ui/src/index.scss
index 1a4d1303..dbd9550c 100644
--- a/opendc-web/opendc-web-ui/src/index.scss
+++ b/opendc-web/opendc-web-ui/src/index.scss
@@ -1,7 +1,7 @@
@import '~bootstrap/scss/bootstrap';
-@import './style-globals/_mixins.scss';
-@import './style-globals/_variables.scss';
+@import './style/_mixins.scss';
+@import './style/_variables.scss';
html,
body,
diff --git a/opendc-web/opendc-web-ui/src/pages/_app.js b/opendc-web/opendc-web-ui/src/pages/_app.js
index 77ffa698..761ae0cd 100644
--- a/opendc-web/opendc-web-ui/src/pages/_app.js
+++ b/opendc-web/opendc-web-ui/src/pages/_app.js
@@ -22,7 +22,7 @@
import Head from 'next/head'
import { Provider } from 'react-redux'
-import { useStore } from '../store/configure-store'
+import { useStore } from '../redux'
import '../index.scss'
export default function App({ Component, pageProps }) {
diff --git a/opendc-web/opendc-web-ui/src/pages/profile.js b/opendc-web/opendc-web-ui/src/pages/profile.js
index de60037b..97afc4d9 100644
--- a/opendc-web/opendc-web-ui/src/pages/profile.js
+++ b/opendc-web/opendc-web-ui/src/pages/profile.js
@@ -1,10 +1,32 @@
+/*
+ * Copyright (c) 2021 AtLarge Research
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
import React, { useState } from 'react'
import Head from 'next/head'
import { useDispatch } from 'react-redux'
import AppNavbarContainer from '../containers/navigation/AppNavbarContainer'
import ConfirmationModal from '../components/modals/ConfirmationModal'
-import { deleteCurrentUser } from '../actions/users'
-import { useRequireAuth } from '../auth/hook'
+import { deleteCurrentUser } from '../redux/actions/users'
+import { useRequireAuth } from '../auth'
const Profile = () => {
useRequireAuth()
diff --git a/opendc-web/opendc-web-ui/src/pages/projects/index.js b/opendc-web/opendc-web-ui/src/pages/projects/index.js
index dd61751f..05e9514f 100644
--- a/opendc-web/opendc-web-ui/src/pages/projects/index.js
+++ b/opendc-web/opendc-web-ui/src/pages/projects/index.js
@@ -1,12 +1,12 @@
import React, { useEffect, useState } from 'react'
import Head from 'next/head'
import { useDispatch } from 'react-redux'
-import { fetchAuthorizationsOfCurrentUser } from '../../actions/users'
+import { fetchAuthorizationsOfCurrentUser } from '../../redux/actions/users'
import ProjectFilterPanel from '../../components/projects/FilterPanel'
import NewProjectContainer from '../../containers/projects/NewProjectContainer'
import VisibleProjectList from '../../containers/projects/VisibleProjectAuthList'
import AppNavbarContainer from '../../containers/navigation/AppNavbarContainer'
-import { useRequireAuth } from '../../auth/hook'
+import { useRequireAuth } from '../../auth'
import { Container } from 'reactstrap'
function Projects() {
diff --git a/opendc-web/opendc-web-ui/src/actions/auth.js b/opendc-web/opendc-web-ui/src/redux/actions/auth.js
index 38c1a782..38c1a782 100644
--- a/opendc-web/opendc-web-ui/src/actions/auth.js
+++ b/opendc-web/opendc-web-ui/src/redux/actions/auth.js
diff --git a/opendc-web/opendc-web-ui/src/actions/interaction-level.js b/opendc-web/opendc-web-ui/src/redux/actions/interaction-level.js
index ff6b1fa3..ff6b1fa3 100644
--- a/opendc-web/opendc-web-ui/src/actions/interaction-level.js
+++ b/opendc-web/opendc-web-ui/src/redux/actions/interaction-level.js
diff --git a/opendc-web/opendc-web-ui/src/actions/map.js b/opendc-web/opendc-web-ui/src/redux/actions/map.js
index 09196dca..aa14cacd 100644
--- a/opendc-web/opendc-web-ui/src/actions/map.js
+++ b/opendc-web/opendc-web-ui/src/redux/actions/map.js
@@ -3,7 +3,7 @@ import {
MAP_MIN_SCALE,
MAP_SCALE_PER_EVENT,
MAP_SIZE_IN_PIXELS,
-} from '../components/app/map/MapConstants'
+} from '../../components/app/map/MapConstants'
export const SET_MAP_POSITION = 'SET_MAP_POSITION'
export const SET_MAP_DIMENSIONS = 'SET_MAP_DIMENSIONS'
diff --git a/opendc-web/opendc-web-ui/src/actions/objects.js b/opendc-web/opendc-web-ui/src/redux/actions/objects.js
index 7b648b18..7b648b18 100644
--- a/opendc-web/opendc-web-ui/src/actions/objects.js
+++ b/opendc-web/opendc-web-ui/src/redux/actions/objects.js
diff --git a/opendc-web/opendc-web-ui/src/actions/portfolios.js b/opendc-web/opendc-web-ui/src/redux/actions/portfolios.js
index d37886d8..d37886d8 100644
--- a/opendc-web/opendc-web-ui/src/actions/portfolios.js
+++ b/opendc-web/opendc-web-ui/src/redux/actions/portfolios.js
diff --git a/opendc-web/opendc-web-ui/src/actions/prefabs.js b/opendc-web/opendc-web-ui/src/redux/actions/prefabs.js
index c112feed..c112feed 100644
--- a/opendc-web/opendc-web-ui/src/actions/prefabs.js
+++ b/opendc-web/opendc-web-ui/src/redux/actions/prefabs.js
diff --git a/opendc-web/opendc-web-ui/src/actions/projects.js b/opendc-web/opendc-web-ui/src/redux/actions/projects.js
index 15158164..15158164 100644
--- a/opendc-web/opendc-web-ui/src/actions/projects.js
+++ b/opendc-web/opendc-web-ui/src/redux/actions/projects.js
diff --git a/opendc-web/opendc-web-ui/src/actions/scenarios.js b/opendc-web/opendc-web-ui/src/redux/actions/scenarios.js
index c8a90762..c8a90762 100644
--- a/opendc-web/opendc-web-ui/src/actions/scenarios.js
+++ b/opendc-web/opendc-web-ui/src/redux/actions/scenarios.js
diff --git a/opendc-web/opendc-web-ui/src/actions/topologies.js b/opendc-web/opendc-web-ui/src/redux/actions/topologies.js
index dcce3b7d..dcce3b7d 100644
--- a/opendc-web/opendc-web-ui/src/actions/topologies.js
+++ b/opendc-web/opendc-web-ui/src/redux/actions/topologies.js
diff --git a/opendc-web/opendc-web-ui/src/actions/topology/building.js b/opendc-web/opendc-web-ui/src/redux/actions/topology/building.js
index 72deda6f..72deda6f 100644
--- a/opendc-web/opendc-web-ui/src/actions/topology/building.js
+++ b/opendc-web/opendc-web-ui/src/redux/actions/topology/building.js
diff --git a/opendc-web/opendc-web-ui/src/actions/topology/machine.js b/opendc-web/opendc-web-ui/src/redux/actions/topology/machine.js
index 17ccce5d..17ccce5d 100644
--- a/opendc-web/opendc-web-ui/src/actions/topology/machine.js
+++ b/opendc-web/opendc-web-ui/src/redux/actions/topology/machine.js
diff --git a/opendc-web/opendc-web-ui/src/actions/topology/rack.js b/opendc-web/opendc-web-ui/src/redux/actions/topology/rack.js
index b117402e..b117402e 100644
--- a/opendc-web/opendc-web-ui/src/actions/topology/rack.js
+++ b/opendc-web/opendc-web-ui/src/redux/actions/topology/rack.js
diff --git a/opendc-web/opendc-web-ui/src/actions/topology/room.js b/opendc-web/opendc-web-ui/src/redux/actions/topology/room.js
index 52cba680..61eea7fe 100644
--- a/opendc-web/opendc-web-ui/src/actions/topology/room.js
+++ b/opendc-web/opendc-web-ui/src/redux/actions/topology/room.js
@@ -1,4 +1,4 @@
-import { findTileWithPosition } from '../../util/tile-calculations'
+import { findTileWithPosition } from '../../../util/tile-calculations'
export const EDIT_ROOM_NAME = 'EDIT_ROOM_NAME'
export const DELETE_ROOM = 'DELETE_ROOM'
diff --git a/opendc-web/opendc-web-ui/src/actions/users.js b/opendc-web/opendc-web-ui/src/redux/actions/users.js
index 4868ac34..4868ac34 100644
--- a/opendc-web/opendc-web-ui/src/actions/users.js
+++ b/opendc-web/opendc-web-ui/src/redux/actions/users.js
diff --git a/opendc-web/opendc-web-ui/src/store/configure-store.js b/opendc-web/opendc-web-ui/src/redux/index.js
index 149536a3..c706752b 100644
--- a/opendc-web/opendc-web-ui/src/store/configure-store.js
+++ b/opendc-web/opendc-web-ui/src/redux/index.js
@@ -4,10 +4,10 @@ import { createLogger } from 'redux-logger'
import persistState from 'redux-localstorage'
import createSagaMiddleware from 'redux-saga'
import thunk from 'redux-thunk'
-import { authRedirectMiddleware } from '../auth/index'
-import rootReducer from '../reducers/index'
-import rootSaga from '../sagas/index'
-import { viewportAdjustmentMiddleware } from './middlewares/viewport-adjustment'
+import { authRedirectMiddleware } from '../auth'
+import rootReducer from './reducers'
+import rootSaga from './sagas'
+import { viewportAdjustmentMiddleware } from './middleware/viewport-adjustment'
let store
diff --git a/opendc-web/opendc-web-ui/src/store/middlewares/viewport-adjustment.js b/opendc-web/opendc-web-ui/src/redux/middleware/viewport-adjustment.js
index b4472c54..6b22eb80 100644
--- a/opendc-web/opendc-web-ui/src/store/middlewares/viewport-adjustment.js
+++ b/opendc-web/opendc-web-ui/src/redux/middleware/viewport-adjustment.js
@@ -1,5 +1,5 @@
-import { SET_MAP_DIMENSIONS, setMapPosition, setMapScale } from '../../actions/map'
-import { SET_CURRENT_TOPOLOGY } from '../../actions/topology/building'
+import { SET_MAP_DIMENSIONS, setMapPosition, setMapScale } from '../actions/map'
+import { SET_CURRENT_TOPOLOGY } from '../actions/topology/building'
import {
MAP_MAX_SCALE,
MAP_MIN_SCALE,
diff --git a/opendc-web/opendc-web-ui/src/reducers/auth.js b/opendc-web/opendc-web-ui/src/redux/reducers/auth.js
index 399a4b10..399a4b10 100644
--- a/opendc-web/opendc-web-ui/src/reducers/auth.js
+++ b/opendc-web/opendc-web-ui/src/redux/reducers/auth.js
diff --git a/opendc-web/opendc-web-ui/src/reducers/construction-mode.js b/opendc-web/opendc-web-ui/src/redux/reducers/construction-mode.js
index 257dddd2..257dddd2 100644
--- a/opendc-web/opendc-web-ui/src/reducers/construction-mode.js
+++ b/opendc-web/opendc-web-ui/src/redux/reducers/construction-mode.js
diff --git a/opendc-web/opendc-web-ui/src/reducers/current-ids.js b/opendc-web/opendc-web-ui/src/redux/reducers/current-ids.js
index 9b46aa60..9b46aa60 100644
--- a/opendc-web/opendc-web-ui/src/reducers/current-ids.js
+++ b/opendc-web/opendc-web-ui/src/redux/reducers/current-ids.js
diff --git a/opendc-web/opendc-web-ui/src/reducers/index.js b/opendc-web/opendc-web-ui/src/redux/reducers/index.js
index 9dff379b..9dff379b 100644
--- a/opendc-web/opendc-web-ui/src/reducers/index.js
+++ b/opendc-web/opendc-web-ui/src/redux/reducers/index.js
diff --git a/opendc-web/opendc-web-ui/src/reducers/interaction-level.js b/opendc-web/opendc-web-ui/src/redux/reducers/interaction-level.js
index eafcb269..eafcb269 100644
--- a/opendc-web/opendc-web-ui/src/reducers/interaction-level.js
+++ b/opendc-web/opendc-web-ui/src/redux/reducers/interaction-level.js
diff --git a/opendc-web/opendc-web-ui/src/reducers/map.js b/opendc-web/opendc-web-ui/src/redux/reducers/map.js
index de712c15..de712c15 100644
--- a/opendc-web/opendc-web-ui/src/reducers/map.js
+++ b/opendc-web/opendc-web-ui/src/redux/reducers/map.js
diff --git a/opendc-web/opendc-web-ui/src/reducers/objects.js b/opendc-web/opendc-web-ui/src/redux/reducers/objects.js
index 1f721b2e..a2483b43 100644
--- a/opendc-web/opendc-web-ui/src/reducers/objects.js
+++ b/opendc-web/opendc-web-ui/src/redux/reducers/objects.js
@@ -5,7 +5,7 @@ import {
ADD_TO_STORE,
REMOVE_ID_FROM_STORE_OBJECT_LIST_PROP,
} from '../actions/objects'
-import { CPU_UNITS, GPU_UNITS, MEMORY_UNITS, STORAGE_UNITS } from '../util/unit-specifications'
+import { CPU_UNITS, GPU_UNITS, MEMORY_UNITS, STORAGE_UNITS } from '../../util/unit-specifications'
export const objects = combineReducers({
project: object('project'),
diff --git a/opendc-web/opendc-web-ui/src/reducers/project-list.js b/opendc-web/opendc-web-ui/src/redux/reducers/project-list.js
index ad803db0..ad803db0 100644
--- a/opendc-web/opendc-web-ui/src/reducers/project-list.js
+++ b/opendc-web/opendc-web-ui/src/redux/reducers/project-list.js
diff --git a/opendc-web/opendc-web-ui/src/sagas/index.js b/opendc-web/opendc-web-ui/src/redux/sagas/index.js
index 6332b2fb..6332b2fb 100644
--- a/opendc-web/opendc-web-ui/src/sagas/index.js
+++ b/opendc-web/opendc-web-ui/src/redux/sagas/index.js
diff --git a/opendc-web/opendc-web-ui/src/sagas/objects.js b/opendc-web/opendc-web-ui/src/redux/sagas/objects.js
index 313d9976..82dbb935 100644
--- a/opendc-web/opendc-web-ui/src/sagas/objects.js
+++ b/opendc-web/opendc-web-ui/src/redux/sagas/objects.js
@@ -1,10 +1,10 @@
import { call, put, select } from 'redux-saga/effects'
import { addToStore } from '../actions/objects'
-import { getAllSchedulers } from '../api/routes/schedulers'
-import { getProject } from '../api/routes/projects'
-import { getAllTraces } from '../api/routes/traces'
-import { getUser } from '../api/routes/users'
-import { getTopology, updateTopology } from '../api/routes/topologies'
+import { getAllSchedulers } from '../../api/schedulers'
+import { getProject } from '../../api/projects'
+import { getAllTraces } from '../../api/traces'
+import { getUser } from '../../api/users'
+import { getTopology, updateTopology } from '../../api/topologies'
import { uuid } from 'uuidv4'
export const OBJECT_SELECTORS = {
diff --git a/opendc-web/opendc-web-ui/src/sagas/portfolios.js b/opendc-web/opendc-web-ui/src/redux/sagas/portfolios.js
index ed9bfd29..8ddf888d 100644
--- a/opendc-web/opendc-web-ui/src/sagas/portfolios.js
+++ b/opendc-web/opendc-web-ui/src/redux/sagas/portfolios.js
@@ -1,10 +1,10 @@
import { call, put, select, delay } from 'redux-saga/effects'
import { addPropToStoreObject, addToStore } from '../actions/objects'
-import { addPortfolio, deletePortfolio, getPortfolio, updatePortfolio } from '../api/routes/portfolios'
-import { getProject } from '../api/routes/projects'
+import { addPortfolio, deletePortfolio, getPortfolio, updatePortfolio } from '../../api/portfolios'
+import { getProject } from '../../api/projects'
import { fetchAndStoreAllSchedulers, fetchAndStoreAllTraces } from './objects'
import { fetchAndStoreAllTopologiesOfProject } from './topology'
-import { getScenario } from '../api/routes/scenarios'
+import { getScenario } from '../../api/scenarios'
export function* onOpenPortfolioSucceeded(action) {
try {
diff --git a/opendc-web/opendc-web-ui/src/sagas/prefabs.js b/opendc-web/opendc-web-ui/src/redux/sagas/prefabs.js
index 16cf3d62..3158a219 100644
--- a/opendc-web/opendc-web-ui/src/sagas/prefabs.js
+++ b/opendc-web/opendc-web-ui/src/redux/sagas/prefabs.js
@@ -1,6 +1,6 @@
import { call, put, select } from 'redux-saga/effects'
import { addToStore } from '../actions/objects'
-import { addPrefab } from '../api/routes/prefabs'
+import { addPrefab } from '../../api/prefabs'
import { getRackById } from './objects'
export function* onAddPrefab(action) {
diff --git a/opendc-web/opendc-web-ui/src/sagas/profile.js b/opendc-web/opendc-web-ui/src/redux/sagas/profile.js
index e914ba56..e187b765 100644
--- a/opendc-web/opendc-web-ui/src/sagas/profile.js
+++ b/opendc-web/opendc-web-ui/src/redux/sagas/profile.js
@@ -1,6 +1,6 @@
import { call, put } from 'redux-saga/effects'
import { deleteCurrentUserSucceeded } from '../actions/users'
-import { deleteUser } from '../api/routes/users'
+import { deleteUser } from '../../api/users'
export function* onDeleteCurrentUser(action) {
try {
diff --git a/opendc-web/opendc-web-ui/src/sagas/projects.js b/opendc-web/opendc-web-ui/src/redux/sagas/projects.js
index fdeea132..ecd9a7c9 100644
--- a/opendc-web/opendc-web-ui/src/sagas/projects.js
+++ b/opendc-web/opendc-web-ui/src/redux/sagas/projects.js
@@ -1,7 +1,7 @@
import { call, put } from 'redux-saga/effects'
import { addToStore } from '../actions/objects'
import { addProjectSucceeded, deleteProjectSucceeded } from '../actions/projects'
-import { addProject, deleteProject, getProject } from '../api/routes/projects'
+import { addProject, deleteProject, getProject } from '../../api/projects'
import { fetchAndStoreAllTopologiesOfProject } from './topology'
import { fetchAndStoreAllSchedulers, fetchAndStoreAllTraces } from './objects'
import { fetchPortfoliosOfProject } from './portfolios'
diff --git a/opendc-web/opendc-web-ui/src/sagas/scenarios.js b/opendc-web/opendc-web-ui/src/redux/sagas/scenarios.js
index 59223610..a5463fa6 100644
--- a/opendc-web/opendc-web-ui/src/sagas/scenarios.js
+++ b/opendc-web/opendc-web-ui/src/redux/sagas/scenarios.js
@@ -1,9 +1,9 @@
import { call, put, select } from 'redux-saga/effects'
import { addPropToStoreObject, addToStore } from '../actions/objects'
-import { getProject } from '../api/routes/projects'
+import { getProject } from '../../api/projects'
import { fetchAndStoreAllSchedulers, fetchAndStoreAllTraces } from './objects'
import { fetchAndStoreAllTopologiesOfProject } from './topology'
-import { addScenario, deleteScenario, updateScenario } from '../api/routes/scenarios'
+import { addScenario, deleteScenario, updateScenario } from '../../api/scenarios'
import { fetchPortfolioWithScenarios, watchForPortfolioResults } from './portfolios'
export function* onOpenScenarioSucceeded(action) {
diff --git a/opendc-web/opendc-web-ui/src/sagas/topology.js b/opendc-web/opendc-web-ui/src/redux/sagas/topology.js
index bba1ebb1..65f97cc9 100644
--- a/opendc-web/opendc-web-ui/src/sagas/topology.js
+++ b/opendc-web/opendc-web-ui/src/redux/sagas/topology.js
@@ -15,10 +15,10 @@ import {
DEFAULT_RACK_POWER_CAPACITY,
DEFAULT_RACK_SLOT_CAPACITY,
MAX_NUM_UNITS_PER_MACHINE,
-} from '../components/app/map/MapConstants'
+} from '../../components/app/map/MapConstants'
import { fetchAndStoreTopology, getTopologyAsObject, updateTopologyOnServer } from './objects'
import { uuid } from 'uuidv4'
-import { addTopology, deleteTopology } from '../api/routes/topologies'
+import { addTopology, deleteTopology } from '../../api/topologies'
export function* fetchAndStoreAllTopologiesOfProject(projectId, setTopology = false) {
try {
diff --git a/opendc-web/opendc-web-ui/src/sagas/users.js b/opendc-web/opendc-web-ui/src/redux/sagas/users.js
index 74e652f6..88c424b5 100644
--- a/opendc-web/opendc-web-ui/src/sagas/users.js
+++ b/opendc-web/opendc-web-ui/src/redux/sagas/users.js
@@ -2,9 +2,9 @@ import { call, put } from 'redux-saga/effects'
import { logInSucceeded } from '../actions/auth'
import { addToStore } from '../actions/objects'
import { fetchAuthorizationsOfCurrentUserSucceeded } from '../actions/users'
-import { performTokenSignIn } from '../api/routes/token-signin'
-import { addUser } from '../api/routes/users'
-import { saveAuthLocalStorage } from '../auth/index'
+import { performTokenSignIn } from '../../api/token-signin'
+import { addUser } from '../../api/users'
+import { saveAuthLocalStorage } from '../../auth'
import { fetchAndStoreProject, fetchAndStoreUser } from './objects'
export function* onFetchLoggedInUser(action) {
diff --git a/opendc-web/opendc-web-ui/src/shapes/index.js b/opendc-web/opendc-web-ui/src/shapes.js
index 621c7d25..621c7d25 100644
--- a/opendc-web/opendc-web-ui/src/shapes/index.js
+++ b/opendc-web/opendc-web-ui/src/shapes.js
diff --git a/opendc-web/opendc-web-ui/src/style-globals/_mixins.scss b/opendc-web/opendc-web-ui/src/style/_mixins.scss
index 5f103cd7..5f103cd7 100644
--- a/opendc-web/opendc-web-ui/src/style-globals/_mixins.scss
+++ b/opendc-web/opendc-web-ui/src/style/_mixins.scss
diff --git a/opendc-web/opendc-web-ui/src/style-globals/_variables.scss b/opendc-web/opendc-web-ui/src/style/_variables.scss
index e3df6cbd..e3df6cbd 100644
--- a/opendc-web/opendc-web-ui/src/style-globals/_variables.scss
+++ b/opendc-web/opendc-web-ui/src/style/_variables.scss