Skip to content

Commit dee73a4

Browse files
authored
Fix UI bugs (#20364)
Signed-off-by: xuelichao <[email protected]>
1 parent c791b39 commit dee73a4

File tree

22 files changed

+110
-83
lines changed

22 files changed

+110
-83
lines changed

src/portal/src/app/base/left-side-nav/system-robot-accounts/system-robot-util.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ export const ACTION_RESOURCE_I18N_MAP = {
7878
log: 'ROBOT_ACCOUNT.LOG',
7979
'notification-policy': 'ROBOT_ACCOUNT.NOTIFICATION_POLICY',
8080
quota: 'ROBOT_ACCOUNT.QUOTA',
81+
sbom: 'ROBOT_ACCOUNT.SBOM',
8182
};
8283

8384
export function convertKey(key: string) {

src/portal/src/app/base/project/repository/artifact/artifact-additions/artifact-additions.component.html

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,27 +13,32 @@ <h4 class="margin-bottom-025">{{ 'ARTIFACT.ADDITIONS' | translate }}</h4>
1313
[clrIfActive]="currentTabLinkId === 'vulnerability'">
1414
<clr-tab-content id="vulnerability-content">
1515
<hbr-artifact-vulnerabilities
16+
*ngIf="currentTabLinkId === 'vulnerability'"
1617
[artifact]="artifact"
1718
[projectName]="projectName"
1819
[projectId]="projectId"
1920
[repoName]="repoName"
21+
[scanBtnState]="getScanBtnState()"
22+
[hasEnabledScanner]="hasEnabledScanner()"
2023
[digest]="digest"
2124
[vulnerabilitiesLink]="
2225
getVulnerability()
2326
"></hbr-artifact-vulnerabilities>
2427
</clr-tab-content>
2528
</ng-template>
2629
</clr-tab>
27-
<clr-tab *ngIf="getSbom()">
30+
<clr-tab *ngIf="hasScannerSupportSBOM()">
2831
<button clrTabLink id="sbom" (click)="actionTab('sbom')">
2932
{{ 'REPOSITORY.SBOM' | translate }}
3033
</button>
3134
<ng-template [clrIfActive]="currentTabLinkId === 'sbom'">
3235
<clr-tab-content id="sbom-content">
3336
<hbr-artifact-sbom
37+
*ngIf="currentTabLinkId === 'sbom'"
3438
[artifact]="artifact"
3539
[projectName]="projectName"
3640
[projectId]="projectId"
41+
[hasScannerSupportSBOM]="hasScannerSupportSBOM()"
3742
[repoName]="repoName"
3843
[sbomDigest]="sbomDigest"></hbr-artifact-sbom>
3944
</clr-tab-content>
@@ -50,6 +55,7 @@ <h4 class="margin-bottom-025">{{ 'ARTIFACT.ADDITIONS' | translate }}</h4>
5055
[clrIfActive]="currentTabLinkId === 'build-history'">
5156
<clr-tab-content>
5257
<hbr-artifact-build-history
58+
*ngIf="currentTabLinkId === 'build-history'"
5359
[buildHistoryLink]="
5460
getBuildHistory()
5561
"></hbr-artifact-build-history>
@@ -67,6 +73,7 @@ <h4 class="margin-bottom-025">{{ 'ARTIFACT.ADDITIONS' | translate }}</h4>
6773
[clrIfActive]="currentTabLinkId === 'summary-link'">
6874
<clr-tab-content id="summary-content">
6975
<hbr-artifact-summary
76+
*ngIf="currentTabLinkId === 'summary-link'"
7077
[summaryLink]="getSummary()"></hbr-artifact-summary>
7178
</clr-tab-content>
7279
</ng-template>
@@ -81,6 +88,7 @@ <h4 class="margin-bottom-025">{{ 'ARTIFACT.ADDITIONS' | translate }}</h4>
8188
<ng-template [clrIfActive]="currentTabLinkId === 'depend-link'">
8289
<clr-tab-content id="depend-content">
8390
<hbr-artifact-dependencies
91+
*ngIf="currentTabLinkId === 'depend-link'"
8492
[dependenciesLink]="
8593
getDependencies()
8694
"></hbr-artifact-dependencies>
@@ -97,6 +105,7 @@ <h4 class="margin-bottom-025">{{ 'ARTIFACT.ADDITIONS' | translate }}</h4>
97105
<ng-template [clrIfActive]="currentTabLinkId === 'value-link'">
98106
<clr-tab-content id="value-content">
99107
<hbr-artifact-values
108+
*ngIf="currentTabLinkId === 'value-link'"
100109
[valuesLink]="getValues()"></hbr-artifact-values>
101110
</clr-tab-content>
102111
</ng-template>

src/portal/src/app/base/project/repository/artifact/artifact-additions/artifact-additions.component.spec.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import { AdditionLinks } from '../../../../../../../ng-swagger-gen/models/additi
44
import { CURRENT_BASE_HREF } from '../../../../../shared/units/utils';
55
import { SharedTestingModule } from '../../../../../shared/shared.module';
66
import { NO_ERRORS_SCHEMA } from '@angular/core';
7+
import { ArtifactListPageService } from '../artifact-list-page/artifact-list-page.service';
8+
import { ClrLoadingState } from '@clr/angular';
79

810
describe('ArtifactAdditionsComponent', () => {
911
const mockedAdditionLinks: AdditionLinks = {
@@ -12,6 +14,18 @@ describe('ArtifactAdditionsComponent', () => {
1214
href: CURRENT_BASE_HREF + '/test',
1315
},
1416
};
17+
const mockedArtifactListPageService = {
18+
hasScannerSupportSBOM(): boolean {
19+
return true;
20+
},
21+
hasEnabledScanner(): boolean {
22+
return true;
23+
},
24+
getScanBtnState(): ClrLoadingState {
25+
return ClrLoadingState.SUCCESS;
26+
},
27+
init() {},
28+
};
1529
let component: ArtifactAdditionsComponent;
1630
let fixture: ComponentFixture<ArtifactAdditionsComponent>;
1731

@@ -20,13 +34,20 @@ describe('ArtifactAdditionsComponent', () => {
2034
imports: [SharedTestingModule],
2135
declarations: [ArtifactAdditionsComponent],
2236
schemas: [NO_ERRORS_SCHEMA],
37+
providers: [
38+
{
39+
provide: ArtifactListPageService,
40+
useValue: mockedArtifactListPageService,
41+
},
42+
],
2343
}).compileComponents();
2444
});
2545

2646
beforeEach(() => {
2747
fixture = TestBed.createComponent(ArtifactAdditionsComponent);
2848
component = fixture.componentInstance;
2949
component.additionLinks = mockedAdditionLinks;
50+
component.tab = 'vulnerability';
3051
fixture.detectChanges();
3152
});
3253

src/portal/src/app/base/project/repository/artifact/artifact-additions/artifact-additions.component.ts

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import { ADDITIONS } from './models';
1010
import { AdditionLinks } from '../../../../../../../ng-swagger-gen/models/addition-links';
1111
import { AdditionLink } from '../../../../../../../ng-swagger-gen/models/addition-link';
1212
import { Artifact } from '../../../../../../../ng-swagger-gen/models/artifact';
13-
import { ClrTabs } from '@clr/angular';
13+
import { ClrLoadingState, ClrTabs } from '@clr/angular';
14+
import { ArtifactListPageService } from '../artifact-list-page/artifact-list-page.service';
1415

1516
@Component({
1617
selector: 'artifact-additions',
@@ -32,14 +33,21 @@ export class ArtifactAdditionsComponent implements AfterViewChecked, OnInit {
3233
@Input()
3334
tab: string;
3435

35-
@Input() currentTabLinkId: string = 'vulnerability';
36+
@Input() currentTabLinkId: string = '';
3637
activeTab: string = null;
3738

3839
@ViewChild('additionsTab') tabs: ClrTabs;
39-
constructor(private ref: ChangeDetectorRef) {}
40+
constructor(
41+
private ref: ChangeDetectorRef,
42+
private artifactListPageService: ArtifactListPageService
43+
) {}
4044

4145
ngOnInit(): void {
4246
this.activeTab = this.tab;
47+
if (!this.activeTab) {
48+
this.currentTabLinkId = 'vulnerability';
49+
}
50+
this.artifactListPageService.init(this.projectId);
4351
}
4452

4553
ngAfterViewChecked() {
@@ -50,6 +58,10 @@ export class ArtifactAdditionsComponent implements AfterViewChecked, OnInit {
5058
this.ref.detectChanges();
5159
}
5260

61+
hasScannerSupportSBOM(): boolean {
62+
return this.artifactListPageService.hasScannerSupportSBOM();
63+
}
64+
5365
getVulnerability(): AdditionLink {
5466
if (
5567
this.additionLinks &&
@@ -59,12 +71,7 @@ export class ArtifactAdditionsComponent implements AfterViewChecked, OnInit {
5971
}
6072
return null;
6173
}
62-
getSbom(): AdditionLink {
63-
if (this.additionLinks && this.additionLinks[ADDITIONS.SBOMS]) {
64-
return this.additionLinks[ADDITIONS.SBOMS];
65-
}
66-
return {};
67-
}
74+
6875
getBuildHistory(): AdditionLink {
6976
if (this.additionLinks && this.additionLinks[ADDITIONS.BUILD_HISTORY]) {
7077
return this.additionLinks[ADDITIONS.BUILD_HISTORY];
@@ -93,4 +100,12 @@ export class ArtifactAdditionsComponent implements AfterViewChecked, OnInit {
93100
actionTab(tab: string): void {
94101
this.currentTabLinkId = tab;
95102
}
103+
104+
getScanBtnState(): ClrLoadingState {
105+
return this.artifactListPageService.getScanBtnState();
106+
}
107+
108+
hasEnabledScanner(): boolean {
109+
return this.artifactListPageService.hasEnabledScanner();
110+
}
96111
}

src/portal/src/app/base/project/repository/artifact/artifact-additions/artifact-sbom/artifact-sbom.component.html

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,18 @@
3232
</div>
3333
</div>
3434
</clr-dg-action-bar>
35-
<clr-dg-column [clrDgField]="'package'" class="package-medium">{{
36-
'SBOM.GRID.COLUMN_PACKAGE' | translate
37-
}}</clr-dg-column>
38-
<clr-dg-column [clrDgField]="'version'" class="version-medium">{{
39-
'SBOM.GRID.COLUMN_VERSION' | translate
40-
}}</clr-dg-column>
35+
<clr-dg-column
36+
[clrDgSortBy]="'name'"
37+
[clrDgField]="'name'"
38+
class="package-medium"
39+
>{{ 'SBOM.GRID.COLUMN_PACKAGE' | translate }}</clr-dg-column
40+
>
41+
<clr-dg-column
42+
[clrDgSortBy]="'versionInfo'"
43+
[clrDgField]="'versionInfo'"
44+
class="version-medium"
45+
>{{ 'SBOM.GRID.COLUMN_VERSION' | translate }}</clr-dg-column
46+
>
4147
<clr-dg-column>{{
4248
'SBOM.GRID.COLUMN_LICENSE' | translate
4349
}}</clr-dg-column>

src/portal/src/app/base/project/repository/artifact/artifact-additions/artifact-sbom/artifact-sbom.component.spec.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import {
1010
} from '@ngx-translate/core';
1111
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
1212
import { UserPermissionService } from '../../../../../../shared/services';
13-
import { AdditionLink } from '../../../../../../../../ng-swagger-gen/models/addition-link';
1413
import { ErrorHandler } from '../../../../../../shared/units/error-handler';
1514
import { SessionService } from '../../../../../../shared/services/session.service';
1615
import { SessionUser } from '../../../../../../shared/entities/session-user';

src/portal/src/app/base/project/repository/artifact/artifact-additions/artifact-sbom/artifact-sbom.component.ts

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
1-
import {
2-
AfterViewInit,
3-
Component,
4-
Input,
5-
OnDestroy,
6-
OnInit,
7-
} from '@angular/core';
1+
import { Component, Input, OnDestroy, OnInit } from '@angular/core';
82
import { ClrDatagridStateInterface, ClrLoadingState } from '@clr/angular';
93
import { finalize } from 'rxjs/operators';
10-
import { AdditionLink } from '../../../../../../../../ng-swagger-gen/models/addition-link';
114
import {
125
ScannerVo,
136
UserPermissionService,
@@ -30,16 +23,14 @@ import {
3023
HarborEvent,
3124
} from '../../../../../../services/event-service/event.service';
3225
import { severityText } from '../../../../../left-side-nav/interrogation-services/vulnerability-database/security-hub.interface';
33-
import { AppConfigService } from 'src/app/services/app-config.service';
3426

3527
import {
3628
ArtifactSbom,
3729
ArtifactSbomPackageItem,
3830
getArtifactSbom,
3931
} from '../../artifact';
4032
import { ArtifactService } from 'ng-swagger-gen/services';
41-
import { ScanTypes } from 'src/app/shared/entities/shared.const';
42-
import { ArtifactListPageService } from '../../artifact-list-page/artifact-list-page.service';
33+
import { ScanTypes } from '../../../../../../shared/entities/shared.const';
4334

4435
@Component({
4536
selector: 'hbr-artifact-sbom',
@@ -56,13 +47,12 @@ export class ArtifactSbomComponent implements OnInit, OnDestroy {
5647
@Input()
5748
sbomDigest: string;
5849
@Input() artifact: Artifact;
50+
@Input() hasScannerSupportSBOM: boolean = false;
5951

6052
artifactSbom: ArtifactSbom;
6153
loading: boolean = false;
62-
hasScannerSupportSBOM: boolean = false;
6354
downloadSbomBtnState: ClrLoadingState = ClrLoadingState.DEFAULT;
6455
hasSbomPermission: boolean = false;
65-
6656
hasShowLoading: boolean = false;
6757
sub: Subscription;
6858
hasViewInitWithDelay: boolean = false;
@@ -73,16 +63,13 @@ export class ArtifactSbomComponent implements OnInit, OnDestroy {
7363
readonly severityText = severityText;
7464
constructor(
7565
private errorHandler: ErrorHandler,
76-
private appConfigService: AppConfigService,
7766
private artifactService: ArtifactService,
78-
private artifactListPageService: ArtifactListPageService,
7967
private userPermissionService: UserPermissionService,
8068
private eventService: EventService,
8169
private session: SessionService
8270
) {}
8371

8472
ngOnInit() {
85-
this.artifactListPageService.init(this.projectId);
8673
this.getSbom();
8774
this.getSbomPermission();
8875
if (!this.sub) {
@@ -222,8 +209,6 @@ export class ArtifactSbomComponent implements OnInit, OnDestroy {
222209
}
223210

224211
canDownloadSbom(): boolean {
225-
this.hasScannerSupportSBOM =
226-
this.artifactListPageService.hasScannerSupportSBOM();
227212
return (
228213
this.hasScannerSupportSBOM &&
229214
//this.hasSbomPermission &&
@@ -234,7 +219,12 @@ export class ArtifactSbomComponent implements OnInit, OnDestroy {
234219
}
235220

236221
artifactSbomPackages(): ArtifactSbomPackageItem[] {
237-
return this.artifactSbom?.sbomPackage?.packages ?? [];
222+
return (
223+
this.artifactSbom?.sbomPackage?.packages?.filter(
224+
item =>
225+
item?.name || item?.versionInfo || item?.licenseConcluded
226+
) ?? []
227+
);
238228
}
239229

240230
load(state: ClrDatagridStateInterface) {

src/portal/src/app/base/project/repository/artifact/artifact-additions/artifact-vulnerabilities/artifact-vulnerabilities.component.ts

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,13 @@ export class ArtifactVulnerabilitiesComponent implements OnInit, OnDestroy {
5050
@Input()
5151
digest: string;
5252
@Input() artifact: Artifact;
53+
@Input() scanBtnState: ClrLoadingState = ClrLoadingState.DEFAULT;
54+
@Input() hasEnabledScanner: boolean = false;
5355
scan_overview: any;
5456
scanner: ScannerVo;
55-
projectScanner: ScannerVo;
5657

5758
scanningResults: VulnerabilityItem[] = [];
5859
loading: boolean = false;
59-
hasEnabledScanner: boolean = false;
60-
scanBtnState: ClrLoadingState = ClrLoadingState.DEFAULT;
6160
severitySort: ClrDatagridComparatorInterface<VulnerabilityItem>;
6261
cvssSort: ClrDatagridComparatorInterface<VulnerabilityItem>;
6362
hasScanningPermission: boolean = false;
@@ -112,7 +111,6 @@ export class ArtifactVulnerabilitiesComponent implements OnInit, OnDestroy {
112111
ngOnInit() {
113112
this.getVulnerabilities();
114113
this.getScanningPermission();
115-
this.getProjectScanner();
116114
if (!this.sub) {
117115
this.sub = this.eventService.subscribe(
118116
HarborEvent.UPDATE_VULNERABILITY_INFO,
@@ -203,30 +201,6 @@ export class ArtifactVulnerabilitiesComponent implements OnInit, OnDestroy {
203201
);
204202
}
205203

206-
getProjectScanner(): void {
207-
this.hasEnabledScanner = false;
208-
this.scanBtnState = ClrLoadingState.LOADING;
209-
this.scanningService.getProjectScanner(this.projectId).subscribe(
210-
response => {
211-
if (
212-
response &&
213-
'{}' !== JSON.stringify(response) &&
214-
!response.disabled &&
215-
response.health === 'healthy'
216-
) {
217-
this.scanBtnState = ClrLoadingState.SUCCESS;
218-
this.hasEnabledScanner = true;
219-
} else {
220-
this.scanBtnState = ClrLoadingState.ERROR;
221-
}
222-
this.projectScanner = response;
223-
},
224-
error => {
225-
this.scanBtnState = ClrLoadingState.ERROR;
226-
}
227-
);
228-
}
229-
230204
getLevel(v: VulnerabilityItem): number {
231205
if (v && v.severity && SEVERITY_LEVEL_MAP[v.severity]) {
232206
return SEVERITY_LEVEL_MAP[v.severity];

src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.html

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,6 @@
6565
class="action-dropdown"
6666
clrPosition="bottom-left"
6767
*clrIfOpen>
68-
<div
69-
class="dropdown-divider"
70-
role="separator"
71-
aria-hidden="true"></div>
7268
<button
7369
clrDropdownItem
7470
id="stop-scan"

src/portal/src/app/base/project/repository/artifact/artifact-list-page/artifact-list/artifact-list-tab/artifact-list-tab.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1099,7 +1099,7 @@ export class ArtifactListTabComponent implements OnInit, OnDestroy {
10991099
res?.filter(
11001100
item =>
11011101
item.type === AccessoryType.SBOM
1102-
)?.[0]?.digest ?? null;
1102+
)?.[0]?.digest ?? undefined;
11031103
}
11041104
},
11051105
error: err => {

0 commit comments

Comments
 (0)