1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import * as React from 'react';
6 import { Table, TableBody, TableRow, TableCell, TableHead, StyleRulesCallback, Theme, WithStyles, withStyles, Typography } from '@material-ui/core';
7 import { DataColumn } from './data-column';
9 export interface DataTableProps<T> {
11 columns: Array<DataColumn<T>>;
12 onRowClick?: (event: React.MouseEvent<HTMLTableRowElement>, item: T) => void;
13 onRowContextMenu?: (event: React.MouseEvent<HTMLTableRowElement>, item: T) => void;
16 class DataTable<T> extends React.Component<DataTableProps<T> & WithStyles<CssRules>> {
18 const { items, columns, classes, onRowClick, onRowContextMenu } = this.props;
19 return <div className={classes.tableContainer}>
25 .filter(column => column.selected)
26 .map(({ name, renderHeader, key }, index) =>
27 <TableCell key={key || index}>
28 {renderHeader ? renderHeader() : name}
33 <TableBody className={classes.tableBody}>
39 onClick={event => onRowClick && onRowClick(event, item)}
40 onContextMenu={event => onRowContextMenu && onRowContextMenu(event, item)}>
42 .filter(column => column.selected)
43 .map((column, index) => (
44 <TableCell key={column.key || index}>
51 </Table> : <Typography
52 className={classes.noItemsInfo}
61 type CssRules = "tableBody" | "tableContainer" | "noItemsInfo";
63 const styles: StyleRulesCallback<CssRules> = (theme: Theme) => ({
68 background: theme.palette.background.paper
72 padding: theme.spacing.unit
76 export default withStyles(styles)(DataTable);