[Fix] Fix part issue of round2

Signed-off-by: Yogi_Wang <yawang@vmware.com>
This commit is contained in:
Yogi_Wang 2020-04-09 13:08:39 +08:00
parent 5661ff937b
commit 3c771670ca
20 changed files with 67 additions and 46 deletions

View File

@ -135,16 +135,11 @@ export class CreateProjectComponent implements AfterViewInit, OnChanges, OnDest
Validators.pattern('(^-1$)|(^([1-9]+)([0-9]+)*$)'), Validators.pattern('(^-1$)|(^([1-9]+)([0-9]+)*$)'),
validateLimit(this.currentForm.form.controls['create_project_storage_limit_unit']) validateLimit(this.currentForm.form.controls['create_project_storage_limit_unit'])
]); ]);
this.currentForm.form.controls['create_project_count_limit'].setValidators(
[
Validators.required,
Validators.pattern('(^-1$)|(^([1-9]+)([0-9]+)*$)')
]);
} }
this.currentForm.form.valueChanges this.currentForm.form.valueChanges
.pipe(distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b))) .pipe(distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)))
.subscribe((data) => { .subscribe((data) => {
['create_project_storage_limit', 'create_project_storage_limit_unit', 'create_project_count_limit'].forEach(fieldName => { ['create_project_storage_limit', 'create_project_storage_limit_unit'].forEach(fieldName => {
if (this.currentForm.form.get(fieldName) && this.currentForm.form.get(fieldName).value !== null) { if (this.currentForm.form.get(fieldName) && this.currentForm.form.get(fieldName).value !== null) {
this.currentForm.form.get(fieldName).updateValueAndValidity(); this.currentForm.form.get(fieldName).updateValueAndValidity();
} }

View File

@ -182,7 +182,7 @@
</clr-dg-cell> </clr-dg-cell>
<clr-dg-cell *ngIf="depth"> <clr-dg-cell *ngIf="depth">
<div class="cell"> <div class="cell">
{{artifact.extra_attrs?.os}}/{{artifact.extra_attrs?.architecture}} {{artifact.platform?.os}}/{{artifact.platform?.architecture}}{{artifact.platform?.variant?'/'+artifact.platform?.variant: ''}}
</div> </div>
</clr-dg-cell> </clr-dg-cell>
<clr-dg-cell class="w-rem-4"> <clr-dg-cell class="w-rem-4">
@ -208,7 +208,7 @@
<tr> <tr>
<th class="left tag-header-color"> <th class="left tag-header-color">
{{'REPOSITORY.TAGS' | translate | uppercase}}</th> {{'REPOSITORY.TAGS' | translate | uppercase}}</th>
<th class="left tag-header-color"> <th *ngIf="withNotary" class="left tag-header-color">
{{'REPOSITORY.SIGNED' | translate | uppercase}}</th> {{'REPOSITORY.SIGNED' | translate | uppercase}}</th>
<th class="left tag-header-color"> <th class="left tag-header-color">
{{'REPOSITORY.PULL_TIME' | translate | uppercase}}</th> {{'REPOSITORY.PULL_TIME' | translate | uppercase}}</th>
@ -219,7 +219,7 @@
<tbody class="tag-tbody"> <tbody class="tag-tbody">
<tr class="tag-tr" *ngFor="let tag of artifact.tags"> <tr class="tag-tr" *ngFor="let tag of artifact.tags">
<td class="left tag-body-color">{{tag.name}}</td> <td class="left tag-body-color">{{tag.name}}</td>
<td class="left tag-body-color" [ngSwitch]="tag.signed"> <td *ngIf="withNotary" class="left tag-body-color" [ngSwitch]="tag.signed">
<div class="cell"> <div class="cell">
<clr-icon shape="check-circle" *ngSwitchCase="true" size="20" class="color-green"></clr-icon> <clr-icon shape="check-circle" *ngSwitchCase="true" size="20" class="color-green"></clr-icon>
<clr-icon shape="times-circle" *ngSwitchCase="false" size="16" class="color-red"></clr-icon> <clr-icon shape="times-circle" *ngSwitchCase="false" size="16" class="color-red"></clr-icon>

View File

@ -58,6 +58,7 @@ import { ArtifactFront as Artifact, mutipleFilter } from "../../../artifact/arti
import { Project } from "../../../../project"; import { Project } from "../../../../project";
import { ArtifactService as NewArtifactService } from "../../../../../../../ng-swagger-gen/services/artifact.service"; import { ArtifactService as NewArtifactService } from "../../../../../../../ng-swagger-gen/services/artifact.service";
import { ADDITIONS } from "../../../artifact/artifact-additions/models"; import { ADDITIONS } from "../../../artifact/artifact-additions/models";
import { Platform } from "../../../../../../../ng-swagger-gen/models/platform";
export interface LabelState { export interface LabelState {
iconsShow: boolean; iconsShow: boolean;
label: Label; label: Label;
@ -347,6 +348,7 @@ export class ArtifactListTabComponent implements OnInit, OnDestroy {
this.newArtifactService.getArtifact(artifactParam).subscribe( this.newArtifactService.getArtifact(artifactParam).subscribe(
res => { res => {
let observableLists: Observable<Artifact>[] = []; let observableLists: Observable<Artifact>[] = [];
let platFormAttr: { platform: Platform }[] = [];
this.totalCount = res.references.length; this.totalCount = res.references.length;
res.references.forEach((child, index) => { res.references.forEach((child, index) => {
if (index >= (pageNumber - 1) * this.pageSize && index < pageNumber * this.pageSize) { if (index >= (pageNumber - 1) * this.pageSize && index < pageNumber * this.pageSize) {
@ -360,6 +362,7 @@ export class ArtifactListTabComponent implements OnInit, OnDestroy {
withSignature: true, withSignature: true,
withTag: true withTag: true
}; };
platFormAttr.push({platform: child.platform});
observableLists.push(this.newArtifactService.getArtifact(childParams)); observableLists.push(this.newArtifactService.getArtifact(childParams));
} }
}); });
@ -367,6 +370,9 @@ export class ArtifactListTabComponent implements OnInit, OnDestroy {
this.loading = false; this.loading = false;
})).subscribe(artifacts => { })).subscribe(artifacts => {
this.artifactList = artifacts; this.artifactList = artifacts;
this.artifactList.forEach((artifact, index) => {
artifact.platform = clone(platFormAttr[index].platform);
});
this.getArtifactAnnotationsArray(this.artifactList); this.getArtifactAnnotationsArray(this.artifactList);
}, error => { }, error => {
this.errorHandlerService.error(error); this.errorHandlerService.error(error);
@ -681,12 +687,12 @@ export class ArtifactListTabComponent implements OnInit, OnDestroy {
this.newArtifactService.CopyArtifact(params) this.newArtifactService.CopyArtifact(params)
.pipe(finalize(() => { .pipe(finalize(() => {
this.imageNameInput.form.reset(); this.imageNameInput.form.reset();
this.retagDialogOpened = false;
})) }))
.subscribe(response => { .subscribe(response => {
this.translateService.get('RETAG.MSG_SUCCESS').subscribe((res: string) => { this.translateService.get('RETAG.MSG_SUCCESS').subscribe((res: string) => {
this.errorHandlerService.info(res); this.errorHandlerService.info(res);
}); });
this.retagDialogOpened = false;
}, error => { }, error => {
this.errorHandlerService.error(error); this.errorHandlerService.error(error);
}); });

View File

@ -41,7 +41,7 @@
</form> </form>
</clr-dg-action-bar> </clr-dg-action-bar>
<clr-dg-column [clrDgField]="'name'">{{'TAG.NAME' | translate}}</clr-dg-column> <clr-dg-column [clrDgField]="'name'">{{'TAG.NAME' | translate}}</clr-dg-column>
<clr-dg-column >{{'REPOSITORY.SIGNED' | translate}}</clr-dg-column> <clr-dg-column *ngIf="withNotary">{{'REPOSITORY.SIGNED' | translate}}</clr-dg-column>
<clr-dg-column>{{'TAG.PULL_TIME' | translate}}</clr-dg-column> <clr-dg-column>{{'TAG.PULL_TIME' | translate}}</clr-dg-column>
<clr-dg-column>{{'TAG.PUSH_TIME' | translate}}</clr-dg-column> <clr-dg-column>{{'TAG.PUSH_TIME' | translate}}</clr-dg-column>
@ -52,7 +52,7 @@
<span *ngIf="tag.immutable" class="label label-info ml-8">{{'REPOSITORY.IMMUTABLE' | translate}}</span> <span *ngIf="tag.immutable" class="label label-info ml-8">{{'REPOSITORY.IMMUTABLE' | translate}}</span>
</div> </div>
</clr-dg-cell> </clr-dg-cell>
<clr-dg-cell [ngSwitch]="tag.signed"> <clr-dg-cell *ngIf="withNotary" [ngSwitch]="tag.signed">
<div class="cell"> <div class="cell">
<clr-icon shape="check-circle" *ngSwitchCase="true" size="20" class="color-green"></clr-icon> <clr-icon shape="check-circle" *ngSwitchCase="true" size="20" class="color-green"></clr-icon>
<clr-icon shape="times-circle" *ngSwitchCase="false" size="16" class="color-red"></clr-icon> <clr-icon shape="times-circle" *ngSwitchCase="false" size="16" class="color-red"></clr-icon>

View File

@ -12,7 +12,7 @@ import { OperationService } from "../../../../../lib/components/operation/operat
import { CURRENT_BASE_HREF } from "../../../../../lib/utils/utils"; import { CURRENT_BASE_HREF } from "../../../../../lib/utils/utils";
import { USERSTATICPERMISSION, UserPermissionService, UserPermissionDefaultService } from '../../../../../lib/services'; import { USERSTATICPERMISSION, UserPermissionService, UserPermissionDefaultService } from '../../../../../lib/services';
import { delay } from 'rxjs/operators'; import { delay } from 'rxjs/operators';
import { AppConfigService } from "../../../../services/app-config.service";
describe('ArtifactTagComponent', () => { describe('ArtifactTagComponent', () => {
let component: ArtifactTagComponent; let component: ArtifactTagComponent;
@ -29,6 +29,18 @@ describe('ArtifactTagComponent', () => {
const config: IServiceConfig = { const config: IServiceConfig = {
repositoryBaseEndpoint: CURRENT_BASE_HREF + "/repositories/testing" repositoryBaseEndpoint: CURRENT_BASE_HREF + "/repositories/testing"
}; };
const mockAppConfigService = {
getConfig: () => {
return {
project_creation_restriction: "",
with_chartmuseum: "",
with_notary: "",
with_clair: "",
with_admiral: "",
registry_url: "",
};
}
};
let userPermissionService; let userPermissionService;
const permissions = [ const permissions = [
{ resource: USERSTATICPERMISSION.REPOSITORY_TAG.KEY, action: USERSTATICPERMISSION.REPOSITORY_TAG.VALUE.DELETE }, { resource: USERSTATICPERMISSION.REPOSITORY_TAG.KEY, action: USERSTATICPERMISSION.REPOSITORY_TAG.VALUE.DELETE },
@ -51,6 +63,7 @@ describe('ArtifactTagComponent', () => {
{ provide: SERVICE_CONFIG, useValue: config }, { provide: SERVICE_CONFIG, useValue: config },
{ provide: mockErrorHandler, useValue: ErrorHandler }, { provide: mockErrorHandler, useValue: ErrorHandler },
{ provide: ArtifactService, useValue: mockArtifactService }, { provide: ArtifactService, useValue: mockArtifactService },
{ provide: AppConfigService, useValue: mockAppConfigService },
{ provide: UserPermissionService, useClass: UserPermissionDefaultService }, { provide: UserPermissionService, useClass: UserPermissionDefaultService },
{ provide: OperationService }, { provide: OperationService },
] ]

View File

@ -22,6 +22,7 @@ import {
} from "../../../../../lib/services"; } from "../../../../../lib/services";
import { ClrDatagridStateInterface } from '@clr/angular'; import { ClrDatagridStateInterface } from '@clr/angular';
import { DEFAULT_PAGE_SIZE, calculatePage, dbEncodeURIComponent } from '../../../../../lib/utils/utils'; import { DEFAULT_PAGE_SIZE, calculatePage, dbEncodeURIComponent } from '../../../../../lib/utils/utils';
import { AppConfigService } from "../../../../services/app-config.service";
class InitTag { class InitTag {
name = ""; name = "";
@ -64,6 +65,7 @@ export class ArtifactTagComponent implements OnInit, OnDestroy {
private artifactService: ArtifactService, private artifactService: ArtifactService,
private translateService: TranslateService, private translateService: TranslateService,
private userPermissionService: UserPermissionService, private userPermissionService: UserPermissionService,
private appConfigService: AppConfigService,
private errorHandlerService: ErrorHandler private errorHandlerService: ErrorHandler
) { } ) { }
@ -156,7 +158,7 @@ export class ArtifactTagComponent implements OnInit, OnDestroy {
// const tag: NewTag = {name: this.newTagName}; // const tag: NewTag = {name: this.newTagName};
const createTagParams: ArtifactService.CreateTagParams = { const createTagParams: ArtifactService.CreateTagParams = {
projectName: this.projectName, projectName: this.projectName,
repositoryName: this.repositoryName, repositoryName: dbEncodeURIComponent(this.repositoryName),
reference: this.artifactDetails.digest, reference: this.artifactDetails.digest,
tag: this.newTagName tag: this.newTagName
}; };
@ -249,7 +251,7 @@ export class ArtifactTagComponent implements OnInit, OnDestroy {
this.operationService.publishInfo(operMessage); this.operationService.publishInfo(operMessage);
const deleteTagParams: ArtifactService.DeleteTagParams = { const deleteTagParams: ArtifactService.DeleteTagParams = {
projectName: this.projectName, projectName: this.projectName,
repositoryName: this.repositoryName, repositoryName: dbEncodeURIComponent(this.repositoryName),
reference: this.artifactDetails.digest, reference: this.artifactDetails.digest,
tagName: tag.name tagName: tag.name
}; };
@ -292,4 +294,7 @@ export class ArtifactTagComponent implements OnInit, OnDestroy {
ngOnDestroy(): void { ngOnDestroy(): void {
this.tagNameCheckSub.unsubscribe(); this.tagNameCheckSub.unsubscribe();
} }
get withNotary(): boolean {
return this.appConfigService.getConfig().with_notary;
}
} }

View File

@ -1,7 +1,9 @@
import { Artifact } from "../../../../../ng-swagger-gen/models/artifact"; import { Artifact } from "../../../../../ng-swagger-gen/models/artifact";
import { Platform } from "../../../../../ng-swagger-gen/models/platform";
export interface ArtifactFront extends Artifact { export interface ArtifactFront extends Artifact {
annotationsArray?: string[]; annotationsArray?: string[];
platform?: Platform;
showImage?: string; showImage?: string;
} }

View File

@ -187,6 +187,6 @@ export class ResultBarChartComponent implements OnInit, OnDestroy {
} }
viewLog(): string { viewLog(): string {
return `${ CURRENT_BASE_HREF }/projects/${this.projectName return `${ CURRENT_BASE_HREF }/projects/${this.projectName
}/repositories/${this.repoName}/artifacts/${this.artifactDigest}/scan/${this.summary.report_id}/log`; }/repositories/${dbEncodeURIComponent(this.repoName)}/artifacts/${this.artifactDigest}/scan/${this.summary.report_id}/log`;
} }
} }

View File

@ -23,8 +23,8 @@
<div class="black-point-container margin-left-10"> <div class="black-point-container margin-left-10">
<div class="black-point "></div> <div class="black-point "></div>
</div> </div>
<span class="margin-left-10 font-weight-800 color-green font-size-12">{{fixableCount}}</span> <span class="margin-left-10 font-weight-800 font-size-12">{{fixableCount}}</span>
<span class="margin-left-5 color-green font-size-12">{{'SCANNER.FIXABLE' | translate}}</span> <span class="margin-left-5 font-size-12">{{'SCANNER.FIXABLE' | translate}}</span>
</div> </div>
<div *ngIf="isNone" class="pl-1 margin-left-5 tip-wrapper bar-block-none shadow-none width-150">{{'VULNERABILITY.NO_VULNERABILITY' | translate }}</div> <div *ngIf="isNone" class="pl-1 margin-left-5 tip-wrapper bar-block-none shadow-none width-150">{{'VULNERABILITY.NO_VULNERABILITY' | translate }}</div>
</div> </div>

View File

@ -82,7 +82,7 @@
</tr> </tr>
<tr> <tr>
<td class="left"> <td class="left">
<span>{{'ROBOT_ACCOUNT.PERMISSIONS_IMAGE' | translate}}</span> <span>{{'ROBOT_ACCOUNT.PERMISSIONS_ARTIFACT' | translate}}</span>
<clr-tooltip> <clr-tooltip>
<clr-icon clrTooltipTrigger shape="info-circle" size="24"></clr-icon> <clr-icon clrTooltipTrigger shape="info-circle" size="24"></clr-icon>
<clr-tooltip-content clrPosition="top-right" clrSize="lg" *clrIfOpen> <clr-tooltip-content clrPosition="top-right" clrSize="lg" *clrIfOpen>

View File

@ -336,8 +336,8 @@
"ENABLE_ACCOUNT": "Enable Account", "ENABLE_ACCOUNT": "Enable Account",
"DELETE": "Delete", "DELETE": "Delete",
"CREAT_ROBOT_ACCOUNT": "Create Robot Account", "CREAT_ROBOT_ACCOUNT": "Create Robot Account",
"PERMISSIONS_IMAGE": "Image", "PERMISSIONS_ARTIFACT": "Artifact",
"PERMISSIONS_HELMCHART": "Helm Chart", "PERMISSIONS_HELMCHART": "Helm Chart (Chart Museum)",
"PUSH": "Push", "PUSH": "Push",
"PULL": "Pull", "PULL": "Pull",
"FILTER_PLACEHOLDER": "Filter Robot Accounts", "FILTER_PLACEHOLDER": "Filter Robot Accounts",
@ -642,7 +642,7 @@
"NAME": "Name", "NAME": "Name",
"TAGS": "Tags", "TAGS": "Tags",
"PLATFORM": "OS/ARCH", "PLATFORM": "OS/ARCH",
"ARTIFACT_TOOTIP": "Click this icon to enter the Artifact list of refer", "ARTIFACT_TOOTIP": "Click to view this OCI index's artifact list",
"ARTIFACTS_COUNT": "Artifacts", "ARTIFACTS_COUNT": "Artifacts",
"PULL_COUNT": "Pulls", "PULL_COUNT": "Pulls",
"PULL_COMMAND": "Pull Command", "PULL_COMMAND": "Pull Command",

View File

@ -337,8 +337,8 @@
"ENABLE_ACCOUNT": "Enable Account", "ENABLE_ACCOUNT": "Enable Account",
"DELETE": "Delete", "DELETE": "Delete",
"CREAT_ROBOT_ACCOUNT": "Creat Robot Account", "CREAT_ROBOT_ACCOUNT": "Creat Robot Account",
"PERMISSIONS_IMAGE": "Image", "PERMISSIONS_ARTIFACT": "Artifact",
"PERMISSIONS_HELMCHART": "Helm Chart", "PERMISSIONS_HELMCHART": "Helm Chart (Chart Museum)",
"PUSH": "Push", "PUSH": "Push",
"PULL": "Pull", "PULL": "Pull",
"FILTER_PLACEHOLDER": "Filter Robot Accounts", "FILTER_PLACEHOLDER": "Filter Robot Accounts",
@ -643,7 +643,7 @@
"NAME": "Nombre", "NAME": "Nombre",
"TAGS": "Etiquetas", "TAGS": "Etiquetas",
"PLATFORM": "OS/ARCH", "PLATFORM": "OS/ARCH",
"ARTIFACT_TOOTIP": "Click this icon to enter the Artifact list of refer", "ARTIFACT_TOOTIP": "Click to view this OCI index's artifact list",
"ARTIFACTS_COUNT": "Artifacts", "ARTIFACTS_COUNT": "Artifacts",
"PULL_COUNT": "Pulls", "PULL_COUNT": "Pulls",
"PULL_COMMAND": "Comando Pull", "PULL_COMMAND": "Comando Pull",
@ -790,6 +790,7 @@
"SUB_TITLE_SUFIX": "logs" "SUB_TITLE_SUFIX": "logs"
}, },
"CONFIG": { "CONFIG": {
"HISTORY": "History",
"TITLE": "Configuración", "TITLE": "Configuración",
"AUTH": "Autentificación", "AUTH": "Autentificación",
"REPLICATION": "Replicación", "REPLICATION": "Replicación",

View File

@ -328,8 +328,8 @@
"ENABLE_ACCOUNT": "permettre à compte ", "ENABLE_ACCOUNT": "permettre à compte ",
"DELETE": "Supprimer", "DELETE": "Supprimer",
"CREAT_ROBOT_ACCOUNT": "créat robot compte ", "CREAT_ROBOT_ACCOUNT": "créat robot compte ",
"PERMISSIONS_IMAGE": "Image", "PERMISSIONS_ARTIFACT": "Artifact",
"PERMISSIONS_HELMCHART": "Helm Chart", "PERMISSIONS_HELMCHART": "Helm Chart (Chart Museum)",
"PUSH": "Push", "PUSH": "Push",
"PULL": "Pull", "PULL": "Pull",
"FILTER_PLACEHOLDER": "Filter Robot Accounts", "FILTER_PLACEHOLDER": "Filter Robot Accounts",
@ -631,7 +631,7 @@
"NAME": "Nom", "NAME": "Nom",
"TAGS": "Tags", "TAGS": "Tags",
"PLATFORM": "OS/ARCH", "PLATFORM": "OS/ARCH",
"ARTIFACT_TOOTIP": "Click this icon to enter the Artifact list of refer", "ARTIFACT_TOOTIP": "Click to view this OCI index's artifact list",
"ARTIFACTS_COUNT": "Artifacts", "ARTIFACTS_COUNT": "Artifacts",
"PULL_COUNT": "Pulls", "PULL_COUNT": "Pulls",
"PULL_COMMAND": "Commande de Pull", "PULL_COMMAND": "Commande de Pull",
@ -775,6 +775,7 @@
"SUB_TITLE_SUFIX": "logs" "SUB_TITLE_SUFIX": "logs"
}, },
"CONFIG": { "CONFIG": {
"HISTORY": "History",
"TITLE": "Configuration", "TITLE": "Configuration",
"AUTH": "Identification", "AUTH": "Identification",
"REPLICATION": "Réplication", "REPLICATION": "Réplication",

View File

@ -334,8 +334,8 @@
"ENABLE_ACCOUNT": "Ativar conta", "ENABLE_ACCOUNT": "Ativar conta",
"DELETE": "Remover", "DELETE": "Remover",
"CREAT_ROBOT_ACCOUNT": "CRIA robô conta", "CREAT_ROBOT_ACCOUNT": "CRIA robô conta",
"PERMISSIONS_IMAGE": "Image", "PERMISSIONS_ARTIFACT": "Artifact",
"PERMISSIONS_HELMCHART": "Helm Chart", "PERMISSIONS_HELMCHART": "Helm Chart (Chart Museum)",
"PUSH": "Push", "PUSH": "Push",
"PULL": "Pull", "PULL": "Pull",
"FILTER_PLACEHOLDER": "Filtro robot accounts", "FILTER_PLACEHOLDER": "Filtro robot accounts",
@ -642,7 +642,7 @@
"NAME": "Nome", "NAME": "Nome",
"TAGS": "Tags", "TAGS": "Tags",
"PLATFORM": "OS/ARCH", "PLATFORM": "OS/ARCH",
"ARTIFACT_TOOTIP": "Click this icon to enter the Artifact list of refer", "ARTIFACT_TOOTIP": "Click to view this OCI index's artifact list",
"ARTIFACTS_COUNT": "Artifacts", "ARTIFACTS_COUNT": "Artifacts",
"PULL_COUNT": "Pulls", "PULL_COUNT": "Pulls",
"PULL_COMMAND": "Comando de Pull", "PULL_COMMAND": "Comando de Pull",
@ -786,6 +786,7 @@
"SUB_TITLE_SUFIX": "logs" "SUB_TITLE_SUFIX": "logs"
}, },
"CONFIG": { "CONFIG": {
"HISTORY": "History",
"TITLE": "Configuração", "TITLE": "Configuração",
"AUTH": "Autenticação", "AUTH": "Autenticação",
"REPLICATION": "Replicação", "REPLICATION": "Replicação",

View File

@ -336,8 +336,8 @@
"ENABLE_ACCOUNT": "Hesabı Etkinleştir", "ENABLE_ACCOUNT": "Hesabı Etkinleştir",
"DELETE": "Sil", "DELETE": "Sil",
"CREAT_ROBOT_ACCOUNT": "Robot Hesabı Yarat", "CREAT_ROBOT_ACCOUNT": "Robot Hesabı Yarat",
"PERMISSIONS_IMAGE": "İmaj", "PERMISSIONS_ARTIFACT": "Artifact",
"PERMISSIONS_HELMCHART": "Helm Tablosu", "PERMISSIONS_HELMCHART": "Helm Tablosu (Chart Museum)",
"PUSH": "Yükle", "PUSH": "Yükle",
"PULL": "Çek", "PULL": "Çek",
"FILTER_PLACEHOLDER": "Robot Hesaplarını Filtrele", "FILTER_PLACEHOLDER": "Robot Hesaplarını Filtrele",
@ -642,7 +642,7 @@
"NAME": "İsim", "NAME": "İsim",
"TAGS": "Etiketler", "TAGS": "Etiketler",
"PLATFORM": "OS/ARCH", "PLATFORM": "OS/ARCH",
"ARTIFACT_TOOTIP": "Click this icon to enter the Artifact list of refer", "ARTIFACT_TOOTIP": "Click to view this OCI index's artifact list",
"ARTIFACTS_COUNT": "Artifacts", "ARTIFACTS_COUNT": "Artifacts",
"PULL_COUNT": "İndirmeler", "PULL_COUNT": "İndirmeler",
"PULL_COMMAND": "İndirme Komutu", "PULL_COMMAND": "İndirme Komutu",

View File

@ -335,8 +335,8 @@
"ENABLE_ACCOUNT": "启用账户", "ENABLE_ACCOUNT": "启用账户",
"DELETE": "删除", "DELETE": "删除",
"CREAT_ROBOT_ACCOUNT": "创建机器人账户", "CREAT_ROBOT_ACCOUNT": "创建机器人账户",
"PERMISSIONS_IMAGE": "镜像", "PERMISSIONS_ARTIFACT": "Artifact",
"PERMISSIONS_HELMCHART": "Helm Chart", "PERMISSIONS_HELMCHART": "Helm Chart (Chart Museum)",
"PUSH": "推送", "PUSH": "推送",
"PULL": "拉取", "PULL": "拉取",
"FILTER_PLACEHOLDER": "过滤机器人账户", "FILTER_PLACEHOLDER": "过滤机器人账户",
@ -643,7 +643,7 @@
"NAME": "名称", "NAME": "名称",
"TAGS": "Tags", "TAGS": "Tags",
"PLATFORM": "OS/ARCH", "PLATFORM": "OS/ARCH",
"ARTIFACT_TOOTIP": "Click this icon to enter the Artifact list of refer", "ARTIFACT_TOOTIP": "点击查看此 OCI 索引的 Artifact 列表",
"ARTIFACTS_COUNT": "Artifacts", "ARTIFACTS_COUNT": "Artifacts",
"PULL_COUNT": "下载数", "PULL_COUNT": "下载数",
"PULL_COMMAND": "Pull命令", "PULL_COMMAND": "Pull命令",
@ -790,6 +790,7 @@
"SUB_TITLE_SUFIX": "条日志" "SUB_TITLE_SUFIX": "条日志"
}, },
"CONFIG": { "CONFIG": {
"HISTORY": "历史记录",
"TITLE": "配置", "TITLE": "配置",
"AUTH": "认证模式", "AUTH": "认证模式",
"REPLICATION": "复制", "REPLICATION": "复制",
@ -1153,6 +1154,7 @@
"UNKNOWN": "未知", "UNKNOWN": "未知",
"STATUS": "状态", "STATUS": "状态",
"START_TIME": "创建时间", "START_TIME": "创建时间",
"CREATION_TIME": "创建时间",
"UPDATE_TIME": "更新时间", "UPDATE_TIME": "更新时间",
"LOGS": "日志", "LOGS": "日志",
"PENDING": "未开始", "PENDING": "未开始",

View File

@ -83,7 +83,7 @@
<select class="clr-select width-100" formControlName="value" #selectedValue id="{{'select_'+ supportedFilters[i]?.type}}" <select class="clr-select width-100" formControlName="value" #selectedValue id="{{'select_'+ supportedFilters[i]?.type}}"
name="{{supportedFilters[i]?.type}}"> name="{{supportedFilters[i]?.type}}">
<option value="">{{'REPLICATION.ALL' | translate}}</option> <option value="">{{'REPLICATION.ALL' | translate}}</option>
<option *ngFor="let value of supportedFilters[i]?.values;" value="{{value}}">{{value}}</option> <option *ngFor="let value of supportedFilters[i]?.values;" value="{{value}}">{{value}}{{value==='chart'? ' (chartmuseum)': ''}}</option>
</select> </select>
</div> </div>
<div class="select resource-box" *ngIf="supportedFilters[i]?.type==='label'&& supportedFilters[i]?.style==='list'"> <div class="select resource-box" *ngIf="supportedFilters[i]?.type==='label'&& supportedFilters[i]?.style==='list'">
@ -93,7 +93,7 @@
<ng-template ngFor let-label [ngForOf]="filter.value.value" let-m="index"> <ng-template ngFor let-label [ngForOf]="filter.value.value" let-m="index">
<span class="label" *ngIf="m<1"> {{label}} </span> <span class="label" *ngIf="m<1"> {{label}} </span>
</ng-template> </ng-template>
<span class="ellipsis" *ngIf="filter.value.value.length>1">···</span> <span class="ellipsis color-white-dark" *ngIf="filter.value.value.length>1">···</span>
<div *ngFor="let label1 of filter.value.value;let k = index" hidden="true"> <div *ngFor="let label1 of filter.value.value;let k = index" hidden="true">
<input type="text" [formControlName]="k" #labelValue id="{{'label_'+ supportedFilters[i]?.type + '_' + label1}}" name="{{'label_'+ supportedFilters[i]?.type + '_' + label1}}" <input type="text" [formControlName]="k" #labelValue id="{{'label_'+ supportedFilters[i]?.type + '_' + label1}}" name="{{'label_'+ supportedFilters[i]?.type + '_' + label1}}"
placeholder="select labels"> placeholder="select labels">

View File

@ -448,7 +448,7 @@ export class CreateEditRuleComponent implements OnInit, OnDestroy {
supportedFilter.values.forEach( value => { supportedFilter.values.forEach( value => {
this.supportedFilterLabels.push({ this.supportedFilterLabels.push({
name: value, name: value,
color: '#fff', color: '#FFFFFF',
select: false, select: false,
scope: 'g' scope: 'g'
}); });
@ -468,7 +468,7 @@ export class CreateEditRuleComponent implements OnInit, OnDestroy {
this.supportedFilterLabels = [ this.supportedFilterLabels = [
{ {
name: labelValue, name: labelValue,
color: '#fff', color: '#FFFFFF',
select: true, select: true,
scope: 'g' scope: 'g'
}, ...this.supportedFilterLabels]; }, ...this.supportedFilterLabels];

View File

@ -8,7 +8,6 @@
id="project-name" id="project-name"
class="clr-input w-90" class="clr-input w-90"
(keyup)='validateProjectName()' (keyup)='validateProjectName()'
(blur)='blurProjectInput()'
formControlName="projectName" autocomplete="off" /> formControlName="projectName" autocomplete="off" />
<clr-icon class="clr-validate-icon" shape="exclamation-circle"></clr-icon> <clr-icon class="clr-validate-icon" shape="exclamation-circle"></clr-icon>
<div class="select-box" [style.display]="selectedProjectList.length ? 'block' : 'none'"> <div class="select-box" [style.display]="selectedProjectList.length ? 'block' : 'none'">

View File

@ -76,10 +76,6 @@ export class ImageNameInputComponent implements OnInit, OnDestroy {
} }
} }
blurProjectInput(): void {
this.validateProjectName();
}
get form(): AbstractControl { get form(): AbstractControl {
return this.imageNameForm; return this.imageNameForm;
} }