summaryrefslogtreecommitdiff
path: root/opendc-web/opendc-web-ui/src/pages/projects
diff options
context:
space:
mode:
Diffstat (limited to 'opendc-web/opendc-web-ui/src/pages/projects')
-rw-r--r--opendc-web/opendc-web-ui/src/pages/projects/[project]/index.js75
-rw-r--r--opendc-web/opendc-web-ui/src/pages/projects/[project]/portfolios/[portfolio].js121
-rw-r--r--opendc-web/opendc-web-ui/src/pages/projects/[project]/topologies/[topology].js142
-rw-r--r--opendc-web/opendc-web-ui/src/pages/projects/index.js116
4 files changed, 0 insertions, 454 deletions
diff --git a/opendc-web/opendc-web-ui/src/pages/projects/[project]/index.js b/opendc-web/opendc-web-ui/src/pages/projects/[project]/index.js
deleted file mode 100644
index 52938bcd..00000000
--- a/opendc-web/opendc-web-ui/src/pages/projects/[project]/index.js
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * 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 { useRouter } from 'next/router'
-import ProjectOverview from '../../../components/projects/ProjectOverview'
-import { useProject } from '../../../data/project'
-import { AppPage } from '../../../components/AppPage'
-import Head from 'next/head'
-import Link from 'next/link'
-import {
- Breadcrumb,
- BreadcrumbItem,
- PageSection,
- PageSectionVariants,
- Skeleton,
- Text,
- TextContent,
-} from '@patternfly/react-core'
-
-function Project() {
- const router = useRouter()
- const projectId = +router.query['project']
-
- const { data: project } = useProject(+projectId)
-
- const breadcrumb = (
- <Breadcrumb>
- <BreadcrumbItem to="/projects" component={Link}>
- Projects
- </BreadcrumbItem>
- <BreadcrumbItem to={`/projects/${projectId}`} component={Link} isActive>
- Project details
- </BreadcrumbItem>
- </Breadcrumb>
- )
-
- return (
- <AppPage breadcrumb={breadcrumb}>
- <Head>
- <title>{`${project?.name ?? 'Project'} - OpenDC`}</title>
- </Head>
- <PageSection variant={PageSectionVariants.light}>
- <TextContent>
- <Text component="h1">
- {project?.name ?? <Skeleton width="15%" screenreaderText="Loading project" />}
- </Text>
- </TextContent>
- </PageSection>
- <PageSection isFilled>
- <ProjectOverview projectId={projectId} />
- </PageSection>
- </AppPage>
- )
-}
-
-export default Project
diff --git a/opendc-web/opendc-web-ui/src/pages/projects/[project]/portfolios/[portfolio].js b/opendc-web/opendc-web-ui/src/pages/projects/[project]/portfolios/[portfolio].js
deleted file mode 100644
index 5d1e041b..00000000
--- a/opendc-web/opendc-web-ui/src/pages/projects/[project]/portfolios/[portfolio].js
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * 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 dynamic from 'next/dynamic'
-import { useRouter } from 'next/router'
-import Head from 'next/head'
-import Link from 'next/link'
-import React, { useRef } from 'react'
-import {
- Breadcrumb,
- BreadcrumbItem,
- Divider,
- PageSection,
- PageSectionVariants,
- Tab,
- TabContent,
- Tabs,
- TabTitleText,
- Text,
- TextContent,
-} from '@patternfly/react-core'
-import { AppPage } from '../../../../components/AppPage'
-import ContextSelectionSection from '../../../../components/context/ContextSelectionSection'
-import PortfolioSelector from '../../../../components/context/PortfolioSelector'
-import PortfolioOverview from '../../../../components/portfolios/PortfolioOverview'
-import { usePortfolio } from '../../../../data/project'
-
-const PortfolioResults = dynamic(() => import('../../../../components/portfolios/PortfolioResults'), { ssr: false })
-
-/**
- * Page that displays the results in a portfolio.
- */
-function Portfolio() {
- const router = useRouter()
- const projectId = +router.query['project']
- const portfolioNumber = +router.query['portfolio']
-
- const overviewRef = useRef(null)
- const resultsRef = useRef(null)
-
- const { data: portfolio } = usePortfolio(projectId, portfolioNumber)
-
- const breadcrumb = (
- <Breadcrumb>
- <BreadcrumbItem to="/projects" component={Link}>
- Projects
- </BreadcrumbItem>
- <BreadcrumbItem to={`/projects/${projectId}`} component={Link}>
- Project details
- </BreadcrumbItem>
- <BreadcrumbItem to={`/projects/${projectId}/portfolios/${portfolioNumber}`} component={Link} isActive>
- Portfolio
- </BreadcrumbItem>
- </Breadcrumb>
- )
-
- const contextSelectors = (
- <ContextSelectionSection>
- <PortfolioSelector activePortfolio={portfolio} />
- </ContextSelectionSection>
- )
-
- return (
- <AppPage breadcrumb={breadcrumb} contextSelectors={contextSelectors}>
- <Head>
- <title>Portfolio - OpenDC</title>
- </Head>
- <PageSection variant={PageSectionVariants.light}>
- <TextContent>
- <Text component="h1">Portfolio</Text>
- </TextContent>
- </PageSection>
- <PageSection type="tabs" variant={PageSectionVariants.light} stickyOnBreakpoint={{ default: 'top' }}>
- <Divider component="div" />
- <Tabs defaultActiveKey={0} className="pf-m-page-insets">
- <Tab
- eventKey={0}
- title={<TabTitleText>Overview</TabTitleText>}
- tabContentId="overview"
- tabContentRef={overviewRef}
- />
- <Tab
- eventKey={1}
- title={<TabTitleText>Results</TabTitleText>}
- tabContentId="results"
- tabContentRef={resultsRef}
- />
- </Tabs>
- </PageSection>
- <PageSection isFilled>
- <TabContent eventKey={0} id="overview" ref={overviewRef} aria-label="Overview tab">
- <PortfolioOverview projectId={projectId} portfolioId={portfolioNumber} />
- </TabContent>
- <TabContent eventKey={1} id="results" ref={resultsRef} aria-label="Results tab" hidden>
- <PortfolioResults projectId={projectId} portfolioId={portfolioNumber} />
- </TabContent>
- </PageSection>
- </AppPage>
- )
-}
-
-export default Portfolio
diff --git a/opendc-web/opendc-web-ui/src/pages/projects/[project]/topologies/[topology].js b/opendc-web/opendc-web-ui/src/pages/projects/[project]/topologies/[topology].js
deleted file mode 100644
index 48359365..00000000
--- a/opendc-web/opendc-web-ui/src/pages/projects/[project]/topologies/[topology].js
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * 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 dynamic from 'next/dynamic'
-import { useRouter } from 'next/router'
-import Head from 'next/head'
-import Link from 'next/link'
-import ContextSelectionSection from '../../../../components/context/ContextSelectionSection'
-import TopologySelector from '../../../../components/context/TopologySelector'
-import TopologyOverview from '../../../../components/topologies/TopologyOverview'
-import { useDispatch } from 'react-redux'
-import React, { useEffect, useState } from 'react'
-import { AppPage } from '../../../../components/AppPage'
-import {
- Breadcrumb,
- BreadcrumbItem,
- Divider,
- PageSection,
- PageSectionVariants,
- Tab,
- TabContent,
- Tabs,
- TabTitleText,
- Text,
- TextContent,
-} from '@patternfly/react-core'
-import { useTopology } from '../../../../data/topology'
-import { goToRoom } from '../../../../redux/actions/interaction-level'
-import { openTopology } from '../../../../redux/actions/topology'
-
-const TopologyMap = dynamic(() => import('../../../../components/topologies/TopologyMap'), { ssr: false })
-
-/**
- * Page that displays a datacenter topology.
- */
-function Topology() {
- const router = useRouter()
- const projectId = +router.query['project']
- const topologyNumber = +router.query['topology']
-
- const { data: topology } = useTopology(projectId, topologyNumber)
-
- const dispatch = useDispatch()
- useEffect(() => {
- if (topologyNumber) {
- dispatch(openTopology(projectId, topologyNumber))
- }
- }, [projectId, topologyNumber, dispatch])
-
- const [activeTab, setActiveTab] = useState('overview')
-
- const breadcrumb = (
- <Breadcrumb>
- <BreadcrumbItem to="/projects" component={Link}>
- Projects
- </BreadcrumbItem>
- <BreadcrumbItem to={`/projects/${projectId}`} component={Link}>
- Project details
- </BreadcrumbItem>
- <BreadcrumbItem to={`/projects/${projectId}/topologies/${topologyNumber}`} component={Link} isActive>
- Topology
- </BreadcrumbItem>
- </Breadcrumb>
- )
-
- const contextSelectors = (
- <ContextSelectionSection>
- <TopologySelector activeTopology={topology} />
- </ContextSelectionSection>
- )
-
- return (
- <AppPage breadcrumb={breadcrumb} contextSelectors={contextSelectors}>
- <Head>
- <title>{`${topology?.name ?? 'Topologies'} - OpenDC`}</title>
- </Head>
- <PageSection variant={PageSectionVariants.light}>
- <TextContent>
- <Text component="h1">Topology</Text>
- </TextContent>
- </PageSection>
- <PageSection type="none" variant={PageSectionVariants.light} className="pf-c-page__main-tabs" sticky="top">
- <Divider component="div" />
- <Tabs
- activeKey={activeTab}
- onSelect={(_, tabIndex) => setActiveTab(tabIndex)}
- className="pf-m-page-insets"
- >
- <Tab eventKey="overview" title={<TabTitleText>Overview</TabTitleText>} tabContentId="overview" />
- <Tab
- eventKey="floor-plan"
- title={<TabTitleText>Floor Plan</TabTitleText>}
- tabContentId="floor-plan"
- />
- </Tabs>
- </PageSection>
- <PageSection padding={activeTab === 'floor-plan' && { default: 'noPadding' }} isFilled>
- <TabContent id="overview" aria-label="Overview tab" hidden={activeTab !== 'overview'}>
- <TopologyOverview
- projectId={projectId}
- topologyNumber={topologyNumber}
- onSelect={(type, obj) => {
- if (type === 'room') {
- dispatch(goToRoom(obj.id))
- setActiveTab('floor-plan')
- }
- }}
- />
- </TabContent>
- <TabContent
- id="floor-plan"
- aria-label="Floor Plan tab"
- className="pf-u-h-100"
- hidden={activeTab !== 'floor-plan'}
- >
- <TopologyMap />
- </TabContent>
- </PageSection>
- </AppPage>
- )
-}
-
-export default Topology
diff --git a/opendc-web/opendc-web-ui/src/pages/projects/index.js b/opendc-web/opendc-web-ui/src/pages/projects/index.js
deleted file mode 100644
index 97ff105c..00000000
--- a/opendc-web/opendc-web-ui/src/pages/projects/index.js
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * 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 { PlusIcon } from '@patternfly/react-icons'
-import React, { useMemo, useState } from 'react'
-import Head from 'next/head'
-import ProjectFilterPanel from '../../components/projects/FilterPanel'
-import { AppPage } from '../../components/AppPage'
-import {
- PageSection,
- PageSectionVariants,
- Title,
- Toolbar,
- ToolbarItem,
- ToolbarContent,
- Button,
- TextContent,
- Text,
-} from '@patternfly/react-core'
-import ProjectCollection from '../../components/projects/ProjectCollection'
-import TextInputModal from '../../components/util/modals/TextInputModal'
-import { useProjects, useDeleteProject, useNewProject } from '../../data/project'
-
-const getVisibleProjects = (projects, filter) => {
- switch (filter) {
- case 'SHOW_ALL':
- return projects
- case 'SHOW_OWN':
- return projects.filter((project) => project.role === 'OWNER')
- case 'SHOW_SHARED':
- return projects.filter((project) => project.role !== 'OWNER')
- default:
- return projects
- }
-}
-
-function Projects() {
- const { status, data: projects } = useProjects()
- const [filter, setFilter] = useState('SHOW_ALL')
- const visibleProjects = useMemo(() => getVisibleProjects(projects ?? [], filter), [projects, filter])
-
- const { mutate: deleteProject } = useDeleteProject()
- const { mutate: addProject } = useNewProject()
-
- const [isProjectCreationModalVisible, setProjectCreationModalVisible] = useState(false)
- const onProjectCreation = (name) => {
- if (name) {
- addProject({ name })
- }
- setProjectCreationModalVisible(false)
- }
-
- return (
- <AppPage>
- <Head>
- <title>My Projects - OpenDC</title>
- </Head>
- <PageSection variant={PageSectionVariants.light} isFilled>
- <div className="pf-u-mx-auto pf-u-max-width" style={{ '--pf-u-max-width--MaxWidth': '100ch' }}>
- <Title className="pf-u-mt-xl-on-md" headingLevel="h1" size="4xl">
- Welcome
- </Title>
- <TextContent>
- <Text component="p">Find all your personal and shared projects</Text>
- </TextContent>
- <Toolbar inset={{ default: 'insetNone' }}>
- <ToolbarContent>
- <ToolbarItem>
- <ProjectFilterPanel onSelect={setFilter} activeFilter={filter} />
- </ToolbarItem>
- <ToolbarItem alignment={{ default: 'alignRight' }}>
- <Button icon={<PlusIcon />} onClick={() => setProjectCreationModalVisible(true)}>
- Create Project
- </Button>
- </ToolbarItem>
- </ToolbarContent>
- </Toolbar>
- <ProjectCollection
- status={status}
- isFiltering={filter !== 'SHOW_ALL'}
- projects={visibleProjects}
- onDelete={(project) => deleteProject(project.id)}
- onCreate={() => setProjectCreationModalVisible(true)}
- />
- <TextInputModal
- title="New Project"
- label="Project name"
- isOpen={isProjectCreationModalVisible}
- callback={onProjectCreation}
- />
- </div>
- </PageSection>
- </AppPage>
- )
-}
-
-export default Projects