Skip to content

Commit a3e16a6

Browse files
committed
chore(heureka): adds support groups
1 parent 3261803 commit a3e16a6

9 files changed

Lines changed: 308 additions & 183 deletions

File tree

apps/heureka/src/components/Vulnerabilities/VulnerabilitiesList/VulnerabilityDetailsPanel/VulnerabilityServicesList.tsx

Lines changed: 0 additions & 150 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Juno contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
import React, { use } from "react"
7+
import { useNavigate } from "@tanstack/react-router"
8+
import { DataGridRow, DataGridCell } from "@cloudoperators/juno-ui-components"
9+
import { Vulnerability } from "../../../utils"
10+
import { ApolloQueryResult } from "@apollo/client"
11+
import { GetVulnerabilitiesQuery } from "../../../../../generated/graphql"
12+
import { getNormalizedVulnerabilitiesResponse } from "../../../utils"
13+
14+
type VulnerabilityServicesDataRowsProps = {
15+
vulnerabilitiesPromise: Promise<ApolloQueryResult<GetVulnerabilitiesQuery>>
16+
vulnerabilityName: string
17+
onServiceClick?: (serviceCcrn: string) => void
18+
}
19+
20+
export const VulnerabilityServicesDataRows = ({
21+
vulnerabilitiesPromise,
22+
vulnerabilityName,
23+
onServiceClick,
24+
}: VulnerabilityServicesDataRowsProps) => {
25+
const navigate = useNavigate()
26+
27+
const handleServiceClick = (serviceCcrn: string) => {
28+
if (onServiceClick) {
29+
onServiceClick(serviceCcrn)
30+
} else {
31+
navigate({
32+
to: "/services/$service",
33+
params: { service: serviceCcrn },
34+
})
35+
}
36+
}
37+
38+
// Use the promise passed from the parent
39+
const { data } = use(vulnerabilitiesPromise)
40+
41+
// Get vulnerability data from the response
42+
const { vulnerabilities } = getNormalizedVulnerabilitiesResponse(data)
43+
const vulnerabilityData = vulnerabilities.find((vuln: Vulnerability) => vuln.name === vulnerabilityName)
44+
45+
if (!vulnerabilityData) {
46+
return <div className="text-sm text-theme-light">Vulnerability not found: {vulnerabilityName}</div>
47+
}
48+
49+
const services = vulnerabilityData.services || []
50+
const totalCount = vulnerabilityData.servicesCount || 0
51+
52+
if (totalCount === 0) {
53+
return <div className="text-sm text-theme-light">No services affected by this vulnerability.</div>
54+
}
55+
56+
return (
57+
<>
58+
{services.map((service, index) => (
59+
<DataGridRow key={index} className="cursor-pointer" onClick={() => handleServiceClick(service.ccrn)}>
60+
<DataGridCell className="whitespace-nowrap">{service.ccrn}</DataGridCell>
61+
</DataGridRow>
62+
))}
63+
</>
64+
)
65+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Juno contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
import { use } from "react"
7+
import { Vulnerability } from "../../../utils"
8+
import { ApolloQueryResult } from "@apollo/client"
9+
import { GetVulnerabilitiesQuery } from "../../../../../generated/graphql"
10+
import { getNormalizedVulnerabilitiesResponse } from "../../../utils"
11+
12+
type VulnerabilityServicesTotalCountProps = {
13+
vulnerabilitiesPromise: Promise<ApolloQueryResult<GetVulnerabilitiesQuery>>
14+
vulnerabilityName: string
15+
}
16+
17+
export const VulnerabilityServicesTotalCount = ({
18+
vulnerabilitiesPromise,
19+
vulnerabilityName,
20+
}: VulnerabilityServicesTotalCountProps) => {
21+
const { data } = use(vulnerabilitiesPromise)
22+
const { vulnerabilities } = getNormalizedVulnerabilitiesResponse(data)
23+
const vulnerabilityData = vulnerabilities.find((vuln: Vulnerability) => vuln.name === vulnerabilityName)
24+
const { servicesCount } = vulnerabilityData || { servicesCount: 0 }
25+
26+
return servicesCount
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Juno contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
import React, { Suspense } from "react"
7+
import {
8+
Stack,
9+
DataGrid,
10+
DataGridRow,
11+
DataGridHeadCell,
12+
DataGridCell,
13+
Spinner,
14+
} from "@cloudoperators/juno-ui-components"
15+
import SectionContentHeading from "../../../../common/SectionContentHeading"
16+
import { CursorPagination } from "../../../../common/CursorPagination"
17+
import { ApolloQueryResult } from "@apollo/client"
18+
import { GetVulnerabilitiesQuery } from "../../../../../generated/graphql"
19+
import { getNormalizedVulnerabilityServicesResponse } from "../../../utils"
20+
import { VulnerabilityServicesDataRows } from "./VulnerabilityServicesDataRows"
21+
import { VulnerabilityServicesTotalCount } from "./VulnerabilityServicesTotalCount"
22+
23+
type VulnerabilityServicesListProps = {
24+
vulnerabilityName: string
25+
vulnerabilitiesPromise: Promise<ApolloQueryResult<GetVulnerabilitiesQuery>>
26+
onServiceClick?: (serviceCcrn: string) => void
27+
goToPage: (after?: string | null) => void
28+
}
29+
30+
export const VulnerabilityServicesList = ({
31+
vulnerabilityName,
32+
vulnerabilitiesPromise,
33+
onServiceClick,
34+
goToPage,
35+
}: VulnerabilityServicesListProps) => {
36+
return (
37+
<Suspense>
38+
<SectionContentHeading>
39+
Services
40+
<Suspense>
41+
(
42+
<VulnerabilityServicesTotalCount
43+
vulnerabilitiesPromise={vulnerabilitiesPromise}
44+
vulnerabilityName={vulnerabilityName}
45+
/>
46+
)
47+
</Suspense>
48+
</SectionContentHeading>
49+
50+
<div className="datagrid-hover">
51+
<DataGrid columns={1}>
52+
<DataGridRow>
53+
<DataGridHeadCell>Service</DataGridHeadCell>
54+
</DataGridRow>
55+
<Suspense
56+
fallback={
57+
<DataGridRow>
58+
<DataGridCell colSpan={1}>
59+
<Stack gap="2" alignment="center">
60+
<div>Loading</div>
61+
<Spinner variant="primary"></Spinner>
62+
</Stack>
63+
</DataGridCell>
64+
</DataGridRow>
65+
}
66+
>
67+
<VulnerabilityServicesDataRows
68+
vulnerabilitiesPromise={vulnerabilitiesPromise}
69+
vulnerabilityName={vulnerabilityName}
70+
onServiceClick={onServiceClick}
71+
/>
72+
</Suspense>
73+
</DataGrid>
74+
</div>
75+
<Suspense>
76+
<CursorPagination
77+
dataNormalizationMethod={getNormalizedVulnerabilityServicesResponse}
78+
dataPromise={vulnerabilitiesPromise}
79+
goToPage={goToPage}
80+
/>
81+
</Suspense>
82+
</Suspense>
83+
)
84+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Juno contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
import React, { use } from "react"
7+
import { DataGridRow, DataGridCell, Stack, Pill, DataGridHeadCell, DataGrid } from "@cloudoperators/juno-ui-components"
8+
import { Vulnerability } from "../../utils"
9+
import { ApolloQueryResult } from "@apollo/client"
10+
import { GetVulnerabilitiesQuery } from "../../../../generated/graphql"
11+
import { getNormalizedVulnerabilitiesResponse } from "../../utils"
12+
13+
type VulnerabilitySupportGroupsProps = {
14+
vulnerabilitiesPromise: Promise<ApolloQueryResult<GetVulnerabilitiesQuery>>
15+
vulnerabilityName: string
16+
}
17+
18+
export const VulnerabilitySupportGroups = ({
19+
vulnerabilitiesPromise,
20+
vulnerabilityName,
21+
}: VulnerabilitySupportGroupsProps) => {
22+
const { data } = use(vulnerabilitiesPromise)
23+
const { vulnerabilities } = getNormalizedVulnerabilitiesResponse(data)
24+
const vulnerabilityData = vulnerabilities.find((vuln: Vulnerability) => vuln.name === vulnerabilityName)
25+
26+
if (!vulnerabilityData) {
27+
return null
28+
}
29+
30+
return (
31+
<DataGrid columns={2} gridColumnTemplate="10% auto" className="mb-6">
32+
<DataGridRow>
33+
<DataGridHeadCell>Support Groups</DataGridHeadCell>
34+
<DataGridCell>
35+
<Stack gap="1" direction="horizontal" wrap>
36+
{vulnerabilityData.supportGroups?.map((group: string) => (
37+
<Pill
38+
key={group}
39+
pillKey="support_group"
40+
pillKeyLabel="support_group"
41+
pillValue={group}
42+
pillValueLabel={group}
43+
/>
44+
))}
45+
</Stack>
46+
</DataGridCell>
47+
</DataGridRow>
48+
</DataGrid>
49+
)
50+
}

0 commit comments

Comments
 (0)