From ce0735c9a887c57f2b43fbd484c5a0c3146e84e8 Mon Sep 17 00:00:00 2001 From: Justin Campbell Date: Wed, 7 Oct 2020 10:55:08 -0400 Subject: [PATCH] Implement react-table w/ filters using search fields as column headers --- src/App.js | 63 +------------ .../ItemTable/ItemTable-ReactTable.js | 93 +++++++++++++++++++ 2 files changed, 97 insertions(+), 59 deletions(-) create mode 100644 src/components/ItemTable/ItemTable-ReactTable.js diff --git a/src/App.js b/src/App.js index e1cdcf0..4046c32 100644 --- a/src/App.js +++ b/src/App.js @@ -1,13 +1,13 @@ import React, { useState, useEffect } from "react"; import { ThemeProvider } from "@material-ui/core/styles"; -import webqueueTheme from "./theme"; +import clsx from "clsx"; import { Box, makeStyles, Paper } from "@material-ui/core"; +import webqueueTheme from "./theme"; import ItemTableAppBar from "./components/ItemTableAppBar/"; import ItemTable from "./components/ItemTable/"; import ItemViewAppBar from "./components/ItemViewAppBar/"; import ItemView from "./components/ItemView/"; -import clsx from "clsx"; -import ReactTable from "./components/ItemTable/ReactTable"; +import ItemTable_ReactTable from "./components/ItemTable/ItemTable-ReactTable"; function App(){ const [darkMode, setDarkMode] = useState(false); @@ -49,61 +49,6 @@ function App(){ }); const classes = useStyles(); - - const columns = React.useMemo( - () => [ - { - Header: 'Queue', - accessor: 'queue', // accessor is the "key" in the data - }, - { - Header: 'Item #', - accessor: 'number', - }, - { - Header: 'Assigned To', - accessor: 'assignedTo', - }, - { - Header: 'Subject', - accessor: 'subject', - }, - { - Header: 'Status', - accessor: 'status', - }, - { - Header: 'Priority', - accessor: 'priority', - }, - { - Header: 'Last Updated', - accessor: 'lastUpdated', - }, - { - Header: 'Department', - accessor: 'department', - }, - { - Header: 'Building', - accessor: 'building', - }, - { - Header: 'Date Received', - accessor: 'dateReceived', - }, - - ], - [] - ); - - const [data, setData] = useState([]) - - useEffect(() => { - fetch("/api/ce").then(res => res.json()).then(queue => { - setData(queue.items) - }) - }, []); return ( @@ -112,7 +57,7 @@ function App(){ {/* */} - + diff --git a/src/components/ItemTable/ItemTable-ReactTable.js b/src/components/ItemTable/ItemTable-ReactTable.js new file mode 100644 index 0000000..b537a06 --- /dev/null +++ b/src/components/ItemTable/ItemTable-ReactTable.js @@ -0,0 +1,93 @@ +import React, { useState, useEffect, useMemo } from "react"; +import { useTable, useFilters } from "react-table"; +import { Table, TableBody, TableCell, TableHead, TableRow, TableContainer, Paper } from "@material-ui/core"; +import { TextField } from "@material-ui/core"; + +export default function ItemTable_ReactTable() { + + const [data, setData] = useState([]); + useEffect(() => { + fetch("/api/ce").then(apiResponse => apiResponse.json()).then(queue => { + setData(queue.items) + }) + }, []) + + const ColumnFilter = ({ column }) => { + return ( + <> + column.setFilter(event.target.value)} + type="search" + size="small" + color="secondary" + variant="outlined" + fullWidth + /> + + ); + }; + + const columns = React.useMemo( + () => [ + { Header: 'Queue', accessor: 'queue' }, + { Header: 'Item #', accessor: 'number' }, + { Header: 'Assigned To', accessor: 'assignedTo' }, + { Header: 'Subject', accessor: 'subject' }, + { Header: 'Status', accessor: 'status' }, + { Header: 'Priority', accessor: 'priority' }, + { Header: 'Last Updated', accessor: 'lastUpdated' }, + { Header: 'Department', accessor: 'department' }, + { Header: 'Building', accessor: 'building' }, + { Header: 'Date Received', accessor: 'dateReceived' }, + ], []); + + const { getTableProps, + getTableBodyProps, + headerGroups, + rows, + prepareRow + } = useTable( + { + columns, + data, + defaultColumn: { + Filter: ColumnFilter + } + }, + useFilters + ); + + return ( + + + + {headerGroups.map(headerGroup => ( + + {headerGroup.headers.map(column => ( + + {column.render("Filter")} + + ))} + + ))} + + + {rows.map((row, i) => { + prepareRow(row); + return ( + + {row.cells.map(cell => ( + + {cell.render("Cell")} + + ))} + + ); + })} + +
+
+ ); + +} \ No newline at end of file