/********************************************************************************
* Copyright (c) 2020 TypeFox and others
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
********************************************************************************/
import { FunctionComponent, ReactNode, useContext, lazy, Suspense } from 'react';
import {
Box,
Container,
CssBaseline,
Typography,
IconButton,
} from '@mui/material';
import { styled } from '@mui/material/styles';
import { Route, Routes, useNavigate } from 'react-router-dom';
import AccountBoxIcon from '@mui/icons-material/AccountBox';
import AssignmentIndIcon from '@mui/icons-material/AssignmentInd';
import BarChartIcon from '@mui/icons-material/BarChart';
import ExtensionSharpIcon from '@mui/icons-material/ExtensionSharp';
import HistoryIcon from '@mui/icons-material/History';
import PeopleIcon from '@mui/icons-material/People';
import PersonIcon from '@mui/icons-material/Person';
import SecurityIcon from '@mui/icons-material/Security';
import SettingsIcon from '@mui/icons-material/Settings';
import SpeedIcon from '@mui/icons-material/Speed';
import StarIcon from '@mui/icons-material/Star';
import { LoginComponent } from "../../default/login";
import { MainContext } from '../../context';
import { AdminDashboardRoutes } from './admin-dashboard-routes';
import { AdminSidepanel } from './admin-sidepanel';
import { AdminHeader } from './admin-header';
import { isNavGroup, NavEntry } from './nav-types';
import { NamespaceAdmin } from './namespace-admin';
import { PublisherAdmin } from './publisher-admin';
import { ScanAdmin } from './scan-admin';
import { Tiers } from './tiers/tiers';
import { Customers } from './customers/customers';
import { CustomerDetails } from './customers/customer-details';
import { Logs } from './logs/logs';
import { RuntimeSettingsPage } from './settings';
import { Welcome } from './welcome';
const ExtensionAdmin = lazy(() => import('./extension-admin').then(m => ({ default: m.ExtensionAdmin })));
const UsageStatsView = lazy(() => import('./usage-stats/usage-stats').then(m => ({ default: m.UsageStatsView })));
const navConfig: NavEntry[] = [
{ path: AdminDashboardRoutes.NAMESPACE_ADMIN, name: 'Namespaces', icon: , description: 'Manage user roles and create new namespaces' },
{ path: AdminDashboardRoutes.EXTENSION_ADMIN, name: 'Extensions', icon: , description: 'Search for extensions and remove certain versions' },
{ path: AdminDashboardRoutes.PUBLISHER_ADMIN, name: 'Publisher', icon: , description: 'Search for publishers and revoke their contributions' },
{ path: AdminDashboardRoutes.SCANS_ADMIN, name: 'Scans', icon: , description: 'View security scan results and manage quarantined extensions' },
{
name: 'Rate Limiting',
icon: ,
children: [
{ path: AdminDashboardRoutes.TIERS, name: 'Tiers', icon: , description: 'Manage rate-limit tiers' },
{ path: AdminDashboardRoutes.CUSTOMERS, name: 'Customers', icon: , description: 'Manage rate-limit customers' },
{ path: AdminDashboardRoutes.USAGE_STATS, name: 'Usage Stats', icon: , description: 'Show usage stats for customers' },
],
},
{ path: AdminDashboardRoutes.SETTINGS, name: 'Settings', icon: , description: 'Manage runtime settings for the registry' },
{ path: AdminDashboardRoutes.LOGS, name: 'Logs', icon: , description: 'Browse admin activity logs' },
];
const routeNames: { [key: string]: string } = {
[AdminDashboardRoutes.MAIN]: 'Admin Dashboard',
...navConfig.reduce<{ [key: string]: string }>((acc, entry) => {
if (isNavGroup(entry)) {
entry.children.forEach(child => {
acc[child.path] = child.name;
});
} else {
acc[entry.path] = entry.name;
}
return acc;
}, {}),
};
const ScrollableContent = styled(Box)(({ theme }) => ({
flex: 1,
overflowY: 'auto',
'&::-webkit-scrollbar': {
width: '12px',
},
'&::-webkit-scrollbar-track': {
backgroundColor: theme.palette.action.hover,
},
'&::-webkit-scrollbar-thumb': {
backgroundColor: theme.palette.action.selected,
borderRadius: '6px',
'&:hover': {
backgroundColor: theme.palette.action.focus,
},
},
}));
const Message: FunctionComponent<{message: string}> = ({ message }) => {
return (
{message}
);
};
export const AdminDashboard: FunctionComponent = props => {
const { user, loginProviders } = useContext(MainContext);
const navigate = useNavigate();
const toMainPage = () => navigate('/');
let content: ReactNode = null;
if (user?.role === 'admin') {
content =
} />
} />
} />
} />
} />
} />
} />
} />
} />
} />
} />
} />
} />
} />
;
} else if (user) {
content = ;
} else if (!props.userLoading && loginProviders) {
content =
{
if (href) {
return (
);
} else {
return (
);
}
}}
/>
;
}
return <>
{content}
>;
};
export interface AdminDashboardProps {
userLoading: boolean;
}