14
14
* limitations under the License.
15
15
*/
16
16
17
- import React from 'react'
18
17
import DOMPurify from 'dompurify'
19
18
import { ScanVulnerabilitiesTableProps , VulnerabilityType } from '../Types'
20
19
import './scanVulnerabilities.css'
20
+ import { SortableTableHeaderCell } from '@Common/SortableTableHeaderCell'
21
+ 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
+ }
37
+
38
+ // To be replaced with Scan V2 Modal Table
39
+ export default function ScanVulnerabilitiesTable ( {
40
+ vulnerabilities,
41
+ hidePolicy,
42
+ shouldStick,
43
+ } : ScanVulnerabilitiesTableProps ) {
44
+
45
+ const [ sortConfig , setSortConfig ] = useState ( {
46
+ sortBy : SortBy . SEVERITY ,
47
+ sortOrder : SortingOrder . ASC ,
48
+ } )
49
+
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')
59
+
60
+ // const ascVulnerabilities = [...critical, ...high, ...medium, ...low, ...unknown]
61
+ // const descVulnerabilities = [...unknown, ...low, ...medium, ...high, ...critical]
62
+
63
+ const triggerSeveritySorting = ( ) => setSortConfig ( { sortBy : SortBy . SEVERITY , sortOrder : sortConfig . sortOrder === SortingOrder . ASC ? SortingOrder . DESC : SortingOrder . DESC } )
21
64
22
- export default function ScanVulnerabilitiesTable ( { vulnerabilities, hidePolicy, shouldStick } : ScanVulnerabilitiesTableProps ) {
23
65
const renderRow = ( vulnerability : VulnerabilityType ) => (
24
66
< tr
25
67
className = "dc__security-tab__table-row cursor"
26
68
onClick = { ( e ) => {
27
69
window . open ( `https://cve.mitre.org/cgi-bin/cvename.cgi?name=${ vulnerability . name } ` , '_blank' )
28
70
} }
71
+ key = { vulnerability . name }
29
72
>
30
73
< td className = "security-tab__cell-cve dc__cve-cell" >
31
74
< a
@@ -37,14 +80,21 @@ export default function ScanVulnerabilitiesTable({ vulnerabilities, hidePolicy,
37
80
</ a >
38
81
</ td >
39
82
< td className = "security-tab__cell-severity" >
40
- < span className = { `dc__fill-${ vulnerability . severity ?. toLowerCase ( ) } ` } > { vulnerability . severity } </ span >
83
+ < span
84
+ className = { `severity-chip severity-chip--${ vulnerability . severity ?. toLowerCase ( ) } dc__capitalize dc__w-fit-content` }
85
+ >
86
+ { vulnerability . severity }
87
+ </ span >
41
88
</ td >
42
89
< td className = "security-tab__cell-package" > { vulnerability . package } </ td >
43
90
{ /* QUERY: Do we need to add DOMPurify at any other key for this table as well? */ }
44
91
< td className = "security-tab__cell-current-ver" >
45
- < p className = "m-0 cn-9 fs-13 fw-4" dangerouslySetInnerHTML = { {
46
- __html : DOMPurify . sanitize ( vulnerability . version )
47
- } } />
92
+ < p
93
+ className = "m-0 cn-9 fs-13 fw-4"
94
+ dangerouslySetInnerHTML = { {
95
+ __html : DOMPurify . sanitize ( vulnerability . version ) ,
96
+ } }
97
+ />
48
98
</ td >
49
99
< td className = "security-tab__cell-fixed-ver" > { vulnerability . fixedVersion } </ td >
50
100
{ ! hidePolicy && (
@@ -60,17 +110,26 @@ export default function ScanVulnerabilitiesTable({ vulnerabilities, hidePolicy,
60
110
return (
61
111
< table className = "security-tab__table" >
62
112
< tbody >
63
- < tr className = { `security-tab__table-header ${ shouldStick ? 'dc__position-sticky bcn-0 dc__zi-4 dc__top-0' : '' } ` } >
113
+ < tr
114
+ className = { `security-tab__table-header ${ shouldStick ? 'dc__position-sticky bcn-0 dc__zi-4 dc__top-42' : '' } ` }
115
+ >
64
116
< th className = "security-cell-header security-tab__cell-cve" > CVE</ th >
65
- < th className = "security-cell-header security-tab__cell-severity" > Severity</ th >
117
+ < th className = "security-cell-header security-tab__cell-severity" >
118
+ < SortableTableHeaderCell
119
+ title = "Severity"
120
+ isSorted
121
+ isSortable
122
+ sortOrder = { sortConfig . sortOrder }
123
+ triggerSorting = { triggerSeveritySorting }
124
+ disabled = { false }
125
+ />
126
+ </ th >
66
127
< th className = "security-cell-header security-tab__cell-package" > Package</ th >
67
128
< th className = "security-cell-header security-tab__cell-current-ver" > Current Version</ th >
68
129
< th className = "security-cell-header security-tab__cell-fixed-ver" > Fixed In Version</ th >
69
- { ! hidePolicy && (
70
- < th className = "security-cell-header security-tab__cell-policy" > Policy</ th >
71
- ) }
130
+ { ! hidePolicy && < th className = "security-cell-header security-tab__cell-policy" > Policy</ th > }
72
131
</ tr >
73
- { vulnerabilities . map ( ( vulnerability ) => renderRow ( vulnerability ) ) }
132
+ { sortedVulnerabilities . map ( ( vulnerability ) => renderRow ( vulnerability ) ) }
74
133
</ tbody >
75
134
</ table >
76
135
)
0 commit comments