Refactor to apply global navigation actions
[arvados-workbench2.git] / src / views-components / side-panel-tree / side-panel-tree.tsx
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import * as React from "react";
6 import { Dispatch } from "redux";
7 import { connect } from "react-redux";
8 import { TreePicker, TreePickerProps } from "../tree-picker/tree-picker";
9 import { TreeItem } from "~/components/tree/tree";
10 import { ProjectResource } from "~/models/project";
11 import { ListItemTextIcon } from "~/components/list-item-text-icon/list-item-text-icon";
12 import { ProjectIcon, FavoriteIcon, ProjectsIcon, ShareMeIcon, TrashIcon } from '~/components/icon/icon';
13 import { RecentIcon, WorkflowIcon } from '~/components/icon/icon';
14 import { activateSidePanelTreeItem, toggleSidePanelTreeItemCollapse, SIDE_PANEL_TREE, SidePanelTreeCategory } from '~/store/side-panel-tree/side-panel-tree-actions';
15
16 export interface SidePanelTreeProps {
17     onItemActivation: (id: string) => void;
18 }
19
20 type SidePanelTreeActionProps = Pick<TreePickerProps, 'toggleItemActive' | 'toggleItemOpen'>;
21
22 const mapDispatchToProps = (dispatch: Dispatch, props: SidePanelTreeProps): SidePanelTreeActionProps => ({
23     toggleItemActive: (nodeId) => {
24         dispatch<any>(activateSidePanelTreeItem(nodeId));
25         props.onItemActivation(nodeId);
26     },
27     toggleItemOpen: (nodeId) => {
28         dispatch<any>(toggleSidePanelTreeItemCollapse(nodeId));
29     }
30 });
31
32 export const SidePanelTree = connect(undefined, mapDispatchToProps)(
33     (props: SidePanelTreeActionProps) =>
34         <TreePicker {...props} render={renderSidePanelItem} pickerId={SIDE_PANEL_TREE} />);
35
36 const renderSidePanelItem = (item: TreeItem<ProjectResource>) =>
37     <ListItemTextIcon
38         icon={getProjectPickerIcon(item)}
39         name={typeof item.data === 'string' ? item.data : item.data.name}
40         isActive={item.active}
41         hasMargin={true} />;
42
43 const getProjectPickerIcon = (item: TreeItem<ProjectResource | string>) =>
44     typeof item.data === 'string'
45         ? getSidePanelIcon(item.data)
46         : ProjectIcon;
47
48 const getSidePanelIcon = (category: string) => {
49     switch (category) {
50         case SidePanelTreeCategory.FAVORITES:
51             return FavoriteIcon;
52         case SidePanelTreeCategory.PROJECTS:
53             return ProjectsIcon;
54         case SidePanelTreeCategory.RECENT_OPEN:
55             return RecentIcon;
56         case SidePanelTreeCategory.SHARED_WITH_ME:
57             return ShareMeIcon;
58         case SidePanelTreeCategory.TRASH:
59             return TrashIcon;
60         case SidePanelTreeCategory.WORKFLOWS:
61             return WorkflowIcon;
62         default:
63             return ProjectIcon;
64     }
65 };