diff --git a/src/portal/src/app/base/project/project-log/audit-legacy-log.component.html b/src/portal/src/app/base/project/project-log/audit-legacy-log.component.html
new file mode 100644
index 000000000..7239f2883
--- /dev/null
+++ b/src/portal/src/app/base/project/project-log/audit-legacy-log.component.html
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ 'AUDIT_LOG.USERNAME' | translate
+ }}
+ {{
+ 'AUDIT_LOG.RESOURCE' | translate
+ }}
+ {{
+ 'AUDIT_LOG.RESOURCE_TYPE' | translate
+ }}
+ {{
+ 'AUDIT_LOG.OPERATION' | translate
+ }}
+ {{
+ 'AUDIT_LOG.TIMESTAMP' | translate
+ }}
+
+ {{ l.username }}
+ {{ l.resource }}
+ {{ l.resource_type }}
+ {{ l.operation }}
+ {{
+ l.op_time | harborDatetime : 'short'
+ }}
+
+
+
+ {{
+ 'PAGINATION.PAGE_SIZE' | translate
+ }}
+ {{ pagination.firstItem + 1 }} -
+ {{ pagination.lastItem + 1 }}
+ {{ 'AUDIT_LOG.OF' | translate }}
+
+ {{ totalRecordCount }} {{ 'AUDIT_LOG.ITEMS' | translate }}
+
+
+
+
+
diff --git a/src/portal/src/app/base/project/project-log/audit-legacy-log.component.scss b/src/portal/src/app/base/project/project-log/audit-legacy-log.component.scss
new file mode 100644
index 000000000..a5c71143a
--- /dev/null
+++ b/src/portal/src/app/base/project/project-log/audit-legacy-log.component.scss
@@ -0,0 +1,47 @@
+
+
+.option-right {
+ padding-right: 16px;
+}
+
+.refresh-btn {
+ cursor: pointer;
+}
+
+.refresh-btn:hover {
+ color: #007CBB;
+}
+
+.row-right {
+ padding-right: 60px;
+}
+
+.log-top {
+ top: 12px;
+}
+
+.check-span {
+ display: inline-block;
+ width: 16px;
+}
+
+.display-f{
+ display: flex;
+}
+
+.reverse-row {
+ display: flex;
+ flex-direction: row-reverse;
+ align-items: baseline;
+}
+
+.flex-items-xs-right {
+ display: flex;
+ align-items: baseline;
+
+ ::ng-deep {
+ clr-date-container{
+ margin-top: 0;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/portal/src/app/base/project/project-log/audit-legacy-log.component.spec.ts b/src/portal/src/app/base/project/project-log/audit-legacy-log.component.spec.ts
new file mode 100644
index 000000000..b4e1a2bb7
--- /dev/null
+++ b/src/portal/src/app/base/project/project-log/audit-legacy-log.component.spec.ts
@@ -0,0 +1,182 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { ProjectAuditLegacyLogComponent } from './audit-legacy-log.component';
+import { MessageHandlerService } from '../../../shared/services/message-handler.service';
+import { ActivatedRoute, Router } from '@angular/router';
+import { of } from 'rxjs';
+import { CUSTOM_ELEMENTS_SCHEMA, DebugElement, LOCALE_ID } from '@angular/core';
+import { delay } from 'rxjs/operators';
+import { AuditLog } from '../../../../../ng-swagger-gen/models/audit-log';
+import { HttpHeaders, HttpResponse } from '@angular/common/http';
+import { ProjectService } from '../../../../../ng-swagger-gen/services/project.service';
+import { click } from '../../../shared/units/utils';
+import { SharedTestingModule } from '../../../shared/shared.module';
+import { registerLocaleData } from '@angular/common';
+import locale_en from '@angular/common/locales/en';
+import { DatePickerComponent } from '../../../shared/components/datetime-picker/datetime-picker.component';
+
+describe('ProjectAuditLegacyLogComponent', () => {
+ let component: ProjectAuditLegacyLogComponent;
+ let fixture: ComponentFixture
;
+ const mockMessageHandlerService = {
+ handleError: () => {},
+ };
+ const mockActivatedRoute = {
+ parent: {
+ parent: {
+ parent: {
+ snapshot: {
+ data: null,
+ },
+ },
+ },
+ },
+ snapshot: {
+ data: null,
+ },
+ data: of({
+ auditLogResolver: '',
+ }).pipe(delay(0)),
+ };
+ const mockRouter = null;
+ const mockedAuditLogs: AuditLog[] = [];
+ for (let i = 0; i < 18; i++) {
+ let item: AuditLog = {
+ id: 234 + i,
+ resource: 'myProject/Demo' + i,
+ resource_type: 'N/A',
+ operation: 'create',
+ op_time: '2017-04-11T10:26:22Z',
+ username: 'user91' + i,
+ };
+ mockedAuditLogs.push(item);
+ }
+ const fakedAuditlogService = {
+ getLogsResponse(params: ProjectService.GetLogsParams) {
+ if (params.q && params.q.indexOf('Demo0') !== -1) {
+ return of(
+ new HttpResponse({
+ body: mockedAuditLogs.slice(0, 1),
+ headers: new HttpHeaders({
+ 'x-total-count': '18',
+ }),
+ })
+ ).pipe(delay(0));
+ }
+ if (params.page <= 1) {
+ return of(
+ new HttpResponse({
+ body: mockedAuditLogs.slice(0, 15),
+ headers: new HttpHeaders({
+ 'x-total-count': '18',
+ }),
+ })
+ ).pipe(delay(0));
+ } else {
+ return of(
+ new HttpResponse({
+ body: mockedAuditLogs.slice(15),
+ headers: new HttpHeaders({
+ 'x-total-count': '18',
+ }),
+ })
+ ).pipe(delay(0));
+ }
+ },
+ };
+ registerLocaleData(locale_en, 'en-us');
+ beforeEach(async () => {
+ TestBed.overrideComponent(DatePickerComponent, {
+ set: {
+ providers: [
+ {
+ provide: LOCALE_ID,
+ useValue: 'en-us',
+ },
+ ],
+ },
+ });
+ await TestBed.configureTestingModule({
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
+ imports: [SharedTestingModule],
+ declarations: [ProjectAuditLegacyLogComponent],
+ providers: [
+ { provide: ActivatedRoute, useValue: mockActivatedRoute },
+ { provide: Router, useValue: mockRouter },
+ { provide: ProjectService, useValue: fakedAuditlogService },
+ {
+ provide: MessageHandlerService,
+ useValue: mockMessageHandlerService,
+ },
+ ],
+ }).compileComponents();
+ });
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(ProjectAuditLegacyLogComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+ it('should get data from AccessLogService', () => {
+ fixture.detectChanges();
+ fixture.whenStable().then(() => {
+ // wait for async getRecentLogs
+ fixture.detectChanges();
+ expect(component.auditLogs).toBeTruthy();
+ expect(component.auditLogs.length).toEqual(15);
+ });
+ });
+
+ it('should render data to view', () => {
+ fixture.detectChanges();
+ fixture.whenStable().then(() => {
+ fixture.detectChanges();
+
+ let de: DebugElement = fixture.debugElement.query(
+ del => del.classes['datagrid-cell']
+ );
+ expect(de).toBeTruthy();
+ let el: HTMLElement = de.nativeElement;
+ expect(el).toBeTruthy();
+ expect(el.textContent.trim()).toEqual('user910');
+ });
+ });
+ it('should support pagination', async () => {
+ fixture.autoDetectChanges(true);
+ await fixture.whenStable();
+ let el: HTMLButtonElement =
+ fixture.nativeElement.querySelector('.pagination-next');
+ expect(el).toBeTruthy();
+ el.click();
+ fixture.detectChanges();
+ await fixture.whenStable();
+ expect(component.currentPage).toEqual(2);
+ expect(component.auditLogs.length).toEqual(3);
+ });
+
+ it('should support filtering list by keywords', () => {
+ fixture.detectChanges();
+ let el: HTMLElement =
+ fixture.nativeElement.querySelector('.search-btn');
+ expect(el).toBeTruthy('Not found search icon');
+ click(el);
+ fixture.detectChanges();
+ let el2: HTMLInputElement =
+ fixture.nativeElement.querySelector('input');
+ expect(el2).toBeTruthy('Not found input');
+ fixture.detectChanges();
+ fixture.whenStable().then(() => {
+ fixture.detectChanges();
+ component.doSearchAuditLogs('Demo0');
+ fixture.detectChanges();
+ fixture.whenStable().then(() => {
+ fixture.detectChanges();
+ expect(component.auditLogs).toBeTruthy();
+ expect(component.auditLogs.length).toEqual(1);
+ });
+ });
+ });
+});
diff --git a/src/portal/src/app/base/project/project-log/audit-legacy-log.component.ts b/src/portal/src/app/base/project/project-log/audit-legacy-log.component.ts
new file mode 100644
index 000000000..cb71882ba
--- /dev/null
+++ b/src/portal/src/app/base/project/project-log/audit-legacy-log.component.ts
@@ -0,0 +1,247 @@
+// Copyright (c) 2017 VMware, Inc. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+import { Component, OnInit } from '@angular/core';
+import { ActivatedRoute, Router } from '@angular/router';
+import { SessionUser } from '../../../shared/entities/session-user';
+import { MessageHandlerService } from '../../../shared/services/message-handler.service';
+import { ProjectService } from '../../../../../ng-swagger-gen/services/project.service';
+import { AuditLog } from '../../../../../ng-swagger-gen/models/audit-log';
+import { Project } from '../project';
+import { finalize } from 'rxjs/operators';
+import {
+ getPageSizeFromLocalStorage,
+ PageSizeMapKeys,
+ setPageSizeToLocalStorage,
+} from '../../../shared/units/utils';
+import { ClrDatagridStateInterface } from '@clr/angular';
+
+const optionalSearch: {} = { 0: 'AUDIT_LOG.ADVANCED', 1: 'AUDIT_LOG.SIMPLE' };
+
+class FilterOption {
+ key: string;
+ description: string;
+ checked: boolean;
+
+ constructor(
+ private iKey: string,
+ private iDescription: string,
+ private iChecked: boolean
+ ) {
+ this.key = iKey;
+ this.description = iDescription;
+ this.checked = iChecked;
+ }
+
+ toString(): string {
+ return (
+ 'key:' +
+ this.key +
+ ', description:' +
+ this.description +
+ ', checked:' +
+ this.checked +
+ '\n'
+ );
+ }
+}
+
+export class SearchOption {
+ startTime: string = '';
+ endTime: string = '';
+}
+
+@Component({
+ selector: 'project-audit-legacy-log',
+ templateUrl: './audit-legacy-log.component.html',
+ styleUrls: ['./audit-legacy-log.component.scss'],
+})
+export class ProjectAuditLegacyLogComponent implements OnInit {
+ search: SearchOption = new SearchOption();
+ currentUser: SessionUser;
+ projectId: number;
+ projectName: string;
+ queryUsername: string;
+ queryStartTime: string;
+ queryEndTime: string;
+ queryOperation: string[] = [];
+ auditLogs: AuditLog[];
+ loading: boolean = true;
+
+ toggleName = optionalSearch;
+ currentOption: number = 0;
+ filterOptions: FilterOption[] = [
+ new FilterOption('all', 'AUDIT_LOG.ALL_OPERATIONS', true),
+ new FilterOption('pull', 'AUDIT_LOG.PULL', true),
+ new FilterOption('create', 'AUDIT_LOG.CREATE', true),
+ new FilterOption('delete', 'AUDIT_LOG.DELETE', true),
+ new FilterOption('others', 'AUDIT_LOG.OTHERS', true),
+ ];
+
+ pageOffset = 1;
+ pageSize = getPageSizeFromLocalStorage(
+ PageSizeMapKeys.PROJECT_AUDIT_LOG_COMPONENT
+ );
+ totalRecordCount = 0;
+ currentPage = 1;
+ totalPage = 0;
+
+ get showPaginationIndex(): boolean {
+ return this.totalRecordCount > 0;
+ }
+
+ constructor(
+ private route: ActivatedRoute,
+ private router: Router,
+ private auditLogService: ProjectService,
+ private messageHandlerService: MessageHandlerService
+ ) {
+ // Get current user from registered resolver.
+ this.route.data.subscribe(
+ data => (this.currentUser = data['auditLogResolver'])
+ );
+ }
+
+ ngOnInit(): void {
+ const resolverData = this.route.parent.parent.parent.snapshot.data;
+ if (resolverData) {
+ const pro: Project = resolverData['projectResolver'];
+ this.projectName = pro.name;
+ }
+ }
+
+ retrieve(state?: ClrDatagridStateInterface) {
+ if (state && state.page) {
+ this.pageSize = state.page.size;
+ setPageSizeToLocalStorage(
+ PageSizeMapKeys.PROJECT_AUDIT_LOG_COMPONENT,
+ this.pageSize
+ );
+ }
+ const arr: string[] = [];
+ if (this.queryUsername) {
+ arr.push(`username=~${this.queryUsername}`);
+ }
+ if (this.queryStartTime && this.queryEndTime) {
+ arr.push(`op_time=[${this.queryStartTime}~${this.queryEndTime}]`);
+ } else {
+ if (this.queryStartTime) {
+ arr.push(`op_time=[${this.queryStartTime}~]`);
+ }
+ if (this.queryEndTime) {
+ arr.push(`op_time=[~${this.queryEndTime}]`);
+ }
+ }
+ if (this.queryOperation && this.queryOperation.length > 0) {
+ arr.push(`operation={${this.queryOperation.join(' ')}}`);
+ }
+
+ const param: ProjectService.GetLogsParams = {
+ projectName: this.projectName,
+ pageSize: this.pageSize,
+ page: this.currentPage,
+ };
+ if (arr && arr.length > 0) {
+ param.q = encodeURIComponent(arr.join(','));
+ }
+ this.loading = true;
+ this.auditLogService
+ .getLogsResponse(param)
+ .pipe(finalize(() => (this.loading = false)))
+ .subscribe(
+ response => {
+ // Get total count
+ if (response.headers) {
+ let xHeader: string =
+ response.headers.get('x-total-count');
+ if (xHeader) {
+ this.totalRecordCount = Number.parseInt(
+ xHeader,
+ 10
+ );
+ }
+ }
+ this.auditLogs = response.body;
+ },
+ error => {
+ this.messageHandlerService.handleError(error);
+ }
+ );
+ }
+ doSearchAuditLogs(searchUsername: string): void {
+ this.queryUsername = searchUsername;
+ this.retrieve();
+ }
+
+ doSearchByStartTime(fromTimestamp: string): void {
+ this.queryStartTime = fromTimestamp;
+ this.retrieve();
+ }
+
+ doSearchByEndTime(toTimestamp: string): void {
+ this.queryEndTime = toTimestamp;
+ this.retrieve();
+ }
+
+ doSearchByOptions() {
+ let selectAll = true;
+ let operationFilter: string[] = [];
+ for (let filterOption of this.filterOptions) {
+ if (filterOption.checked) {
+ operationFilter.push(filterOption.key);
+ } else {
+ selectAll = false;
+ }
+ }
+ if (selectAll) {
+ operationFilter = [];
+ }
+ this.queryOperation = operationFilter;
+ this.retrieve();
+ }
+
+ toggleOptionalName(option: number): void {
+ option === 1 ? (this.currentOption = 0) : (this.currentOption = 1);
+ }
+
+ toggleFilterOption(option: string): void {
+ let selectedOption = this.filterOptions.find(
+ value => value.key === option
+ );
+ selectedOption.checked = !selectedOption.checked;
+ if (selectedOption.key === 'all') {
+ this.filterOptions
+ .filter(value => value.key !== selectedOption.key)
+ .forEach(value => (value.checked = selectedOption.checked));
+ } else {
+ if (!selectedOption.checked) {
+ this.filterOptions.find(value => value.key === 'all').checked =
+ false;
+ }
+ let selectAll = true;
+ this.filterOptions
+ .filter(value => value.key !== 'all')
+ .forEach(value => {
+ if (!value.checked) {
+ selectAll = false;
+ }
+ });
+ this.filterOptions.find(value => value.key === 'all').checked =
+ selectAll;
+ }
+ this.doSearchByOptions();
+ }
+ refresh(): void {
+ this.retrieve();
+ }
+}
diff --git a/src/portal/src/app/base/project/project-log/audit-log.component.html b/src/portal/src/app/base/project/project-log/audit-log.component.html
index 7239f2883..1db9f1dda 100644
--- a/src/portal/src/app/base/project/project-log/audit-log.component.html
+++ b/src/portal/src/app/base/project/project-log/audit-log.component.html
@@ -57,6 +57,9 @@
+ {{
+ 'AUDIT_LOG.TIMESTAMP' | translate
+ }}
{{
'AUDIT_LOG.USERNAME' | translate
}}
@@ -70,16 +73,22 @@
'AUDIT_LOG.OPERATION' | translate
}}
{{
- 'AUDIT_LOG.TIMESTAMP' | translate
+ 'AUDIT_LOG.OPERATION_DESCRIPTION' | translate
}}
+ {{ 'AUDIT_LOG.RESULT' | translate }}
+ {{
+ 'AUDIT_LOG.NOT_FOUND' | translate
+ }}
+ {{
+ l.op_time | harborDatetime : 'short'
+ }}
{{ l.username }}
{{ l.resource }}
{{ l.resource_type }}
{{ l.operation }}
- {{
- l.op_time | harborDatetime : 'short'
- }}
+ {{ l.operation_description }}
+ {{ l.operation_result }}
{
- let component: AuditLogComponent;
- let fixture: ComponentFixture;
+describe('ProjectAuditLogComponent', () => {
+ let component: ProjectAuditLogComponent;
+ let fixture: ComponentFixture;
const mockMessageHandlerService = {
handleError: () => {},
};
const mockActivatedRoute = {
parent: {
parent: {
- snapshot: {
- data: null,
+ parent: {
+ snapshot: {
+ data: null,
+ },
},
},
},
@@ -36,9 +38,9 @@ describe('AuditLogComponent', () => {
}).pipe(delay(0)),
};
const mockRouter = null;
- const mockedAuditLogs: AuditLog[] = [];
+ const mockedAuditLogExts: AuditLogExt[] = [];
for (let i = 0; i < 18; i++) {
- let item: AuditLog = {
+ let item: AuditLogExt = {
id: 234 + i,
resource: 'myProject/Demo' + i,
resource_type: 'N/A',
@@ -46,14 +48,14 @@ describe('AuditLogComponent', () => {
op_time: '2017-04-11T10:26:22Z',
username: 'user91' + i,
};
- mockedAuditLogs.push(item);
+ mockedAuditLogExts.push(item);
}
- const fakedAuditlogService = {
- getLogsResponse(params: ProjectService.GetLogsParams) {
+ const fakedAuditlogExtService = {
+ getLogExtsResponse(params: ProjectService.GetLogsParams) {
if (params.q && params.q.indexOf('Demo0') !== -1) {
return of(
new HttpResponse({
- body: mockedAuditLogs.slice(0, 1),
+ body: mockedAuditLogExts.slice(0, 1),
headers: new HttpHeaders({
'x-total-count': '18',
}),
@@ -63,7 +65,7 @@ describe('AuditLogComponent', () => {
if (params.page <= 1) {
return of(
new HttpResponse({
- body: mockedAuditLogs.slice(0, 15),
+ body: mockedAuditLogExts.slice(0, 15),
headers: new HttpHeaders({
'x-total-count': '18',
}),
@@ -72,7 +74,7 @@ describe('AuditLogComponent', () => {
} else {
return of(
new HttpResponse({
- body: mockedAuditLogs.slice(15),
+ body: mockedAuditLogExts.slice(15),
headers: new HttpHeaders({
'x-total-count': '18',
}),
@@ -96,11 +98,11 @@ describe('AuditLogComponent', () => {
await TestBed.configureTestingModule({
schemas: [CUSTOM_ELEMENTS_SCHEMA],
imports: [SharedTestingModule],
- declarations: [AuditLogComponent],
+ declarations: [ProjectAuditLogComponent],
providers: [
{ provide: ActivatedRoute, useValue: mockActivatedRoute },
{ provide: Router, useValue: mockRouter },
- { provide: ProjectService, useValue: fakedAuditlogService },
+ { provide: ProjectService, useValue: fakedAuditlogExtService },
{
provide: MessageHandlerService,
useValue: mockMessageHandlerService,
@@ -110,7 +112,7 @@ describe('AuditLogComponent', () => {
});
beforeEach(() => {
- fixture = TestBed.createComponent(AuditLogComponent);
+ fixture = TestBed.createComponent(ProjectAuditLogComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
diff --git a/src/portal/src/app/base/project/project-log/audit-log.component.ts b/src/portal/src/app/base/project/project-log/audit-log.component.ts
index 47e942819..42a7a66a3 100644
--- a/src/portal/src/app/base/project/project-log/audit-log.component.ts
+++ b/src/portal/src/app/base/project/project-log/audit-log.component.ts
@@ -16,7 +16,7 @@ import { ActivatedRoute, Router } from '@angular/router';
import { SessionUser } from '../../../shared/entities/session-user';
import { MessageHandlerService } from '../../../shared/services/message-handler.service';
import { ProjectService } from '../../../../../ng-swagger-gen/services/project.service';
-import { AuditLog } from '../../../../../ng-swagger-gen/models/audit-log';
+import { AuditLogExt } from '../../../../../ng-swagger-gen/models/audit-log-ext';
import { Project } from '../project';
import { finalize } from 'rxjs/operators';
import {
@@ -62,11 +62,11 @@ export class SearchOption {
}
@Component({
- selector: 'audit-log',
+ selector: 'project-audit-log',
templateUrl: './audit-log.component.html',
styleUrls: ['./audit-log.component.scss'],
})
-export class AuditLogComponent implements OnInit {
+export class ProjectAuditLogComponent implements OnInit {
search: SearchOption = new SearchOption();
currentUser: SessionUser;
projectId: number;
@@ -75,7 +75,7 @@ export class AuditLogComponent implements OnInit {
queryStartTime: string;
queryEndTime: string;
queryOperation: string[] = [];
- auditLogs: AuditLog[];
+ auditLogs: AuditLogExt[];
loading: boolean = true;
toggleName = optionalSearch;
@@ -113,7 +113,7 @@ export class AuditLogComponent implements OnInit {
}
ngOnInit(): void {
- const resolverData = this.route.parent.parent.snapshot.data;
+ const resolverData = this.route.parent.parent.parent?.snapshot?.data;
if (resolverData) {
const pro: Project = resolverData['projectResolver'];
this.projectName = pro.name;
@@ -146,7 +146,7 @@ export class AuditLogComponent implements OnInit {
arr.push(`operation={${this.queryOperation.join(' ')}}`);
}
- const param: ProjectService.GetLogsParams = {
+ const param: ProjectService.GetLogExtsParams = {
projectName: this.projectName,
pageSize: this.pageSize,
page: this.currentPage,
@@ -156,7 +156,7 @@ export class AuditLogComponent implements OnInit {
}
this.loading = true;
this.auditLogService
- .getLogsResponse(param)
+ .getLogExtsResponse(param)
.pipe(finalize(() => (this.loading = false)))
.subscribe(
response => {
diff --git a/src/portal/src/app/base/project/project-log/audit-log.module.ts b/src/portal/src/app/base/project/project-log/audit-log.module.ts
index 12895a8a1..f6fbfbeeb 100644
--- a/src/portal/src/app/base/project/project-log/audit-log.module.ts
+++ b/src/portal/src/app/base/project/project-log/audit-log.module.ts
@@ -1,16 +1,37 @@
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { SharedModule } from '../../../shared/shared.module';
-import { AuditLogComponent } from './audit-log.component';
+import { ProjectAuditLogComponent } from './audit-log.component';
+import { ProjectLogsComponent } from './project-logs.component';
+import { ProjectAuditLegacyLogComponent } from './audit-legacy-log.component';
const routes: Routes = [
{
path: '',
- component: AuditLogComponent,
+ component: ProjectLogsComponent,
+ children: [
+ {
+ path: 'project-audit-log',
+ component: ProjectAuditLogComponent,
+ },
+ {
+ path: 'project-audit-legacy-log',
+ component: ProjectAuditLegacyLogComponent,
+ },
+ {
+ path: '',
+ redirectTo: 'project-audit-log',
+ pathMatch: 'full',
+ },
+ ],
},
];
@NgModule({
- declarations: [AuditLogComponent],
+ declarations: [
+ ProjectLogsComponent,
+ ProjectAuditLogComponent,
+ ProjectAuditLegacyLogComponent,
+ ],
imports: [RouterModule.forChild(routes), SharedModule],
})
export class AuditLogModule {}
diff --git a/src/portal/src/app/base/project/project-log/project-logs.component.html b/src/portal/src/app/base/project/project-log/project-logs.component.html
new file mode 100644
index 000000000..8a1408ed0
--- /dev/null
+++ b/src/portal/src/app/base/project/project-log/project-logs.component.html
@@ -0,0 +1,21 @@
+
+
diff --git a/src/portal/src/app/base/project/project-log/project-logs.component.scss b/src/portal/src/app/base/project/project-log/project-logs.component.scss
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/portal/src/app/base/project/project-log/project-logs.component.ts b/src/portal/src/app/base/project/project-log/project-logs.component.ts
new file mode 100644
index 000000000..ecfade27b
--- /dev/null
+++ b/src/portal/src/app/base/project/project-log/project-logs.component.ts
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core';
+
+@Component({
+ selector: 'project-logs',
+ templateUrl: './project-logs.component.html',
+ styleUrls: ['./project-logs.component.scss'],
+})
+export class ProjectLogsComponent {
+ inProgress: boolean = true;
+ constructor() {}
+}
diff --git a/src/portal/src/i18n/lang/de-de-lang.json b/src/portal/src/i18n/lang/de-de-lang.json
index b9379409f..455fcffb4 100644
--- a/src/portal/src/i18n/lang/de-de-lang.json
+++ b/src/portal/src/i18n/lang/de-de-lang.json
@@ -179,6 +179,8 @@
"INTERROGATION_SERVICES": "Schwachstellen Scan"
},
"LOGS": "Logs",
+ "AUDIT_LOGS": "Audit Logs",
+ "LEGACY_LOGS": "Audit Logs (Legacy)",
"TASKS": "Aufgaben",
"API_EXPLORER": "Api Explorer",
"HARBOR_API_MANAGEMENT": "Harbor API V2.0",
@@ -526,9 +528,16 @@
"REPOSITORY_NAME": "Repository Name",
"TAGS": "Tags",
"OPERATION": "Operation",
+ "OPERATION_DESCRIPTION": "Operation Description",
"OPERATIONS": "Operations",
"TIMESTAMP": "Zeitstempel",
"ALL_OPERATIONS": "Alle Operations",
+ "ARTIFACT": "Artifact",
+ "USER": "User",
+ "PROJECT": "Project",
+ "CONFIGURATION": "Configuration",
+ "PROJECT_MEMBER": "Project Member",
+ "USER_LOGIN_LOGOUT": "User Login/Logout",
"PULL": "Pull",
"PUSH": "Push",
"CREATE": "Erstellen",
@@ -537,6 +546,7 @@
"ADVANCED": "Erweitert",
"SIMPLE": "Einfach",
"ITEMS": "Einträge",
+ "RESULT": "Success",
"FILTER_PLACEHOLDER": "Filter Logs",
"INVALID_DATE": "Fehlerhaftes Datum.",
"OF": "von",
@@ -1810,12 +1820,18 @@
"INCLUDED_OPERATIONS": "Eingeschlossene Aktionen",
"INCLUDED_OPERATION_TOOLTIP": "Entferne Audit-Logs für die ausgewählten Aktionen",
"INCLUDED_OPERATION_ERROR": "Bitte wähle mindestens eine Aktion",
+ "INCLUDED_EVENT_TYPES": "Included event types",
+ "INCLUDED_EVENT_TYPE_TOOLTIP": "Remove audit logs for the selected event types",
+ "INCLUDED_EVENT_TYPE_ERROR": "Please select at lease one event type",
"PURGE_NOW": "JETZT SÄUBERN",
"PURGE_NOW_SUCCESS": "Signal zur Bereinigung erfolgreich gesendet",
"PURGE_SCHEDULE_RESET": "Bereinigungsplan wurde zurückgesetzt",
"PURGE_HISTORY": "Bereinigungshistorie",
"FORWARD_ENDPOINT": "Syslog Endpunkt für die Weiterleitung des Audit-Logs",
"FORWARD_ENDPOINT_TOOLTIP": "Leite Audit-Logs an einen Syslog-Endpunkt, zum Beispiel: harbor-log:10514",
+ "DISABLE_AUDIT_LOG_EVENT_TYPE": "Disable Audit Log Event Type",
+ "DISABLE_AUDIT_LOG_EVENT_TYPE_TOOLTIP": "The comma-separated name of the audit log event to be disabled.",
+ "AUDIT_LOG_EVENT_TYPE_EMPTY": "No audit log event type exists.",
"SKIP_DATABASE": "Datenbank für Audit-Logs übergehen",
"SKIP_DATABASE_TOOLTIP": "Audit-Logs werden nicht in die Datenbank geschrieben. Nur verfügbar, wenn die Weiterleitung für Audit-Logs konfiguriert ist.",
"STOP_GC_SUCCESS": "Signal zum stoppen der Speicherbereinigungs-Aktion erfolgreich",
diff --git a/src/portal/src/i18n/lang/en-us-lang.json b/src/portal/src/i18n/lang/en-us-lang.json
index 88f756b02..471bf2005 100644
--- a/src/portal/src/i18n/lang/en-us-lang.json
+++ b/src/portal/src/i18n/lang/en-us-lang.json
@@ -179,6 +179,8 @@
"INTERROGATION_SERVICES": "Interrogation Services"
},
"LOGS": "Logs",
+ "AUDIT_LOGS": "Audit Logs",
+ "LEGACY_LOGS": "Audit Logs (Legacy)",
"TASKS": "Tasks",
"API_EXPLORER": "Api Explorer",
"HARBOR_API_MANAGEMENT": "Harbor API V2.0",
@@ -526,9 +528,16 @@
"REPOSITORY_NAME": "Repository Name",
"TAGS": "Tags",
"OPERATION": "Operation",
+ "OPERATION_DESCRIPTION": "Operation Description",
"OPERATIONS": "Operations",
"TIMESTAMP": "Timestamp",
"ALL_OPERATIONS": "All Operations",
+ "ARTIFACT": "Artifact",
+ "USER": "User",
+ "PROJECT": "Project",
+ "CONFIGURATION": "Configuration",
+ "PROJECT_MEMBER": "Project Member",
+ "USER_LOGIN_LOGOUT": "User Login/Logout",
"PULL": "Pull",
"PUSH": "Push",
"CREATE": "Create",
@@ -537,6 +546,7 @@
"ADVANCED": "Advanced",
"SIMPLE": "Simple",
"ITEMS": "items",
+ "RESULT": "Success",
"FILTER_PLACEHOLDER": "Filter Logs",
"INVALID_DATE": "Invalid date.",
"OF": "of",
@@ -1812,12 +1822,18 @@
"INCLUDED_OPERATIONS": "Included operations",
"INCLUDED_OPERATION_TOOLTIP": "Remove audit logs for the selected operations",
"INCLUDED_OPERATION_ERROR": "Please select at lease one operation",
+ "INCLUDED_EVENT_TYPES": "Included event types",
+ "INCLUDED_EVENT_TYPE_TOOLTIP": "Remove audit logs for the selected event types",
+ "INCLUDED_EVENT_TYPE_ERROR": "Please select at lease one event type",
"PURGE_NOW": "PURGE NOW",
"PURGE_NOW_SUCCESS": "Purge triggered successfully",
"PURGE_SCHEDULE_RESET": "Purge schedule has been reset",
"PURGE_HISTORY": "Purge History",
"FORWARD_ENDPOINT": "Audit Log Forward Syslog Endpoint",
"FORWARD_ENDPOINT_TOOLTIP": "Forward audit logs to the syslog endpoint, for example: harbor-log:10514",
+ "DISABLE_AUDIT_LOG_EVENT_TYPE": "Disable Audit Log Event Type",
+ "DISABLE_AUDIT_LOG_EVENT_TYPE_TOOLTIP": "The comma-separated name of the audit log event to be disabled.",
+ "AUDIT_LOG_EVENT_TYPE_EMPTY": "No audit log event type exists.",
"SKIP_DATABASE": "Skip Audit Log Database",
"SKIP_DATABASE_TOOLTIP": "Skip to log audit log in the database, only available when audit log forward endpoint is configured",
"STOP_GC_SUCCESS": "Trigger stopping GC operation successfully",
diff --git a/src/portal/src/i18n/lang/es-es-lang.json b/src/portal/src/i18n/lang/es-es-lang.json
index a62c80446..fb0cfcc05 100644
--- a/src/portal/src/i18n/lang/es-es-lang.json
+++ b/src/portal/src/i18n/lang/es-es-lang.json
@@ -179,6 +179,8 @@
"INTERROGATION_SERVICES": "Interrogation Services"
},
"LOGS": "Logs",
+ "AUDIT_LOGS": "Audit Logs",
+ "LEGACY_LOGS": "Audit Logs (Legacy)",
"TASKS": "Tasks",
"API_EXPLORER": "Api Explorer",
"HARBOR_API_MANAGEMENT": "Harbor API V2.0",
@@ -526,9 +528,16 @@
"REPOSITORY_NAME": "Nombre del Repositorio",
"TAGS": "Etiquetas",
"OPERATION": "Operación",
+ "OPERATION_DESCRIPTION": "Operation Description",
"OPERATIONS": "Operaciones",
"TIMESTAMP": "Fecha",
"ALL_OPERATIONS": "Todas las operaciones",
+ "ARTIFACT": "Artifact",
+ "USER": "User",
+ "PROJECT": "Project",
+ "CONFIGURATION": "Configuration",
+ "PROJECT_MEMBER": "Project Member",
+ "USER_LOGIN_LOGOUT": "User Login/Logout",
"PULL": "Pull",
"PUSH": "Push",
"CREATE": "Crear",
@@ -537,6 +546,7 @@
"ADVANCED": "Avanzado",
"SIMPLE": "Simple",
"ITEMS": "elementos",
+ "RESULT": "Success",
"FILTER_PLACEHOLDER": "Filtrar logs",
"INVALID_DATE": "Fecha invalida.",
"OF": "of",
@@ -1802,12 +1812,18 @@
"INCLUDED_OPERATIONS": "Operaciones incluidas",
"INCLUDED_OPERATION_TOOLTIP": "Eliminar registros de auditoría de las operaciones seleccionadas",
"INCLUDED_OPERATION_ERROR": "Por favor seleccione al menos una operación",
+ "INCLUDED_EVENT_TYPES": "Included event types",
+ "INCLUDED_EVENT_TYPE_TOOLTIP": "Remove audit logs for the selected event types",
+ "INCLUDED_EVENT_TYPE_ERROR": "Please select at lease one event type",
"PURGE_NOW": "PURGAR AHORA",
"PURGE_NOW_SUCCESS": "Purga activada exitosamente",
"PURGE_SCHEDULE_RESET": "Se ha restablecido la programación de purga",
"PURGE_HISTORY": "Historial de purga",
"FORWARD_ENDPOINT": "Audit Log Reenviar Syslog Endpoint",
"FORWARD_ENDPOINT_TOOLTIP": "Reenviar audit logs al endpoint de syslog, por ejemplo: harbor-log:10514",
+ "DISABLE_AUDIT_LOG_EVENT_TYPE": "Disable Audit Log Event Type",
+ "DISABLE_AUDIT_LOG_EVENT_TYPE_TOOLTIP": "The comma-separated name of the audit log event to be disabled.",
+ "AUDIT_LOG_EVENT_TYPE_EMPTY": "No audit log event type exists.",
"SKIP_DATABASE": "Omitir Base de Datos Audit Log",
"SKIP_DATABASE_TOOLTIP": "Saltar al registro de auditoría en la base de datos, solo disponible cuando se configura el endpoint de reenvío del registro de auditoría",
"STOP_GC_SUCCESS": "El disparador detiene con éxito la operación GC",
diff --git a/src/portal/src/i18n/lang/fr-fr-lang.json b/src/portal/src/i18n/lang/fr-fr-lang.json
index 578026d8b..16e7c94d5 100644
--- a/src/portal/src/i18n/lang/fr-fr-lang.json
+++ b/src/portal/src/i18n/lang/fr-fr-lang.json
@@ -179,6 +179,8 @@
"INTERROGATION_SERVICES": "Services d'analyse"
},
"LOGS": "Logs",
+ "AUDIT_LOGS": "Audit Logs",
+ "LEGACY_LOGS": "Audit Logs (Legacy)",
"TASKS": "Tâches",
"API_EXPLORER": "Explorateur d'API",
"HARBOR_API_MANAGEMENT": "Harbor API V2.0",
@@ -526,9 +528,16 @@
"REPOSITORY_NAME": "Nom du dépôt",
"TAGS": "Etiquettes",
"OPERATION": "Opération",
+ "OPERATION_DESCRIPTION": "Operation Description",
"OPERATIONS": "Opérations",
"TIMESTAMP": "Horodatage",
"ALL_OPERATIONS": "Toutes les opérations",
+ "ARTIFACT": "Artifact",
+ "USER": "User",
+ "PROJECT": "Project",
+ "CONFIGURATION": "Configuration",
+ "PROJECT_MEMBER": "Project Member",
+ "USER_LOGIN_LOGOUT": "User Login/Logout",
"PULL": "Pull",
"PUSH": "Push",
"CREATE": "Créer",
@@ -537,6 +546,7 @@
"ADVANCED": "Avancé",
"SIMPLE": "Simple",
"ITEMS": "entrées",
+ "RESULT": "Success",
"FILTER_PLACEHOLDER": "Filtrer les logs",
"INVALID_DATE": "Date invalide.",
"OF": "sur",
@@ -1812,12 +1822,18 @@
"INCLUDED_OPERATIONS": "Opérations incluses",
"INCLUDED_OPERATION_TOOLTIP": "Supprimer les logs d'audit pour les opérations sélectionnées",
"INCLUDED_OPERATION_ERROR": "Sélectionner au moins une opération",
+ "INCLUDED_EVENT_TYPES": "Included event types",
+ "INCLUDED_EVENT_TYPE_TOOLTIP": "Remove audit logs for the selected event types",
+ "INCLUDED_EVENT_TYPE_ERROR": "Please select at lease one event type",
"PURGE_NOW": "Purger maintenant",
"PURGE_NOW_SUCCESS": "La purge s'est déclenchée avec succès",
"PURGE_SCHEDULE_RESET": "Le programme de purge a été réinitialisé",
"PURGE_HISTORY": "Historique de purges",
"FORWARD_ENDPOINT": "Endpoint Syslog de transfert de logs d'audit",
"FORWARD_ENDPOINT_TOOLTIP": "Transfère les logs d'audit à l'endpoint Syslog, par exemple : harbor-log:10514",
+ "DISABLE_AUDIT_LOG_EVENT_TYPE": "Disable Audit Log Event Type",
+ "DISABLE_AUDIT_LOG_EVENT_TYPE_TOOLTIP": "The comma-separated name of the audit log event to be disabled.",
+ "AUDIT_LOG_EVENT_TYPE_EMPTY": "No audit log event type exists.",
"SKIP_DATABASE": "Ne pas enregistrer les logs d'audit dans la base de données",
"SKIP_DATABASE_TOOLTIP": "Ne pas enregistrer les logs d'audit dans la base de données, disponible uniquement lorsque l'endpoint de transfert de logs d'audit est configuré",
"STOP_GC_SUCCESS": "Déclenchement avec succès de l'arrêt de l'exécution du GC",
diff --git a/src/portal/src/i18n/lang/ko-kr-lang.json b/src/portal/src/i18n/lang/ko-kr-lang.json
index 777ec5bd3..62d2ccb69 100644
--- a/src/portal/src/i18n/lang/ko-kr-lang.json
+++ b/src/portal/src/i18n/lang/ko-kr-lang.json
@@ -179,6 +179,8 @@
"INTERROGATION_SERVICES": "질의 서비스"
},
"LOGS": "로그",
+ "AUDIT_LOGS": "Audit Logs",
+ "LEGACY_LOGS": "Audit Logs (Legacy)",
"TASKS": "테스크",
"API_EXPLORER": "Api 탐색기",
"HARBOR_API_MANAGEMENT": "Harbor API V2.0",
@@ -523,9 +525,16 @@
"REPOSITORY_NAME": "저장소 이름",
"TAGS": "태그",
"OPERATION": "작업",
+ "OPERATION_DESCRIPTION": "Operation Description",
"OPERATIONS": "작업들",
"TIMESTAMP": "타임스탬프",
"ALL_OPERATIONS": "모든 작업들",
+ "ARTIFACT": "Artifact",
+ "USER": "User",
+ "PROJECT": "Project",
+ "CONFIGURATION": "Configuration",
+ "PROJECT_MEMBER": "Project Member",
+ "USER_LOGIN_LOGOUT": "User Login/Logout",
"PULL": "풀(Pull)",
"PUSH": "푸시",
"CREATE": "생성",
@@ -534,6 +543,7 @@
"ADVANCED": "Advanced",
"SIMPLE": "Simple",
"ITEMS": "아이템",
+ "RESULT": "Success",
"FILTER_PLACEHOLDER": "로그 필터",
"INVALID_DATE": "잘못된 날짜.",
"OF": "of",
@@ -1803,12 +1813,18 @@
"INCLUDED_OPERATIONS": "포함된 작업",
"INCLUDED_OPERATION_TOOLTIP": "선택한 작업에 대한 감사 로그 삭제",
"INCLUDED_OPERATION_ERROR": "작업을 하나 이상 선택하세요.",
+ "INCLUDED_EVENT_TYPES": "Included event types",
+ "INCLUDED_EVENT_TYPE_TOOLTIP": "Remove audit logs for the selected event types",
+ "INCLUDED_EVENT_TYPE_ERROR": "Please select at lease one event type",
"PURGE_NOW": "지금 제거",
"PURGE_NOW_SUCCESS": "제거가 성공적으로 발생됐습니다",
"PURGE_SCHEDULE_RESET": "제거 예약이 초기화됐습니다",
"PURGE_HISTORY": "제거 기록",
"FORWARD_ENDPOINT": "감사 로그를 Syslog 엔트포인트로 전달",
"FORWARD_ENDPOINT_TOOLTIP": "감사 로그를 syslog 엔드포인트로 전달합니다(예: harbor-log:10514)",
+ "DISABLE_AUDIT_LOG_EVENT_TYPE": "Disable Audit Log Event Type",
+ "DISABLE_AUDIT_LOG_EVENT_TYPE_TOOLTIP": "The comma-separated name of the audit log event to be disabled.",
+ "AUDIT_LOG_EVENT_TYPE_EMPTY": "No audit log event type exists.",
"SKIP_DATABASE": "감사 로그 데이터베이스 건너뛰기",
"SKIP_DATABASE_TOOLTIP": "데이터베이스의 감사 로그 로그로 건너뛰기, 감사 로그 전달 엔드포인트가 구성된 경우에만 사용 가능",
"STOP_GC_SUCCESS": "가비지 컬렉션 작업 중지를 성공적으로 발생시켰습니다",
diff --git a/src/portal/src/i18n/lang/pt-br-lang.json b/src/portal/src/i18n/lang/pt-br-lang.json
index 095420e14..4c235083c 100644
--- a/src/portal/src/i18n/lang/pt-br-lang.json
+++ b/src/portal/src/i18n/lang/pt-br-lang.json
@@ -178,6 +178,8 @@
"INTERROGATION_SERVICES": "Serviços de Diagnóstico"
},
"LOGS": "Eventos",
+ "AUDIT_LOGS": "Audit Logs",
+ "LEGACY_LOGS": "Audit Logs (Legacy)",
"TASKS": "Tarefas",
"API_EXPLORER": "Explorador da API",
"HARBOR_API_MANAGEMENT": "Harbor API V2.0",
@@ -524,9 +526,16 @@
"REPOSITORY_NAME": "Nome do repositório",
"TAGS": "Tags",
"OPERATION": "Operação",
+ "OPERATION_DESCRIPTION": "Operation Description",
"OPERATIONS": "Operações",
"TIMESTAMP": "Horáro",
"ALL_OPERATIONS": "Todas as Operações",
+ "ARTIFACT": "Artifact",
+ "USER": "User",
+ "PROJECT": "Project",
+ "CONFIGURATION": "Configuration",
+ "PROJECT_MEMBER": "Project Member",
+ "USER_LOGIN_LOGOUT": "User Login/Logout",
"PULL": "Pull",
"PUSH": "Push",
"CREATE": "Criar",
@@ -535,6 +544,7 @@
"ADVANCED": "Avançado",
"SIMPLE": "Simples",
"ITEMS": "itens",
+ "RESULT": "Success",
"FILTER_PLACEHOLDER": "Filtrar",
"INVALID_DATE": "Data inválida.",
"OF": "de",
@@ -1807,12 +1817,18 @@
"INCLUDED_OPERATIONS": "Included operations",
"INCLUDED_OPERATION_TOOLTIP": "Remove audit logs for the selected operations",
"INCLUDED_OPERATION_ERROR": "Please select at lease one operation",
+ "INCLUDED_EVENT_TYPES": "Included event types",
+ "INCLUDED_EVENT_TYPE_TOOLTIP": "Remove audit logs for the selected event types",
+ "INCLUDED_EVENT_TYPE_ERROR": "Please select at lease one event type",
"PURGE_NOW": "PURGE NOW",
"PURGE_NOW_SUCCESS": "Purge triggered successfully",
"PURGE_SCHEDULE_RESET": "Purge schedule has been reset",
"PURGE_HISTORY": "Purge History",
"FORWARD_ENDPOINT": "Audit Log Forward Syslog Endpoint",
"FORWARD_ENDPOINT_TOOLTIP": "Forward audit logs to the syslog endpoint, for example: harbor-log:10514",
+ "DISABLE_AUDIT_LOG_EVENT_TYPE": "Disable Audit Log Event Type",
+ "DISABLE_AUDIT_LOG_EVENT_TYPE_TOOLTIP": "The comma-separated name of the audit log event to be disabled.",
+ "AUDIT_LOG_EVENT_TYPE_EMPTY": "No audit log event type exists.",
"SKIP_DATABASE": "Skip Audit Log Database",
"SKIP_DATABASE_TOOLTIP": "Skip to log audit log in the database, only available when audit log forward endpoint is configured",
"STOP_GC_SUCCESS": "Trigger stopping GC operation successfully",
diff --git a/src/portal/src/i18n/lang/tr-tr-lang.json b/src/portal/src/i18n/lang/tr-tr-lang.json
index 8e30de6ee..8ee954d2d 100644
--- a/src/portal/src/i18n/lang/tr-tr-lang.json
+++ b/src/portal/src/i18n/lang/tr-tr-lang.json
@@ -179,6 +179,8 @@
"INTERROGATION_SERVICES": "Interrogation Services"
},
"LOGS": "Kayıtlar",
+ "AUDIT_LOGS": "Audit Logs",
+ "LEGACY_LOGS": "Audit Logs (Legacy)",
"TASKS": "Görevler",
"API_EXPLORER": "Api Explorer",
"HARBOR_API_MANAGEMENT": "Harbor API V2.0",
@@ -526,9 +528,16 @@
"REPOSITORY_NAME": "Depo İsmi",
"TAGS": "Etiketler",
"OPERATION": "Operasyon",
+ "OPERATION_DESCRIPTION": "Operation Description",
"OPERATIONS": "Operasyonlar",
"TIMESTAMP": "Zaman Damgası",
"ALL_OPERATIONS": "Tüm Operasyonlar",
+ "ARTIFACT": "Artifact",
+ "USER": "User",
+ "PROJECT": "Project",
+ "CONFIGURATION": "Configuration",
+ "PROJECT_MEMBER": "Project Member",
+ "USER_LOGIN_LOGOUT": "User Login/Logout",
"PULL": "Çek",
"PUSH": "Yükle",
"CREATE": "Oluştur",
@@ -537,6 +546,7 @@
"ADVANCED": "Gelişmiş",
"SIMPLE": "Basit",
"ITEMS": "adet",
+ "RESULT": "Success",
"FILTER_PLACEHOLDER": "Günlükleri Filtrele",
"INVALID_DATE": "Geçersiz tarih.",
"OF": "of",
@@ -1810,12 +1820,18 @@
"INCLUDED_OPERATIONS": "Included operations",
"INCLUDED_OPERATION_TOOLTIP": "Remove audit logs for the selected operations",
"INCLUDED_OPERATION_ERROR": "Please select at lease one operation",
+ "INCLUDED_EVENT_TYPES": "Included event types",
+ "INCLUDED_EVENT_TYPE_TOOLTIP": "Remove audit logs for the selected event types",
+ "INCLUDED_EVENT_TYPE_ERROR": "Please select at lease one event type",
"PURGE_NOW": "PURGE NOW",
"PURGE_NOW_SUCCESS": "Purge triggered successfully",
"PURGE_SCHEDULE_RESET": "Purge schedule has been reset",
"PURGE_HISTORY": "Purge History",
"FORWARD_ENDPOINT": "Audit Log Forward Syslog Endpoint",
"FORWARD_ENDPOINT_TOOLTIP": "Forward audit logs to the syslog endpoint, for example: harbor-log:10514",
+ "DISABLE_AUDIT_LOG_EVENT_TYPE": "Disable Audit Log Event Type",
+ "DISABLE_AUDIT_LOG_EVENT_TYPE_TOOLTIP": "The comma-separated name of the audit log event to be disabled.",
+ "AUDIT_LOG_EVENT_TYPE_EMPTY": "No audit log event type exists.",
"SKIP_DATABASE": "Skip Audit Log Database",
"SKIP_DATABASE_TOOLTIP": "Skip to log audit log in the database, only available when audit log forward endpoint is configured",
"STOP_GC_SUCCESS": "Trigger stopping GC operation successfully",
diff --git a/src/portal/src/i18n/lang/zh-cn-lang.json b/src/portal/src/i18n/lang/zh-cn-lang.json
index ef941a46f..90ca8476f 100644
--- a/src/portal/src/i18n/lang/zh-cn-lang.json
+++ b/src/portal/src/i18n/lang/zh-cn-lang.json
@@ -178,6 +178,8 @@
"INTERROGATION_SERVICES": "审查服务"
},
"LOGS": "日志",
+ "AUDIT_LOGS": "Audit Logs",
+ "LEGACY_LOGS": "Audit Logs (Legacy)",
"TASKS": "任务",
"API_EXPLORER": "API控制中心",
"HARBOR_API_MANAGEMENT": "Harbor API V2.0",
@@ -524,9 +526,16 @@
"REPOSITORY_NAME": "镜像名称",
"TAGS": "Tags",
"OPERATION": "操作",
+ "OPERATION_DESCRIPTION": "Operation Description",
"OPERATIONS": "操作",
"TIMESTAMP": "时间戳",
"ALL_OPERATIONS": "所有操作",
+ "ARTIFACT": "Artifact",
+ "USER": "User",
+ "PROJECT": "Project",
+ "CONFIGURATION": "Configuration",
+ "PROJECT_MEMBER": "Project Member",
+ "USER_LOGIN_LOGOUT": "User Login/Logout",
"PULL": "Pull",
"PUSH": "Push",
"CREATE": "Create",
@@ -535,6 +544,7 @@
"ADVANCED": "高级检索",
"SIMPLE": "简单检索",
"ITEMS": "条记录",
+ "RESULT": "Success",
"FILTER_PLACEHOLDER": "过滤日志",
"INVALID_DATE": "无效日期。",
"OF": "共计",
@@ -1809,12 +1819,18 @@
"INCLUDED_OPERATIONS": "包含操作",
"INCLUDED_OPERATION_TOOLTIP": "删除指定操作类型的日志",
"INCLUDED_OPERATION_ERROR": "请至少选择一种操作类型",
+ "INCLUDED_EVENT_TYPES": "Included event types",
+ "INCLUDED_EVENT_TYPE_TOOLTIP": "Remove audit logs for the selected event types",
+ "INCLUDED_EVENT_TYPE_ERROR": "Please select at lease one event type",
"PURGE_NOW": "立即清理",
"PURGE_NOW_SUCCESS": "触发清理成功",
"PURGE_SCHEDULE_RESET": "清理计划已被重置",
"PURGE_HISTORY": "清理历史",
"FORWARD_ENDPOINT": "日志转发端点",
"FORWARD_ENDPOINT_TOOLTIP": "将日志转发到指定的 syslog 端点,例如:harbor-log:10514",
+ "DISABLE_AUDIT_LOG_EVENT_TYPE": "Disable Audit Log Event Type",
+ "DISABLE_AUDIT_LOG_EVENT_TYPE_TOOLTIP": "The comma-separated name of the audit log event to be disabled.",
+ "AUDIT_LOG_EVENT_TYPE_EMPTY": "No audit log event type exists.",
"SKIP_DATABASE": "跳过日志数据库",
"SKIP_DATABASE_TOOLTIP": "开启此项将不会在数据库中记录日志,需先配置日志转发端点",
"STOP_GC_SUCCESS": "成功触发停止垃圾回收的操作",
diff --git a/src/portal/src/i18n/lang/zh-tw-lang.json b/src/portal/src/i18n/lang/zh-tw-lang.json
index 166081983..f0c16e8bf 100644
--- a/src/portal/src/i18n/lang/zh-tw-lang.json
+++ b/src/portal/src/i18n/lang/zh-tw-lang.json
@@ -178,6 +178,8 @@
"INTERROGATION_SERVICES": "審查服務"
},
"LOGS": "日誌",
+ "AUDIT_LOGS": "Audit Logs",
+ "LEGACY_LOGS": "Audit Logs (Legacy)",
"TASKS": "任務",
"API_EXPLORER": "API Explorer",
"HARBOR_API_MANAGEMENT": "Harbor API V2.0",
@@ -525,9 +527,16 @@
"REPOSITORY_NAME": "儲存庫名稱",
"TAGS": "標籤",
"OPERATION": "操作",
+ "OPERATION_DESCRIPTION": "Operation Description",
"OPERATIONS": "操作",
"TIMESTAMP": "時間戳記",
"ALL_OPERATIONS": "所有操作",
+ "ARTIFACT": "Artifact",
+ "USER": "User",
+ "PROJECT": "Project",
+ "CONFIGURATION": "Configuration",
+ "PROJECT_MEMBER": "Project Member",
+ "USER_LOGIN_LOGOUT": "User Login/Logout",
"PULL": "拉取",
"PUSH": "推送",
"CREATE": "建立",
@@ -536,6 +545,7 @@
"ADVANCED": "進階搜尋",
"SIMPLE": "簡易搜尋",
"ITEMS": "筆紀錄",
+ "RESULT": "Success",
"FILTER_PLACEHOLDER": "篩選日誌",
"INVALID_DATE": "無效日期。",
"OF": "共計",
@@ -1807,12 +1817,18 @@
"INCLUDED_OPERATIONS": "包含的操作",
"INCLUDED_OPERATION_TOOLTIP": "移除所選操作的稽核日誌",
"INCLUDED_OPERATION_ERROR": "請至少選擇一個操作",
+ "INCLUDED_EVENT_TYPES": "Included event types",
+ "INCLUDED_EVENT_TYPE_TOOLTIP": "Remove audit logs for the selected event types",
+ "INCLUDED_EVENT_TYPE_ERROR": "Please select at lease one event type",
"PURGE_NOW": "立即清除",
"PURGE_NOW_SUCCESS": "成功觸發清除",
"PURGE_SCHEDULE_RESET": "清除排程已重設",
"PURGE_HISTORY": "清除歷史",
"FORWARD_ENDPOINT": "稽核日誌轉發 Syslog 端點",
"FORWARD_ENDPOINT_TOOLTIP": "將稽核日誌轉發至 syslog 端點,例如: harbor-log:10514",
+ "DISABLE_AUDIT_LOG_EVENT_TYPE": "Disable Audit Log Event Type",
+ "DISABLE_AUDIT_LOG_EVENT_TYPE_TOOLTIP": "The comma-separated name of the audit log event to be disabled.",
+ "AUDIT_LOG_EVENT_TYPE_EMPTY": "No audit log event type exists.",
"SKIP_DATABASE": "跳過稽核日誌資料庫",
"SKIP_DATABASE_TOOLTIP": "跳過在資料庫中記錄稽核日誌,僅在設定稽核日誌轉發端點時可用",
"STOP_GC_SUCCESS": "成功觸發停止清理垃圾操作",