1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import * as React from 'react';
6 import DataExplorer, { DataExplorerProps } from "../../components/data-explorer/data-explorer";
7 import { Typography, Grid, ListItem, Divider, List, ListItemIcon, ListItemText } from '@material-ui/core';
8 import { Column } from '../../components/data-explorer/column';
9 import IconButton, { IconButtonProps } from '@material-ui/core/IconButton';
10 import MoreVertIcon from "@material-ui/icons/MoreVert";
11 import Popover from '../popover/popover';
13 export interface ProjectItem {
22 interface ProjectExplorerProps {
24 onItemClick: (item: ProjectItem) => void;
27 type ProjectExplorerState = Pick<DataExplorerProps<ProjectItem>, "columns">;
29 class ProjectExplorer extends React.Component<ProjectExplorerProps, ProjectExplorerState> {
31 state: ProjectExplorerState = {
37 <Grid container onClick={() => this.props.onItemClick(item)}>
39 <Typography style={{ marginLeft: 8 }}>
49 <Typography noWrap align="center">
75 render: ({ fileSize }) => (
77 {typeof fileSize === "number" ? formatFileSize(fileSize) : "-"}
82 header: "Last modified",
86 {formatDate(item.lastModified)}
94 renderHeader: () => <span/>,
96 <Grid container justify="flex-end">
97 <Popover triggerComponent={ItemActionsTrigger}>
101 icon: "fas fa-users",
105 icon: "fas fa-sign-out-alt",
110 label: "Add to favourite"
121 icon: "fas fa-download",
127 renderAction({ icon: "fas fa-trash-alt", label: "Remove" })
140 columns={this.state.columns}
141 items={this.props.items}
142 onColumnToggle={this.toggleColumn}
147 toggleColumn = (column: Column<ProjectItem>) => {
148 const index = this.state.columns.indexOf(column);
149 const columns = this.state.columns.slice(0);
150 columns.splice(index, 1, { ...column, selected: !column.selected });
151 this.setState({ columns });
155 const formatDate = (isoDate: string) => {
156 const date = new Date(isoDate);
157 return date.toLocaleString();
160 const formatFileSize = (size: number) => {
162 case size > 1000000000000:
163 return `${size / 1000000000000} TB`;
164 case size > 1000000000:
165 return `${size / 1000000000} GB`;
167 return `${size / 1000000} MB`;
169 return `${size / 1000} KB`;
175 const renderIcon = (projectItem: ProjectItem) => {
176 switch (projectItem.type) {
177 case "arvados#group":
178 return <i className="fas fa-folder" />;
179 case "arvados#groupList":
180 return <i className="fas fa-th" />;
186 const renderAction = (action: { label: string, icon: string }, index?: number) => (
187 <ListItem button key={index}>
189 <i className={action.icon} />
197 const ItemActionsTrigger: React.SFC<IconButtonProps> = (props) => (
198 <IconButton {...props}>
203 export default ProjectExplorer;