source/idea/idea-cluster-manager/webapp/src/App.tsx (1,055 lines of code) (raw):
/*
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
* with the License. A copy of the License is located at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES
* OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions
* and limitations under the License.
*/
import React, { Component } from "react";
import "./App.scss";
import { IdeaAuthChallenge, IdeaAuthConfirmForgotPassword, IdeaAuthenticatedRoute, IdeaAuthForgotPassword, IdeaAuthLogin, IdeaAuthLoginRedirect, RESAuthSignUp, RESAuthVerifyAccount } from "./pages/auth";
import Home from "./pages/home";
import { AppContext } from "./common";
import Users from "./pages/user-management/users";
import Groups from "./pages/user-management/groups";
import SocaFileBrowser from "./pages/home/file-browser";
import VirtualDesktopDashboard from "./pages/virtual-desktops/virtual-desktop-dashboard";
import VirtualDesktopSessions from "./pages/virtual-desktops/virtual-desktop-sessions";
import VirtualDesktopSoftwareStacks from "./pages/virtual-desktops/virtual-desktop-software-stacks";
import MyVirtualDesktopSessions from "./pages/virtual-desktops/my-virtual-desktop-sessions";
import VirtualDesktopSettings from "./pages/virtual-desktops/virtual-desktop-settings";
import VirtualDesktopSessionDetail from "./pages/virtual-desktops/virtual-desktop-session-detail";
import VirtualDesktopDebug from "./pages/virtual-desktops/virtual-desktop-debug";
import { DashboardMain } from "./pages/dashboard";
import CostDashboard from "./pages/cost-dashboard/cost-dashboard";
import SSHAccess from "./pages/home/ssh-access";
import ClusterSettings from "./pages/cluster-admin/cluster-settings";
import ClusterStatus from "./pages/cluster-admin/cluster-status";
import Projects from "./pages/cluster-admin/projects";
import ConfigureProject from "./pages/cluster-admin/configure-project";
import FileSystems from "./pages/cluster-admin/filesystem";
import S3Buckets from "./pages/cluster-admin/s3-bucket";
import IdentityManagement from "./pages/cluster-admin/identity-management";
import AddS3Bucket from "./pages/cluster-admin/add-s3-bucket";
import EditS3Bucket from "./pages/cluster-admin/edit-s3-bucket";
import { Box, HelpPanel, SideNavigationProps, StatusIndicator } from "@cloudscape-design/components";
import { NonCancelableCustomEvent } from "@cloudscape-design/components/internal/events";
import { FlashbarProps } from "@cloudscape-design/components/flashbar/interfaces";
import ReactMarkdown from "react-markdown";
import remarkGfm from "remark-gfm";
import rehypeRaw from "rehype-raw";
import { applyDensity, applyMode, Density, Mode } from "@cloudscape-design/global-styles";
import VirtualDesktopPermissionProfileDetail from "./pages/permissions/desktop-sharing-profile-detail";
import MySharedVirtualDesktopSessions from "./pages/virtual-desktops/my-shared-virtual-desktop-sessions";
import VirtualDesktopSoftwareStackDetail from "./pages/virtual-desktops/virtual-desktop-software-stack-detail";
import { IdeaSideNavHeader, IdeaSideNavItems } from "./navigation/side-nav-items";
import { IdeaAppNavigationProps, withRouter } from "./navigation/navigation-utils";
import { Routes, Route, Navigate } from "react-router-dom";
import IdeaLogTail from "./pages/home/log-tail";
import Utils from "./common/utils";
import SnapshotManagement from "./pages/snapshots/snapshot-management"
import AuthzClient from "./client/authz-client";
import Permissions from "./pages/permissions/permissions";
import PermissionProfilesView from "./pages/permissions/view-permission-profile";
import ConfigurePermissionProfile from "./pages/permissions/configure-permission-profile";
import ConfigureDesktopSharingProfile from "./pages/permissions/configure-desktop-sharing-profile";
import { Constants, ErrorCodes } from "./common/constants";
export interface IdeaWebPortalAppProps extends IdeaAppNavigationProps {}
export interface IdeaWebPortalAppState {
sideNavHeader: SideNavigationProps.Header;
sideNavItems: SideNavigationProps.Item[];
isLoggedIn: boolean;
isInitialized: boolean;
toolsOpen: boolean;
tools: React.ReactNode;
flashbarItems: FlashbarProps.MessageDefinition[];
isFileBrowserEnabled: boolean;
projectPermissions?: { isInProject: boolean; canCreateOthersSession: boolean; }
isSshEnabled: boolean;
isGovCloudPartition: boolean;
projectOwnerRoles?: string[];
}
export interface OnToolsChangeEvent {
pageId: string;
open: boolean;
}
export interface OnPageChangeEvent {
pageId: string;
}
export interface OnFlashbarChangeEvent {
items: FlashbarProps.MessageDefinition[];
append?: boolean;
}
class IdeaWebPortalApp extends Component<IdeaWebPortalAppProps, IdeaWebPortalAppState> {
constructor(props: IdeaWebPortalAppProps) {
super(props);
this.state = {
isLoggedIn: false,
isInitialized: false,
sideNavHeader: {
text: "...",
href: "#/",
},
sideNavItems: [],
toolsOpen: false,
tools: null,
flashbarItems: [],
isFileBrowserEnabled: false,
projectPermissions: { isInProject: false, canCreateOthersSession: false },
isSshEnabled: false,
isGovCloudPartition: false,
projectOwnerRoles: [],
};
}
componentDidMount() {
AppContext.setOnRoute(this.onRoute);
const context = AppContext.get();
context
.auth()
.isLoggedIn()
.then((loginStatus) => {
const init = () => {
if (!context.auth().isAdmin()) {
const isInProject = async (): Promise<{
isInProject: boolean;
canCreateOthersSession: boolean;
}> => {
const output = {
isInProject: false,
canCreateOthersSession: false,
}
const user = await context.auth().getUser();
const authzClient: AuthzClient = context.client().authz();
const projects = await context.client().projects().getUserProjects({ username: user.username });
if (!projects.projects || projects.projects.length === 0) {
return output;
}
output.isInProject = true;
const rolePermissions = await authzClient.listRoles({
include_permissions: true,
});
const projectRoleAssignments: Promise<void>[] = [];
// for every project, we check if the user has permission to create sessions
// in that project
for (const project of projects.projects!) {
const resource_key = `${project.project_id!}:project`;
projectRoleAssignments.push(Promise.resolve(
authzClient.listRoleAssignments({ resource_key })
.then(async (result) => {
for (const roleAssignment of result.items) {
let currentUserIsInRole = user.additional_groups?.includes(roleAssignment.actor_id) || roleAssignment.actor_id === user.username!;
if (currentUserIsInRole) {
const rolePermission = rolePermissions.items.find(perm => perm.role_id === roleAssignment.role_id);
if (rolePermission && rolePermission.vdis?.create_terminate_others_sessions) {
output.canCreateOthersSession = true;
return; // we only need to know if one of the roles allows creating sessions for others
}
}
}
})
));
}
await Promise.all(projectRoleAssignments);
return output;
};
isInProject()
.then((projectPermissions) => {
// user is not assigned to any projects, don't render projects page
if (!projectPermissions.isInProject)
return;
const result: SideNavigationProps.Item[] = [...this.state.sideNavItems];
result.push({
type: "divider",
});
if (projectPermissions.canCreateOthersSession) {
result.push({
type: "section",
text: "Session Management",
defaultExpanded: true,
items: [
{
type: "link",
text: "Sessions",
href: "#/virtual-desktop/sessions",
}
]
});
}
result.push({
type: "section",
text: "Environment Management",
defaultExpanded: true,
items: [
{
type: "link",
text: "Projects",
href: "#/cluster/projects",
}
]
});
this.setState( { sideNavItems: result, projectPermissions: projectPermissions });
});
}
this.setState({
isInitialized: true,
isLoggedIn: loginStatus,
isFileBrowserEnabled: context.getClusterSettingsService().getIsFileBrowserEnabled(),
isSshEnabled: context.getClusterSettingsService().getIsSshEnabled(),
isGovCloudPartition: context.getClusterSettingsService().getIsGovCloudPartition(),
sideNavHeader: IdeaSideNavHeader(context),
sideNavItems: IdeaSideNavItems(context),
});
context.setHooks(this.onLogin, this.onLogout);
};
if (loginStatus) {
context
.getClusterSettingsService()
.initialize()
.then((_) => {
init();
});
} else {
init();
}
})
.catch((error) => {
console.error(error);
this.setState({
isInitialized: true,
isLoggedIn: false,
});
});
}
onLogin = (): Promise<boolean> => {
return new Promise((resolve, reject) => {
const context = AppContext.get();
context
.getClusterSettingsService()
.initialize()
.then((_) => {
this.setState(
{
isLoggedIn: true,
sideNavHeader: IdeaSideNavHeader(context),
sideNavItems: IdeaSideNavItems(context),
},
() => {
resolve(true);
}
);
})
.catch((error) => {
console.error(error);
reject(false);
});
});
};
onLogout = (): Promise<boolean> => {
return new Promise((resolve, _) => {
this.setState(
{
isLoggedIn: false,
},
() => {
applyDensity(Density.Comfortable);
applyMode(Mode.Light);
resolve(true);
}
);
});
};
onRoute = (path: string) => {
this.props.navigate(path);
};
onSideNavChange = (event: NonCancelableCustomEvent<SideNavigationProps.ChangeDetail>) => {
const items = this.state.sideNavItems;
items.forEach((item) => {
if (item.type === "section") {
if (item.text === event.detail.item.text) {
item.defaultExpanded = event.detail.expanded;
}
}
});
this.setState({
sideNavItems: [...items],
});
};
fetchContextHelp = (pageId: string) => {
let helpContent = require(`./docs/${pageId}.md`);
let footer = require(`./docs/_footer.md`);
fetch(helpContent).then((helpContentResponse) => {
fetch(footer).then((footerResponse) => {
helpContentResponse.text().then((content) => {
footerResponse.text().then((footerContent) => {
let lines = content.split("\n");
if (lines.length === 0) {
return;
}
const header = lines[0];
const children = lines.splice(1).join("\n");
this.setState({
tools: <HelpPanel header={<ReactMarkdown children={header} />} children={<ReactMarkdown children={children} remarkPlugins={[remarkGfm]} rehypePlugins={[rehypeRaw]} />} footer={<ReactMarkdown children={footerContent} remarkPlugins={[remarkGfm]} rehypePlugins={[rehypeRaw]} />} />,
});
});
});
});
});
};
onPageChange = (event: OnPageChangeEvent) => {
if (this.state.toolsOpen) {
this.setState(
{
tools: (
<Box textAlign={"center"} margin={"xxxl"}>
<StatusIndicator type="loading" />
</Box>
),
},
() => {
this.fetchContextHelp(event.pageId);
}
);
}
if (this.state.flashbarItems.length > 0) {
this.setState({
flashbarItems: [],
});
}
};
onToolsChange = (event: OnToolsChangeEvent) => {
this.setState(
{
toolsOpen: event.open,
tools: event.open ? (
<Box textAlign={"center"} margin={"xxxl"}>
<StatusIndicator type="loading" />
</Box>
) : null,
},
() => {
this.fetchContextHelp(event.pageId);
}
);
};
onFlashbarChange = (event: OnFlashbarChangeEvent) => {
let items: FlashbarProps.MessageDefinition[] = [];
if (typeof event.append !== "undefined" && event.append) {
this.state.flashbarItems.forEach((item) => {
items.push(item);
});
}
event.items.forEach((item, index) => {
item.id = Utils.getUUID();
if (item.dismissible) {
// create a closure to retain the index
const dismiss = (id: string) => {
return () => {
let updatedItems = [...this.state.flashbarItems];
updatedItems = updatedItems.filter((item) => item.id !== id);
this.setState({
flashbarItems: updatedItems,
});
};
};
item.onDismiss = dismiss(item.id!);
}
items.push(item);
});
this.setState({
flashbarItems: items,
});
};
render() {
return (
this.state.isInitialized && (
<Routes>
{/*authentication pages*/}
<Route
path="/auth/login"
element={
<IdeaAuthenticatedRoute path="/auth/login" isLoggedIn={this.state.isLoggedIn}>
<IdeaAuthLogin />
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/auth/login-redirect"
element={
<IdeaAuthenticatedRoute path="/auth/login-redirect" isLoggedIn={this.state.isLoggedIn}>
<IdeaAuthLoginRedirect />
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/auth/forgot-password"
element={
<IdeaAuthenticatedRoute path="/auth/forgot-password" isLoggedIn={this.state.isLoggedIn}>
<IdeaAuthForgotPassword />
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/auth/confirm-forgot-password"
element={
<IdeaAuthenticatedRoute path="/auth/confirm-forgot-password" isLoggedIn={this.state.isLoggedIn}>
<IdeaAuthConfirmForgotPassword />
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/auth/challenge"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<IdeaAuthChallenge />
</IdeaAuthenticatedRoute>
}
/>
{
Utils.isSelfSignUpEnabled() &&
Utils.isNativeUserLoginEnabled() && (
<>
<Route
path="/auth/sign-up"
element={
<IdeaAuthenticatedRoute path="/auth/sign-up" isLoggedIn={this.state.isLoggedIn}>
<RESAuthSignUp />
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/auth/verify-account"
element={
<IdeaAuthenticatedRoute path="/auth/verify-account" isLoggedIn={this.state.isLoggedIn}>
<RESAuthVerifyAccount />
</IdeaAuthenticatedRoute>
}
/>
</>
)
}
{/*home*/}
<Route
path="/"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<Home
ideaPageId="home"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/dashboard"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<DashboardMain
ideaPageId="dashboard"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
{/*cost dashboard*/}
{
!this.state.isGovCloudPartition &&
<Route
path="/home/cost-dashboard"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<CostDashboard
ideaPageId="cost-dashboard"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
}
{/*user home*/}
<Route
path="/home/virtual-desktops"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<MyVirtualDesktopSessions
ideaPageId="my-virtual-desktop-sessions"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/home/shared-desktops"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<MySharedVirtualDesktopSessions
ideaPageId="my-shared-virtual-desktop-sessions"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/home/file-browser"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn} isFileBrowserEnabled={this.state.isFileBrowserEnabled}>
<SocaFileBrowser
ideaPageId="file-browser"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/home/file-browser/tail"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn} isFileBrowserEnabled={this.state.isFileBrowserEnabled}>
<IdeaLogTail
ideaPageId="log-tail"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/home/ssh-access"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn} isSshEnabled={this.state.isSshEnabled}>
<SSHAccess
ideaPageId="ssh-access"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
{/*virtual desktop*/}
<Route
path="/virtual-desktop/dashboard"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<VirtualDesktopDashboard
ideaPageId="virtual-desktop-dashboard"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/virtual-desktop/sessions/:idea_session_id"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<VirtualDesktopSessionDetail
ideaPageId="virtual-desktop-session-detail"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/virtual-desktop/sessions"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn} hasProjectBasedPermission={this.state.projectPermissions?.canCreateOthersSession}>
<VirtualDesktopSessions
ideaPageId="virtual-desktop-sessions"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/virtual-desktop/software-stacks"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<VirtualDesktopSoftwareStacks
ideaPageId="virtual-desktop-software-stacks"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/virtual-desktop/software-stacks/:software_stack_id/:software_stack_base_os"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<VirtualDesktopSoftwareStackDetail
ideaPageId="virtual-desktop-software-stack-detail"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/virtual-desktop/settings"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<VirtualDesktopSettings
ideaPageId="virtual-desktop-settings"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/virtual-desktop/debug"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<VirtualDesktopDebug
ideaPageId="virtual-desktop-debug"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/cluster/permissions/sharing-profiles/:profile_id"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<VirtualDesktopPermissionProfileDetail
ideaPageId="virtual-desktop-permission-profile-detail"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
{/* environment */}
<Route
path="/cluster/projects"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn} hasProjectBasedPermission={this.state.projectPermissions?.isInProject || false}>
<Projects
ideaPageId="projects"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
projectOwnerRoles={this.state.projectOwnerRoles}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/cluster/projects/configure"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn} hasProjectBasedPermission={this.state.projectPermissions?.isInProject}>
<ConfigureProject
ideaPageId="configure-project"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/cluster/users"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<Users
ideaPageId="users"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/cluster/groups"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<Groups
ideaPageId="groups"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/cluster/filesystem"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<FileSystems
ideaPageId="filesystem"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/cluster/s3-bucket"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<S3Buckets
ideaPageId="s3-bucket"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/cluster/s3-bucket/add-bucket"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<AddS3Bucket
ideaPageId="add-bucket"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/cluster/s3-bucket/edit-bucket"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<EditS3Bucket
ideaPageId="edit-bucket"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/cluster/identity-management"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<IdentityManagement
ideaPageId="identity-management"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/cluster/permissions"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<Permissions
ideaPageId="permissions"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/cluster/permissions/project-roles/:profile_id"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<PermissionProfilesView
ideaPageId="project-roles-view-detail"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/cluster/permissions/project-roles/configure"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<ConfigurePermissionProfile
ideaPageId="project-roles-configure"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/cluster/permissions/sharing-profiles/configure"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<ConfigureDesktopSharingProfile
ideaPageId="sharing-profiles-configure"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/cluster/status"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<ClusterStatus
ideaPageId="cluster-status"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
{/*<Route*/}
{/* path="/cluster/email-templates"*/}
{/* element={*/}
{/* <IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>*/}
{/* <EmailTemplates*/}
{/* ideaPageId="email-templates"*/}
{/* toolsOpen={this.state.toolsOpen}*/}
{/* tools={this.state.tools}*/}
{/* onToolsChange={this.onToolsChange}*/}
{/* onPageChange={this.onPageChange}*/}
{/* sideNavItems={this.state.sideNavItems}*/}
{/* sideNavHeader={this.state.sideNavHeader}*/}
{/* onSideNavChange={this.onSideNavChange}*/}
{/* onFlashbarChange={this.onFlashbarChange}*/}
{/* flashbarItems={this.state.flashbarItems}*/}
{/* />*/}
{/* </IdeaAuthenticatedRoute>*/}
{/* }*/}
{/*/>*/}
<Route
path="/cluster/snapshot-management"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<SnapshotManagement
ideaPageId="snapshot-management"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route
path="/cluster/settings"
element={
<IdeaAuthenticatedRoute isLoggedIn={this.state.isLoggedIn}>
<ClusterSettings
ideaPageId="cluster-settings"
toolsOpen={this.state.toolsOpen}
tools={this.state.tools}
onToolsChange={this.onToolsChange}
onPageChange={this.onPageChange}
sideNavItems={this.state.sideNavItems}
sideNavHeader={this.state.sideNavHeader}
onSideNavChange={this.onSideNavChange}
onFlashbarChange={this.onFlashbarChange}
flashbarItems={this.state.flashbarItems}
/>
</IdeaAuthenticatedRoute>
}
/>
<Route path="*" element={<Navigate to="/" replace />} />
</Routes>
)
);
}
}
export default withRouter(IdeaWebPortalApp);