-
+
{{t 'description'}}
@@ -101,21 +102,12 @@
- {{#if @analysis.isRisky}}
+ {{#if (or @analysis.isRisky @analysis.isOverriddenAsPassed)}}
{{#if (and (eq @analysis.cvssVersion 3) @analysis.cvssVector)}}
-
-
- {{t 'cvss'}}
-
-
+
-
-
-
-
- {{t 'cvssMetrics'}}
-
+
+
+ {{t 'cvssMetrics'}}
+
-
- <:label as |metric|>
-
- {{metric.key}}
-
-
+
+ <:label as |metric|>
+
+ {{metric.key}}
+
+
- <:value as |metric|>
-
- {{metric.value}}
-
-
-
-
-
+ <:value as |metric|>
+
+ {{metric.value}}
+
+
+
+
{{/if}}
{{t 'vulnerability'}}
@@ -203,7 +196,10 @@
@direction='column'
@spacing='1.5'
>
-
+
{{t 'compliantSolution'}}
@@ -225,7 +221,7 @@
>
{{t 'nonCompliantCodeExample'}}
@@ -242,21 +238,25 @@
{{#if this.hasRegulatoryContent}}
{{t 'regulatory'}}
{{#each this.regulatoryContent as |rc|}}
{{#if rc.hasContent}}
-
+
-
- {{#if (not-eq rc this.regulatoryContent.lastObject)}}
-
- {{/if}}
{{/if}}
{{/each}}
@@ -294,7 +290,7 @@
>
{{t 'businessImplication'}}
@@ -314,7 +310,7 @@
{{t 'attachments'}}
@@ -325,5 +321,5 @@
{{/each}}
{{/if}}
-
+
\ No newline at end of file
diff --git a/app/components/file-details/vulnerability-analysis-details/index.scss b/app/components/file-details/vulnerability-analysis-details/index.scss
index 98c52f0756..16b3c76538 100644
--- a/app/components/file-details/vulnerability-analysis-details/index.scss
+++ b/app/components/file-details/vulnerability-analysis-details/index.scss
@@ -1,27 +1,99 @@
.analysis-details-root {
+ min-height: calc(100vh - 56px);
margin: -0.5em;
+ background-color: var(
+ --file-details-vulnerability-analysis-details-background-light
+ );
.analysis-details-header {
background-color: var(
--file-details-vulnerability-analysis-details-background-main
);
+
box-shadow: var(
--file-details-vulnerability-analysis-details-header-box-shadow
);
- padding: 1.5em;
+
+ padding: 1.75em 1.5em;
box-sizing: border-box;
position: sticky;
top: -0.5em;
+
z-index: calc(
var(--file-details-vulnerability-analysis-details-zIndex) - 1
);
}
- .analysis-section:not(:last-child) {
+ .analysis-details-header-container,
+ .analysis-details-body-container {
+ width: 80%;
+ max-width: 960px;
+ margin: 0 auto;
+ }
+
+ .analysis-details-body-container {
+ background-color: var(
+ --file-details-vulnerability-analysis-details-background-main
+ );
+
+ border-radius: var(
+ --file-details-vulnerability-analysis-details-border-radius
+ );
+
+ border: 1px solid
+ var(--file-details-vulnerability-analysis-details-border-color);
+
+ margin: 1.5em auto;
+
+ &.analysis-overridded-passed {
+ background-color: var(
+ --file-details-vulnerability-analysis-details-marked-passed-background-color
+ );
+
+ .vulnerabiliy-finding-container {
+ background-color: var(
+ --file-details-vulnerability-analysis-details-marked-passed-code-background-color
+ );
+
+ border: 1px solid
+ var(--file-details-vulnerability-analysis-details-border-color);
+ }
+
+ .analysis-static-content {
+ pre code {
+ background-color: var(
+ --file-details-vulnerability-analysis-details-marked-passed-code-background-color
+ );
+
+ border: 1px solid
+ var(--file-details-vulnerability-analysis-details-border-color);
+ }
+ }
+ }
+ }
+
+ .analysis-section {
width: 100%;
- padding-bottom: 1.5em;
- border-bottom: 1px solid
- var(--file-details-vulnerability-analysis-details-divider-color);
+ padding: 1.5em;
+
+ &:not(:last-child) {
+ border-bottom: 1px solid
+ var(--file-details-vulnerability-analysis-details-divider-color);
+ }
+
+ &.analysis-regulatory-section {
+ padding: 0em;
+
+ .analysis-regulatory-content {
+ width: 100%;
+ padding: 0em 1.5em 1em;
+
+ &:not(:last-child) {
+ border-bottom: 1px solid
+ var(--file-details-vulnerability-analysis-details-divider-color);
+ }
+ }
+ }
}
.analysis-content {
@@ -54,6 +126,27 @@
margin: 0.25em 1em;
}
}
+
+ pre {
+ background-color: unset;
+
+ code {
+ width: 600px;
+ max-height: 400px;
+ overflow: auto;
+ margin: 0.5em 0;
+ font-size: 1rem;
+ background-color: var(
+ --file-details-vulnerability-analysis-details-code-background-color
+ );
+ color: var(
+ --file-details-vulnerability-analysis-details-code-text-color
+ );
+ border-radius: var(
+ --file-details-vulnerability-analysis-details-border-radius
+ );
+ }
+ }
}
.analysis-content-title {
@@ -69,26 +162,19 @@
max-width: 600px;
width: 100%;
max-height: 300px;
- overflow: scroll;
+ overflow: auto;
text-overflow: clip;
padding: 1em 0.75em;
margin: 1em 0 1em;
background-color: var(
- --file-details-vulnerability-analysis-details-vul-finding-background-color
+ --file-details-vulnerability-analysis-details-code-background-color
);
- border: 1px solid
- var(
- --file-details-vulnerability-analysis-details-vul-finding-border-color
- );
border-radius: var(
--file-details-vulnerability-analysis-details-border-radius
);
.vulnerabiliy-finding-description {
background-color: unset;
- font-family: var(
- --file-details-vulnerability-analysis-details-vul-finding-font-family
- );
color: var(--file-details-vulnerability-analysis-details-color-primary);
white-space: pre-line;
width: max-content;
diff --git a/app/components/file-details/vulnerability-analysis-details/index.ts b/app/components/file-details/vulnerability-analysis-details/index.ts
index 460094270e..35a19be377 100644
--- a/app/components/file-details/vulnerability-analysis-details/index.ts
+++ b/app/components/file-details/vulnerability-analysis-details/index.ts
@@ -9,7 +9,6 @@ import AnalysisModel from 'irene/models/analysis';
export interface FileDetailsVulnerabilityAnalysisDetailsSignature {
Args: {
analysis: AnalysisModel;
- showHeader?: boolean;
};
}
@@ -170,7 +169,7 @@ export default class FileDetailsVulnerabilityAnalysisDetailsComponent extends Co
return htmlSafe(this.vulnerability.get?.('question') || '');
}
- if (this.analysis.isRisky) {
+ if (this.analysis.isRisky || this.analysis.isOverriddenAsPassed) {
return this.vulnerability.get?.('descriptionUnescapedd');
}
diff --git a/app/components/file-details/vulnerability-analysis/index.hbs b/app/components/file-details/vulnerability-analysis/index.hbs
index 99449ec3cd..791aada01f 100644
--- a/app/components/file-details/vulnerability-analysis/index.hbs
+++ b/app/components/file-details/vulnerability-analysis/index.hbs
@@ -89,6 +89,7 @@
data-test-vulnerability-analysis-thead
@sorts={{this.analysesSorts}}
@onUpdateSorts={{this.updateAnalysesSorts}}
+ @sortFunction={{this.handleAnalysesSortComparison}}
@columns={{this.columns}}
as |h|
>
diff --git a/app/components/file-details/vulnerability-analysis/index.ts b/app/components/file-details/vulnerability-analysis/index.ts
index 568bfb9ea8..5367b41a7b 100644
--- a/app/components/file-details/vulnerability-analysis/index.ts
+++ b/app/components/file-details/vulnerability-analysis/index.ts
@@ -133,6 +133,27 @@ export default class FileDetailsVulnerabilityAnalysisComponent extends Component
this.analysesSorts = sorts;
}
+ @action
+ handleAnalysesSortComparison(
+ a: AnalysisModel,
+ b: AnalysisModel,
+ sorts: EmberTableSort[]
+ ) {
+ const isAscending = sorts[0]?.isAscending ?? false; // default is desc
+
+ if (a.isOverriddenAsPassed && b.isRiskPassedBySystem) {
+ return isAscending ? 1 : -1;
+ }
+
+ if (b.isOverriddenAsPassed && a.isRiskPassedBySystem) {
+ return isAscending ? -1 : 1;
+ }
+
+ return isAscending
+ ? a.computedRisk - b.computedRisk
+ : b.computedRisk - a.computedRisk;
+ }
+
@action
handleAnalysisClick({
rowValue,
diff --git a/app/components/project-settings/analysis-settings/vulnerability-details/index.hbs b/app/components/project-settings/analysis-settings/vulnerability-details/index.hbs
deleted file mode 100644
index c9ef361b62..0000000000
--- a/app/components/project-settings/analysis-settings/vulnerability-details/index.hbs
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-
-
-
- {{this.vulnerabilityDetails.name}}
-
-
- {{#if (and this.riskOverridden (not this.isEditing))}}
-
-
- {{else}}
-
- {{t (risk-text aks.value)}}
-
- {{/if}}
-
-
-{{#if this.isExpanded}}
-
-
- {{t 'comments'}}
-
-
- {{#if this.isEditing}}
-
-
-
-
- {{t 'save'}}
-
-
-
- {{t 'cancel'}}
-
-
-
- {{else}}
-
-
- {{#if this.vulnerability.comment}}
- {{this.vulnerability.comment}}
- {{else}}
- {{t 'none'}}
- {{/if}}
-
-
-
-
- {{t 'edit'}}
-
-
-
-
- {{t 'reset'}}
-
-
-
-
- {{/if}}
-
-{{/if}}
\ No newline at end of file
diff --git a/app/components/project-settings/analysis-settings/vulnerability-details/index.scss b/app/components/project-settings/analysis-settings/vulnerability-details/index.scss
deleted file mode 100644
index 83273e78f7..0000000000
--- a/app/components/project-settings/analysis-settings/vulnerability-details/index.scss
+++ /dev/null
@@ -1,23 +0,0 @@
-.vulnerability-details-container {
- height: 62px;
- border-bottom: 1px solid
- var(--project-settings-analysis-settings-vulnerability-details-border-color);
- color: var(--text-primary);
-}
-
-.edit-details-container {
- border-bottom: 1px solid
- var(--project-settings-analysis-settings-vulnerability-details-border-color);
-}
-
-.comment-textarea {
- width: 100%;
- border-color: var(
- --project-settings-analysis-settings-vulnerability-details-border-color
- );
- border-radius: var(
- --project-settings-analysis-settings-vulnerability-details-border-radius
- );
- padding: 1em;
- margin-bottom: 1em;
-}
diff --git a/app/components/project-settings/analysis-settings/vulnerability-details/index.ts b/app/components/project-settings/analysis-settings/vulnerability-details/index.ts
deleted file mode 100644
index 6a3de5e841..0000000000
--- a/app/components/project-settings/analysis-settings/vulnerability-details/index.ts
+++ /dev/null
@@ -1,191 +0,0 @@
-import { action } from '@ember/object';
-import { inject as service } from '@ember/service';
-import Component from '@glimmer/component';
-import { tracked } from '@glimmer/tracking';
-import { task } from 'ember-concurrency';
-import IntlService from 'ember-intl/services/intl';
-import Store from '@ember-data/store';
-
-import ENUMS from 'irene/enums';
-import ENV from 'irene/config/environment';
-import ProjectModel from 'irene/models/project';
-import VulnerabilityPreferenceModel from 'irene/models/vulnerability-preference';
-import parseError from 'irene/utils/parse-error';
-
-interface ProjectSettingsAnalysisSettingsVulnerabilityDetailsSignature {
- Args: {
- project: ProjectModel | null;
- vulnerability: VulnerabilityPreferenceModel | null;
- };
-}
-
-export default class ProjectSettingsAnalysisSettingsVulnerabilityDetailsComponent extends Component {
- @service declare intl: IntlService;
- @service declare ajax: any;
- @service declare store: Store;
- @service('notifications') declare notify: NotificationService;
-
- @tracked isEditing = false;
- @tracked isExpanded = false;
- @tracked selectedRisk: number | null = null;
- @tracked vulnerabilityRisk = this.defaultVulnerabilityRisk;
- @tracked riskOverridden = this.defaultRiskOverridden;
- @tracked editedComment = '';
-
- get vulnerability() {
- return this.args.vulnerability;
- }
-
- get project() {
- return this.args.project;
- }
-
- get defaultVulnerabilityRisk() {
- return this.vulnerability?.risk;
- }
-
- get selectedRiskKey() {
- return this.risks.find((obj) => {
- if (this.selectedRisk) {
- return obj.value === this.selectedRisk;
- }
-
- return obj.value === this.vulnerabilityRisk;
- });
- }
-
- get vulnerabilityDetails() {
- return this.vulnerability
- ? this.store.peekRecord('vulnerability', this.vulnerability.id)
- : null;
- }
-
- get risks() {
- const risks = ENUMS.RISK.CHOICES;
- const riskFilter = [ENUMS.RISK.NONE, ENUMS.RISK.UNKNOWN];
-
- return risks.filter((risk) => !riskFilter.includes(risk.value as number));
- }
-
- get defaultRiskOverridden() {
- return this.vulnerability?.riskOverridden;
- }
-
- updateVulnerabilityProperties(
- data: { risk: number | null; comment: string | null },
- type: string
- ) {
- if (this.vulnerability) {
- if (type === 'mark') {
- this.riskOverridden = true;
- } else {
- this.isEditing = false;
- this.riskOverridden = false;
- }
-
- this.vulnerability.risk = data.risk as number;
- this.vulnerabilityRisk = data.risk as number;
- this.vulnerability.comment = data.comment as string;
- }
- }
-
- @action selectPreference(risk: { key: string; value: number }) {
- this.isEditing = true;
- this.selectedRisk = parseInt(String(risk.value));
- this.isExpanded = true;
- }
-
- @action savePreference() {
- const risk = this.selectedRisk || this.vulnerabilityRisk;
- const comment = this.editedComment;
- const tRiskAndCommentRequired = this.intl.t('riskAndCommentRequired');
-
- if (!risk || !comment) {
- this.notify.error(tRiskAndCommentRequired);
- return;
- }
-
- const type = 'mark';
- const data = { risk, comment };
-
- this.saveVulnerabilityPreferences.perform(data, type);
- }
-
- @action editPreference() {
- this.isEditing = true;
- }
-
- @action expandCollapse() {
- if (this.selectedRiskKey) {
- this.isExpanded = !this.isExpanded;
-
- if (this.isExpanded) {
- if (this.riskOverridden) {
- this.editedComment = this.vulnerability?.comment || '';
- } else {
- this.isEditing = true;
- }
- }
- }
- }
-
- @action cancelEdit() {
- this.isEditing = false;
- this.isExpanded = false;
-
- if (!this.riskOverridden) {
- this.selectedRisk = null;
- }
- }
-
- @action resetPreference() {
- this.editedComment = '';
- this.selectedRisk = null;
-
- const type = 'reset';
-
- const data = {
- risk: null,
- comment: null,
- };
-
- this.saveVulnerabilityPreferences.perform(data, type);
- }
-
- saveVulnerabilityPreferences = task(
- async (
- data: { risk: number | null; comment: string | null },
- type: string
- ) => {
- const profileId = this.project?.activeProfileId;
- const vulnerabilityId = this.vulnerability?.id;
- const tSavedPreferences = this.intl.t('savedPreferences');
-
- const url = [
- ENV.endpoints['profiles'],
- profileId,
- ENV.endpoints['vulnerabilityPreferences'],
- vulnerabilityId,
- ].join('/');
-
- try {
- await this.ajax.put(url, { data });
- this.notify.success(tSavedPreferences);
-
- this.isEditing = false;
- this.updateVulnerabilityProperties(data, type);
-
- this.isExpanded = false;
- } catch (error) {
- this.notify.error(parseError(error));
- this.vulnerabilityRisk = this.vulnerability?.risk;
- }
- }
- );
-}
-
-declare module '@glint/environment-ember-loose/registry' {
- export default interface Registry {
- 'ProjectSettings::AnalysisSettings::VulnerabilityDetails': typeof ProjectSettingsAnalysisSettingsVulnerabilityDetailsComponent;
- }
-}
diff --git a/app/components/project-settings/analysis-settings/vulnerability-list/action/index.hbs b/app/components/project-settings/analysis-settings/vulnerability-list/action/index.hbs
new file mode 100644
index 0000000000..fa399180e8
--- /dev/null
+++ b/app/components/project-settings/analysis-settings/vulnerability-list/action/index.hbs
@@ -0,0 +1,17 @@
+
+ {{#if @vulnerabilityPreference.riskOverridden}}
+
+ {{else}}
+
+ {{/if}}
+
\ No newline at end of file
diff --git a/app/components/project-settings/analysis-settings/vulnerability-list/action/index.ts b/app/components/project-settings/analysis-settings/vulnerability-list/action/index.ts
new file mode 100644
index 0000000000..d018cf4b6d
--- /dev/null
+++ b/app/components/project-settings/analysis-settings/vulnerability-list/action/index.ts
@@ -0,0 +1,17 @@
+import Component from '@glimmer/component';
+import type VulnerabilityPreferenceModel from 'irene/models/vulnerability-preference';
+
+export interface ProjectSettingsAnalysisSettingsVulnerabilityListActionSignature {
+ Args: {
+ vulnerabilityPreference: VulnerabilityPreferenceModel;
+ setVulnerabilityDataModel: (vulPref: VulnerabilityPreferenceModel) => void;
+ };
+}
+
+export default class ProjectSettingsAnalysisSettingsVulnerabilityListActionComponent extends Component {}
+
+declare module '@glint/environment-ember-loose/registry' {
+ export default interface Registry {
+ 'project-settings/analysis-settings/vulnerability-list/action': typeof ProjectSettingsAnalysisSettingsVulnerabilityListActionComponent;
+ }
+}
diff --git a/app/components/project-settings/analysis-settings/vulnerability-list/index.hbs b/app/components/project-settings/analysis-settings/vulnerability-list/index.hbs
index dee8f03bc4..ccc4791bd3 100644
--- a/app/components/project-settings/analysis-settings/vulnerability-list/index.hbs
+++ b/app/components/project-settings/analysis-settings/vulnerability-list/index.hbs
@@ -38,44 +38,43 @@
-
-
- {{t 'vulnerability'}}
-
-
-
- {{t 'overrideRisk'}}
-
-
-
{{#if this.fetchVulnerabilityPreferences.isRunning}}
{{else}}
-
- {{#each this.vulnerabilityPreferences as |vulnerability|}}
-
- {{/each}}
-
+
+
+
+
+
+ {{#let (component r.columnValue.component) as |Component|}}
+
+ {{/let}}
+
+
+
+
+
+
{{/if}}
{{/if}}
\ No newline at end of file
diff --git a/app/components/project-settings/analysis-settings/vulnerability-list/index.ts b/app/components/project-settings/analysis-settings/vulnerability-list/index.ts
index 155306e279..3e0bfa091c 100644
--- a/app/components/project-settings/analysis-settings/vulnerability-list/index.ts
+++ b/app/components/project-settings/analysis-settings/vulnerability-list/index.ts
@@ -6,12 +6,15 @@ import { inject as service } from '@ember/service';
import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
import { task } from 'ember-concurrency';
-import MeService from 'irene/services/me';
import Store from '@ember-data/store';
+import IntlService from 'ember-intl/services/intl';
+
+import ENV from 'irene/config/environment';
+import ENUMS from 'irene/enums';
import ProjectModel from 'irene/models/project';
import VulnerabilityPreferenceModel from 'irene/models/vulnerability-preference';
+import MeService from 'irene/services/me';
import parseError from 'irene/utils/parse-error';
-import IntlService from 'ember-intl/services/intl';
type ProjectSettingsAnalysisSettingsVulnerabilityListQueryResponse =
DS.AdapterPopulatedRecordArray
& {
@@ -28,12 +31,16 @@ export default class ProjectSettingsAnalysisSettingsVulnerabilityListComponent e
@service declare me: MeService;
@service declare store: Store;
@service declare intl: IntlService;
+ @service declare ajax: any;
@service('notifications') declare notify: NotificationService;
@tracked
vulnerabilityListResponse: ProjectSettingsAnalysisSettingsVulnerabilityListQueryResponse | null =
null;
+ @tracked
+ selectedVulnerabilityPreference: VulnerabilityPreferenceModel | null = null;
+
constructor(
owner: unknown,
args: ProjectSettingsAnalysisSettingsVulnerabilityListSignature['Args']
@@ -43,6 +50,30 @@ export default class ProjectSettingsAnalysisSettingsVulnerabilityListComponent e
this.loadVulnerabilityPreferences();
}
+ get columns() {
+ return [
+ {
+ name: this.intl.t('vulnerability'),
+ component:
+ 'project-settings/analysis-settings/vulnerability-list/name' as const,
+ minWidth: 300,
+ },
+ {
+ name: this.intl.t('editOverrideVulnerability.overriddenSeverity'),
+ minWidth: 125,
+ textAlign: 'center',
+ component:
+ 'project-settings/analysis-settings/vulnerability-list/overridden-severity' as const,
+ },
+ {
+ name: this.intl.t('action'),
+ textAlign: 'center',
+ component:
+ 'project-settings/analysis-settings/vulnerability-list/action' as const,
+ },
+ ];
+ }
+
get project() {
return this.args.project;
}
@@ -51,10 +82,111 @@ export default class ProjectSettingsAnalysisSettingsVulnerabilityListComponent e
return this.vulnerabilityListResponse?.toArray() || [];
}
+ get vulnerability() {
+ return this.selectedVulnerabilityPreference
+ ? this.store.peekRecord(
+ 'vulnerability',
+ this.selectedVulnerabilityPreference.id
+ )
+ : null;
+ }
+
+ get overrideCriteriaOptions() {
+ return [
+ {
+ label: this.intl.t('allFutureAnalyses'),
+ value: ENUMS.ANALYSIS_OVERRIDE_CRITERIA.ALL_FUTURE_UPLOAD,
+ },
+ ];
+ }
+
+ get openOverrideEditDrawer() {
+ return Boolean(this.vulnerabilityDataModel);
+ }
+
+ get vulnerabilityDataModel() {
+ return this.selectedVulnerabilityPreference
+ ? {
+ model: this.selectedVulnerabilityPreference,
+ vulnerabilityName: this.vulnerability?.name || '',
+ computedRisk: this.selectedVulnerabilityPreference.risk,
+ isOverridden: this.selectedVulnerabilityPreference.riskOverridden,
+ overriddenRisk: this.selectedVulnerabilityPreference.risk,
+ overriddenRiskComment: this.selectedVulnerabilityPreference.comment,
+ overriddenBy: this.selectedVulnerabilityPreference.updatedBy,
+ overrideCriteria: ENUMS.ANALYSIS_OVERRIDE_CRITERIA.ALL_FUTURE_UPLOAD,
+ overrideCriteriaOptions: this.overrideCriteriaOptions,
+ overriddenOn: this.selectedVulnerabilityPreference.updatedDate,
+
+ ignoreVulnerabilityHelperText: this.intl.t(
+ 'projectSettings.vulnerabilityPreference.ignoreVulnerabilityHelperText'
+ ),
+
+ overrideSuccessMessage: this.intl.t(
+ 'projectSettings.vulnerabilityPreference.overrideSuccessMessage'
+ ),
+
+ resetConfirmComponent:
+ 'project-settings/analysis-settings/vulnerability-list/reset-confirm',
+
+ resetOverrideHandler: this.resetPreference,
+ editSaveOverrideHandler: this.savePreference,
+ }
+ : null;
+ }
+
+ @action
+ handleOverrideEditDrawerClose() {
+ this.selectedVulnerabilityPreference = null;
+ }
+
+ @action
+ setVulnerabilityDataModel(
+ vulnerabilityPreference: VulnerabilityPreferenceModel
+ ) {
+ this.selectedVulnerabilityPreference = vulnerabilityPreference;
+ }
+
@action loadVulnerabilityPreferences() {
this.fetchVulnerabilityPreferences.perform();
}
+ @action
+ async savePreference(risk: number, comment: string) {
+ const data = { risk, comment };
+
+ await this.saveVulnerabilityPreferences.perform(data);
+ }
+
+ @action
+ async resetPreference() {
+ const data = {
+ risk: null,
+ comment: null,
+ };
+
+ await this.saveVulnerabilityPreferences.perform(data);
+ }
+
+ saveVulnerabilityPreferences = task(
+ async (data: { risk: number | null; comment: string | null }) => {
+ const profileId = this.project?.activeProfileId;
+ const vulnerabilityId = this.vulnerability?.id;
+
+ const url = [
+ ENV.endpoints['profiles'],
+ profileId,
+ ENV.endpoints['vulnerabilityPreferences'],
+ vulnerabilityId,
+ ].join('/');
+
+ const res = await this.ajax.put(url, { data });
+
+ // update model
+ this.selectedVulnerabilityPreference?.updateValues(res);
+ }
+ );
+
fetchVulnerabilityPreferences = task(async () => {
try {
this.vulnerabilityListResponse = (await this.store.query(
diff --git a/app/components/project-settings/analysis-settings/vulnerability-list/name/index.hbs b/app/components/project-settings/analysis-settings/vulnerability-list/name/index.hbs
new file mode 100644
index 0000000000..e1a8e6680c
--- /dev/null
+++ b/app/components/project-settings/analysis-settings/vulnerability-list/name/index.hbs
@@ -0,0 +1,3 @@
+
+ {{this.vulnerabilityDetails.name}}
+
\ No newline at end of file
diff --git a/app/components/project-settings/analysis-settings/vulnerability-list/name/index.ts b/app/components/project-settings/analysis-settings/vulnerability-list/name/index.ts
new file mode 100644
index 0000000000..dba8d4c1e9
--- /dev/null
+++ b/app/components/project-settings/analysis-settings/vulnerability-list/name/index.ts
@@ -0,0 +1,28 @@
+import Component from '@glimmer/component';
+import { inject as service } from '@ember/service';
+import type Store from '@ember-data/store';
+
+import type VulnerabilityPreferenceModel from 'irene/models/vulnerability-preference';
+
+export interface ProjectSettingsAnalysisSettingsVulnerabilityListNameSignature {
+ Args: {
+ vulnerabilityPreference: VulnerabilityPreferenceModel;
+ };
+}
+
+export default class ProjectSettingsAnalysisSettingsVulnerabilityListNameComponent extends Component {
+ @service declare store: Store;
+
+ get vulnerabilityDetails() {
+ return this.store.peekRecord(
+ 'vulnerability',
+ this.args.vulnerabilityPreference.id
+ );
+ }
+}
+
+declare module '@glint/environment-ember-loose/registry' {
+ export default interface Registry {
+ 'project-settings/analysis-settings/vulnerability-list/name': typeof ProjectSettingsAnalysisSettingsVulnerabilityListNameComponent;
+ }
+}
diff --git a/app/components/project-settings/analysis-settings/vulnerability-list/overridden-severity/index.hbs b/app/components/project-settings/analysis-settings/vulnerability-list/overridden-severity/index.hbs
new file mode 100644
index 0000000000..f553e84a38
--- /dev/null
+++ b/app/components/project-settings/analysis-settings/vulnerability-list/overridden-severity/index.hbs
@@ -0,0 +1,8 @@
+{{#if @vulnerabilityPreference.riskOverridden}}
+
+{{/if}}
\ No newline at end of file
diff --git a/app/components/project-settings/analysis-settings/vulnerability-list/overridden-severity/index.ts b/app/components/project-settings/analysis-settings/vulnerability-list/overridden-severity/index.ts
new file mode 100644
index 0000000000..5896a1cbfa
--- /dev/null
+++ b/app/components/project-settings/analysis-settings/vulnerability-list/overridden-severity/index.ts
@@ -0,0 +1,16 @@
+import Component from '@glimmer/component';
+import type VulnerabilityPreferenceModel from 'irene/models/vulnerability-preference';
+
+export interface ProjectSettingsAnalysisSettingsVulnerabilityListOverriddenSeveritySignature {
+ Args: {
+ vulnerabilityPreference: VulnerabilityPreferenceModel;
+ };
+}
+
+export default class ProjectSettingsAnalysisSettingsVulnerabilityListOverriddenSeverityComponent extends Component {}
+
+declare module '@glint/environment-ember-loose/registry' {
+ export default interface Registry {
+ 'project-settings/analysis-settings/vulnerability-list/overridden-severity': typeof ProjectSettingsAnalysisSettingsVulnerabilityListOverriddenSeverityComponent;
+ }
+}
diff --git a/app/components/project-settings/analysis-settings/vulnerability-list/reset-confirm/index.hbs b/app/components/project-settings/analysis-settings/vulnerability-list/reset-confirm/index.hbs
new file mode 100644
index 0000000000..4fcc0168ad
--- /dev/null
+++ b/app/components/project-settings/analysis-settings/vulnerability-list/reset-confirm/index.hbs
@@ -0,0 +1,52 @@
+{{#if @isResetSuccess}}
+
+
+
+
+ {{t 'projectSettings.vulnerabilityPreference.resetSuccessMessage'}}
+
+
+{{else}}
+
+ {{t 'projectSettings.vulnerabilityPreference.resetConfirmTitle'}}
+
+
+
+
+
+ {{#each this.resetActionBtnDetails as |btn|}}
+
+ {{btn.label}}
+
+ {{/each}}
+
+{{/if}}
\ No newline at end of file
diff --git a/app/components/project-settings/analysis-settings/vulnerability-list/reset-confirm/index.scss b/app/components/project-settings/analysis-settings/vulnerability-list/reset-confirm/index.scss
new file mode 100644
index 0000000000..e3278df791
--- /dev/null
+++ b/app/components/project-settings/analysis-settings/vulnerability-list/reset-confirm/index.scss
@@ -0,0 +1,8 @@
+.reset-action-container {
+ background-color: var(
+ --project-settings-analysis-settings-vulnerability-list-reset-confirm-background-main
+ );
+ box-shadow: var(
+ --project-settings-analysis-settings-vulnerability-list-reset-confirm-action-box-shadow
+ );
+}
diff --git a/app/components/project-settings/analysis-settings/vulnerability-list/reset-confirm/index.ts b/app/components/project-settings/analysis-settings/vulnerability-list/reset-confirm/index.ts
new file mode 100644
index 0000000000..3947d77c76
--- /dev/null
+++ b/app/components/project-settings/analysis-settings/vulnerability-list/reset-confirm/index.ts
@@ -0,0 +1,40 @@
+import Component from '@glimmer/component';
+import { inject as service } from '@ember/service';
+import IntlService from 'ember-intl/services/intl';
+
+import { AnalysisRiskDataModel } from 'irene/components/analysis-risk/override-edit-drawer';
+
+export interface ProjectSettingsAnalysisSettingsVulnerabilityListResetConfirmSignature {
+ Args: {
+ dataModel: AnalysisRiskDataModel;
+ resetHandler: (all?: boolean) => void;
+ resetCancelHandler?: () => void;
+ isResetRunning: boolean;
+ isResetSuccess: boolean;
+ };
+}
+
+export default class ProjectSettingsAnalysisSettingsVulnerabilityListResetConfirmComponent extends Component {
+ @service declare intl: IntlService;
+
+ get resetActionBtnDetails() {
+ return [
+ {
+ label: this.intl.t('yes'),
+ action: () => this.args.resetHandler(false),
+ },
+ {
+ variant: 'outlined' as const,
+ label: this.intl.t('cancel'),
+ color: 'neutral' as const,
+ action: () => this.args.resetCancelHandler?.(),
+ },
+ ];
+ }
+}
+
+declare module '@glint/environment-ember-loose/registry' {
+ export default interface Registry {
+ 'project-settings/analysis-settings/vulnerability-list/reset-confirm': typeof ProjectSettingsAnalysisSettingsVulnerabilityListResetConfirmComponent;
+ }
+}
diff --git a/app/components/security/edit-analysis-details/index.hbs b/app/components/security/edit-analysis-details/index.hbs
index 1599f2d5d3..2cb7f6ddb2 100644
--- a/app/components/security/edit-analysis-details/index.hbs
+++ b/app/components/security/edit-analysis-details/index.hbs
@@ -516,85 +516,6 @@