mirror of
https://github.com/goharbor/harbor.git
synced 2025-02-10 08:51:36 +01:00
Fix ui issues found in testing day (#15015)
Signed-off-by: AllForNothing <sshijun@vmware.com>
This commit is contained in:
parent
a902f971e1
commit
50b44e13d2
@ -101,7 +101,7 @@
|
|||||||
[clrModalClosable]="false">
|
[clrModalClosable]="false">
|
||||||
|
|
||||||
<h3 class="modal-title">{{'PROFILE.ADMIN_CLI_SECRET_RESET_BUTTON' | translate}}</h3>
|
<h3 class="modal-title">{{'PROFILE.ADMIN_CLI_SECRET_RESET_BUTTON' | translate}}</h3>
|
||||||
<div class="modal-body">
|
<div class="modal-body upload-secret">
|
||||||
<form #resetSecretFrom="ngForm" class="clr-form reset-cli-form clr-form-horizontal">
|
<form #resetSecretFrom="ngForm" class="clr-form reset-cli-form clr-form-horizontal">
|
||||||
<clr-input-container>
|
<clr-input-container>
|
||||||
<label>{{'PROFILE.NEW_SECRET' | translate}}</label>
|
<label>{{'PROFILE.NEW_SECRET' | translate}}</label>
|
||||||
|
@ -45,4 +45,7 @@ clr-modal {
|
|||||||
}
|
}
|
||||||
.set-btns {
|
.set-btns {
|
||||||
display: flex;
|
display: flex;
|
||||||
}
|
}
|
||||||
|
:host::ng-deep.upload-secret {
|
||||||
|
width: 23rem;
|
||||||
|
}
|
||||||
|
@ -73,14 +73,13 @@
|
|||||||
[(ngModel)]="currentConfig.ldap_search_dn.value" id="ldapSearchDN" size="40"
|
[(ngModel)]="currentConfig.ldap_search_dn.value" id="ldapSearchDN" size="40"
|
||||||
[disabled]="disabled(currentConfig.ldap_search_dn)" />
|
[disabled]="disabled(currentConfig.ldap_search_dn)" />
|
||||||
</clr-input-container>
|
</clr-input-container>
|
||||||
|
|
||||||
<clr-input-container>
|
<clr-input-container>
|
||||||
<label for="ldapSearchPwd">{{'CONFIG.LDAP.SEARCH_PWD' | translate}}</label>
|
<label for="ldapSearchPwd">{{'CONFIG.LDAP.SEARCH_PWD' | translate}}</label>
|
||||||
|
<!--disable property should be consistent with 'ldap_search_dn', as the back end API won't return this fielder, -->
|
||||||
<input clrInput name="ldapSearchPwd" type="password" #ldapSearchPwdInput="ngModel"
|
<input clrInput name="ldapSearchPwd" type="password" #ldapSearchPwdInput="ngModel"
|
||||||
[(ngModel)]="currentConfig.ldap_search_password.value" id="ldapSearchPwd" size="40"
|
[(ngModel)]="currentConfig.ldap_search_password.value" id="ldapSearchPwd" size="40"
|
||||||
[disabled]="disabled(currentConfig.ldap_search_password)" />
|
[disabled]="disabled(currentConfig.ldap_search_dn)" />
|
||||||
</clr-input-container>
|
</clr-input-container>
|
||||||
|
|
||||||
<clr-input-container>
|
<clr-input-container>
|
||||||
<label for="ldapBaseDN" class="required">{{'CONFIG.LDAP.BASE_DN' | translate}}
|
<label for="ldapBaseDN" class="required">{{'CONFIG.LDAP.BASE_DN' | translate}}
|
||||||
<clr-tooltip>
|
<clr-tooltip>
|
||||||
|
@ -22,9 +22,10 @@
|
|||||||
</clr-input-container>
|
</clr-input-container>
|
||||||
<clr-input-container>
|
<clr-input-container>
|
||||||
<label for="emailPassword">{{'CONFIG.MAIL_PASSWORD' | translate}}</label>
|
<label for="emailPassword">{{'CONFIG.MAIL_PASSWORD' | translate}}</label>
|
||||||
|
<!--disable property should be consistent with 'email_username', as the back end API won't return this fielder, -->
|
||||||
<input clrInput name="emailPassword" type="password" #emailPasswordInput="ngModel"
|
<input clrInput name="emailPassword" type="password" #emailPasswordInput="ngModel"
|
||||||
[(ngModel)]="currentConfig.email_password.value" id="emailPassword" size="40"
|
[(ngModel)]="currentConfig.email_password.value" id="emailPassword" size="40"
|
||||||
[disabled]="disabled(currentConfig.email_password)" />
|
[disabled]="disabled(currentConfig.email_username)" />
|
||||||
</clr-input-container>
|
</clr-input-container>
|
||||||
<clr-input-container>
|
<clr-input-container>
|
||||||
<label for="emailFrom" class="required">{{'CONFIG.MAIL_FROM' | translate}}</label>
|
<label for="emailFrom" class="required">{{'CONFIG.MAIL_FROM' | translate}}</label>
|
||||||
@ -82,4 +83,4 @@
|
|||||||
<button type="button" id="ping-test" class="btn btn-outline" (click)="testMailServer()" [disabled]="!isMailConfigValid()">{{'BUTTON.TEST_MAIL'
|
<button type="button" id="ping-test" class="btn btn-outline" (click)="testMailServer()" [disabled]="!isMailConfigValid()">{{'BUTTON.TEST_MAIL'
|
||||||
| translate}}</button>
|
| translate}}</button>
|
||||||
<span id="forTestingMail" class="spinner spinner-inline" [hidden]="hideMailTestingSpinner"></span>
|
<span id="forTestingMail" class="spinner spinner-inline" [hidden]="hideMailTestingSpinner"></span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -160,7 +160,7 @@
|
|||||||
maxlength="255">
|
maxlength="255">
|
||||||
<clr-tooltip class="des-tooltip">
|
<clr-tooltip class="des-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-left" clrSize="md" *clrIfOpen>
|
<clr-tooltip-content clrPosition="top-left" clrSize="lg" *clrIfOpen>
|
||||||
<span>{{'TOOLTIP.DESTINATION_NAMESPACE' | translate}}</span>
|
<span>{{'TOOLTIP.DESTINATION_NAMESPACE' | translate}}</span>
|
||||||
</clr-tooltip-content>
|
</clr-tooltip-content>
|
||||||
</clr-tooltip>
|
</clr-tooltip>
|
||||||
@ -173,11 +173,11 @@
|
|||||||
<!--destination namespaces -->
|
<!--destination namespaces -->
|
||||||
<div class="clr-form-control">
|
<div class="clr-form-control">
|
||||||
<label for="dest_namespace_replace_count" class="clr-control-label"></label>
|
<label for="dest_namespace_replace_count" class="clr-control-label"></label>
|
||||||
<div class="clr-control-container" [class.clr-error]="ruleForm.controls.dest_namespace_replace_count.touched && ruleForm.controls.dest_namespace_replace_count.invalid">
|
<div class="clr-control-container">
|
||||||
<div class="input-width flex">
|
<div class="input-width flex">
|
||||||
<div class="clr-select-wrapper">
|
<div class="clr-select-wrapper">
|
||||||
<label class="sub-label">{{'REPLICATION.REPO_FLATTENING' | translate}}:</label>
|
<label class="sub-label">{{'REPLICATION.REPO_FLATTENING' | translate}}:</label>
|
||||||
<select id="dest_namespace_replace_count" formControlName="dest_namespace_replace_count" class="clr-select count-type">
|
<select [attr.disabled]="(ruleForm.controls.dest_namespace.invalid || !ruleForm.controls.dest_namespace.value) ? 'disabled' : null" id="dest_namespace_replace_count" formControlName="dest_namespace_replace_count" class="clr-select count-type">
|
||||||
<option *ngFor="let item of flattenLevelMap | keyvalue"
|
<option *ngFor="let item of flattenLevelMap | keyvalue"
|
||||||
[value]="item.key">{{item.value | translate}}</option>
|
[value]="item.key">{{item.value | translate}}</option>
|
||||||
</select>
|
</select>
|
||||||
@ -185,8 +185,13 @@
|
|||||||
<div class="clr-input-wrapper">
|
<div class="clr-input-wrapper">
|
||||||
<clr-tooltip class="des-tooltip">
|
<clr-tooltip class="des-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-left" clrSize="md" *clrIfOpen>
|
<clr-tooltip-content class="flatten" clrPosition="top-left" clrSize="lg" *clrIfOpen>
|
||||||
{{'REPLICATION.FLATTEN_LEVEL_TIP' | translate}}
|
<div>{{'REPLICATION.FLATTEN_LEVEL_TIP' | translate}}</div>
|
||||||
|
<div>{{'REPLICATION.FLATTEN_LEVEL_TIP_ALL' | translate}}</div>
|
||||||
|
<div>{{'REPLICATION.FLATTEN_LEVEL_TIP_NO' | translate}}</div>
|
||||||
|
<div>{{'REPLICATION.FLATTEN_LEVEL_TIP_1' | translate}}</div>
|
||||||
|
<div>{{'REPLICATION.FLATTEN_LEVEL_TIP_2' | translate}}</div>
|
||||||
|
<div>{{'REPLICATION.FLATTEN_LEVEL_TIP_3' | translate}}</div>
|
||||||
</clr-tooltip-content>
|
</clr-tooltip-content>
|
||||||
</clr-tooltip>
|
</clr-tooltip>
|
||||||
</div>
|
</div>
|
||||||
|
@ -304,3 +304,6 @@ clr-modal {
|
|||||||
.count-type {
|
.count-type {
|
||||||
width: 158px;
|
width: 158px;
|
||||||
}
|
}
|
||||||
|
:host::ng-deep.flatten {
|
||||||
|
width: 23rem!important;
|
||||||
|
}
|
||||||
|
@ -12,6 +12,7 @@ import {Project} from './project';
|
|||||||
import {SystemInfo, SystemInfoService} from '../../../../shared/services';
|
import {SystemInfo, SystemInfoService} from '../../../../shared/services';
|
||||||
import {UserPermissionService} from '../../../../shared/services';
|
import {UserPermissionService} from '../../../../shared/services';
|
||||||
import {USERSTATICPERMISSION} from '../../../../shared/services';
|
import {USERSTATICPERMISSION} from '../../../../shared/services';
|
||||||
|
import { EventService, HarborEvent } from "../../../../services/event-service/event.service";
|
||||||
|
|
||||||
|
|
||||||
const ONE_THOUSAND: number = 1000;
|
const ONE_THOUSAND: number = 1000;
|
||||||
@ -92,6 +93,7 @@ export class ProjectPolicyConfigComponent implements OnInit {
|
|||||||
private projectService: ProjectService,
|
private projectService: ProjectService,
|
||||||
private systemInfoService: SystemInfoService,
|
private systemInfoService: SystemInfoService,
|
||||||
private userPermission: UserPermissionService,
|
private userPermission: UserPermissionService,
|
||||||
|
private event: EventService
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -176,6 +178,8 @@ export class ProjectPolicyConfigComponent implements OnInit {
|
|||||||
|
|
||||||
refresh() {
|
refresh() {
|
||||||
this.retrieve();
|
this.retrieve();
|
||||||
|
// notify project detail component to refresh project info
|
||||||
|
this.event.publish(HarborEvent.REFRESH_PROJECT_INFO);
|
||||||
}
|
}
|
||||||
|
|
||||||
isValid() {
|
isValid() {
|
||||||
|
@ -25,6 +25,7 @@ import { ProjectService } from "../../../../../ng-swagger-gen/services/project.s
|
|||||||
import { ProjectSummaryQuota } from "../../../../../ng-swagger-gen/models/project-summary-quota";
|
import { ProjectSummaryQuota } from "../../../../../ng-swagger-gen/models/project-summary-quota";
|
||||||
import { QUOTA_DANGER_COEFFICIENT, QUOTA_WARNING_COEFFICIENT, QuotaUnits } from "../../../shared/entities/shared.const";
|
import { QUOTA_DANGER_COEFFICIENT, QUOTA_WARNING_COEFFICIENT, QuotaUnits } from "../../../shared/entities/shared.const";
|
||||||
import { clone, GetIntegerAndUnit, getSizeNumber, getSizeUnit } from "../../../shared/units/utils";
|
import { clone, GetIntegerAndUnit, getSizeNumber, getSizeUnit } from "../../../shared/units/utils";
|
||||||
|
import { EventService, HarborEvent } from "../../../services/event-service/event.service";
|
||||||
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
@ -134,6 +135,7 @@ export class ProjectDetailComponent implements OnInit, AfterViewInit, OnDestroy
|
|||||||
projectQuota: ProjectSummaryQuota;
|
projectQuota: ProjectSummaryQuota;
|
||||||
quotaDangerCoefficient: number = QUOTA_DANGER_COEFFICIENT;
|
quotaDangerCoefficient: number = QUOTA_DANGER_COEFFICIENT;
|
||||||
quotaWarningCoefficient: number = QUOTA_WARNING_COEFFICIENT;
|
quotaWarningCoefficient: number = QUOTA_WARNING_COEFFICIENT;
|
||||||
|
eventSub: Subscription;
|
||||||
constructor(
|
constructor(
|
||||||
private projectService: ProjectService,
|
private projectService: ProjectService,
|
||||||
private route: ActivatedRoute,
|
private route: ActivatedRoute,
|
||||||
@ -142,7 +144,8 @@ export class ProjectDetailComponent implements OnInit, AfterViewInit, OnDestroy
|
|||||||
private appConfigService: AppConfigService,
|
private appConfigService: AppConfigService,
|
||||||
private userPermissionService: UserPermissionService,
|
private userPermissionService: UserPermissionService,
|
||||||
private errorHandler: ErrorHandler,
|
private errorHandler: ErrorHandler,
|
||||||
private cdf: ChangeDetectorRef) {
|
private cdf: ChangeDetectorRef,
|
||||||
|
private event: EventService) {
|
||||||
this.hasSignedIn = this.sessionService.getCurrentUser() !== null;
|
this.hasSignedIn = this.sessionService.getCurrentUser() !== null;
|
||||||
this.route.data.subscribe(data => {
|
this.route.data.subscribe(data => {
|
||||||
this.currentProject = <Project>data['projectResolver'];
|
this.currentProject = <Project>data['projectResolver'];
|
||||||
@ -169,6 +172,11 @@ export class ProjectDetailComponent implements OnInit, AfterViewInit, OnDestroy
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
if (!this.eventSub) {
|
||||||
|
this.eventSub = this.event.subscribe(HarborEvent.REFRESH_PROJECT_INFO, () => {
|
||||||
|
this.refreshProjectInfo();
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ngAfterViewInit() {
|
ngAfterViewInit() {
|
||||||
@ -182,6 +190,10 @@ export class ProjectDetailComponent implements OnInit, AfterViewInit, OnDestroy
|
|||||||
this._subscription.unsubscribe();
|
this._subscription.unsubscribe();
|
||||||
this._subscription = null;
|
this._subscription = null;
|
||||||
}
|
}
|
||||||
|
if (this.eventSub) {
|
||||||
|
this.eventSub.unsubscribe();
|
||||||
|
this.eventSub = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
getPermissionsList(projectId: number): void {
|
getPermissionsList(projectId: number): void {
|
||||||
let permissionsList = [];
|
let permissionsList = [];
|
||||||
@ -315,4 +327,17 @@ export class ProjectDetailComponent implements OnInit, AfterViewInit, OnDestroy
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
refreshProjectInfo() {
|
||||||
|
this.getQuotaInfo();
|
||||||
|
this.getProject();
|
||||||
|
}
|
||||||
|
getProject() {
|
||||||
|
this.projectService.getProject({
|
||||||
|
projectNameOrId: this.projectId.toString()
|
||||||
|
}).subscribe(res => {
|
||||||
|
if (res) {
|
||||||
|
this.currentProject = <any>res as Project;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -412,8 +412,6 @@ export class ArtifactListTabComponent implements OnInit, OnDestroy {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.artifactList = res.body;
|
this.artifactList = res.body;
|
||||||
this.artifactList = doSorting<Artifact>(this.artifactList, state);
|
|
||||||
|
|
||||||
this.getPullCommand(this.artifactList);
|
this.getPullCommand(this.artifactList);
|
||||||
this.getArtifactTagsAsync(this.artifactList);
|
this.getArtifactTagsAsync(this.artifactList);
|
||||||
this.getIconsFromBackEnd();
|
this.getIconsFromBackEnd();
|
||||||
|
@ -53,6 +53,7 @@ import { HttpErrorResponse } from "@angular/common/http";
|
|||||||
import { errorHandler } from "../../../shared/units/shared.utils";
|
import { errorHandler } from "../../../shared/units/shared.utils";
|
||||||
import { ConfirmationAcknowledgement } from "../../global-confirmation-dialog/confirmation-state-message";
|
import { ConfirmationAcknowledgement } from "../../global-confirmation-dialog/confirmation-state-message";
|
||||||
import { ConfirmationMessage } from "../../global-confirmation-dialog/confirmation-message";
|
import { ConfirmationMessage } from "../../global-confirmation-dialog/confirmation-message";
|
||||||
|
import { EventService, HarborEvent } from "../../../services/event-service/event.service";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: "hbr-repository-gridview",
|
selector: "hbr-repository-gridview",
|
||||||
@ -109,6 +110,7 @@ export class RepositoryGridviewComponent implements OnChanges, OnInit, OnDestroy
|
|||||||
private route: ActivatedRoute,
|
private route: ActivatedRoute,
|
||||||
private session: SessionService,
|
private session: SessionService,
|
||||||
private router: Router,
|
private router: Router,
|
||||||
|
private event: EventService
|
||||||
) {
|
) {
|
||||||
if (localStorage) {
|
if (localStorage) {
|
||||||
this.isCardView = localStorage.getItem(CARD_VIEW_LOCALSTORAGE_KEY) === TRUE_STR;
|
this.isCardView = localStorage.getItem(CARD_VIEW_LOCALSTORAGE_KEY) === TRUE_STR;
|
||||||
@ -329,6 +331,8 @@ export class RepositoryGridviewComponent implements OnChanges, OnInit, OnDestroy
|
|||||||
|
|
||||||
refresh() {
|
refresh() {
|
||||||
this.doSearchRepoNames("");
|
this.doSearchRepoNames("");
|
||||||
|
// notify project detail component to refresh project info
|
||||||
|
this.event.publish(HarborEvent.REFRESH_PROJECT_INFO);
|
||||||
}
|
}
|
||||||
|
|
||||||
loadNextPage() {
|
loadNextPage() {
|
||||||
|
@ -56,5 +56,6 @@ export class EventService {
|
|||||||
|
|
||||||
export enum HarborEvent {
|
export enum HarborEvent {
|
||||||
SCROLL = 'scroll',
|
SCROLL = 'scroll',
|
||||||
SCROLL_TO_POSITION = 'scrollToPosition'
|
SCROLL_TO_POSITION = 'scrollToPosition',
|
||||||
|
REFRESH_PROJECT_INFO = 'refreshProjectInfo'
|
||||||
}
|
}
|
||||||
|
@ -637,7 +637,12 @@
|
|||||||
"FLATTEN_LEVEL_2": "Flatten 2 Levels",
|
"FLATTEN_LEVEL_2": "Flatten 2 Levels",
|
||||||
"FLATTEN_LEVEL_3": "Flatten 3 Levels",
|
"FLATTEN_LEVEL_3": "Flatten 3 Levels",
|
||||||
"FLATTEN_ALL": "Flatten All Levels",
|
"FLATTEN_ALL": "Flatten All Levels",
|
||||||
"FLATTEN_LEVEL_TIP": "Reduce the nested repository structure when copying images. Default 'Flatten 1 Level' will replace the left most repository component with the destination namespace a/b/c/img -> ns/b/c/img. 'Flatten all Levels' is the legacy option used prior v2.3 resulting in a/b/c/img -> ns/img."
|
"FLATTEN_LEVEL_TIP": "Reduce the nested repository structure when copying images. Assuming that the nested repository structure is 'a/b/c/d/img' and the destination namespace is 'ns', the corresponding results of each item are as below:",
|
||||||
|
"FLATTEN_LEVEL_TIP_ALL": "'Flatten All Levels'(Used prior v2.3): 'a/b/c/d/img' -> 'ns/img'",
|
||||||
|
"FLATTEN_LEVEL_TIP_NO": "'No Flatting': 'a/b/c/d/img' -> 'ns/a/b/c/d/img",
|
||||||
|
"FLATTEN_LEVEL_TIP_1": "'Flatten 1 Level'(Default): 'a/b/c/d/img' -> 'ns/b/c/d/img'",
|
||||||
|
"FLATTEN_LEVEL_TIP_2": "'Flatten 2 Levels': 'a/b/c/d/img' -> 'ns/c/d/img'",
|
||||||
|
"FLATTEN_LEVEL_TIP_3": "'Flatten 3 Levels': 'a/b/c/d/img' -> 'ns/d/img'"
|
||||||
},
|
},
|
||||||
"DESTINATION": {
|
"DESTINATION": {
|
||||||
"NEW_ENDPOINT": "Neuer Endpunkt",
|
"NEW_ENDPOINT": "Neuer Endpunkt",
|
||||||
@ -672,7 +677,7 @@
|
|||||||
"CANNOT_EDIT": "Endpunkt kann nicht geändert werden, während die Replikationsregel aktiviert ist.",
|
"CANNOT_EDIT": "Endpunkt kann nicht geändert werden, während die Replikationsregel aktiviert ist.",
|
||||||
"FAILED_TO_DELETE_TARGET_IN_USED": "Genutzter Endpunkt konnte nicht gelöscht werden.",
|
"FAILED_TO_DELETE_TARGET_IN_USED": "Genutzter Endpunkt konnte nicht gelöscht werden.",
|
||||||
"PLACEHOLDER": "Wir konnten keine Endpunkt finden.",
|
"PLACEHOLDER": "Wir konnten keine Endpunkt finden.",
|
||||||
"DEPRECATED": "Helm Hub wird nach Artifact Hub migriert"
|
"DEPRECATED": "Helm Hub wird nach Artifact Hub migriert"
|
||||||
},
|
},
|
||||||
"REPOSITORY": {
|
"REPOSITORY": {
|
||||||
"COPY_DIGEST_ID": "Kopiere Digest",
|
"COPY_DIGEST_ID": "Kopiere Digest",
|
||||||
|
@ -637,7 +637,12 @@
|
|||||||
"FLATTEN_LEVEL_2": "Flatten 2 Levels",
|
"FLATTEN_LEVEL_2": "Flatten 2 Levels",
|
||||||
"FLATTEN_LEVEL_3": "Flatten 3 Levels",
|
"FLATTEN_LEVEL_3": "Flatten 3 Levels",
|
||||||
"FLATTEN_ALL": "Flatten All Levels",
|
"FLATTEN_ALL": "Flatten All Levels",
|
||||||
"FLATTEN_LEVEL_TIP": "Reduce the nested repository structure when copying images. Default 'Flatten 1 Level' will replace the left most repository component with the destination namespace a/b/c/img -> ns/b/c/img. 'Flatten all Levels' is the legacy option used prior v2.3 resulting in a/b/c/img -> ns/img."
|
"FLATTEN_LEVEL_TIP": "Reduce the nested repository structure when copying images. Assuming that the nested repository structure is 'a/b/c/d/img' and the destination namespace is 'ns', the corresponding results of each item are as below:",
|
||||||
|
"FLATTEN_LEVEL_TIP_ALL": "'Flatten All Levels'(Used prior v2.3): 'a/b/c/d/img' -> 'ns/img'",
|
||||||
|
"FLATTEN_LEVEL_TIP_NO": "'No Flatting': 'a/b/c/d/img' -> 'ns/a/b/c/d/img",
|
||||||
|
"FLATTEN_LEVEL_TIP_1": "'Flatten 1 Level'(Default): 'a/b/c/d/img' -> 'ns/b/c/d/img'",
|
||||||
|
"FLATTEN_LEVEL_TIP_2": "'Flatten 2 Levels': 'a/b/c/d/img' -> 'ns/c/d/img'",
|
||||||
|
"FLATTEN_LEVEL_TIP_3": "'Flatten 3 Levels': 'a/b/c/d/img' -> 'ns/d/img'"
|
||||||
},
|
},
|
||||||
"DESTINATION": {
|
"DESTINATION": {
|
||||||
"NEW_ENDPOINT": "New Endpoint",
|
"NEW_ENDPOINT": "New Endpoint",
|
||||||
|
@ -638,7 +638,12 @@
|
|||||||
"FLATTEN_LEVEL_2": "Flatten 2 Levels",
|
"FLATTEN_LEVEL_2": "Flatten 2 Levels",
|
||||||
"FLATTEN_LEVEL_3": "Flatten 3 Levels",
|
"FLATTEN_LEVEL_3": "Flatten 3 Levels",
|
||||||
"FLATTEN_ALL": "Flatten All Levels",
|
"FLATTEN_ALL": "Flatten All Levels",
|
||||||
"FLATTEN_LEVEL_TIP": "Reduce the nested repository structure when copying images. Default 'Flatten 1 Level' will replace the left most repository component with the destination namespace a/b/c/img -> ns/b/c/img. 'Flatten all Levels' is the legacy option used prior v2.3 resulting in a/b/c/img -> ns/img."
|
"FLATTEN_LEVEL_TIP": "Reduce the nested repository structure when copying images. Assuming that the nested repository structure is 'a/b/c/d/img' and the destination namespace is 'ns', the corresponding results of each item are as below:",
|
||||||
|
"FLATTEN_LEVEL_TIP_ALL": "'Flatten All Levels'(Used prior v2.3): 'a/b/c/d/img' -> 'ns/img'",
|
||||||
|
"FLATTEN_LEVEL_TIP_NO": "'No Flatting': 'a/b/c/d/img' -> 'ns/a/b/c/d/img",
|
||||||
|
"FLATTEN_LEVEL_TIP_1": "'Flatten 1 Level'(Default): 'a/b/c/d/img' -> 'ns/b/c/d/img'",
|
||||||
|
"FLATTEN_LEVEL_TIP_2": "'Flatten 2 Levels': 'a/b/c/d/img' -> 'ns/c/d/img'",
|
||||||
|
"FLATTEN_LEVEL_TIP_3": "'Flatten 3 Levels': 'a/b/c/d/img' -> 'ns/d/img'"
|
||||||
},
|
},
|
||||||
"DESTINATION": {
|
"DESTINATION": {
|
||||||
"NEW_ENDPOINT": "Nuevo Endpoint",
|
"NEW_ENDPOINT": "Nuevo Endpoint",
|
||||||
|
@ -627,7 +627,12 @@
|
|||||||
"FLATTEN_LEVEL_2": "Flatten 2 Levels",
|
"FLATTEN_LEVEL_2": "Flatten 2 Levels",
|
||||||
"FLATTEN_LEVEL_3": "Flatten 3 Levels",
|
"FLATTEN_LEVEL_3": "Flatten 3 Levels",
|
||||||
"FLATTEN_ALL": "Flatten All Levels",
|
"FLATTEN_ALL": "Flatten All Levels",
|
||||||
"FLATTEN_LEVEL_TIP": "Reduce the nested repository structure when copying images. Default 'Flatten 1 Level' will replace the left most repository component with the destination namespace a/b/c/img -> ns/b/c/img. 'Flatten all Levels' is the legacy option used prior v2.3 resulting in a/b/c/img -> ns/img."
|
"FLATTEN_LEVEL_TIP": "Reduce the nested repository structure when copying images. Assuming that the nested repository structure is 'a/b/c/d/img' and the destination namespace is 'ns', the corresponding results of each item are as below:",
|
||||||
|
"FLATTEN_LEVEL_TIP_ALL": "'Flatten All Levels'(Used prior v2.3): 'a/b/c/d/img' -> 'ns/img'",
|
||||||
|
"FLATTEN_LEVEL_TIP_NO": "'No Flatting': 'a/b/c/d/img' -> 'ns/a/b/c/d/img",
|
||||||
|
"FLATTEN_LEVEL_TIP_1": "'Flatten 1 Level'(Default): 'a/b/c/d/img' -> 'ns/b/c/d/img'",
|
||||||
|
"FLATTEN_LEVEL_TIP_2": "'Flatten 2 Levels': 'a/b/c/d/img' -> 'ns/c/d/img'",
|
||||||
|
"FLATTEN_LEVEL_TIP_3": "'Flatten 3 Levels': 'a/b/c/d/img' -> 'ns/d/img'"
|
||||||
},
|
},
|
||||||
"DESTINATION": {
|
"DESTINATION": {
|
||||||
"NEW_ENDPOINT": "Nouveau Point Final",
|
"NEW_ENDPOINT": "Nouveau Point Final",
|
||||||
|
@ -637,7 +637,12 @@
|
|||||||
"FLATTEN_LEVEL_2": "Flatten 2 Levels",
|
"FLATTEN_LEVEL_2": "Flatten 2 Levels",
|
||||||
"FLATTEN_LEVEL_3": "Flatten 3 Levels",
|
"FLATTEN_LEVEL_3": "Flatten 3 Levels",
|
||||||
"FLATTEN_ALL": "Flatten All Levels",
|
"FLATTEN_ALL": "Flatten All Levels",
|
||||||
"FLATTEN_LEVEL_TIP": "Reduce the nested repository structure when copying images. Default 'Flatten 1 Level' will replace the left most repository component with the destination namespace a/b/c/img -> ns/b/c/img. 'Flatten all Levels' is the legacy option used prior v2.3 resulting in a/b/c/img -> ns/img."
|
"FLATTEN_LEVEL_TIP": "Reduce the nested repository structure when copying images. Assuming that the nested repository structure is 'a/b/c/d/img' and the destination namespace is 'ns', the corresponding results of each item are as below:",
|
||||||
|
"FLATTEN_LEVEL_TIP_ALL": "'Flatten All Levels'(Used prior v2.3): 'a/b/c/d/img' -> 'ns/img'",
|
||||||
|
"FLATTEN_LEVEL_TIP_NO": "'No Flatting': 'a/b/c/d/img' -> 'ns/a/b/c/d/img",
|
||||||
|
"FLATTEN_LEVEL_TIP_1": "'Flatten 1 Level'(Default): 'a/b/c/d/img' -> 'ns/b/c/d/img'",
|
||||||
|
"FLATTEN_LEVEL_TIP_2": "'Flatten 2 Levels': 'a/b/c/d/img' -> 'ns/c/d/img'",
|
||||||
|
"FLATTEN_LEVEL_TIP_3": "'Flatten 3 Levels': 'a/b/c/d/img' -> 'ns/d/img'"
|
||||||
},
|
},
|
||||||
"DESTINATION": {
|
"DESTINATION": {
|
||||||
"NEW_ENDPOINT": "Novo Endpoint",
|
"NEW_ENDPOINT": "Novo Endpoint",
|
||||||
|
@ -637,7 +637,12 @@
|
|||||||
"FLATTEN_LEVEL_2": "Flatten 2 Levels",
|
"FLATTEN_LEVEL_2": "Flatten 2 Levels",
|
||||||
"FLATTEN_LEVEL_3": "Flatten 3 Levels",
|
"FLATTEN_LEVEL_3": "Flatten 3 Levels",
|
||||||
"FLATTEN_ALL": "Flatten All Levels",
|
"FLATTEN_ALL": "Flatten All Levels",
|
||||||
"FLATTEN_LEVEL_TIP": "Reduce the nested repository structure when copying images. Default 'Flatten 1 Level' will replace the left most repository component with the destination namespace a/b/c/img -> ns/b/c/img. 'Flatten all Levels' is the legacy option used prior v2.3 resulting in a/b/c/img -> ns/img."
|
"FLATTEN_LEVEL_TIP": "Reduce the nested repository structure when copying images. Assuming that the nested repository structure is 'a/b/c/d/img' and the destination namespace is 'ns', the corresponding results of each item are as below:",
|
||||||
|
"FLATTEN_LEVEL_TIP_ALL": "'Flatten All Levels'(Used prior v2.3): 'a/b/c/d/img' -> 'ns/img'",
|
||||||
|
"FLATTEN_LEVEL_TIP_NO": "'No Flatting': 'a/b/c/d/img' -> 'ns/a/b/c/d/img",
|
||||||
|
"FLATTEN_LEVEL_TIP_1": "'Flatten 1 Level'(Default): 'a/b/c/d/img' -> 'ns/b/c/d/img'",
|
||||||
|
"FLATTEN_LEVEL_TIP_2": "'Flatten 2 Levels': 'a/b/c/d/img' -> 'ns/c/d/img'",
|
||||||
|
"FLATTEN_LEVEL_TIP_3": "'Flatten 3 Levels': 'a/b/c/d/img' -> 'ns/d/img'"
|
||||||
},
|
},
|
||||||
"DESTINATION": {
|
"DESTINATION": {
|
||||||
"NEW_ENDPOINT": "Yeni Uç Nokta",
|
"NEW_ENDPOINT": "Yeni Uç Nokta",
|
||||||
|
@ -639,7 +639,12 @@
|
|||||||
"FLATTEN_LEVEL_2": "替换2级",
|
"FLATTEN_LEVEL_2": "替换2级",
|
||||||
"FLATTEN_LEVEL_3": "替换3级",
|
"FLATTEN_LEVEL_3": "替换3级",
|
||||||
"FLATTEN_ALL": "替换所有级",
|
"FLATTEN_ALL": "替换所有级",
|
||||||
"FLATTEN_LEVEL_TIP": "此项用以在复制镜像时减少仓库的层级结构。默认值'替换1级'表示将用目标名称空间替换仓库的最左侧一级,例如:a/b/c/img -> namespace/b/c/img,其他替换层级以此类推。'替换所有级'是v2.3之前版本所使用的行为,它表示 a/b/c/img -> namespace/img。"
|
"FLATTEN_LEVEL_TIP": "此项用以在复制镜像时减少仓库的层级结构。假设仓库的层级结构为 'a/b/c/d/img' 且目标名称空间为 'ns',则每一项对应的结果如下:",
|
||||||
|
"FLATTEN_LEVEL_TIP_ALL": "'替换所有级'(v2.3之前版本所使用的行为): 'a/b/c/d/img' -> 'ns/img'",
|
||||||
|
"FLATTEN_LEVEL_TIP_NO": "'无替换': 'a/b/c/d/img' -> 'ns/a/b/c/d/img",
|
||||||
|
"FLATTEN_LEVEL_TIP_1": "'替换1级'(默认项): 'a/b/c/d/img' -> 'ns/b/c/d/img'",
|
||||||
|
"FLATTEN_LEVEL_TIP_2": "'替换2级': 'a/b/c/d/img' -> 'ns/c/d/img'",
|
||||||
|
"FLATTEN_LEVEL_TIP_3": "'替换3级': 'a/b/c/d/img' -> 'ns/d/img'"
|
||||||
},
|
},
|
||||||
"DESTINATION": {
|
"DESTINATION": {
|
||||||
"NEW_ENDPOINT": "新建目标",
|
"NEW_ENDPOINT": "新建目标",
|
||||||
|
@ -634,7 +634,12 @@
|
|||||||
"FLATTEN_LEVEL_2": "Flatten 2 Levels",
|
"FLATTEN_LEVEL_2": "Flatten 2 Levels",
|
||||||
"FLATTEN_LEVEL_3": "Flatten 3 Levels",
|
"FLATTEN_LEVEL_3": "Flatten 3 Levels",
|
||||||
"FLATTEN_ALL": "Flatten All Levels",
|
"FLATTEN_ALL": "Flatten All Levels",
|
||||||
"FLATTEN_LEVEL_TIP": "Reduce the nested repository structure when copying images. Default 'Flatten 1 Level' will replace the left most repository component with the destination namespace a/b/c/img -> ns/b/c/img. 'Flatten all Levels' is the legacy option used prior v2.3 resulting in a/b/c/img -> ns/img."
|
"FLATTEN_LEVEL_TIP": "Reduce the nested repository structure when copying images. Assuming that the nested repository structure is 'a/b/c/d/img' and the destination namespace is 'ns', the corresponding results of each item are as below:",
|
||||||
|
"FLATTEN_LEVEL_TIP_ALL": "'Flatten All Levels'(Used prior v2.3): 'a/b/c/d/img' -> 'ns/img'",
|
||||||
|
"FLATTEN_LEVEL_TIP_NO": "'No Flatting': 'a/b/c/d/img' -> 'ns/a/b/c/d/img",
|
||||||
|
"FLATTEN_LEVEL_TIP_1": "'Flatten 1 Level'(Default): 'a/b/c/d/img' -> 'ns/b/c/d/img'",
|
||||||
|
"FLATTEN_LEVEL_TIP_2": "'Flatten 2 Levels': 'a/b/c/d/img' -> 'ns/c/d/img'",
|
||||||
|
"FLATTEN_LEVEL_TIP_3": "'Flatten 3 Levels': 'a/b/c/d/img' -> 'ns/d/img'"
|
||||||
},
|
},
|
||||||
"DESTINATION":{
|
"DESTINATION":{
|
||||||
"NEW_ENDPOINT": "新建目標",
|
"NEW_ENDPOINT": "新建目標",
|
||||||
|
Loading…
Reference in New Issue
Block a user