import React from "react"; import { uniqueId } from "lodash"; import ReactTooltip from "react-tooltip"; import TextCell from "components/TableContainer/DataTable/TextCell"; import { ISoftwareVulnerability } from "interfaces/software"; const NUM_VULNERABILITIES_IN_TOOLTIP = 3; const baseClass = "vulnerabilities-cell"; const generateCell = ( vulnerabilities: ISoftwareVulnerability[] | string[] | null ) => { if (vulnerabilities === null || vulnerabilities.length === 0) { return ; } let text = ""; let italicize = true; if (vulnerabilities.length === 1) { italicize = false; text = typeof vulnerabilities[0] === "string" ? vulnerabilities[0] : vulnerabilities[0].cve; } else { text = `${vulnerabilities.length} vulnerabilities`; } return ; }; const getName = (vulnerabiltiy: ISoftwareVulnerability | string) => { return typeof vulnerabiltiy === "string" ? vulnerabiltiy : vulnerabiltiy.cve; }; const condenseVulnerabilities = ( vulnerabilities: ISoftwareVulnerability[] | string[] ) => { const condensed = (vulnerabilities?.length && vulnerabilities .slice(-NUM_VULNERABILITIES_IN_TOOLTIP) .map(getName) .reverse()) || []; return vulnerabilities.length > NUM_VULNERABILITIES_IN_TOOLTIP ? condensed.concat( `+${vulnerabilities.length - NUM_VULNERABILITIES_IN_TOOLTIP} more` ) : condensed; }; const generateTooltip = ( vulnerabilities: ISoftwareVulnerability[] | string[], tooltipId: string ) => { if (vulnerabilities.length <= 1) { return null; } const condensedVulnerabilities = condenseVulnerabilities(vulnerabilities); return (
    {condensedVulnerabilities.map((vulnerability) => { const key = typeof vulnerability === "string" ? vulnerability : uniqueId(); return
  • {vulnerability}
  • ; })}
); }; interface IVulnerabilitiesCellProps { vulnerabilities: ISoftwareVulnerability[] | string[] | null; } const VulnerabilitiesCell = ({ vulnerabilities, }: IVulnerabilitiesCellProps) => { const tooltipId = uniqueId(); // only one vulnerability, no need for tooltip const cell = generateCell(vulnerabilities); if (vulnerabilities === null || vulnerabilities.length <= 1) { return <>{cell}; } const vulnerabilityTooltip = generateTooltip(vulnerabilities, tooltipId); return ( <>
{cell}
{vulnerabilityTooltip} ); }; export default VulnerabilitiesCell;