diff --git a/src/Components/SmartComponents/CVEs/CVEsTableToolbar.js b/src/Components/SmartComponents/CVEs/CVEsTableToolbar.js index 7595680cb..e48a2d200 100644 --- a/src/Components/SmartComponents/CVEs/CVEsTableToolbar.js +++ b/src/Components/SmartComponents/CVEs/CVEsTableToolbar.js @@ -1,5 +1,5 @@ /* eslint-disable camelcase */ -import React, { useState } from 'react'; +import React, { useEffect, useState } from 'react'; import propTypes from 'prop-types'; import { injectIntl } from 'react-intl'; import messages from '../../../Messages'; @@ -15,6 +15,7 @@ import securityRuleFilter from '../../PresentationalComponents/Filters/PrimaryTo import businessRiskFilter from '../../PresentationalComponents/Filters/PrimaryToolbarFilters/BusinessRiskFilter'; import knownExploitFilter from '../../PresentationalComponents/Filters/PrimaryToolbarFilters/KnownExploitFilter'; import statusFilter from '../../PresentationalComponents/Filters/PrimaryToolbarFilters/StatusFilter'; +import advisoryAvailabilityFilter from '../../PresentationalComponents/Filters/PrimaryToolbarFilters/AdvisoryAvailabilityFilter'; import { kebabItemDownloadPDF } from '../../PresentationalComponents/Kebab/KebabItems'; import DownloadCVEsReport from '../Reports/DownloadCVEsReport'; import { @@ -45,9 +46,18 @@ const CVEsTableToolbarWithContext = ({ context, canEditStatusOrBusinessRisk, can }; const { cves, params, methods, selectedCves, isAllExpanded } = context; + const { isLoading } = cves; const { filter } = params; const selectedCvesCount = selectedCves && selectedCves.length; + const [showCvesWithoutErrata, setShowCvesWithoutErrata] = useState(false); + + useEffect(() => { + if (!isLoading) { + setShowCvesWithoutErrata(cves?.meta?.cves_without_errata); + } + }, [cves?.meta?.cves_without_errata, isLoading]); + const selectOptions = selectAllCheckbox({ selectedItems: selectedCves, selectorHandler: methods.selectCves, @@ -95,7 +105,7 @@ const CVEsTableToolbarWithContext = ({ context, canEditStatusOrBusinessRisk, can onClick: () => methods.setColumnManagementModalOpen(true) }, ...canToggleCvesWithoutErrata ? [( - cves?.meta?.cves_without_errata ? + showCvesWithoutErrata ? { label: intl.formatMessage(messages.hideCvesWithoutAdvisories), onClick: () => setCvesWithoutErrata(false).then(() => methods.apply({ page: 1 })) @@ -146,7 +156,8 @@ const CVEsTableToolbarWithContext = ({ context, canEditStatusOrBusinessRisk, can businessRiskFilter(methods.apply, params), affectingFilter(methods.apply, params), publishDateFilter(methods.apply, params), - statusFilter(methods.apply, params) + statusFilter(methods.apply, params), + ...showCvesWithoutErrata ? [advisoryAvailabilityFilter(methods.apply, params)] : [] ] }} activeFiltersConfig={{ diff --git a/src/Helpers/APIHelper.js b/src/Helpers/APIHelper.js index de524167b..ec9522972 100644 --- a/src/Helpers/APIHelper.js +++ b/src/Helpers/APIHelper.js @@ -83,7 +83,8 @@ export function getCveListByAccount(apiProps) { 'report', 'advanced_report', 'ansible', - 'mssql' + 'mssql', + 'advisory_available' ]; let parameterArray = constructParameters(apiProps, parameterNames); let result = api.getCveList(...parameterArray); @@ -95,7 +96,8 @@ export function getCveIdsList(apiProps) { ...defaultParams, ...cveParams, 'ansible', - 'mssql' + 'mssql', + 'advisory_available' ]; let parameterArray = constructParameters(apiProps, parameterNames); diff --git a/src/Helpers/constants.js b/src/Helpers/constants.js index d87ce4174..7f17efa12 100644 --- a/src/Helpers/constants.js +++ b/src/Helpers/constants.js @@ -379,6 +379,10 @@ export const FILTERS = { remediation: { title: intl.formatMessage(messages.remediationFilterLabel), items: REMEDIATION_OPTIONS + }, + advisory_available: { + title: intl.formatMessage(messages.advisory), + items: ADVISORY_AVAILABILITY_FILTER_OPTIONS } }; @@ -815,7 +819,8 @@ export const CVES_FILTER_PARAMS = [ 'affecting', 'show_advisories', 'advisory', - 'known_exploit' + 'known_exploit', + 'advisory_available' ]; export const CVES_ALLOWED_PARAMS = [