1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import * as React from "react";
6 import { TreeItem, TreeItemStatus } from "../tree/tree";
7 import { VirtualTree } from "../tree/virtual-tree";
8 import { FileTreeData } from "./file-tree-data";
9 import { FileTreeItem } from "./file-tree-item";
11 export interface FileTreeProps {
12 items: Array<TreeItem<FileTreeData>>;
13 onMenuOpen: (event: React.MouseEvent<HTMLElement>, item: TreeItem<FileTreeData>) => void;
14 onSelectionToggle: (event: React.MouseEvent<HTMLElement>, item: TreeItem<FileTreeData>) => void;
15 onCollapseToggle: (id: string, status: TreeItemStatus) => void;
16 onFileClick: (id: string) => void;
17 currentItemUuid?: string;
20 const Tree = VirtualTree(20);
21 export class FileTree extends React.Component<FileTreeProps> {
25 items={this.props.items}
27 render={this.renderItem}
28 onContextMenu={this.handleContextMenu}
29 toggleItemActive={this.handleToggleActive}
30 toggleItemOpen={this.handleToggle}
31 toggleItemSelection={this.handleSelectionChange}
32 currentItemUuid={this.props.currentItemUuid} />;
35 handleContextMenu = (event: React.MouseEvent<any>, item: TreeItem<FileTreeData>) => {
36 event.stopPropagation();
37 this.props.onMenuOpen(event, item);
40 handleToggle = (event: React.MouseEvent<{}>, { id, status }: TreeItem<{}>) => {
41 this.props.onCollapseToggle(id, status);
44 handleToggleActive = (_: React.MouseEvent<HTMLElement>, item: TreeItem<FileTreeData>) => {
45 this.props.onFileClick(item.id);
48 handleSelectionChange = (event: React.MouseEvent<HTMLElement>, item: TreeItem<FileTreeData>) => {
49 event.stopPropagation();
50 this.props.onSelectionToggle(event, item);
53 renderItem = (item: TreeItem<FileTreeData>) =>
56 onMoreClick={this.handleContextMenu} />