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 { Column } from './column';
9 export interface DataTableProps<T> {
11 columns: Array<Column<T>>;
12 onItemClick?: (item: T) => void;
15 class DataTable<T> extends React.Component<DataTableProps<T> & WithStyles<CssRules>> {
17 const { items, columns, classes, onItemClick } = this.props;
19 <div className={classes.tableContainer}>
27 .filter(column => column.selected)
28 .map(({ header, renderHeader, key }, index) => (
29 <TableCell key={key || index}>
30 {renderHeader ? renderHeader() : header}
36 <TableBody className={classes.tableBody}>
39 .map((item, index) => (
40 <TableRow key={index} hover onClick={() => onItemClick && onItemClick(item)}>
43 .filter(column => column.selected)
44 .map((column, index) => (
45 <TableCell key={column.key || index}>
56 <Typography>No items</Typography>
65 type CssRules = "tableBody" | "tableContainer";
67 const styles: StyleRulesCallback<CssRules> = (theme: Theme) => ({
72 background: theme.palette.background.paper
76 export default withStyles(styles)(DataTable);