diff --git a/frontend/src/component/admin/auth/AuthSettings.tsx b/frontend/src/component/admin/auth/AuthSettings.tsx index 017d36cda1..6cfea73838 100644 --- a/frontend/src/component/admin/auth/AuthSettings.tsx +++ b/frontend/src/component/admin/auth/AuthSettings.tsx @@ -1,7 +1,6 @@ import React from 'react'; import AdminMenu from '../menu/AdminMenu'; import { Alert } from '@material-ui/lab'; -import TabNav from 'component/common/TabNav/TabNav'; import PageContent from 'component/common/PageContent/PageContent'; import ConditionallyRender from 'component/common/ConditionallyRender/ConditionallyRender'; import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig'; @@ -9,6 +8,7 @@ import { OidcAuth } from './OidcAuth/OidcAuth'; import { SamlAuth } from './SamlAuth/SamlAuth'; import { PasswordAuth } from './PasswordAuth/PasswordAuth'; import { GoogleAuth } from './GoogleAuth/GoogleAuth'; +import { TabNav } from 'component/common/TabNav/TabNav/TabNav'; export const AuthSettings = () => { const { authenticationType } = useUiConfig().uiConfig; diff --git a/frontend/src/component/application/ApplicationEdit/ApplicationEdit.tsx b/frontend/src/component/application/ApplicationEdit/ApplicationEdit.tsx index 68c08af65d..da550b4540 100644 --- a/frontend/src/component/application/ApplicationEdit/ApplicationEdit.tsx +++ b/frontend/src/component/application/ApplicationEdit/ApplicationEdit.tsx @@ -13,7 +13,6 @@ import ConditionallyRender from 'component/common/ConditionallyRender/Conditiona import { UPDATE_APPLICATION } from 'component/providers/AccessProvider/permissions'; import { ApplicationView } from '../ApplicationView/ApplicationView'; import { ApplicationUpdate } from '../ApplicationUpdate/ApplicationUpdate'; -import TabNav from 'component/common/TabNav/TabNav'; import Dialogue from 'component/common/Dialogue'; import PageContent from 'component/common/PageContent'; import HeaderTitle from 'component/common/HeaderTitle'; @@ -26,6 +25,7 @@ import useToast from 'hooks/useToast'; import PermissionButton from 'component/common/PermissionButton/PermissionButton'; import { formatDateYMD } from 'utils/formatDate'; import { formatUnknownError } from 'utils/formatUnknownError'; +import { TabNav } from 'component/common/TabNav/TabNav/TabNav'; export const ApplicationEdit = () => { const history = useHistory(); diff --git a/frontend/src/component/common/TabNav/styles.ts b/frontend/src/component/common/TabNav/TabNav/TabNav.styles.ts similarity index 100% rename from frontend/src/component/common/TabNav/styles.ts rename to frontend/src/component/common/TabNav/TabNav/TabNav.styles.ts diff --git a/frontend/src/component/common/TabNav/TabNav.jsx b/frontend/src/component/common/TabNav/TabNav/TabNav.tsx similarity index 59% rename from frontend/src/component/common/TabNav/TabNav.jsx rename to frontend/src/component/common/TabNav/TabNav/TabNav.tsx index 188664e4ba..be3ce4e14c 100644 --- a/frontend/src/component/common/TabNav/TabNav.jsx +++ b/frontend/src/component/common/TabNav/TabNav/TabNav.tsx @@ -1,45 +1,43 @@ -import React, { useState } from 'react'; +import React, { useState, ReactNode } from 'react'; import classnames from 'classnames'; -import PropTypes from 'prop-types'; import { Tabs, Tab, Paper } from '@material-ui/core'; +import { useStyles } from 'component/common/TabNav/TabNav/TabNav.styles'; +import { TabPanel } from 'component/common/TabNav/TabPanel/TabPanel'; -import TabPanel from './TabPanel'; +interface ITabNavProps { + tabData: ITabData[]; + className?: string; + navClass?: string; + startingTab?: number; +} -import { useStyles } from './styles'; -import { useHistory } from 'react-router-dom'; +interface ITabData { + label: string; + component: ReactNode; +} -const a11yProps = index => ({ - id: `tab-${index}`, - 'aria-controls': `tabpanel-${index}`, -}); - -const TabNav = ({ +export const TabNav = ({ tabData, className = '', navClass = '', startingTab = 0, -}) => { +}: ITabNavProps) => { const styles = useStyles(); const [activeTab, setActiveTab] = useState(startingTab); - const history = useHistory(); const renderTabs = () => tabData.map((tab, index) => ( history.push(tab.path)} + id={`tab-${index}`} + aria-controls={`tabpanel-${index}`} /> )); const renderTabPanels = () => tabData.map((tab, index) => ( - + {tab.component} )); @@ -63,12 +61,3 @@ const TabNav = ({ ); }; - -TabNav.propTypes = { - tabData: PropTypes.array.isRequired, - navClass: PropTypes.string, - className: PropTypes.string, - startingTab: PropTypes.number, -}; - -export default TabNav; diff --git a/frontend/src/component/common/TabNav/TabPanel/TabPanel.jsx b/frontend/src/component/common/TabNav/TabPanel/TabPanel.jsx deleted file mode 100644 index efad562c75..0000000000 --- a/frontend/src/component/common/TabNav/TabPanel/TabPanel.jsx +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; - -const TabPanel = ({ children, value, index, ...other }) => ( - -); - -TabPanel.propTypes = { - value: PropTypes.number, - index: PropTypes.number, - children: PropTypes.object, -}; - -export default TabPanel; diff --git a/frontend/src/component/common/TabNav/TabPanel/TabPanel.tsx b/frontend/src/component/common/TabNav/TabPanel/TabPanel.tsx new file mode 100644 index 0000000000..3c2fc65a39 --- /dev/null +++ b/frontend/src/component/common/TabNav/TabPanel/TabPanel.tsx @@ -0,0 +1,18 @@ +import React, { ReactNode } from 'react'; + +interface ITabPanelProps { + value: number; + index: number; + children: ReactNode; +} + +export const TabPanel = ({ children, value, index }: ITabPanelProps) => ( + +); diff --git a/frontend/src/component/common/TabNav/TabPanel/index.jsx b/frontend/src/component/common/TabNav/TabPanel/index.jsx deleted file mode 100644 index a09b57d836..0000000000 --- a/frontend/src/component/common/TabNav/TabPanel/index.jsx +++ /dev/null @@ -1,3 +0,0 @@ -import TabPanel from './TabPanel'; - -export default TabPanel; diff --git a/frontend/src/component/common/TabNav/index.jsx b/frontend/src/component/common/TabNav/index.jsx deleted file mode 100644 index 2d11e237e2..0000000000 --- a/frontend/src/component/common/TabNav/index.jsx +++ /dev/null @@ -1,3 +0,0 @@ -import TabNav from './TabNav'; - -export default TabNav; diff --git a/frontend/src/component/feature/FeatureView/FeatureView.tsx b/frontend/src/component/feature/FeatureView/FeatureView.tsx index 64cbd2f734..866f1791ca 100644 --- a/frontend/src/component/feature/FeatureView/FeatureView.tsx +++ b/frontend/src/component/feature/FeatureView/FeatureView.tsx @@ -5,7 +5,6 @@ import { Link, Route, useHistory, useParams, Switch } from 'react-router-dom'; import useFeatureApi from 'hooks/api/actions/useFeatureApi/useFeatureApi'; import { useFeature } from 'hooks/api/getters/useFeature/useFeature'; import useProject from 'hooks/api/getters/useProject/useProject'; -import useTabs from 'hooks/useTabs'; import useToast from 'hooks/useToast'; import { IFeatureViewParams } from 'interfaces/params'; import { @@ -33,7 +32,6 @@ export const FeatureView = () => { const { projectId, featureId } = useParams(); const { refetch: projectRefetch } = useProject(projectId); const [openTagDialog, setOpenTagDialog] = useState(false); - const { a11yProps } = useTabs(0); const { archiveFeatureToggle } = useFeatureApi(); const { setToastData, setToastApiError } = useToast(); const [showDelDialog, setShowDelDialog] = useState(false); @@ -102,10 +100,7 @@ export const FeatureView = () => { key={tab.title} label={tab.title} value={tab.path} - {...a11yProps(index)} - onClick={() => { - history.push(tab.path); - }} + onClick={() => history.push(tab.path)} className={styles.tabButton} /> ); diff --git a/frontend/src/component/project/Project/Project.tsx b/frontend/src/component/project/Project/Project.tsx index 486845284a..2cfff01807 100644 --- a/frontend/src/component/project/Project/Project.tsx +++ b/frontend/src/component/project/Project/Project.tsx @@ -9,14 +9,13 @@ import { Edit } from '@material-ui/icons'; import useToast from 'hooks/useToast'; import useQueryParams from 'hooks/useQueryParams'; import { useEffect } from 'react'; -import useTabs from 'hooks/useTabs'; -import TabPanel from 'component/common/TabNav/TabPanel'; import { ProjectAccess } from '../ProjectAccess/ProjectAccess'; import ProjectEnvironment from '../ProjectEnvironment/ProjectEnvironment'; import ProjectOverview from './ProjectOverview'; import ProjectHealth from './ProjectHealth/ProjectHealth'; import PermissionIconButton from 'component/common/PermissionIconButton/PermissionIconButton'; import { UPDATE_PROJECT } from 'component/providers/AccessProvider/permissions'; +import { TabPanel } from 'component/common/TabNav/TabPanel/TabPanel'; const Project = () => { const { id, activeTab } = useParams<{ id: string; activeTab: string }>(); @@ -27,8 +26,6 @@ const Project = () => { const styles = useStyles(); const history = useHistory(); - const { a11yProps, activeTabIdx, setActiveTab } = useTabs(0); - const basePath = `/projects/${id}`; const tabData = [ { @@ -57,6 +54,10 @@ const Project = () => { }, ]; + const activeTabIdx = activeTab + ? tabData.findIndex(tab => tab.name === activeTab) + : 0; + useEffect(() => { const created = params.get('created'); const edited = params.get('edited'); @@ -75,29 +76,16 @@ const Project = () => { /* eslint-disable-next-line */ }, []); - useEffect(() => { - const tabIdx = tabData.findIndex(tab => tab.name === activeTab); - if (tabIdx > 0) { - setActiveTab(tabIdx); - } else { - setActiveTab(0); - } - - /* eslint-disable-next-line */ - }, []); - const renderTabs = () => { return tabData.map((tab, index) => { return ( { - setActiveTab(index); - history.push(tab.path); - }} + onClick={() => history.push(tab.path)} className={styles.tabButton} /> ); @@ -150,9 +138,6 @@ const Project = () => {
{ - setActiveTab(tabId); - }} indicatorColor="primary" textColor="primary" >