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 ColumnsConfigurator from "../../components/data-explorer/columns-configurator/columns-configurator";
8 import { Typography, Grid, ListItem, Divider, List, ListItemIcon, ListItemText } from '@material-ui/core';
9 import { Column } from '../../components/data-explorer/column';
10 import IconButton, { IconButtonProps } from '@material-ui/core/IconButton';
11 import MoreVertIcon from "@material-ui/icons/MoreVert";
12 import Popover from '../popover/popover';
14 export interface ProjectItem {
23 interface ProjectExplorerProps {
25 onItemClick: (item: ProjectItem) => void;
28 type ProjectExplorerState = Pick<DataExplorerProps<ProjectItem>, "columns">;
30 class ProjectExplorer extends React.Component<ProjectExplorerProps, ProjectExplorerState> {
32 state: ProjectExplorerState = {
38 <Grid container onClick={() => this.props.onItemClick(item)}>
40 <Typography style={{ marginLeft: 8 }}>
50 <Typography noWrap align="center">
76 render: ({ fileSize }) => (
78 {typeof fileSize === "number" ? formatFileSize(fileSize) : "-"}
83 header: "Last modified",
87 {formatDate(item.lastModified)}
97 <Grid container justify="flex-end">
99 columns={this.state.columns}
100 onColumnToggle={this.toggleColumn}
105 <Grid container justify="flex-end">
106 <Popover triggerComponent={ItemActionsTrigger}>
110 icon: "fas fa-users",
114 icon: "fas fa-sign-out-alt",
119 label: "Add to favourite"
130 icon: "fas fa-download",
136 renderAction({ icon: "fas fa-trash-alt", label: "Remove" })
149 columns={this.state.columns}
150 items={this.props.items}
151 onColumnToggle={this.toggleColumn}
156 toggleColumn = (column: Column<ProjectItem>) => {
157 const index = this.state.columns.indexOf(column);
158 const columns = this.state.columns.slice(0);
159 columns.splice(index, 1, { ...column, selected: !column.selected });
160 this.setState({ columns });
164 const formatDate = (isoDate: string) => {
165 const date = new Date(isoDate);
166 return date.toLocaleString();
169 const formatFileSize = (size: number) => {
171 case size > 1000000000000:
172 return `${size / 1000000000000} TB`;
173 case size > 1000000000:
174 return `${size / 1000000000} GB`;
176 return `${size / 1000000} MB`;
178 return `${size / 1000} KB`;
184 const renderIcon = (projectItem: ProjectItem) => {
185 switch (projectItem.type) {
186 case "arvados#group":
187 return <i className="fas fa-folder" />;
188 case "arvados#groupList":
189 return <i className="fas fa-th" />;
195 const renderAction = (action: { label: string, icon: string }, index?: number) => (
196 <ListItem button key={index}>
198 <i className={action.icon} />
206 const ItemActionsTrigger: React.SFC<IconButtonProps> = (props) => (
207 <IconButton {...props}>
212 export default ProjectExplorer;