Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ export const TableHeaderContentWithControls: React.FC<
ITableHeaderContentWithControlsProps
> = ({ numColumnsBeforeData, numColumnsAfterData, children }) => (
<>
{/* eslint-disable @eslint-react/no-array-index-key -- filler cells with no identity beyond position */}
{Array(numColumnsBeforeData)
.fill(null)
.map((_, i) => (
Expand All @@ -23,5 +24,6 @@ export const TableHeaderContentWithControls: React.FC<
.map((_, i) => (
<Th screenReaderText={`after-data-${i}`} key={i} />
))}
{/* eslint-enable @eslint-react/no-array-index-key */}
</>
);
4 changes: 2 additions & 2 deletions client/src/app/components/UploadFiles.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -118,13 +118,13 @@ export const UploadFiles: React.FC<IUploadFilesProps> = ({
statusToggleText={`${successFileCount} of ${uploads.size} files uploaded`}
statusToggleIcon={statusIcon}
>
{Array.from(uploads.entries()).map(([file, upload], index) => (
{Array.from(uploads.entries()).map(([file, upload]) => (
<MultipleFileUploadStatusItem
// customFileHandler is Required until https://github.com/patternfly/patternfly-react/issues/11276 is fixed
customFileHandler={() => {}}
fileIcon={<FileIcon />}
file={file}
key={`${file.name}-${index}`}
key={`${file.name}-${file.size}-${file.lastModified}`}
onClearClick={() => removeFiles([file])}
progressValue={upload.progress}
progressVariant={
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,8 @@ export const CsafRemediations: React.FC<IRemediationCardProps> = ({
isIndented
>
<Grid hasGutter md={6}>
{sorted.map((rem, i) => (
<GridItem key={`${rem.category}-${i}`}>
{sorted.map((rem) => (
<GridItem key={`${rem.category}-${rem.details}`}>
<RemediationCard
remediation={rem}
productNameMap={productNameMap}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,10 @@ export const CsafVulnerabilityCard: React.FC<ICsafVulnerabilityCardProps> = ({
)}
{vulnerability.threats &&
vulnerability.threats.length > 0 &&
vulnerability.threats.map((threat, i) => (
<DescriptionListGroup key={`${threat.category}-${i}`}>
vulnerability.threats.map((threat) => (
<DescriptionListGroup
key={`${threat.category}-${threat.details}`}
>
<DescriptionListTerm>
{capitalize(threat.category)}
</DescriptionListTerm>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,7 @@ export function linkifyDetails(text: string): React.ReactNode[] {
const parts = text.split(URL_REGEX);
return parts.map((part, i) =>
i % 2 === 1 ? (
// eslint-disable-next-line @eslint-react/no-array-index-key -- index is the only identity for regex-split fragments
<a key={i} href={part} target="_blank" rel="noopener noreferrer">
{part}
</a>
Expand Down
4 changes: 2 additions & 2 deletions client/src/app/pages/package-list/package-table.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -170,9 +170,9 @@ export const PackageTable: React.FC = () => {
<div className={spacing.ptLg}>
{isCellExpanded(item, "licenses") ? (
<List isPlain>
{pkg?.licenses?.map((license, idx) => (
{pkg?.licenses?.map((license) => (
<ListItem
key={`${license.license_name}-${idx}`}
key={`${license.license_name}-${license.license_type}`}
>
{license.license_name}
</ListItem>
Expand Down
96 changes: 45 additions & 51 deletions client/src/app/pages/sbom-details/vulnerabilities-by-sbom.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -352,58 +352,52 @@ export const VulnerabilitiesBySbom: React.FC<VulnerabilitiesBySbomProps> = ({
</Tr>
</Thead>
<Tbody>
{Array.from(item.purls.values()).map(
(purl, index) => {
if (!purl.isOrphan) {
const decomposedPurl = decomposePurl(
purl.purlSummary.purl,
);
return (
<Tr key={purl.purlSummary.uuid}>
<Td>{decomposedPurl?.type}</Td>
<Td>{decomposedPurl?.namespace}</Td>
<Td>
<Link
to={generatePath(
Paths.packageDetails,
{
packageId:
purl.purlSummary.uuid,
},
)}
>
{decomposedPurl?.name}
</Link>
</Td>
<Td>{decomposedPurl?.version}</Td>
<Td>{decomposedPurl?.path}</Td>
<Td>
{decomposedPurl?.qualifiers && (
<PackageQualifiers
value={
decomposedPurl?.qualifiers
}
/>
{Array.from(item.purls.values()).map((purl) => {
if (!purl.isOrphan) {
const decomposedPurl = decomposePurl(
purl.purlSummary.purl,
);
return (
<Tr key={purl.purlSummary.uuid}>
<Td>{decomposedPurl?.type}</Td>
<Td>{decomposedPurl?.namespace}</Td>
<Td>
<Link
to={generatePath(
Paths.packageDetails,
{
packageId:
purl.purlSummary.uuid,
},
)}
</Td>
</Tr>
);
} else {
return (
<Tr
key={`${purl.parentName}-${index}-name`}
>
<Td />
<Td />
<Td>{purl.parentName}</Td>
<Td />
<Td />
<Td />
</Tr>
);
}
},
)}
>
{decomposedPurl?.name}
</Link>
</Td>
<Td>{decomposedPurl?.version}</Td>
<Td>{decomposedPurl?.path}</Td>
<Td>
{decomposedPurl?.qualifiers && (
<PackageQualifiers
value={decomposedPurl?.qualifiers}
/>
)}
</Td>
</Tr>
);
} else {
return (
<Tr key={`orphan-${purl.parentName}`}>
<Td />
<Td />
<Td>{purl.parentName}</Td>
<Td />
<Td />
<Td />
</Tr>
);
}
})}
</Tbody>
</Table>
) : null}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,12 +77,12 @@ export const UploadFileForAnalysis: React.FC<IUploadFileForAnalysisProps> = ({
browseButtonText="Browse Files"
/>
) : (
Array.from(uploads.entries()).map(([file, upload], index) => {
Array.from(uploads.entries()).map(([file, upload]) => {
if (upload.error) {
if (upload.wasCancelled) {
return (
<EmptyState
key={`${file.name}-${index}-cancelled`}
key={`${file.name}-${file.size}-cancelled`}
status="danger"
headingLevel="h4"
titleText="Upload cancelled"
Expand All @@ -108,7 +108,7 @@ export const UploadFileForAnalysis: React.FC<IUploadFileForAnalysisProps> = ({

return (
<EmptyState
key={`${file.name}-${index}-error`}
key={`${file.name}-${file.size}-error`}
status="danger"
headingLevel="h4"
titleText={"Report failed"}
Expand Down Expand Up @@ -140,7 +140,7 @@ export const UploadFileForAnalysis: React.FC<IUploadFileForAnalysisProps> = ({

return (
<EmptyState
key={`${file.name}-${index}-progress`}
key={`${file.name}-${file.size}-progress`}
headingLevel="h4"
titleText={"Analyzing SBOM"}
icon={Spinner}
Expand Down
1 change: 0 additions & 1 deletion eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ export default defineConfig([
"@eslint-react/no-use-context": "off",
"@eslint-react/no-context-provider": "off",
"@eslint-react/naming-convention-ref-name": "off",
"@eslint-react/no-array-index-key": "off",
"@eslint-react/use-state": "off",
"@eslint-react/no-unnecessary-use-prefix": "off",
"@typescript-eslint/no-unused-vars": "off",
Expand Down