mirror of
https://github.com/ToolJet/ToolJet
synced 2026-04-27 16:37:42 +00:00
Add routing for workspace settings subtabs (#9054)
* add routing for workspace settings subtabs * breadcrumb update/style fix
This commit is contained in:
parent
89a7bf9df7
commit
f624e98f5f
4 changed files with 103 additions and 61 deletions
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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,33 +63,46 @@ 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}>
|
||||||
{admin && (
|
<Link
|
||||||
<FolderList
|
to={`/${workspaceId}/workspace-settings/${item.toLowerCase().replace(/\s+/g, '-')}`} // Update the URL path here
|
||||||
className="workspace-settings-nav-items"
|
key={index}
|
||||||
key={index}
|
style={{
|
||||||
onClick={() => {
|
textDecoration: 'none',
|
||||||
setSelectedTab(defaultOrgName(item));
|
border: 'none',
|
||||||
if (item == 'Users') updateSidebarNAV('Users');
|
color: 'inherit',
|
||||||
else updateSidebarNAV(item);
|
outline: 'none',
|
||||||
}}
|
backgroundColor: 'inherit',
|
||||||
selectedItem={selectedTab == defaultOrgName(item)}
|
}}
|
||||||
renderBadgeForItems={['Workspace constants']}
|
>
|
||||||
renderBadge={() => (
|
{admin && (
|
||||||
<span
|
<FolderList
|
||||||
style={{ width: '40px', textTransform: 'lowercase' }}
|
className="workspace-settings-nav-items"
|
||||||
className="badge bg-color-primary badge-pill"
|
key={index}
|
||||||
>
|
onClick={() => {
|
||||||
new
|
setSelectedTab(defaultOrgName(item));
|
||||||
</span>
|
if (item == 'Users') updateSidebarNAV('Users');
|
||||||
)}
|
else updateSidebarNAV(item);
|
||||||
dataCy={item.toLowerCase().replace(/\s+/g, '-')}
|
}}
|
||||||
>
|
selectedItem={selectedTab == defaultOrgName(item)}
|
||||||
{item}
|
renderBadgeForItems={['Workspace constants']}
|
||||||
</FolderList>
|
renderBadge={() => (
|
||||||
)}
|
<span
|
||||||
</>
|
style={{ width: '40px', textTransform: 'lowercase' }}
|
||||||
|
className="badge bg-color-primary badge-pill"
|
||||||
|
>
|
||||||
|
new
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
dataCy={item.toLowerCase().replace(/\s+/g, '-')}
|
||||||
|
>
|
||||||
|
{item}
|
||||||
|
</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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue