frontend/app/DeletionRecords/DeletionRecords.tsx (160 lines of code) (raw):

import React, { useEffect, useState } from "react"; import { RouteComponentProps } from "react-router-dom"; import { Table, TableHead, TableBody, TableRow, TableCell, TableContainer, Paper, TablePagination, TableSortLabel, } from "@material-ui/core"; import { getDeletionRecordsOnPage } from "./helpers"; import { sortListByOrder, SortDirection } from "../utils/lists"; import { isLoggedIn } from "../utils/api"; import { Helmet } from "react-helmet"; import { useGuardianStyles } from "~/misc/utils"; import moment from "moment"; const tableHeaderTitles: HeaderTitle<DeletionRecord>[] = [ { label: "Project", key: "projectEntry" }, { label: "Owner", key: "user" }, { label: "Deleted", key: "deleted" }, { label: "Created", key: "created" }, { label: "Working Group", key: "workingGroup" }, ]; const pageSizeOptions = [25, 50, 100]; const DeletionRecords: React.FC<RouteComponentProps> = (props) => { const classes = useGuardianStyles(); const [deletionRecords, setDeletionRecords] = useState<DeletionRecord[]>([]); const [isAdmin, setIsAdmin] = useState<boolean>(false); const [page, setPage] = useState(0); const [pageSize, setRowsPerPage] = useState(pageSizeOptions[0]); const [order, setOrder] = useState<SortDirection>("asc"); const [orderBy, setOrderBy] = useState<keyof DeletionRecord>("id"); useEffect(() => { const fetchDeletionRecordsOnPage = async () => { const workingGroups = await getDeletionRecordsOnPage({ page, pageSize }); setDeletionRecords(workingGroups); }; const fetchWhoIsLoggedIn = async () => { try { const loggedIn = await isLoggedIn(); setIsAdmin(loggedIn.isAdmin); } catch { setIsAdmin(false); } }; fetchWhoIsLoggedIn(); fetchDeletionRecordsOnPage(); }, [page, pageSize]); const handleChangePage = ( _event: React.MouseEvent<HTMLButtonElement, MouseEvent> | null, newPage: number ) => { setPage(newPage); }; const handleChangeRowsPerPage = async ( event: React.ChangeEvent<HTMLInputElement> ) => { setRowsPerPage(+event.target.value); setPage(0); }; const sortByColumn = (property: keyof DeletionRecord) => ( _event: React.MouseEvent<unknown> ) => { const isAsc = orderBy === property && order === "asc"; setOrder(isAsc ? "desc" : "asc"); setOrderBy(property); }; return ( <> <Helmet> <title>Deletion Records - Pluto Admin</title> </Helmet> {isAdmin ? ( <Paper elevation={3}> <TableContainer> <Table className={classes.table}> <TableHead> <TableRow> {tableHeaderTitles.map((title, index) => ( <TableCell key={title.label ? title.label : index} sortDirection={orderBy === title.key ? order : false} > {title.key ? ( <TableSortLabel active={orderBy === title.key} direction={orderBy === title.key ? order : "asc"} onClick={sortByColumn(title.key)} > {title.label} {orderBy === title.key && ( <span className={classes.visuallyHidden}> {order === "desc" ? "sorted descending" : "sorted ascending"} </span> )} </TableSortLabel> ) : ( title.label )} </TableCell> ))} </TableRow> </TableHead> <TableBody> {sortListByOrder(deletionRecords, orderBy, order).map( ({ id, projectEntry, user, deleted, created, workingGroup, }) => ( <TableRow hover={true} onClick={() => props.history.push(`/deleted/${id}`)} key={id} > <TableCell>{projectEntry}</TableCell> <TableCell>{user}</TableCell> <TableCell> <span className="datetime"> {moment(deleted).format("DD/MM/YYYY HH:mm")} </span> </TableCell> <TableCell> <span className="datetime"> {moment(created).format("DD/MM/YYYY HH:mm")} </span> </TableCell> <TableCell>{workingGroup}</TableCell> </TableRow> ) )} </TableBody> </Table> </TableContainer> <TablePagination rowsPerPageOptions={pageSizeOptions} component="div" count={-1} rowsPerPage={pageSize} page={page} onPageChange={handleChangePage} onRowsPerPageChange={handleChangeRowsPerPage} labelDisplayedRows={({ from, to }) => `${from}-${to}`} /> </Paper> ) : ( <div>You do not have access to this page.</div> )} </> ); }; export default DeletionRecords;