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 } 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: () => this.renderActionsHeader(),
59 render: renderItemActions
66 columns={this.state.columns}
67 items={this.props.items} />;
70 toggleColumn = (column: DataColumn<DataItem>) => {
71 const index = this.state.columns.indexOf(column);
72 const columns = this.state.columns.slice(0);
73 columns.splice(index, 1, { ...column, selected: !column.selected });
74 this.setState({ columns });
77 renderActionsHeader = () =>
78 <Grid container justify="flex-end">
80 columns={this.state.columns}
81 onColumnToggle={this.toggleColumn} />
84 renderName = (item: DataItem) =>
90 onClick={() => this.props.onItemClick(item)}>
95 <Typography color="primary">
103 const renderIcon = (dataItem: DataItem) => {
104 switch (dataItem.type) {
105 case "arvados#group":
106 return <i className="fas fa-folder fa-lg" />;
107 case "arvados#groupList":
108 return <i className="fas fa-th fa-lg" />;
114 const renderDate = (date: string) =>
119 const renderFileSize = (fileSize?: number) =>
121 {formatFileSize(fileSize)}
124 const renderOwner = (owner: string) =>
125 <Typography noWrap color="primary">
129 const renderType = (type: string) =>
134 const renderStatus = (status?: string) =>
135 <Typography noWrap align="center">
139 const renderItemActions = () =>
140 <Grid container justify="flex-end">
141 <Popover triggerComponent={ItemActionsTrigger}>
144 icon: "fas fa-users",
148 icon: "fas fa-sign-out-alt",
153 label: "Add to favourite"
164 icon: "fas fa-download",
166 }].map(renderAction)}
168 {renderAction({ icon: "fas fa-trash-alt", label: "Remove" })}
173 const renderAction = (action: { label: string, icon: string }, index?: number) =>
174 <ListItem button key={index}>
176 <i className={action.icon} />
183 const ItemActionsTrigger: React.SFC<IconButtonProps> = (props) =>
184 <IconButton {...props}>
188 export default DataExplorer;