Issue
In Material UI Table I have a table applied sticky property, which works fine.
On top of the table, but inside the TableContainer I have a button wrapped in Box, which should also be sticky alongside with the table head.
I tried this approach with flex, but didn't work for me.
.wrapper {
display: flex;
flex - direction: column;
overflow: hidden;
}
.scrollable - child {
overflow - y: auto;
}
Also tried to apply position: relative to parent and position: sticky to child without success.
Any help will be appreciated.
Here is the Sandbox link and code below
import * as React from "react";
import Table from "@mui/material/Table";
import TableBody from "@mui/material/TableBody";
import TableCell from "@mui/material/TableCell";
import TableContainer from "@mui/material/TableContainer";
import TableHead from "@mui/material/TableHead";
import TableRow from "@mui/material/TableRow";
import Paper from "@mui/material/Paper";
import { Box, Button } from "@mui/material";
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),
createData("Gingerbread", 356, 16.0, 49, 3.9),
createData("Gingerbread", 356, 16.0, 49, 3.9),
createData("Gingerbread", 356, 16.0, 49, 3.9),
createData("Gingerbread", 356, 16.0, 49, 3.9),
createData("Gingerbread", 356, 16.0, 49, 3.9),
createData("Gingerbread", 356, 16.0, 49, 3.9),
createData("Gingerbread", 356, 16.0, 49, 3.9),
createData("Gingerbread", 356, 16.0, 49, 3.9),
createData("Gingerbread", 356, 16.0, 49, 3.9),
createData("Gingerbread", 356, 16.0, 49, 3.9),
createData("Gingerbread", 356, 16.0, 49, 3.9),
createData("Gingerbread", 356, 16.0, 49, 3.9)
];
export default function BasicTable() {
return (
<TableContainer
component={Paper}
sx={{
maxHeight: "400px",
minHeight: "400px",
position: "relative"
}}
>
<Box sx={{ position: "sticky" }}> //this doesn't work
<Button>click</Button>
</Box>
<Table sx={{ minWidth: 650 }} aria-label="simple table" stickyHeader>
<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}
sx={{ "&:last-child td, &:last-child th": { border: 0 } }}
>
<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>
</TableContainer>
);
}
Solution
I've figured out how to solve this problem, if anyone else is struggling with a similar issue.
The way I did, is to do Column grouping like described in MUI Docs, in other words add my button to a new TableRow inside the Table.
See working code below and the updated sandbox link
import * as React from "react";
import Table from "@mui/material/Table";
import TableBody from "@mui/material/TableBody";
import TableCell from "@mui/material/TableCell";
import TableContainer from "@mui/material/TableContainer";
import TableHead from "@mui/material/TableHead";
import TableRow from "@mui/material/TableRow";
import Paper from "@mui/material/Paper";
import { Box, Button } from "@mui/material";
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),
createData("Gingerbread", 356, 16.0, 49, 3.9),
createData("Gingerbread", 356, 16.0, 49, 3.9),
createData("Gingerbread", 356, 16.0, 49, 3.9),
createData("Gingerbread", 356, 16.0, 49, 3.9),
createData("Gingerbread", 356, 16.0, 49, 3.9),
createData("Gingerbread", 356, 16.0, 49, 3.9),
createData("Gingerbread", 356, 16.0, 49, 3.9),
createData("Gingerbread", 356, 16.0, 49, 3.9),
createData("Gingerbread", 356, 16.0, 49, 3.9),
createData("Gingerbread", 356, 16.0, 49, 3.9),
createData("Gingerbread", 356, 16.0, 49, 3.9),
createData("Gingerbread", 356, 16.0, 49, 3.9)
];
export default function BasicTable() {
return (
<TableContainer
component={Paper}
sx={{
maxHeight: "400px",
minHeight: "400px"
}}
>
<Table sx={{ minWidth: 650 }} aria-label="simple table" stickyHeader>
<TableHead>
<TableRow>
<TableCell colSpan={7}>
<Button>click</Button>
</TableCell>
</TableRow>
<TableRow>
<TableCell style={{ top: 57 }}>Dessert (100g serving)</TableCell>
<TableCell align="right" style={{ top: 57 }}>
Calories
</TableCell>
<TableCell align="right" style={{ top: 57 }}>
Fat (g)
</TableCell>
<TableCell align="right" style={{ top: 57 }}>
Carbs (g)
</TableCell>
<TableCell align="right" style={{ top: 57 }}>
Protein (g)
</TableCell>
</TableRow>
</TableHead>
<TableBody>
{rows.map((row) => (
<TableRow
key={row.name}
sx={{ "&:last-child td, &:last-child th": { border: 0 } }}
>
<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>
</TableContainer>
);
}
Answered By - Greg
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.