From 9b423a1e4ac7aa6077399da13a3d786df0eed11c Mon Sep 17 00:00:00 2001 From: Michal Klobukowski Date: Fri, 27 Jul 2018 13:25:46 +0200 Subject: [PATCH] Create FileTree component Feature #13855 Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski --- src/components/file-tree/file-tree-data.ts | 9 +++ src/components/file-tree/file-tree-item.tsx | 61 +++++++++++++++++++++ src/components/file-tree/file-tree.tsx | 51 +++++++++++++++++ 3 files changed, 121 insertions(+) create mode 100644 src/components/file-tree/file-tree-data.ts create mode 100644 src/components/file-tree/file-tree-item.tsx create mode 100644 src/components/file-tree/file-tree.tsx diff --git a/src/components/file-tree/file-tree-data.ts b/src/components/file-tree/file-tree-data.ts new file mode 100644 index 00000000..4be4ace8 --- /dev/null +++ b/src/components/file-tree/file-tree-data.ts @@ -0,0 +1,9 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: AGPL-3.0 + +export interface FileTreeData { + name: string; + type: string; + size?: number; +} diff --git a/src/components/file-tree/file-tree-item.tsx b/src/components/file-tree/file-tree-item.tsx new file mode 100644 index 00000000..e65c6cdf --- /dev/null +++ b/src/components/file-tree/file-tree-item.tsx @@ -0,0 +1,61 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: AGPL-3.0 + +import * as React from "react"; +import { TreeItem } from "../tree/tree"; +import { ProjectIcon, MoreOptionsIcon } from "../icon/icon"; +import { Typography, IconButton, StyleRulesCallback, withStyles, WithStyles } from "@material-ui/core"; +import { formatFileSize } from "../../common/formatters"; +import { ListItemTextIcon } from "../list-item-text-icon/list-item-text-icon"; +import { FileTreeData } from "./file-tree-data"; + +type CssRules = "root" | "spacer" | "sizeInfo" | "button"; + +const fileTreeItemStyle: StyleRulesCallback = theme => ({ + root: { + display: "flex", + alignItems: "center", + paddingRight: `${theme.spacing.unit}px` + }, + spacer: { + flex: "1" + }, + sizeInfo: { + marginRight: `${theme.spacing.unit * 3}px` + }, + button: { + width: theme.spacing.unit * 3, + height: theme.spacing.unit * 3 + } +}); + +export interface FileTreeItemProps { + item: TreeItem; + onMoreClick: (event: React.MouseEvent, item: TreeItem) => void; +} +export const FileTreeItem = withStyles(fileTreeItemStyle)( + class extends React.Component> { + render() { + const { classes, item } = this.props; + return
+ +
+ {formatFileSize(item.data.size)} + + + +
; + } + + handleClick = (event: React.MouseEvent) => { + this.props.onMoreClick(event, this.props.item); + } + }); + diff --git a/src/components/file-tree/file-tree.tsx b/src/components/file-tree/file-tree.tsx new file mode 100644 index 00000000..bb70f25c --- /dev/null +++ b/src/components/file-tree/file-tree.tsx @@ -0,0 +1,51 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: AGPL-3.0 + +import * as React from "react"; +import { Tree, TreeItem, TreeItemStatus } from "../tree/tree"; +import { FileTreeData } from "./file-tree-data"; +import { FileTreeItem } from "./file-tree-item"; + +export interface FileTreeProps { + items: Array>; + onContextMenu: (event: React.MouseEvent, item: TreeItem) => void; + onSelectionToggle: (event: React.MouseEvent, item: TreeItem) => void; + onCollapseToggle: (id: string, status: TreeItemStatus) => void; +} + +export class FileTree extends React.Component { + render() { + return ; + } + + handleContextMenu = (event: React.MouseEvent, item: TreeItem) => { + event.stopPropagation(); + this.props.onContextMenu(event, item); + } + + handleToggle = (id: string, status: TreeItemStatus) => { + this.props.onCollapseToggle(id, status); + } + + handleToggleActive = () => { return; }; + + handleSelectionChange = (event: React.MouseEvent, item: TreeItem) => { + event.stopPropagation(); + this.props.onSelectionToggle(event, item); + } + + renderItem = (item: TreeItem) => + + +} -- 2.39.5