| 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, | |
| }} | |
| /> | |
| ); | |
| } |