1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import React, { ReactElement } from 'react'
6 import { connect } from 'react-redux'
7 import { ProjectsIcon, ProcessIcon, FavoriteIcon, ShareMeIcon, TrashIcon, PublicFavoriteIcon, GroupsIcon, ResourceIcon } from 'components/icon/icon'
8 import { TerminalIcon } from 'components/icon/icon'
9 import { IconButton, List, ListItem, Tooltip } from '@mui/material'
10 import { CustomStyleRulesCallback } from 'common/custom-theme';
11 import { WithStyles } from '@mui/styles';
12 import withStyles from '@mui/styles/withStyles';
13 import { ArvadosTheme } from 'common/custom-theme'
14 import { navigateTo, navigateToInstanceTypes } from 'store/navigation/navigation-action'
15 import { RootState } from 'store/store'
16 import { Dispatch } from 'redux'
18 navigateToSharedWithMe,
19 navigateToPublicFavorites,
22 navigateToAllProcesses,
24 } from 'store/navigation/navigation-action'
25 import { navigateToUserVirtualMachines } from 'store/navigation/navigation-action'
26 import { RouterAction } from 'react-router-redux'
27 import { User } from 'models/user'
29 type CssRules = 'button' | 'unselected' | 'selected'
31 const styles: CustomStyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
36 marginLeft: '-0.6rem',
40 color: theme.customs.colors.grey600,
43 color: theme.palette.primary.main,
47 enum SidePanelCollapsedCategory {
48 PROJECTS = 'Home Projects',
49 FAVORITES = 'My Favorites',
50 PUBLIC_FAVORITES = 'Public Favorites',
51 SHARED_WITH_ME = 'Shared with me',
52 ALL_PROCESSES = 'All Processes',
53 INSTANCE_TYPES = 'Instance Types',
54 SHELL_ACCESS = 'Shell Access',
59 type TCollapsedCategory = {
60 name: SidePanelCollapsedCategory
62 navTarget: RouterAction | ''
65 const sidePanelCollapsedCategories: TCollapsedCategory[] = [
67 name: SidePanelCollapsedCategory.PROJECTS,
68 icon: <ProjectsIcon />,
72 name: SidePanelCollapsedCategory.FAVORITES,
73 icon: <FavoriteIcon />,
74 navTarget: navigateToFavorites,
77 name: SidePanelCollapsedCategory.PUBLIC_FAVORITES,
78 icon: <PublicFavoriteIcon />,
79 navTarget: navigateToPublicFavorites,
82 name: SidePanelCollapsedCategory.SHARED_WITH_ME,
83 icon: <ShareMeIcon />,
84 navTarget: navigateToSharedWithMe,
87 name: SidePanelCollapsedCategory.ALL_PROCESSES,
88 icon: <ProcessIcon />,
89 navTarget: navigateToAllProcesses,
92 name: SidePanelCollapsedCategory.INSTANCE_TYPES,
93 icon: <ResourceIcon />,
94 navTarget: navigateToInstanceTypes,
97 name: SidePanelCollapsedCategory.SHELL_ACCESS,
98 icon: <TerminalIcon />,
99 navTarget: navigateToUserVirtualMachines,
102 name: SidePanelCollapsedCategory.GROUPS,
103 icon: <GroupsIcon style={{marginLeft: '2px', scale: '85%'}}/>,
104 navTarget: navigateToGroups,
107 name: SidePanelCollapsedCategory.TRASH,
109 navTarget: navigateToTrash,
113 type SidePanelCollapsedProps = {
115 selectedPath: string;
116 navToHome: (uuid: string) => void;
117 navTo: (navTarget: RouterAction | '') => void;
120 const mapStateToProps = ({auth, properties }: RootState) => {
123 selectedPath: properties.breadcrumbs
124 ? properties.breadcrumbs[0].label
125 : SidePanelCollapsedCategory.PROJECTS,
129 const mapDispatchToProps = (dispatch: Dispatch) => {
131 navToHome: (navTarget) => dispatch<any>(navigateTo(navTarget)),
132 navTo: (navTarget) => dispatch<any>(navTarget),
136 export const SidePanelCollapsed = withStyles(styles)(
137 connect(mapStateToProps, mapDispatchToProps)(({ classes, user, selectedPath, navToHome, navTo }: WithStyles<CssRules> & SidePanelCollapsedProps) => {
139 const handleClick = (cat: TCollapsedCategory) => {
140 if (cat.name === SidePanelCollapsedCategory.PROJECTS) navToHome(user.uuid)
141 else navTo(cat.navTarget)
144 const { button, unselected, selected } = classes
146 <List data-cy='side-panel-collapsed'>
147 {sidePanelCollapsedCategories.map((cat) => (
150 data-cy={`collapsed-${cat.name.toLowerCase().replace(/\s+/g, '-')}`}
151 onClick={() => handleClick(cat)}
154 className={selectedPath === cat.name ? selected : unselected}
158 <IconButton className={button} size="large">{cat.icon}</IconButton>