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, DataColumn, ColumnSelector } from "../../components/data-table";
7 import { Typography, Grid, ListItem, Divider, List, ListItemIcon, ListItemText, Paper, Toolbar } 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';
11 import { formatFileSize, formatDate } from '../../common/formatters';
12 import { DataItem } from './data-item';
14 interface DataExplorerProps {
16 onItemClick: (item: DataItem) => void;
19 type DataExplorerState = Pick<DataTableProps<DataItem>, "columns">;
21 class DataExplorer extends React.Component<DataExplorerProps, DataExplorerState> {
22 state: DataExplorerState = {
27 render: item => this.renderName(item)
32 render: item => renderStatus(item.status)
37 render: item => renderType(item.type)
42 render: item => renderOwner(item.owner)
47 render: (item) => renderFileSize(item.fileSize)
50 name: "Last modified",
52 render: item => renderDate(item.lastModified)
58 renderHeader: () => null,
59 render: renderItemActions
67 <Grid container justify="flex-end">
69 columns={this.state.columns}
70 onColumnToggle={this.toggleColumn} />
74 columns={this.state.columns}
75 items={this.props.items} />
80 toggleColumn = (column: DataColumn<DataItem>) => {
81 const index = this.state.columns.indexOf(column);
82 const columns = this.state.columns.slice(0);
83 columns.splice(index, 1, { ...column, selected: !column.selected });
84 this.setState({ columns });
87 renderName = (item: DataItem) =>
93 onClick={() => this.props.onItemClick(item)}>
98 <Typography color="primary">
106 const renderIcon = (dataItem: DataItem) => {
107 switch (dataItem.type) {
108 case "arvados#group":
109 return <i className="fas fa-folder fa-lg" />;
110 case "arvados#groupList":
111 return <i className="fas fa-th fa-lg" />;
117 const renderDate = (date: string) =>
122 const renderFileSize = (fileSize?: number) =>
124 {formatFileSize(fileSize)}
127 const renderOwner = (owner: string) =>
128 <Typography noWrap color="primary">
132 const renderType = (type: string) =>
137 const renderStatus = (status?: string) =>
138 <Typography noWrap align="center">
142 const renderItemActions = () =>
143 <Grid container justify="flex-end">
144 <Popover triggerComponent={ItemActionsTrigger}>
147 icon: "fas fa-users",
151 icon: "fas fa-sign-out-alt",
156 label: "Add to favourite"
167 icon: "fas fa-download",
169 }].map(renderAction)}
171 {renderAction({ icon: "fas fa-trash-alt", label: "Remove" })}
176 const renderAction = (action: { label: string, icon: string }, index?: number) =>
177 <ListItem button key={index}>
179 <i className={action.icon} />
186 const ItemActionsTrigger: React.SFC<IconButtonProps> = (props) =>
187 <IconButton {...props}>
191 export default DataExplorer;