1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import React, { ReactElement, useState } from 'react'
6 import { connect } from 'react-redux'
7 import { ProjectsIcon, ProcessIcon, FavoriteIcon, ShareMeIcon, TrashIcon, PublicFavoriteIcon, GroupsIcon } from 'components/icon/icon'
8 import { List, ListItem, Tooltip } from '@material-ui/core'
9 import { StyleRulesCallback, WithStyles, withStyles } from '@material-ui/core/styles'
10 import { ArvadosTheme } from 'common/custom-theme'
11 import { navigateTo } from 'store/navigation/navigation-action'
12 import { RootState } from 'store/store'
13 import { Dispatch } from 'redux'
15 navigateToSharedWithMe,
16 navigateToPublicFavorites,
19 navigateToAllProcesses,
21 } from 'store/navigation/navigation-action'
22 import { RouterAction } from 'react-router-redux'
23 import { Tree } from 'models/tree'
25 type CssRules = 'root' | 'unselected' | 'selected'
27 const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
30 color: theme.customs.colors.grey700,
33 color: theme.palette.primary.main,
37 enum SidePanelCollapsedCategory {
38 PROJECTS = 'Home Projects',
39 SHARED_WITH_ME = 'Shared with me',
40 PUBLIC_FAVORITES = 'Public Favorites',
41 FAVORITES = 'My Favorites',
43 ALL_PROCESSES = 'All Processes',
47 type TCollapsedCategory = {
48 name: SidePanelCollapsedCategory
50 navTarget: RouterAction | ''
53 const sidePanelCollapsedCategories: TCollapsedCategory[] = [
55 name: SidePanelCollapsedCategory.PROJECTS,
56 icon: <ProjectsIcon />,
60 name: SidePanelCollapsedCategory.SHARED_WITH_ME,
61 icon: <ShareMeIcon />,
62 navTarget: navigateToSharedWithMe,
65 name: SidePanelCollapsedCategory.PUBLIC_FAVORITES,
66 icon: <PublicFavoriteIcon />,
67 navTarget: navigateToPublicFavorites,
70 name: SidePanelCollapsedCategory.FAVORITES,
71 icon: <FavoriteIcon />,
72 navTarget: navigateToFavorites,
75 name: SidePanelCollapsedCategory.GROUPS,
77 navTarget: navigateToGroups,
80 name: SidePanelCollapsedCategory.ALL_PROCESSES,
81 icon: <ProcessIcon />,
82 navTarget: navigateToAllProcesses,
85 name: SidePanelCollapsedCategory.TRASH,
87 navTarget: navigateToTrash,
91 const findSelectedPath = (tree: Tree<any>) => {
92 for (const category in tree) {
93 if (tree[category].active === true) {
94 return tree[category].id
100 const mapStateToProps = (state: RootState) => {
102 user: state.auth.user,
103 selectedPath: findSelectedPath(state.treePicker.sidePanelTree),
107 const mapDispatchToProps = (dispatch: Dispatch) => {
109 navToHome: (navTarget) => dispatch<any>(navigateTo(navTarget)),
110 navTo: (navTarget) => dispatch<any>(navTarget),
114 export const SidePanelCollapsed = withStyles(styles)(
115 connect(mapStateToProps, mapDispatchToProps)(({ classes, user, selectedPath, navToHome, navTo }: WithStyles & any) => {
116 const [selectedIcon, setSelectedIcon] = useState(selectedPath)
118 const handleClick = (cat: TCollapsedCategory) => {
119 setSelectedIcon(cat.name)
120 if (cat.name === SidePanelCollapsedCategory.PROJECTS) navToHome(user.uuid)
121 else navTo(cat.navTarget)
124 const { root, unselected, selected } = classes
126 <List className={root}>
127 {sidePanelCollapsedCategories.map((cat) => (
130 className={selectedIcon === cat.name ? selected : unselected}
131 onClick={() => handleClick(cat)}