blob: 3bc9ccbdea4167a1bf58e787482923b2306f129b [file] [log] [blame]
import React from "react";
import { Link } from "@material-ui/core";
import MUIDataTable, { MUIDataTableColumn } from "mui-datatables";
import { useGithubTeamTable } from "./data/GithubTeamTable";
function GithubTeamTableCellContainer({
value,
url,
header,
}: {
value: number;
url: string;
header: string | undefined;
}) {
let style = {};
if (
header === "No Type" ||
header === "No Priority" ||
header === "Untriaged"
) {
if (value >= 10) {
style = { color: "#e53935", fontWeight: "bold" };
}
} else if (header === "Awaiting Review") {
if (value >= 5) {
style = { color: "#e53935", fontWeight: "bold" };
}
}
return (
<Link href={url} target="_blank" style={style}>
{value}
</Link>
);
}
function TeamOwnerCell({ value }: { value: string }) {
if (value === "(none)") {
return null;
}
return (
<Link href={`https://github.com/${value}`} target="_blank">
{value}
</Link>
);
}
export interface GithubTeamTableContainerProps {
owner: string;
repo: string;
}
export default function GithubTeamTableContainer({
owner,
repo,
}: GithubTeamTableContainerProps) {
const { data: table, error, loading } = useGithubTeamTable(
owner,
repo,
"open-issues"
);
const data = React.useMemo(
() =>
table && table.rows
? table.rows.map((row, index) => {
const data: any = {};
for (let key of Object.keys(row.cells)) {
data[`cells.${key}`] = row.cells[key].count;
}
data["team.name"] = row.team.name;
let teamOwner = row.team.teamOwner;
if (teamOwner === "") {
teamOwner = "(none)";
}
data["team.teamOwner"] = teamOwner;
data["index"] = index;
return data;
})
: [],
[table]
);
const columns: MUIDataTableColumn[] = React.useMemo(() => {
if (!(table && table.headers)) {
return [];
}
const displayTeamColumn = table.rows.length > 1;
return [
{
name: "team.name",
label: "Team",
options: {
filterType: "multiselect",
viewColumns: displayTeamColumn,
filter: displayTeamColumn,
display: displayTeamColumn,
},
},
...table.headers.map(
(header) =>
({
name: `cells.${header.id}`,
label: header.name,
options: {
filter: false,
sortDescFirst: true,
customBodyRender: (value, tableMeta) => {
let url = "";
const row = table.rows.find(
(row) => row.team.name === tableMeta.rowData[0]
);
if (row) {
const key = tableMeta.columnData.name.substring(
"cells.".length
);
url = row.cells[key].url;
}
return (
<GithubTeamTableCellContainer
value={value}
url={url}
header={tableMeta.columnData.label}
/>
);
},
},
} as MUIDataTableColumn)
),
{
name: "team.teamOwner",
label: "Owner",
options: {
filterType: "multiselect",
customBodyRender: (value) => {
return <TeamOwnerCell value={value} />;
},
},
},
];
}, [table]);
if (loading) {
return <span>Loading</span>;
}
if (error) {
return <span>Error</span>;
}
return (
<MUIDataTable
title={table.name}
columns={columns}
data={data}
options={{
elevation: 1,
selectableRows: "none",
download: false,
print: false,
}}
/>
);
}