import React from "react"; import { Link } from "react-router"; import ReactTooltip from "react-tooltip"; import PATHS from "router/paths"; import { formatSoftwareType, ISoftware } from "interfaces/software"; import { IVulnerability } from "interfaces/vulnerability"; import HeaderCell from "components/TableContainer/DataTable/HeaderCell"; import TextCell from "components/TableContainer/DataTable/TextCell"; import Chevron from "../../../../assets/images/icon-chevron-right-blue-16x16@2x.png"; // NOTE: cellProps come from react-table // more info here https://react-table.tanstack.com/docs/api/useTable#cell-properties interface ICellProps { cell: { value: number | string | IVulnerability[]; }; row: { original: ISoftware; }; } interface IStringCellProps extends ICellProps { cell: { value: string; }; } interface INumberCellProps extends ICellProps { cell: { value: number; }; } interface IVulnCellProps extends ICellProps { cell: { value: IVulnerability[]; }; } interface IHeaderProps { column: { title: string; isSortedDesc: boolean; }; } const condenseVulnerabilities = ( vulnerabilities: IVulnerability[] ): string[] => { const condensed = (vulnerabilities?.length && vulnerabilities .slice(-3) .map((v) => v.cve) .reverse()) || []; return vulnerabilities.length > 3 ? condensed.concat(`+${vulnerabilities.length - 3} more`) : condensed; }; const softwareTableHeaders = [ { title: "Name", Header: "Name", disableSortBy: true, accessor: "name", Cell: (cellProps: IStringCellProps): JSX.Element => ( ), }, { title: "Version", Header: "Version", disableSortBy: true, accessor: "version", Cell: (cellProps: IStringCellProps): JSX.Element => ( ), }, { title: "Type", Header: "Type", disableSortBy: true, accessor: "source", Cell: (cellProps: IStringCellProps): JSX.Element => ( ), }, { title: "Vulnerabilities", Header: "Vulnerabilities", disableSortBy: true, accessor: "vulnerabilities", Cell: (cellProps: IVulnCellProps): JSX.Element => { const vulnerabilities = cellProps.cell.value || []; const tooltipText = condenseVulnerabilities(vulnerabilities)?.map( (value) => { return ( {value}
); } ); if (!vulnerabilities?.length) { return ---; } return ( <> 1 ? "text-muted" : "" }`} data-tip data-for={`vulnerabilities__${cellProps.row.original.id.toString()}`} data-tip-disable={vulnerabilities.length <= 1} > {vulnerabilities.length === 1 ? vulnerabilities[0].cve : `${vulnerabilities.length} vulnerabilities`} {tooltipText} ); }, }, { title: "Hosts", Header: (cellProps: IHeaderProps): JSX.Element => ( ), disableSortBy: false, accessor: "hosts_count", Cell: (cellProps: INumberCellProps): JSX.Element => ( View all hosts link to hosts filtered by software ID ), }, ]; export default softwareTableHeaders;