1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import * as React from 'react';
6 import { DataTable, DataTableProps, Column, ColumnsConfigurator } from "../../components/data-table";
7 import { Typography, Grid, ListItem, Divider, List, ListItemIcon, ListItemText } from '@material-ui/core';
8 import IconButton, { IconButtonProps } from '@material-ui/core/IconButton';
9 import MoreVertIcon from "@material-ui/icons/MoreVert";
10 import Popover from '../popover/popover';
12 export interface DataItem {
21 interface DataExplorerProps {
23 onItemClick: (item: DataItem) => void;
26 type DataExplorerState = Pick<DataTableProps<DataItem>, "columns">;
28 class DataExplorer extends React.Component<DataExplorerProps, DataExplorerState> {
30 state: DataExplorerState = {
41 onClick={() => this.props.onItemClick(item)}
47 <Typography color="primary">
58 <Typography noWrap align="center">
76 <Typography noWrap color="primary">
84 render: ({ fileSize }) => (
86 {typeof fileSize === "number" ? formatFileSize(fileSize) : "-"}
91 header: "Last modified",
95 {formatDate(item.lastModified)}
104 renderHeader: () => (
105 <Grid container justify="flex-end">
107 columns={this.state.columns}
108 onColumnToggle={this.toggleColumn}
113 <Grid container justify="flex-end">
114 <Popover triggerComponent={ItemActionsTrigger}>
118 icon: "fas fa-users",
122 icon: "fas fa-sign-out-alt",
127 label: "Add to favourite"
138 icon: "fas fa-download",
144 renderAction({ icon: "fas fa-trash-alt", label: "Remove" })
157 columns={this.state.columns}
158 items={this.props.items}
159 onColumnToggle={this.toggleColumn}
164 toggleColumn = (column: Column<DataItem>) => {
165 const index = this.state.columns.indexOf(column);
166 const columns = this.state.columns.slice(0);
167 columns.splice(index, 1, { ...column, selected: !column.selected });
168 this.setState({ columns });
172 const formatDate = (isoDate: string) => {
173 const date = new Date(isoDate);
174 return date.toLocaleString();
177 const formatFileSize = (size: number) => {
179 case size > 1000000000000:
180 return `${size / 1000000000000} TB`;
181 case size > 1000000000:
182 return `${size / 1000000000} GB`;
184 return `${size / 1000000} MB`;
186 return `${size / 1000} KB`;
192 const renderIcon = (DataItem: DataItem) => {
193 switch (DataItem.type) {
194 case "arvados#group":
195 return <i className="fas fa-folder fa-lg" />;
196 case "arvados#groupList":
197 return <i className="fas fa-th fa-lg" />;
203 const renderAction = (action: { label: string, icon: string }, index?: number) => (
204 <ListItem button key={index}>
206 <i className={action.icon} />
214 const ItemActionsTrigger: React.SFC<IconButtonProps> = (props) => (
215 <IconButton {...props}>
220 export default DataExplorer;