X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/6d53fc76c84291e57f33d55cb1f211bfb63b9f19..95262273a85a2002a9f614c045fe6b907ddcc106:/src/components/data-explorer/data-explorer.tsx diff --git a/src/components/data-explorer/data-explorer.tsx b/src/components/data-explorer/data-explorer.tsx index f24d344ce2..96e259f8f0 100644 --- a/src/components/data-explorer/data-explorer.tsx +++ b/src/components/data-explorer/data-explorer.tsx @@ -3,74 +3,184 @@ // SPDX-License-Identifier: AGPL-3.0 import * as React from 'react'; -import { Table, TableBody, TableRow, TableCell, TableHead, StyleRulesCallback, Theme, WithStyles, withStyles, Typography, Grid } from '@material-ui/core'; -import { Column } from './column'; -import ColumnsConfigurator from "./columns-configurator/columns-configurator"; - -export interface DataExplorerProps { - items: T[]; - columns: Array>; - onColumnToggle: (column: Column) => void; - onItemClick?: (item: T) => void; +import { DataTable, DataColumn, ColumnSelector } from "../../components/data-table"; +import { Typography, Grid, Paper, Toolbar } from '@material-ui/core'; +import IconButton from '@material-ui/core/IconButton'; +import MoreVertIcon from "@material-ui/icons/MoreVert"; +import { formatFileSize, formatDate } from '../../common/formatters'; +import { DataItem } from './data-item'; +import { mockAnchorFromMouseEvent } from '../popover/helpers'; +import { ContextMenu, ContextMenuActions } from './context-menu'; + +interface DataExplorerProps { + items: DataItem[]; + onItemClick: (item: DataItem) => void; + contextMenuActions: ContextMenuActions; +} + +interface DataExplorerState { + columns: Array>; + contextMenu: { + anchorEl?: HTMLElement; + item?: DataItem; + }; } -class DataExplorer extends React.Component & WithStyles> { +class DataExplorer extends React.Component { + state: DataExplorerState = { + contextMenu: {}, + columns: [ + { + name: "Name", + selected: true, + render: item => this.renderName(item) + }, + { + name: "Status", + selected: true, + render: item => renderStatus(item.status) + }, + { + name: "Type", + selected: true, + render: item => renderType(item.type) + }, + { + name: "Owner", + selected: true, + render: item => renderOwner(item.owner) + }, + { + name: "File size", + selected: true, + render: item => renderFileSize(item.fileSize) + }, + { + name: "Last modified", + selected: true, + render: item => renderDate(item.lastModified) + }, + { + name: "Actions", + selected: true, + configurable: false, + renderHeader: () => null, + render: item => this.renderActions(item) + } + ] + }; + render() { - const { items, columns, classes, onItemClick, onColumnToggle } = this.props; - return ( -
+ return + + - + -
- { - items.length > 0 ? ( - - - - { - columns.filter(column => column.selected).map((column, index) => ( - {column.header} - )) - } - - - - { - items.map((item, index) => ( - onItemClick && onItemClick(item)}> - { - columns.filter(column => column.selected).map((column, index) => ( - - {column.render(item)} - - )) - } - - )) - } - -
- ) : ( - No items - ) - } - -
-
- ); + + + + ; } -} -type CssRules = "tableBody" | "tableContainer"; + toggleColumn = (column: DataColumn) => { + const index = this.state.columns.indexOf(column); + const columns = this.state.columns.slice(0); + columns.splice(index, 1, { ...column, selected: !column.selected }); + this.setState({ columns }); + } -const styles: StyleRulesCallback = (theme: Theme) => ({ - tableContainer: { - overflowX: 'auto' - }, - tableBody: { - background: theme.palette.background.paper + renderName = (item: DataItem) => + this.props.onItemClick(item)}> + + {renderIcon(item)} + + + + {item.name} + + + + + renderActions = (item: DataItem) => + + this.openItemMenuOnActionsClick(event, item)}> + + + + + openItemMenuOnRowClick = (event: React.MouseEvent, item: DataItem) => { + event.preventDefault(); + this.setState({ + contextMenu: { + anchorEl: mockAnchorFromMouseEvent(event), + item + } + }); } -}); -export default withStyles(styles)(DataExplorer); + openItemMenuOnActionsClick = (event: React.MouseEvent, item: DataItem) => { + this.setState({ + contextMenu: { + anchorEl: event.currentTarget, + item + } + }); + } + + closeContextMenu = () => { + this.setState({ contextMenu: {} }); + } + +} + +const renderIcon = (dataItem: DataItem) => { + switch (dataItem.type) { + case "arvados#group": + return ; + case "arvados#groupList": + return ; + default: + return ; + } +}; + +const renderDate = (date: string) => + + {formatDate(date)} + ; + +const renderFileSize = (fileSize?: number) => + + {formatFileSize(fileSize)} + ; + +const renderOwner = (owner: string) => + + {owner} + ; + +const renderType = (type: string) => + + {type} + ; + +const renderStatus = (status?: string) => + + {status || "-"} + ; + +export default DataExplorer;