export interface Column<T> {
header: string;
selected: boolean;
+ configurable?: boolean;
render: (item: T) => React.ReactElement<void>;
-}
\ No newline at end of file
+ renderHeader?: () => React.ReactElement<void>;
+}
+
+export const isColumnConfigurable = <T>(column: Column<T>) => {
+ return column.configurable === undefined || column.configurable === true;
+};
\ No newline at end of file
import * as React from 'react';
import { WithStyles, StyleRulesCallback, Theme, withStyles, IconButton, Paper, List, Checkbox, ListItemText, ListItem, Typography, ListSubheader } from '@material-ui/core';
import MenuIcon from "@material-ui/icons/Menu";
-import { Column } from '../column';
+import { Column, isColumnConfigurable } from '../column';
import { PopoverOrigin } from '@material-ui/core/Popover';
import Popover from "../../popover/popover";
import { IconButtonProps } from '@material-ui/core/IconButton';
<Popover triggerComponent={ColumnsConfiguratorTrigger}>
<Paper>
<List dense>
- <ListSubheader>
- Configure table columns
- </ListSubheader>
{
- columns.map((column, index) => (
- <ListItem key={index} button onClick={() => onColumnToggle(column)}>
- <Checkbox disableRipple color="primary" checked={column.selected} className={classes.checkbox} />
- <ListItemText>{column.header}</ListItemText>
- </ListItem>
-
- ))
+ columns
+ .filter(isColumnConfigurable)
+ .map((column, index) => (
+ <ListItem key={index} button onClick={() => onColumnToggle(column)}>
+ <Checkbox disableRipple color="primary" checked={column.selected} className={classes.checkbox} />
+ <ListItemText>{column.header}</ListItemText>
+ </ListItem>
+ ))
}
</List>
</Paper>
<TableHead>
<TableRow>
{
- columns.filter(column => column.selected).map((column, index) => (
- <TableCell key={index}>{column.header}</TableCell>
+ columns.filter(column => column.selected).map(({ header, renderHeader }, index) => (
+ <TableCell key={index}>
+ {renderHeader ? renderHeader() : header}
+ </TableCell>
))
}
</TableRow>
{
header: "Actions",
selected: true,
+ configurable: false,
+ renderHeader: () => <span/>,
render: item => (
- <Popover triggerComponent={ItemActionsTrigger}>
- <List dense>
- {[
+ <Grid container justify="flex-end">
+ <Popover triggerComponent={ItemActionsTrigger}>
+ <List dense>
+ {[
+ {
+ icon: "fas fa-users",
+ label: "Share"
+ },
+ {
+ icon: "fas fa-sign-out-alt",
+ label: "Move to"
+ },
+ {
+ icon: "fas fa-star",
+ label: "Add to favourite"
+ },
+ {
+ icon: "fas fa-edit",
+ label: "Rename"
+ },
+ {
+ icon: "fas fa-copy",
+ label: "Make a copy"
+ },
+ {
+ icon: "fas fa-download",
+ label: "Download"
+ }].map(renderAction)
+ }
+ < Divider />
{
- icon: "fas fa-users",
- label: "Share"
- },
- {
- icon: "fas fa-sign-out-alt",
- label: "Move to"
- },
- {
- icon: "fas fa-star",
- label: "Add to favourite"
- },
- {
- icon: "fas fa-edit",
- label: "Rename"
- },
- {
- icon: "fas fa-copy",
- label: "Make a copy"
- },
- {
- icon: "fas fa-download",
- label: "Download"
- }].map(renderAction)
- }
- < Divider />
- {
- renderAction({ icon: "fas fa-trash-alt", label: "Remove" })
- }
- </List>
- </Popover>
+ renderAction({ icon: "fas fa-trash-alt", label: "Remove" })
+ }
+ </List>
+ </Popover>
+ </Grid>
)
}
]