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 } 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 <Popover triggerComponent={ItemActionsTrigger}>
96 <ListItem>Share</ListItem>
98 <ListItem>Remove</ListItem>
109 columns={this.state.columns}
110 items={this.props.items}
111 onColumnToggle={this.toggleColumn}
116 toggleColumn = (column: Column<ProjectItem>) => {
117 const index = this.state.columns.indexOf(column);
118 const columns = this.state.columns.slice(0);
119 columns.splice(index, 1, { ...column, selected: !column.selected });
120 this.setState({ columns });
124 const formatDate = (isoDate: string) => {
125 const date = new Date(isoDate);
126 return date.toLocaleString();
129 const formatFileSize = (size: number) => {
131 case size > 1000000000000:
132 return `${size / 1000000000000} TB`;
133 case size > 1000000000:
134 return `${size / 1000000000} GB`;
136 return `${size / 1000000} MB`;
138 return `${size / 1000} KB`;
144 const renderIcon = (projectItem: ProjectItem) => {
145 switch (projectItem.type) {
146 case "arvados#group":
147 return <i className="fas fa-folder" />;
148 case "arvados#groupList":
149 return <i className="fas fa-th" />;
155 const ItemActionsTrigger: React.SFC<IconButtonProps> = (props) => (
156 <IconButton {...props}>
161 export default ProjectExplorer;