1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
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 import { openSidePanelContextMenu } from '~/store/context-menu/context-menu-actions';
17 export interface SidePanelTreeProps {
18 onItemActivation: (id: string) => void;
19 sidePanelProgress?: boolean;
22 type SidePanelTreeActionProps = Pick<TreePickerProps, 'onContextMenu' | 'toggleItemActive' | 'toggleItemOpen'>;
24 const mapDispatchToProps = (dispatch: Dispatch, props: SidePanelTreeProps): SidePanelTreeActionProps => ({
25 onContextMenu: (event, id) => {
26 dispatch<any>(openSidePanelContextMenu(event, id));
28 toggleItemActive: (nodeId) => {
29 dispatch<any>(activateSidePanelTreeItem(nodeId));
30 props.onItemActivation(nodeId);
32 toggleItemOpen: (nodeId) => {
33 dispatch<any>(toggleSidePanelTreeItemCollapse(nodeId));
37 export const SidePanelTree = connect(undefined, mapDispatchToProps)(
38 (props: SidePanelTreeActionProps) =>
39 <TreePicker {...props} render={renderSidePanelItem} pickerId={SIDE_PANEL_TREE} />);
41 const renderSidePanelItem = (item: TreeItem<ProjectResource>) =>
43 icon={getProjectPickerIcon(item)}
44 name={typeof item.data === 'string' ? item.data : item.data.name}
45 isActive={item.active}
48 const getProjectPickerIcon = (item: TreeItem<ProjectResource | string>) =>
49 typeof item.data === 'string'
50 ? getSidePanelIcon(item.data)
53 const getSidePanelIcon = (category: string) => {
55 case SidePanelTreeCategory.FAVORITES:
57 case SidePanelTreeCategory.PROJECTS:
59 case SidePanelTreeCategory.RECENT_OPEN:
61 case SidePanelTreeCategory.SHARED_WITH_ME:
63 case SidePanelTreeCategory.TRASH:
65 case SidePanelTreeCategory.WORKFLOWS: