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, DataColumn, ColumnSelector } from "../../components/data-table";
7 import { Typography, Grid, Paper, Toolbar } from '@material-ui/core';
8 import IconButton from '@material-ui/core/IconButton';
9 import MoreVertIcon from "@material-ui/icons/MoreVert";
10 import { formatFileSize, formatDate } from '../../common/formatters';
11 import { DataItem } from './data-item';
12 import { mockAnchorFromMouseEvent } from '../popover/helpers';
13 import { ContextMenu, ContextMenuActions } from './context-menu';
15 interface DataExplorerProps {
17 onItemClick: (item: DataItem) => void;
18 contextMenuActions: ContextMenuActions;
21 interface DataExplorerState {
22 columns: Array<DataColumn<DataItem>>;
24 anchorEl?: HTMLElement;
29 class DataExplorer extends React.Component<DataExplorerProps, DataExplorerState> {
30 state: DataExplorerState = {
36 render: item => this.renderName(item)
41 render: item => renderStatus(item.status)
46 render: item => renderType(item.type)
51 render: item => renderOwner(item.owner)
56 render: item => renderFileSize(item.fileSize)
59 name: "Last modified",
61 render: item => renderDate(item.lastModified)
67 renderHeader: () => null,
68 render: item => this.renderActions(item)
76 {...this.state.contextMenu}
77 onClose={this.closeContextMenu}
78 actions={this.props.contextMenuActions} />
80 <Grid container justify="flex-end">
82 columns={this.state.columns}
83 onColumnToggle={this.toggleColumn} />
87 columns={this.state.columns}
88 items={this.props.items}
89 onRowContextMenu={this.openItemMenuOnRowClick} />
94 toggleColumn = (column: DataColumn<DataItem>) => {
95 const index = this.state.columns.indexOf(column);
96 const columns = this.state.columns.slice(0);
97 columns.splice(index, 1, { ...column, selected: !column.selected });
98 this.setState({ columns });
101 renderName = (item: DataItem) =>
107 onClick={() => this.props.onItemClick(item)}>
112 <Typography color="primary">
118 renderActions = (item: DataItem) =>
119 <Grid container justify="flex-end">
120 <IconButton onClick={event => this.openItemMenuOnActionsClick(event, item)}>
125 openItemMenuOnRowClick = (event: React.MouseEvent<HTMLElement>, item: DataItem) => {
126 event.preventDefault();
129 anchorEl: mockAnchorFromMouseEvent(event),
135 openItemMenuOnActionsClick = (event: React.MouseEvent<HTMLElement>, item: DataItem) => {
138 anchorEl: event.currentTarget,
144 closeContextMenu = () => {
145 this.setState({ contextMenu: {} });
150 const renderIcon = (dataItem: DataItem) => {
151 switch (dataItem.type) {
152 case "arvados#group":
153 return <i className="fas fa-folder fa-lg" />;
154 case "arvados#groupList":
155 return <i className="fas fa-th fa-lg" />;
161 const renderDate = (date: string) =>
166 const renderFileSize = (fileSize?: number) =>
168 {formatFileSize(fileSize)}
171 const renderOwner = (owner: string) =>
172 <Typography noWrap color="primary">
176 const renderType = (type: string) =>
181 const renderStatus = (status?: string) =>
182 <Typography noWrap align="center">
186 export default DataExplorer;