Skip to content

Commit 6f5c5d7

Browse files
committed
feat: add sorting in scan vulnerabilities table
1 parent 148572d commit 6f5c5d7

File tree

5 files changed

+55
-34
lines changed

5 files changed

+55
-34
lines changed

src/Common/SearchBar/SearchBar.component.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ const SearchBar = ({
6565
debounceTimeout = 300,
6666
dataTestId = 'search-bar',
6767
noBackgroundAndBorder = false,
68+
height = '32',
6869
}: SearchBarProps) => {
6970
const [showClearButton, setShowClearButton] = useState(!!initialSearchText)
7071
const inputRef = useRef<HTMLInputElement>()
@@ -116,7 +117,7 @@ const SearchBar = ({
116117
return (
117118
<div className={containerClassName}>
118119
<div
119-
className={`search-bar ${noBackgroundAndBorder ? 'dc__no-border dc__no-background dc__hover-n50' : 'bc-n50 en-2 dc__hover-border-n300'} focus-within-border-b5 dc__block w-100 min-w-200 dc__position-rel br-4 bw-1 h-32`}
120+
className={`search-bar ${noBackgroundAndBorder ? 'dc__no-border dc__no-background dc__hover-n50' : 'bc-n50 en-2 dc__hover-border-n300'} focus-within-border-b5 dc__block w-100 min-w-200 dc__position-rel br-4 bw-1 h-${height}`}
120121
>
121122
<Search className="search-bar__icon dc__position-abs icon-color-n6 icon-dim-16" />
122123
<input

src/Common/SearchBar/types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,8 @@ export interface SearchBarProps {
5555
* Hide the background and border of the search
5656
*/
5757
noBackgroundAndBorder?: boolean
58+
/**
59+
* Height of the Search bar
60+
*/
61+
height?: '32' | '36'
5862
}

src/Common/Security/ScanVulnerabilitiesTable.tsx

Lines changed: 31 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -19,56 +19,45 @@ import { ScanVulnerabilitiesTableProps, VulnerabilityType } from '../Types'
1919
import './scanVulnerabilities.css'
2020
import { SortableTableHeaderCell } from '@Common/SortableTableHeaderCell'
2121
import { SortingOrder } from '@Common/Constants'
22-
import { useState } from 'react'
23-
import { numberComparatorBySortOrder } from '@Shared/Helpers'
24-
25-
const sortPriority = {
26-
'critical': 1,
27-
'high': 2,
28-
'medium': 3,
29-
'low': 4,
30-
'unknown': 5
31-
}
32-
33-
export enum SortBy {
34-
SEVERITY = 'severity',
35-
PACKAGE = 'package'
36-
}
22+
import { useMemo, useState } from 'react'
23+
import { numberComparatorBySortOrder, stringComparatorBySortOrder } from '@Shared/Helpers'
24+
import { SortBy, SortConfig } from './types'
25+
import { sortPriority } from './constants'
3726

3827
// To be replaced with Scan V2 Modal Table
3928
export default function ScanVulnerabilitiesTable({
4029
vulnerabilities,
4130
hidePolicy,
4231
shouldStick,
4332
}: ScanVulnerabilitiesTableProps) {
44-
45-
const [sortConfig, setSortConfig] = useState({
33+
const [sortConfig, setSortConfig] = useState<SortConfig>({
4634
sortBy: SortBy.SEVERITY,
4735
sortOrder: SortingOrder.ASC,
4836
})
4937

50-
const sortedVulnerabilities = vulnerabilities.sort((a, b) => {
51-
return numberComparatorBySortOrder(sortPriority[a.severity], sortPriority[b.severity], sortConfig.sortOrder)
52-
})
53-
54-
// const critical = vulnerabilities.filter((v) => v.severity === 'critical')
55-
// const high = vulnerabilities.filter((v) => v.severity === 'high')
56-
// const medium = vulnerabilities.filter((v) => v.severity === 'medium')
57-
// const low = vulnerabilities.filter((v) => v.severity === 'low')
58-
// const unknown = vulnerabilities.filter((v) => v.severity === 'unknown')
38+
const sortedVulnerabilities = useMemo(() => {
39+
return vulnerabilities.sort((a, b) => {
40+
if (sortConfig.sortBy === SortBy.PACKAGE) {
41+
return stringComparatorBySortOrder(a.package, b.package, sortConfig.sortOrder)
42+
}
5943

60-
// const ascVulnerabilities = [...critical, ...high, ...medium, ...low, ...unknown]
61-
// const descVulnerabilities = [...unknown, ...low, ...medium, ...high, ...critical]
44+
return numberComparatorBySortOrder(sortPriority[a.severity], sortPriority[b.severity], sortConfig.sortOrder)
45+
})
46+
}, [sortConfig])
6247

63-
const triggerSeveritySorting = () => setSortConfig({sortBy: SortBy.SEVERITY, sortOrder: sortConfig.sortOrder === SortingOrder.ASC ? SortingOrder.DESC : SortingOrder.DESC })
48+
const triggerSorting = (sortBy: SortBy) => {
49+
setSortConfig({
50+
sortBy: sortBy,
51+
sortOrder: sortConfig.sortOrder === SortingOrder.ASC ? SortingOrder.DESC : SortingOrder.ASC,
52+
})
53+
}
6454

6555
const renderRow = (vulnerability: VulnerabilityType) => (
6656
<tr
6757
className="dc__security-tab__table-row cursor"
6858
onClick={(e) => {
6959
window.open(`https://cve.mitre.org/cgi-bin/cvename.cgi?name=${vulnerability.name}`, '_blank')
7060
}}
71-
key={vulnerability.name}
7261
>
7362
<td className="security-tab__cell-cve dc__cve-cell">
7463
<a
@@ -117,14 +106,23 @@ export default function ScanVulnerabilitiesTable({
117106
<th className="security-cell-header security-tab__cell-severity">
118107
<SortableTableHeaderCell
119108
title="Severity"
120-
isSorted
109+
isSorted={sortConfig.sortBy === SortBy.SEVERITY}
110+
isSortable
111+
sortOrder={sortConfig.sortOrder}
112+
triggerSorting={() => triggerSorting(SortBy.SEVERITY)}
113+
disabled={false}
114+
/>
115+
</th>
116+
<th className="security-cell-header security-tab__cell-package">
117+
<SortableTableHeaderCell
118+
title="Package"
119+
isSorted={sortConfig.sortBy === SortBy.PACKAGE}
121120
isSortable
122121
sortOrder={sortConfig.sortOrder}
123-
triggerSorting={triggerSeveritySorting}
122+
triggerSorting={() => triggerSorting(SortBy.PACKAGE)}
124123
disabled={false}
125124
/>
126125
</th>
127-
<th className="security-cell-header security-tab__cell-package">Package</th>
128126
<th className="security-cell-header security-tab__cell-current-ver">Current Version</th>
129127
<th className="security-cell-header security-tab__cell-fixed-ver">Fixed In Version</th>
130128
{!hidePolicy && <th className="security-cell-header security-tab__cell-policy">Policy</th>}

src/Common/Security/constants.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export const sortPriority = {
2+
critical: 1,
3+
high: 2,
4+
medium: 3,
5+
low: 4,
6+
unknown: 5,
7+
}

src/Common/Security/types.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { SortingOrder } from '@Common/Constants'
2+
3+
export enum SortBy {
4+
SEVERITY = 'severity',
5+
PACKAGE = 'package',
6+
}
7+
8+
export interface SortConfig {
9+
sortBy: SortBy
10+
sortOrder: SortingOrder
11+
}

0 commit comments

Comments
 (0)