frontend/app/InvalidDeliverablesComponent.tsx (179 lines of code) (raw):
import React, { useEffect, useState } from "react";
import { Helmet } from "react-helmet";
import {
makeStyles,
Paper,
Table,
TableBody,
TableCell,
TableContainer,
TableHead,
TableRow,
} from "@material-ui/core";
import { RouteComponentProps, useParams } from "react-router-dom";
import {
getInvalidDeliverables,
getInvalidDeliverablesByDate,
getInvalidDeliverablesByType,
getInvalidDeliverablesByStatus,
} from "./api-service";
import InvalidRow from "./InvalidRow";
import DayGraph from "./DayGraph";
import TypeGraph from "./TypeGraph";
import StatusGraph from "./StatusGraph";
interface HeaderTitles {
label: string;
key?: keyof Deliverable;
}
const tableHeaderTitles: HeaderTitles[] = [
{ label: "File", key: "filename" },
{ label: "", key: "atom_id" },
{ label: "Last Modified", key: "modified_dt" },
{ label: "Type", key: "type" },
{ label: "Status", key: "status" },
{ label: "Go To", key: "job_id" },
];
const useStyles = makeStyles({
table: {
maxWidth: "100%",
},
page_title: {
fontSize: "25px",
},
graphs: {
display: "grid",
gridTemplateColumns: "55% 45%",
gridTemplateRows: "200px 200px",
"@media only screen and (max-width: 1490px)": {
display: "grid",
gridTemplateColumns: "50% 50%",
gridTemplateRows: "400px 200px",
},
},
daygraph: {
gridColumnStart: 1,
gridColumnEnd: 1,
gridRowStart: 1,
gridRowEnd: 2,
"@media only screen and (max-width: 1490px)": {
gridColumnStart: 1,
gridColumnEnd: 2,
gridRowStart: 1,
gridRowEnd: 1,
},
},
typegraph: {
gridColumnStart: 2,
gridColumnEnd: 2,
gridRowStart: 1,
gridRowEnd: 1,
"@media only screen and (max-width: 1490px)": {
gridColumnStart: 1,
gridColumnEnd: 1,
gridRowStart: 2,
gridRowEnd: 2,
marginTop: "20px",
},
},
statusgraph: {
gridColumnStart: 2,
gridColumnEnd: 2,
gridRowStart: 2,
gridRowEnd: 2,
marginTop: "16px",
"@media only screen and (max-width: 1490px)": {
gridColumnStart: 2,
gridColumnEnd: 2,
gridRowStart: 2,
gridRowEnd: 2,
marginTop: "20px",
},
},
});
const InvalidDeliverablesComponent: React.FC<RouteComponentProps> = () => {
// React Router
// @ts-ignore
const { date, kind, status } = useParams();
// React state
const [deliverables, setDeliverables] = useState<Deliverable[]>([]);
// Material-UI
const classes = useStyles();
const loadDeliverables = async () => {
try {
if (date) {
const projectDeliverables = await getInvalidDeliverablesByDate(date);
setDeliverables(projectDeliverables);
} else if (kind) {
const projectDeliverables = await getInvalidDeliverablesByType(kind);
setDeliverables(projectDeliverables);
} else if (status) {
const projectDeliverables = await getInvalidDeliverablesByStatus(
status
);
setDeliverables(projectDeliverables);
} else {
const projectDeliverables = await getInvalidDeliverables();
setDeliverables(projectDeliverables);
}
} catch (err) {
if (err.response) {
if (err.response.data.detail) console.error(err.response.data.detail);
else return console.error(`Error code ${err.response.status}`);
} else if (err.request) {
console.error(`Could not contact server: ${err.message}`);
} else {
console.error(err.message);
}
}
};
useEffect(() => {
loadDeliverables();
}, []);
return (
<>
<Helmet>
<title>Invalid Deliverables</title>
</Helmet>
<div className={classes.page_title}>Invalid Deliverables</div>
<Table>
<TableBody>
<TableRow>
<TableCell>
<div className={classes.graphs}>
<div className={classes.daygraph}>
<DayGraph />
</div>
<div className={classes.typegraph}>
<TypeGraph />
</div>
<div className={classes.statusgraph}>
<StatusGraph />
</div>
</div>
</TableCell>
</TableRow>
</TableBody>
</Table>
<Paper elevation={3}>
<TableContainer>
<Table className={classes.table}>
<TableHead>
<TableRow>
{tableHeaderTitles.map((entry, idx) => (
<TableCell key={`r${idx}`}>{entry.label}</TableCell>
))}
<TableCell />
</TableRow>
</TableHead>
<TableBody>
{deliverables.map((del, idx) => (
<InvalidRow
key={del.id.toString()}
deliverable={del}
classes={classes}
/>
))}
</TableBody>
</Table>
</TableContainer>
</Paper>
</>
);
};
export default InvalidDeliverablesComponent;