Add routing for workspace settings subtabs (#9054)

* add routing for workspace settings subtabs

* breadcrumb update/style fix
This commit is contained in:
Anantshree Chandola 2024-04-01 20:22:01 +08:00 committed by GitHub
parent 89a7bf9df7
commit f624e98f5f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 103 additions and 61 deletions

View file

@ -32,6 +32,10 @@ import { getWorkspaceIdOrSlugFromURL } from '@/_helpers/routes';
import ErrorPage from '@/_components/ErrorComponents/ErrorPage'; import ErrorPage from '@/_components/ErrorComponents/ErrorPage';
import WorkspaceConstants from '@/WorkspaceConstants'; import WorkspaceConstants from '@/WorkspaceConstants';
import { useAppDataStore } from '@/_stores/appDataStore'; import { useAppDataStore } from '@/_stores/appDataStore';
import { ManageOrgUsers } from '@/ManageOrgUsers';
import { ManageGroupPermissions } from '@/ManageGroupPermissions';
import OrganizationLogin from '@/_components/OrganizationLogin/OrganizationLogin';
import { ManageOrgVars } from '@/ManageOrgVars';
const AppWrapper = (props) => { const AppWrapper = (props) => {
return ( return (
@ -225,7 +229,36 @@ class AppComponent extends React.Component {
<OrganizationSettings switchDarkMode={this.switchDarkMode} darkMode={darkMode} /> <OrganizationSettings switchDarkMode={this.switchDarkMode} darkMode={darkMode} />
</PrivateRoute> </PrivateRoute>
} }
>
<Route
path="users"
element={
<AdminRoute>
<ManageOrgUsers switchDarkMode={this.switchDarkMode} darkMode={darkMode} />
</AdminRoute>
}
/> />
<Route
path="workspace-login"
element={
<AdminRoute>
<OrganizationLogin switchDarkMode={this.switchDarkMode} darkMode={darkMode} />
</AdminRoute>
}
/>
<Route
path="groups"
element={
<AdminRoute>
<ManageGroupPermissions switchDarkMode={this.switchDarkMode} darkMode={darkMode} />
</AdminRoute>
}
/>
<Route
path="workspace-variables"
element={<ManageOrgVars switchDarkMode={this.switchDarkMode} darkMode={darkMode} />}
/>
</Route>
<Route <Route
exact exact
path="/:workspaceId/settings" path="/:workspaceId/settings"

View file

@ -1,35 +1,33 @@
import React, { useEffect, useState, useContext } from 'react'; import React, { useEffect, useState, useContext } from 'react';
import cx from 'classnames'; import cx from 'classnames';
import { useNavigate } from 'react-router-dom'; import { useParams, Outlet, Link, useNavigate, useLocation } from 'react-router-dom';
import Layout from '@/_ui/Layout'; import Layout from '@/_ui/Layout';
import { ManageOrgUsers } from '@/ManageOrgUsers';
import { ManageGroupPermissions } from '@/ManageGroupPermissions';
import { ManageOrgVars } from '@/ManageOrgVars';
import { authenticationService } from '@/_services'; import { authenticationService } from '@/_services';
import { CopilotSetting } from '@/CopilotSettings';
import { BreadCrumbContext } from '../App/App'; import { BreadCrumbContext } from '../App/App';
import FolderList from '@/_ui/FolderList/FolderList'; import FolderList from '@/_ui/FolderList/FolderList';
import { OrganizationList } from '../_components/OrganizationManager/List'; import { OrganizationList } from '../_components/OrganizationManager/List';
import { getWorkspaceId } from '@/_helpers/utils'; import { getWorkspaceId } from '@/_helpers/utils';
import OrganizationLogin from '@/_components/OrganizationLogin/OrganizationLogin';
export function OrganizationSettings(props) { export function OrganizationSettings(props) {
const [admin, setAdmin] = useState(authenticationService.currentSessionValue?.admin); const [admin, setAdmin] = useState(authenticationService.currentSessionValue?.admin);
const [selectedTab, setSelectedTab] = useState(admin ? 'Users & permissions' : 'manageEnvVars'); const [selectedTab, setSelectedTab] = useState(admin ? 'Users & permissions' : 'manageEnvVars');
const navigate = useNavigate(); const navigate = useNavigate();
const location = useLocation();
const { updateSidebarNAV } = useContext(BreadCrumbContext); const { updateSidebarNAV } = useContext(BreadCrumbContext);
const { workspaceId } = useParams();
const sideBarNavs = ['Users', 'Groups', 'Workspace login', 'Workspace variables']; const sideBarNavs = ['Users', 'Groups', 'Workspace login', 'Workspace variables'];
const defaultOrgName = (groupName) => { const defaultOrgName = (groupName) => {
switch (groupName) { switch (groupName) {
case 'Users': case 'users':
return 'Users & permissions'; return 'Users';
case 'Groups': case 'groups':
return 'manageGroups'; return 'Groups';
case 'Workspace login': case 'workspace-login':
return 'manageWorkspaceLogin'; return 'Workspace login';
case 'Workspace variables': case 'workspace-variables':
return 'manageEnvVars'; return 'Workspace variables';
default: default:
return groupName; return groupName;
} }
@ -43,15 +41,20 @@ export function OrganizationSettings(props) {
const subscription = authenticationService.currentSession.subscribe((newOrd) => { const subscription = authenticationService.currentSession.subscribe((newOrd) => {
setAdmin(newOrd?.admin); setAdmin(newOrd?.admin);
}); });
updateSidebarNAV('Users'); admin ? updateSidebarNAV('Users') : updateSidebarNAV('Workspace variables');
() => subscription.unsubsciption(); () => subscription.unsubsciption();
// eslint-disable-next-line react-hooks/exhaustive-deps const selectedTabFromRoute = location.pathname.split('/').pop();
}, [authenticationService.currentSessionValue?.admin]); if (selectedTabFromRoute === 'workspace-settings') {
setSelectedTab(admin ? 'Users' : 'Workspace variables');
const goTooOrgConstantsDashboard = () => { window.location.href = admin
navigate(`/${getWorkspaceId()}/workspace-constants`); ? `/${workspaceId}/workspace-settings/users`
}; : `/${workspaceId}/workspace-settings/workspace-variables`;
} else {
setSelectedTab(defaultOrgName(selectedTabFromRoute));
}
updateSidebarNAV(defaultOrgName(selectedTabFromRoute));
}, [navigate, workspaceId, authenticationService.currentSessionValue?.admin]);
return ( return (
<Layout switchDarkMode={props.switchDarkMode} darkMode={props.darkMode}> <Layout switchDarkMode={props.switchDarkMode} darkMode={props.darkMode}>
@ -60,8 +63,20 @@ export function OrganizationSettings(props) {
<div className="organization-page-sidebar col "> <div className="organization-page-sidebar col ">
<div className="workspace-nav-list-wrap"> <div className="workspace-nav-list-wrap">
{sideBarNavs.map((item, index) => { {sideBarNavs.map((item, index) => {
const Wrapper = ({ children }) => <>{children}</>;
return ( return (
<> <Wrapper key={index}>
<Link
to={`/${workspaceId}/workspace-settings/${item.toLowerCase().replace(/\s+/g, '-')}`} // Update the URL path here
key={index}
style={{
textDecoration: 'none',
border: 'none',
color: 'inherit',
outline: 'none',
backgroundColor: 'inherit',
}}
>
{admin && ( {admin && (
<FolderList <FolderList
className="workspace-settings-nav-items" className="workspace-settings-nav-items"
@ -86,7 +101,8 @@ export function OrganizationSettings(props) {
{item} {item}
</FolderList> </FolderList>
)} )}
</> </Link>
</Wrapper>
); );
})} })}
</div> </div>
@ -95,13 +111,7 @@ export function OrganizationSettings(props) {
<div className={cx('col workspace-content-wrapper')} style={{ paddingTop: '40px' }}> <div className={cx('col workspace-content-wrapper')} style={{ paddingTop: '40px' }}>
<div className="w-100"> <div className="w-100">
{selectedTab === 'Users & permissions' && <ManageOrgUsers darkMode={props.darkMode} />} <Outlet />
{selectedTab === 'manageGroups' && <ManageGroupPermissions darkMode={props.darkMode} />}
{selectedTab === 'manageWorkspaceLogin' && <OrganizationLogin />}
{selectedTab === 'manageEnvVars' && (
<ManageOrgVars darkMode={props.darkMode} goTooOrgConstantsDashboard={goTooOrgConstantsDashboard} />
)}
{selectedTab === 'manageCopilot' && <CopilotSetting />}
</div> </div>
</div> </div>
</div> </div>

View file

@ -18,12 +18,7 @@ export const Breadcrumbs = ({ darkMode, dataCy }) => {
<div key={breadcrumb.key} className="tj-dashboard-header-title-wrap" data-cy={dataCy ?? ''}> <div key={breadcrumb.key} className="tj-dashboard-header-title-wrap" data-cy={dataCy ?? ''}>
<p className=" tj-text-xsm ">{breadcrumb}</p> <p className=" tj-text-xsm ">{breadcrumb}</p>
{sidebarNav?.length > 0 && <SolidIcon name="cheveronright" fill={darkMode ? '#FDFDFE' : '#131620'} />} {sidebarNav?.length > 0 && <SolidIcon name="cheveronright" fill={darkMode ? '#FDFDFE' : '#131620'} />}
<li className="breadcrumb-item font-weight-500"> <li className="breadcrumb-item font-weight-500"> {sidebarNav}</li>
<Link to={`${breadcrumb.key}${search}`} data-cy="breadcrumb-page-title">
{' '}
{sidebarNav}
</Link>
</li>
{beta && <span className="badge bg-color-primary mx-3">beta</span>} {beta && <span className="badge bg-color-primary mx-3">beta</span>}
</div> </div>
); );

View file

@ -16,6 +16,10 @@ function Header({ enableCollapsibleSidebar = false, collapseSidebar = false, tog
case 'database': case 'database':
return 'Database'; return 'Database';
case 'workspace-settings': case 'workspace-settings':
case 'users':
case 'workspace-variables':
case 'groups':
case 'workspace-login':
return 'Workspace settings'; return 'Workspace settings';
case 'data-sources': case 'data-sources':
return 'Data sources'; return 'Data sources';