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 = {
43 onClick={() => this.props.onItemClick(item)}
49 <Typography color="primary">
60 <Typography noWrap align="center">
78 <Typography noWrap color="primary">
86 render: ({ fileSize }) => (
88 {typeof fileSize === "number" ? formatFileSize(fileSize) : "-"}
93 header: "Last modified",
97 {formatDate(item.lastModified)}
106 renderHeader: () => (
107 <Grid container justify="flex-end">
109 columns={this.state.columns}
110 onColumnToggle={this.toggleColumn}
115 <Grid container justify="flex-end">
116 <Popover triggerComponent={ItemActionsTrigger}>
120 icon: "fas fa-users",
124 icon: "fas fa-sign-out-alt",
129 label: "Add to favourite"
140 icon: "fas fa-download",
146 renderAction({ icon: "fas fa-trash-alt", label: "Remove" })
159 columns={this.state.columns}
160 items={this.props.items}
161 onColumnToggle={this.toggleColumn}
166 toggleColumn = (column: Column<ProjectItem>) => {
167 const index = this.state.columns.indexOf(column);
168 const columns = this.state.columns.slice(0);
169 columns.splice(index, 1, { ...column, selected: !column.selected });
170 this.setState({ columns });
174 const formatDate = (isoDate: string) => {
175 const date = new Date(isoDate);
176 return date.toLocaleString();
179 const formatFileSize = (size: number) => {
181 case size > 1000000000000:
182 return `${size / 1000000000000} TB`;
183 case size > 1000000000:
184 return `${size / 1000000000} GB`;
186 return `${size / 1000000} MB`;
188 return `${size / 1000} KB`;
194 const renderIcon = (projectItem: ProjectItem) => {
195 switch (projectItem.type) {
196 case "arvados#group":
197 return <i className="fas fa-folder fa-lg" />;
198 case "arvados#groupList":
199 return <i className="fas fa-th fa-lg"/>;
205 const renderAction = (action: { label: string, icon: string }, index?: number) => (
206 <ListItem button key={index}>
208 <i className={action.icon} />
216 const ItemActionsTrigger: React.SFC<IconButtonProps> = (props) => (
217 <IconButton {...props}>
222 export default ProjectExplorer;