diff --git a/ee/app/assets/javascripts/security_dashboard/components/agent/agent_vulnerability_report.vue b/ee/app/assets/javascripts/security_dashboard/components/agent/agent_vulnerability_report.vue index bf025b69ebc24cd63e4b47c12c585901504fd4ef..3ed2e652380b5eb29e8ac86dd661b69a946c60fe 100644 --- a/ee/app/assets/javascripts/security_dashboard/components/agent/agent_vulnerability_report.vue +++ b/ee/app/assets/javascripts/security_dashboard/components/agent/agent_vulnerability_report.vue @@ -105,6 +105,7 @@ export default { <gl-alert v-if="!alertDismissed" variant="info" + class="gl-mb-3" :title="alertTitleComputed" @dismiss="handleAlertDismiss" > @@ -119,7 +120,6 @@ export default { </gl-alert> <vulnerability-report - :class="{ 'gl-mt-3': !alertDismissed }" :fields="$options.fieldsToShow" :filter-dropdowns="$options.filtersToShow" :filter-fn="transformFilters" diff --git a/ee/app/assets/javascripts/security_dashboard/components/pipeline/pipeline_security_dashboard.vue b/ee/app/assets/javascripts/security_dashboard/components/pipeline/pipeline_security_dashboard.vue index af9cb73b400462e88c90404f00848bb38f9740f4..ec0cf5b0234a65c1b42f08742d94d8d66fa43d80 100644 --- a/ee/app/assets/javascripts/security_dashboard/components/pipeline/pipeline_security_dashboard.vue +++ b/ee/app/assets/javascripts/security_dashboard/components/pipeline/pipeline_security_dashboard.vue @@ -1,11 +1,12 @@ <script> -import { GlEmptyState } from '@gitlab/ui'; +import { GlEmptyState, GlButton } from '@gitlab/ui'; import { mapActions } from 'vuex'; import pipelineSecurityReportSummaryQuery from 'ee/security_dashboard/graphql/queries/pipeline_security_report_summary.query.graphql'; import { reportTypeToSecurityReportTypeEnum } from 'ee/vue_shared/security_reports/constants'; import { fetchPolicies } from '~/lib/graphql'; import { s__ } from '~/locale'; import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; +import { helpPagePath } from '~/helpers/help_page_helper'; import ScanAlerts, { TYPE_ERRORS, TYPE_WARNINGS } from './scan_alerts.vue'; import ReportStatusAlert, { STATUS_PURGED } from './report_status_alert.vue'; import SecurityDashboard from './security_dashboard_vuex.vue'; @@ -24,6 +25,7 @@ export default { SecurityReportsSummary, SecurityDashboard, PipelineVulnerabilityReport, + GlButton, }, mixins: [glFeatureFlagMixin()], inject: [ @@ -131,13 +133,31 @@ export default { parsingWarningAlertDescription: s__( 'SecurityReports|Check the messages generated while parsing the following security reports, as they may prevent the results from being ingested by GitLab. Ensure the security report conforms to a supported %{helpPageLinkStart}JSON schema%{helpPageLinkEnd}.', ), + pageDescription: s__( + `SecurityReports|Results show vulnerabilities introduced by the merge request, in addition to existing vulnerabilities from the latest successful pipeline in your project's default branch.`, + ), + pageDescriptionHelpLink: helpPagePath( + 'user/application_security/security_dashboard/index.html', + { anchor: 'view-vulnerabilities-in-a-pipeline' }, + ), }, }; </script> <template> - <div> - <div v-if="reportSummary" class="gl-my-5"> + <div class="gl-mt-5"> + <p> + {{ $options.i18n.pageDescription }} + <gl-button + class="gl-ml-2 vertical-align-text-top" + icon="question-o" + variant="link" + target="_blank" + :href="$options.i18n.pageDescriptionHelpLink" + /> + </p> + + <div v-if="reportSummary" class="gl-mb-5"> <scan-alerts v-if="showScanErrors" :type="$options.errorsAlertType" @@ -154,9 +174,11 @@ export default { :description="$options.i18n.parsingWarningAlertDescription" class="gl-mb-5" /> + <report-status-alert v-if="hasPurgedScans" class="gl-mb-5" /> <security-reports-summary :summary="reportSummary" :jobs="jobs" /> </div> + <security-dashboard v-if="!shouldShowGraphqlVulnerabilityReport" :vulnerabilities-endpoint="vulnerabilitiesEndpoint" diff --git a/ee/app/assets/javascripts/security_dashboard/components/shared/vulnerability_report/vulnerability_report.vue b/ee/app/assets/javascripts/security_dashboard/components/shared/vulnerability_report/vulnerability_report.vue index 4105f4c8f919134e22144ca53c0eeff2d60521fd..0eedc8d3bfcdcaddf1fcf4679e72332f5af9fb19 100644 --- a/ee/app/assets/javascripts/security_dashboard/components/shared/vulnerability_report/vulnerability_report.vue +++ b/ee/app/assets/javascripts/security_dashboard/components/shared/vulnerability_report/vulnerability_report.vue @@ -74,12 +74,12 @@ export default { <div> <vulnerability-counts v-if="showCounts" - class="gl-mt-7" + class="gl-mb-7" :filters="graphqlFilters" @counts-changed="emitCountsChanged" /> - <div ref="vulnerabilityListTop" class="gl-mt-7" data-testid="vulnerability-list-top"></div> + <div ref="vulnerabilityListTop" data-testid="vulnerability-list-top"></div> <div class="security-dashboard-filters"> <vulnerability-filters :filters="filterDropdowns" @filters-changed="updateGraphqlFilters" /> diff --git a/ee/app/assets/javascripts/security_dashboard/components/shared/vulnerability_report/vulnerability_report_tab.vue b/ee/app/assets/javascripts/security_dashboard/components/shared/vulnerability_report/vulnerability_report_tab.vue index a28369d28dd7986fd1a48205147c04a00e741f3d..c04492af0b1a836ab9b18b68d1aa588a836aece4 100644 --- a/ee/app/assets/javascripts/security_dashboard/components/shared/vulnerability_report/vulnerability_report_tab.vue +++ b/ee/app/assets/javascripts/security_dashboard/components/shared/vulnerability_report/vulnerability_report_tab.vue @@ -56,6 +56,7 @@ export default { <slot name="header"></slot> <vulnerability-report + class="gl-mt-7" :is-visible="isActiveTab" :filter-dropdowns="filterDropdowns" :fields="fields" diff --git a/ee/spec/frontend/security_dashboard/components/pipeline/pipeline_security_dashboard_spec.js b/ee/spec/frontend/security_dashboard/components/pipeline/pipeline_security_dashboard_spec.js index d7d64a8ce64c74f232c83c80024f16e096d47b63..d2107c54b96daf2818f3fff9aa9208c6b59a249b 100644 --- a/ee/spec/frontend/security_dashboard/components/pipeline/pipeline_security_dashboard_spec.js +++ b/ee/spec/frontend/security_dashboard/components/pipeline/pipeline_security_dashboard_spec.js @@ -1,4 +1,4 @@ -import { GlEmptyState } from '@gitlab/ui'; +import { GlEmptyState, GlButton } from '@gitlab/ui'; import { shallowMount } from '@vue/test-utils'; import Vue from 'vue'; import Vuex from 'vuex'; @@ -265,6 +265,20 @@ describe('Pipeline Security Dashboard component', () => { }); }); + describe('page description', () => { + it('shows page description and help link', () => { + factory(); + + expect(wrapper.html()).toContain(PipelineSecurityDashboard.i18n.pageDescription); + expect(wrapper.find(GlButton).attributes()).toMatchObject({ + variant: 'link', + icon: 'question-o', + target: '_blank', + href: PipelineSecurityDashboard.i18n.pageDescriptionHelpLink, + }); + }); + }); + describe('scan warnings', () => { describe('with warnings', () => { describe('with purged scans', () => { diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 5311e9edbdcbb7ee6e2499c47105c5a788bdf5f5..77a9daca219a184a65983a062d414193e6c3378c 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -34293,6 +34293,9 @@ msgstr "" msgid "SecurityReports|Report has expired" msgstr "" +msgid "SecurityReports|Results show vulnerabilities introduced by the merge request, in addition to existing vulnerabilities from the latest successful pipeline in your project's default branch." +msgstr "" + msgid "SecurityReports|Scan details" msgstr ""