X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/dbb23fe7623260b495ad64f0601feefdd103d376..c4d1ac35050791aabbd1665b55248f5e074eb337:/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 05c157f2..874c3259 100644 --- a/src/components/data-explorer/data-explorer.tsx +++ b/src/components/data-explorer/data-explorer.tsx @@ -3,76 +3,223 @@ // 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 from '../context-menu/context-menu'; + +export interface DataExplorerContextActions { + onAddToFavourite: (dataIitem: DataItem) => void; + onCopy: (dataIitem: DataItem) => void; + onDownload: (dataIitem: DataItem) => void; + onMoveTo: (dataIitem: DataItem) => void; + onRemove: (dataIitem: DataItem) => void; + onRename: (dataIitem: DataItem) => void; + onShare: (dataIitem: DataItem) => void; +} +interface DataExplorerProps { + items: DataItem[]; + onItemClick: (item: DataItem) => void; + contextActions: DataExplorerContextActions; +} + +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) + }] + }; + + contextMenuActions = [[{ + icon: "fas fa-users fa-fw", + name: "Share", + onClick: this.handleContextAction("onShare") + }, { + icon: "fas fa-sign-out-alt fa-fw", + name: "Move to", + onClick: this.handleContextAction("onMoveTo") + }, { + icon: "fas fa-star fa-fw", + name: "Add to favourite", + onClick: this.handleContextAction("onAddToFavourite") + }, { + icon: "fas fa-edit fa-fw", + name: "Rename", + onClick: this.handleContextAction("onRename") + }, { + icon: "fas fa-copy fa-fw", + name: "Make a copy", + onClick: this.handleContextAction("onCopy") + }, { + icon: "fas fa-download fa-fw", + name: "Download", + onClick: this.handleContextAction("onDownload") + }], [{ + icon: "fas fa-trash-alt fa-fw", + name: "Remove", + onClick: this.handleContextAction("onRemove") + } + ]]; + render() { - const { items, columns, classes, onItemClick, onColumnToggle } = this.props; - return ( -
+ return + + - + -
- { - items.length > 0 ? ( - - - - { - columns.filter(column => column.selected).map(({ header, renderHeader }, index) => ( - - {renderHeader ? renderHeader() : header} - - )) - } - - - - { - items.map((item, index) => ( - onItemClick && onItemClick(item)}> - { - columns.filter(column => column.selected).map((column, index) => ( - - {column.render(item)} - - )) - } - - )) - } - -
- ) : ( - No items - ) - } - -
-
- ); + + + + ; + } + + 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 }); + } + + 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 + } + }); + } + + openItemMenuOnActionsClick = (event: React.MouseEvent, item: DataItem) => { + this.setState({ + contextMenu: { + anchorEl: event.currentTarget, + item + } + }); } -} -type CssRules = "tableBody" | "tableContainer"; + closeContextMenu = () => { + this.setState({ contextMenu: {} }); + } -const styles: StyleRulesCallback = (theme: Theme) => ({ - tableContainer: { - overflowX: 'auto' - }, - tableBody: { - background: theme.palette.background.paper + handleContextAction(action: keyof DataExplorerContextActions) { + return (item: DataItem) => { + this.closeContextMenu(); + this.props.contextActions[action](item); + }; } -}); -export default withStyles(styles)(DataExplorer); +} + +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;