Skip to content

Commit

Permalink
[docs] Add TypeScript demos for Simple and Spanning Table (#14985)
Browse files Browse the repository at this point in the history
* added doc types for SimpleTable and SpanningTable

* changed to interface
 
* added doc types for SimpleTable and SpanningTable
 
* changed to interface
 
* simplification proposal
 
* accept incoming merge

* removed merge error

Co-authored-by: Olivier Tassinari <[email protected]>
  • Loading branch information
2 people authored and eps1lon committed Mar 23, 2019
1 parent 8350129 commit e8ecc8f
Show file tree
Hide file tree
Showing 4 changed files with 191 additions and 11 deletions.
6 changes: 2 additions & 4 deletions docs/src/pages/demos/tables/SimpleTable.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,8 @@ const styles = theme => ({
},
});

let id = 0;
function createData(name, calories, fat, carbs, protein) {
id += 1;
return { id, name, calories, fat, carbs, protein };
return { name, calories, fat, carbs, protein };
}

const rows = [
Expand Down Expand Up @@ -50,7 +48,7 @@ function SimpleTable(props) {
</TableHead>
<TableBody>
{rows.map(row => (
<TableRow key={row.id}>
<TableRow key={row.name}>
<TableCell component="th" scope="row">
{row.name}
</TableCell>
Expand Down
74 changes: 74 additions & 0 deletions docs/src/pages/demos/tables/SimpleTable.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import React from 'react';
import PropTypes from 'prop-types';
import { createStyles, Theme, withStyles, WithStyles } from '@material-ui/core/styles';
import Table from '@material-ui/core/Table';
import TableBody from '@material-ui/core/TableBody';
import TableCell from '@material-ui/core/TableCell';
import TableHead from '@material-ui/core/TableHead';
import TableRow from '@material-ui/core/TableRow';
import Paper from '@material-ui/core/Paper';

const styles = (theme: Theme) =>
createStyles({
root: {
width: '100%',
marginTop: theme.spacing(3),
overflowX: 'auto',
},
table: {
minWidth: 650,
},
});

function createData(name: string, calories: number, fat: number, carbs: number, protein: number) {
return { name, calories, fat, carbs, protein };
}

const rows = [
createData('Frozen yoghurt', 159, 6.0, 24, 4.0),
createData('Ice cream sandwich', 237, 9.0, 37, 4.3),
createData('Eclair', 262, 16.0, 24, 6.0),
createData('Cupcake', 305, 3.7, 67, 4.3),
createData('Gingerbread', 356, 16.0, 49, 3.9),
];

export interface SimpleTableProps extends WithStyles<typeof styles> {}

function SimpleTable(props: SimpleTableProps) {
const { classes } = props;

return (
<Paper className={classes.root}>
<Table className={classes.table}>
<TableHead>
<TableRow>
<TableCell>Dessert (100g serving)</TableCell>
<TableCell align="right">Calories</TableCell>
<TableCell align="right">Fat (g)</TableCell>
<TableCell align="right">Carbs (g)</TableCell>
<TableCell align="right">Protein (g)</TableCell>
</TableRow>
</TableHead>
<TableBody>
{rows.map(row => (
<TableRow key={row.name}>
<TableCell component="th" scope="row">
{row.name}
</TableCell>
<TableCell align="right">{row.calories}</TableCell>
<TableCell align="right">{row.fat}</TableCell>
<TableCell align="right">{row.carbs}</TableCell>
<TableCell align="right">{row.protein}</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</Paper>
);
}

SimpleTable.propTypes = {
classes: PropTypes.object.isRequired,
} as any;

export default withStyles(styles)(SimpleTable);
15 changes: 8 additions & 7 deletions docs/src/pages/demos/tables/SpanningTable.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,20 +29,20 @@ function priceRow(qty, unit) {
return qty * unit;
}

function createRow(id, desc, qty, unit) {
function createRow(desc, qty, unit) {
const price = priceRow(qty, unit);
return { id, desc, qty, unit, price };
return { desc, qty, unit, price };
}

function subtotal(items) {
return items.map(({ price }) => price).reduce((sum, i) => sum + i, 0);
}

const rows = [
['Paperclips (Box)', 100, 1.15],
['Paper (Case)', 10, 45.99],
['Waste Basket', 2, 17.99],
].map((row, id) => createRow(id, ...row));
createRow('Paperclips (Box)', 100, 1.15),
createRow('Paper (Case)', 10, 45.99),
createRow('Waste Basket', 2, 17.99),
];

const invoiceSubtotal = subtotal(rows);
const invoiceTaxes = TAX_RATE * invoiceSubtotal;
Expand All @@ -63,13 +63,14 @@ function SpanningTable(props) {
</TableHead>
<TableBody>
{rows.map(row => (
<TableRow key={row.id}>
<TableRow key={row.desc}>
<TableCell>{row.desc}</TableCell>
<TableCell align="right">{row.qty}</TableCell>
<TableCell align="right">{row.unit}</TableCell>
<TableCell align="right">{ccyFormat(row.price)}</TableCell>
</TableRow>
))}

<TableRow>
<TableCell rowSpan={3} />
<TableCell colSpan={2}>Subtotal</TableCell>
Expand Down
107 changes: 107 additions & 0 deletions docs/src/pages/demos/tables/SpanningTable.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
import React from 'react';
import PropTypes from 'prop-types';
import { createStyles, Theme, withStyles, WithStyles } from '@material-ui/core/styles';
import Table from '@material-ui/core/Table';
import TableBody from '@material-ui/core/TableBody';
import TableCell from '@material-ui/core/TableCell';
import TableHead from '@material-ui/core/TableHead';
import TableRow from '@material-ui/core/TableRow';
import Paper from '@material-ui/core/Paper';

const TAX_RATE = 0.07;

const styles = (theme: Theme) =>
createStyles({
root: {
width: '100%',
marginTop: theme.spacing(3),
overflowX: 'auto',
},
table: {
minWidth: 700,
},
});

function ccyFormat(num: number) {
return `${num.toFixed(2)}`;
}

function priceRow(qty: number, unit: number) {
return qty * unit;
}

function createRow(desc: string, qty: number, unit: number) {
const price = priceRow(qty, unit);
return { desc, qty, unit, price };
}

interface Row {
desc: string;
qty: number;
unit: number;
price: number;
}

function subtotal(items: Row[]) {
return items.map(({ price }) => price).reduce((sum, i) => sum + i, 0);
}

const rows = [
createRow('Paperclips (Box)', 100, 1.15),
createRow('Paper (Case)', 10, 45.99),
createRow('Waste Basket', 2, 17.99),
];

const invoiceSubtotal = subtotal(rows);
const invoiceTaxes = TAX_RATE * invoiceSubtotal;
const invoiceTotal = invoiceTaxes + invoiceSubtotal;

export interface SpanningTableProps extends WithStyles<typeof styles> {}

function SpanningTable(props: SpanningTableProps) {
const { classes } = props;
return (
<Paper className={classes.root}>
<Table className={classes.table}>
<TableHead>
<TableRow>
<TableCell>Desc</TableCell>
<TableCell align="right">Qty.</TableCell>
<TableCell align="right">@</TableCell>
<TableCell align="right">Price</TableCell>
</TableRow>
</TableHead>
<TableBody>
{rows.map(row => (
<TableRow key={row.desc}>
<TableCell>{row.desc}</TableCell>
<TableCell align="right">{row.qty}</TableCell>
<TableCell align="right">{row.unit}</TableCell>
<TableCell align="right">{ccyFormat(row.price)}</TableCell>
</TableRow>
))}
<TableRow>
<TableCell rowSpan={3} />
<TableCell colSpan={2}>Subtotal</TableCell>
<TableCell align="right">{ccyFormat(invoiceSubtotal)}</TableCell>
</TableRow>
<TableRow>
<TableCell>Tax</TableCell>
<TableCell align="right">{`${(TAX_RATE * 100).toFixed(0)} %`}</TableCell>
<TableCell align="right">{ccyFormat(invoiceTaxes)}</TableCell>
</TableRow>
<TableRow>
<TableCell colSpan={2}>Total</TableCell>
<TableCell align="right">{ccyFormat(invoiceTotal)}</TableCell>
</TableRow>
</TableBody>
</Table>
</Paper>
);
}

SpanningTable.propTypes = {
classes: PropTypes.object.isRequired,
} as any;

export default withStyles(styles)(SpanningTable);

0 comments on commit e8ecc8f

Please sign in to comment.