X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/18a8117437056f65e3c9d84b0231c5f64b1346d1..47e0dc87fa82bac593c53518e556ba7c55410288:/src/components/data-table/data-table.tsx diff --git a/src/components/data-table/data-table.tsx b/src/components/data-table/data-table.tsx index e0e30480da..829bc84ebe 100644 --- a/src/components/data-table/data-table.tsx +++ b/src/components/data-table/data-table.tsx @@ -5,11 +5,11 @@ import * as React from 'react'; import { Table, TableBody, TableRow, TableCell, TableHead, TableSortLabel, StyleRulesCallback, Theme, WithStyles, withStyles, Typography } from '@material-ui/core'; import { DataColumn, SortDirection } from './data-column'; -import DataTableFilters, { DataTableFilterItem } from "../data-table-filters/data-table-filters"; +import { DataTableFilters, DataTableFilterItem } from "../data-table-filters/data-table-filters"; export type DataColumns = Array>; -export interface DataTableProps { +export interface DataTableDataProps { items: T[]; columns: DataColumns; onRowClick: (event: React.MouseEvent, item: T) => void; @@ -20,80 +20,6 @@ export interface DataTableProps { extractKey?: (item: T) => React.Key; } -class DataTable extends React.Component & WithStyles> { - render() { - const { items, classes } = this.props; - return
- - - - {this.mapVisibleColumns(this.renderHeadCell)} - - - - {items.map(this.renderBodyRow)} - -
-
; - } - - renderHeadCell = (column: DataColumn, index: number) => { - const { name, key, renderHeader, filters, sortDirection } = column; - const { onSortToggle, onFiltersChange } = this.props; - return - {renderHeader ? - renderHeader() : - filters - ? - onFiltersChange && - onFiltersChange(filters, column)} - filters={filters}> - {name} - - : sortDirection - ? - onSortToggle && - onSortToggle(column)}> - {name} - - : - {name} - } - ; - } - - renderBodyRow = (item: T, index: number) => { - const { onRowClick, onRowDoubleClick, extractKey } = this.props; - return onRowClick && onRowClick(event, item)} - onContextMenu={this.handleRowContextMenu(item)} - onDoubleClick={event => onRowDoubleClick && onRowDoubleClick(event, item) }> - {this.mapVisibleColumns((column, index) => ( - - {column.render(item)} - - ))} - ; - } - - mapVisibleColumns = (fn: (column: DataColumn, index: number) => React.ReactElement) => { - return this.props.columns.filter(column => column.selected).map(fn); - } - - handleRowContextMenu = (item: T) => - (event: React.MouseEvent) => - this.props.onContextMenu(event, item) - -} - type CssRules = "tableBody" | "tableContainer" | "noItemsInfo"; const styles: StyleRulesCallback = (theme: Theme) => ({ @@ -110,4 +36,80 @@ const styles: StyleRulesCallback = (theme: Theme) => ({ } }); -export default withStyles(styles)(DataTable); +type DataTableProps = DataTableDataProps & WithStyles; + +export const DataTable = withStyles(styles)( + class Component extends React.Component> { + render() { + const { items, classes } = this.props; + return
+ + + + {this.mapVisibleColumns(this.renderHeadCell)} + + + + {items.map(this.renderBodyRow)} + +
+
; + } + + renderHeadCell = (column: DataColumn, index: number) => { + const { name, key, renderHeader, filters, sortDirection } = column; + const { onSortToggle, onFiltersChange } = this.props; + return + {renderHeader ? + renderHeader() : + filters + ? + onFiltersChange && + onFiltersChange(filters, column)} + filters={filters}> + {name} + + : sortDirection + ? + onSortToggle && + onSortToggle(column)}> + {name} + + : + {name} + } + ; + } + + renderBodyRow = (item: T, index: number) => { + const { onRowClick, onRowDoubleClick, extractKey } = this.props; + return onRowClick && onRowClick(event, item)} + onContextMenu={this.handleRowContextMenu(item)} + onDoubleClick={event => onRowDoubleClick && onRowDoubleClick(event, item) }> + {this.mapVisibleColumns((column, index) => ( + + {column.render(item)} + + ))} + ; + } + + mapVisibleColumns = (fn: (column: DataColumn, index: number) => React.ReactElement) => { + return this.props.columns.filter(column => column.selected).map(fn); + } + + handleRowContextMenu = (item: T) => + (event: React.MouseEvent) => + this.props.onContextMenu(event, item) + + } +);