mirror of
https://github.com/goharbor/harbor.git
synced 2024-09-28 13:27:31 +02:00
fix issue about pull command in repository
This commit is contained in:
parent
e79334a445
commit
54e0d34f7f
@ -1,4 +1,4 @@
|
||||
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
||||
import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';
|
||||
|
||||
import { COPY_INPUT_HTML } from './copy-input.html';
|
||||
import { PUSH_IMAGE_STYLE } from './push-image.css';
|
||||
@ -14,16 +14,19 @@ export const enum CopyStatus {
|
||||
|
||||
providers: []
|
||||
})
|
||||
export class CopyInputComponent {
|
||||
|
||||
export class CopyInputComponent implements OnInit {
|
||||
@Input() inputSize: number = 40;
|
||||
@Input() headerTitle: string = "Copy Input";
|
||||
@Input() defaultValue: string = "N/A";
|
||||
@Input() iconMode: boolean = false;
|
||||
|
||||
state: CopyStatus = CopyStatus.NORMAL;
|
||||
|
||||
@Output() onCopySuccess: EventEmitter<any> = new EventEmitter<any>();
|
||||
@Output() onCopyError: EventEmitter<any> = new EventEmitter<any>();
|
||||
|
||||
ngOnInit(): void { }
|
||||
onSuccess($event: any): void {
|
||||
this.state = CopyStatus.SUCCESS;
|
||||
this.onCopySuccess.emit($event);
|
||||
@ -38,6 +41,10 @@ export class CopyInputComponent {
|
||||
this.state = CopyStatus.NORMAL;
|
||||
}
|
||||
|
||||
setPullCommendShow(): void {
|
||||
this.iconMode = false;
|
||||
}
|
||||
|
||||
public get isCopied(): boolean {
|
||||
return this.state === CopyStatus.SUCCESS;
|
||||
}
|
||||
|
@ -1,15 +1,19 @@
|
||||
export const COPY_INPUT_HTML: string = `
|
||||
<div>
|
||||
<div class="command-title">
|
||||
<div class="command-title" *ngIf="!iconMode">
|
||||
{{headerTitle}}
|
||||
</div>
|
||||
<div>
|
||||
<span>
|
||||
<span [class.hide]="iconMode">
|
||||
<input type="text" class="command-input" size="{{inputSize}}" [(ngModel)]="defaultValue" #inputTarget readonly/>
|
||||
</span>
|
||||
<span>
|
||||
<clr-icon shape="copy" [class.is-success]="isCopied" [class.is-error]="hasCopyError" class="info-tips-icon" size="24" [ngxClipboard]="inputTarget" (cbOnSuccess)="onSuccess($event)" (cbOnError)="onError($event)"></clr-icon>
|
||||
<input type="text" size="{{inputSize}}" [(ngModel)]="defaultValue" #inputTarget1 style="width: 1px; min-width: 0px; padding: 0;">
|
||||
</span>
|
||||
<span>
|
||||
<clr-icon shape="copy" [class.is-success]="isCopied" [class.is-error]="hasCopyError" class="info-tips-icon" size="24" [ngxClipboard]="inputTarget1" (cbOnSuccess)="onSuccess($event)" (cbOnError)="onError($event)"></clr-icon>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
`;
|
@ -43,4 +43,7 @@ export const PUSH_IMAGE_STYLE: string = `
|
||||
.btn-font {
|
||||
font-size: 14px !important;
|
||||
}
|
||||
.hide{
|
||||
display:none;
|
||||
}
|
||||
`;
|
@ -15,12 +15,12 @@ export const TAG_TEMPLATE = `
|
||||
|
||||
<h2 *ngIf="!isEmbedded" class="sub-header-title">{{repoName}}</h2>
|
||||
<clr-datagrid [clrDgLoading]="loading" [class.embeded-datagrid]="isEmbedded">
|
||||
<clr-dg-column style="width: 80px;" [clrDgField]="'name'">{{'REPOSITORY.TAG' | translate}}</clr-dg-column>
|
||||
<clr-dg-column style="width: 80px;" [clrDgField]="'size'">{{'REPOSITORY.SIZE' | translate}}</clr-dg-column>
|
||||
<clr-dg-column style="min-width: 180px;">{{'REPOSITORY.PULL_COMMAND' | translate}}</clr-dg-column>
|
||||
<clr-dg-column style="width: 160px;" *ngIf="withClair">{{'VULNERABILITY.SINGULAR' | translate}}</clr-dg-column>
|
||||
<clr-dg-column style="min-width: 160px;" [clrDgField]="'name'">{{'REPOSITORY.TAG' | translate}}</clr-dg-column>
|
||||
<clr-dg-column style="width: 90px;" [clrDgField]="'size'">{{'REPOSITORY.SIZE' | translate}}</clr-dg-column>
|
||||
<clr-dg-column style="min-width: 120px; max-width:220px;">{{'REPOSITORY.PULL_COMMAND' | translate}}</clr-dg-column>
|
||||
<clr-dg-column style="width: 140px;" *ngIf="withClair">{{'VULNERABILITY.SINGULAR' | translate}}</clr-dg-column>
|
||||
<clr-dg-column style="width: 80px;" *ngIf="withNotary">{{'REPOSITORY.SIGNED' | translate}}</clr-dg-column>
|
||||
<clr-dg-column style="width: 100px;">{{'REPOSITORY.AUTHOR' | translate}}</clr-dg-column>
|
||||
<clr-dg-column style="width: 130px;">{{'REPOSITORY.AUTHOR' | translate}}</clr-dg-column>
|
||||
<clr-dg-column style="width: 160px;"[clrDgSortBy]="createdComparator">{{'REPOSITORY.CREATED' | translate}}</clr-dg-column>
|
||||
<clr-dg-column style="width: 80px;" [clrDgField]="'docker_version'" *ngIf="!withClair">{{'REPOSITORY.DOCKER_VERSION' | translate}}</clr-dg-column>
|
||||
<clr-dg-placeholder>{{'TGA.PLACEHOLDER' | translate }}</clr-dg-placeholder>
|
||||
@ -30,13 +30,15 @@ export const TAG_TEMPLATE = `
|
||||
<button class="action-item" *ngIf="hasProjectAdminRole" (click)="deleteTag(t)">{{'REPOSITORY.DELETE' | translate}}</button>
|
||||
<button class="action-item" (click)="showDigestId(t)">{{'REPOSITORY.COPY_DIGEST_ID' | translate}}</button>
|
||||
</clr-dg-action-overflow>
|
||||
<clr-dg-cell style="width: 80px;" [ngSwitch]="existObservablePackage(t)">
|
||||
<a *ngSwitchCase="true" href="javascript:void(0)" (click)="onTagClick(t)">{{t.name}}</a>
|
||||
<clr-dg-cell class="truncated" style="min-width: 160px;" [ngSwitch]="withClair">
|
||||
<a *ngSwitchCase="true" href="javascript:void(0)" (click)="onTagClick(t)" title="{{t.name}}">{{t.name}}</a>
|
||||
<span *ngSwitchDefault>{{t.name}}</span>
|
||||
</clr-dg-cell>
|
||||
<clr-dg-cell style="width: 80px;">{{t.size}}</clr-dg-cell>
|
||||
<clr-dg-cell style="min-width: 180px;" class="truncated" title="docker pull {{registryUrl}}/{{repoName}}:{{t.name}}">docker pull {{registryUrl}}/{{repoName}}:{{t.name}}</clr-dg-cell>
|
||||
<clr-dg-cell style="width: 160px;" *ngIf="withClair">
|
||||
<clr-dg-cell style="width: 90px;">{{t.size}}</clr-dg-cell>
|
||||
<clr-dg-cell style="min-width: 120px; max-width:220px;" class="truncated" title="docker pull {{registryUrl}}/{{repoName}}:{{t.name}}">
|
||||
<hbr-copy-input #copyInput (onCopyError)="onCpError($event)" iconMode="true" defaultValue="docker pull {{registryUrl}}/{{repoName}}:{{t.name}}"></hbr-copy-input>
|
||||
</clr-dg-cell>
|
||||
<clr-dg-cell style="width: 140px;" *ngIf="withClair">
|
||||
<hbr-vulnerability-bar [repoName]="repoName" [tagId]="t.name" [summary]="t.scan_overview"></hbr-vulnerability-bar>
|
||||
</clr-dg-cell>
|
||||
<clr-dg-cell style="width: 80px;" *ngIf="withNotary" [ngSwitch]="t.signature !== null">
|
||||
@ -47,7 +49,7 @@ export const TAG_TEMPLATE = `
|
||||
<span class="tooltip-content">{{'REPOSITORY.NOTARY_IS_UNDETERMINED' | translate}}</span>
|
||||
</a>
|
||||
</clr-dg-cell>
|
||||
<clr-dg-cell style="width: 100px;">{{t.author}}</clr-dg-cell>
|
||||
<clr-dg-cell class="truncated" style="width: 130px;" title="{{t.author}}">{{t.author}}</clr-dg-cell>
|
||||
<clr-dg-cell style="width: 160px;">{{t.created | date: 'short'}}</clr-dg-cell>
|
||||
<clr-dg-cell style="width: 80px;" *ngIf="!withClair">{{t.docker_version}}</clr-dg-cell>
|
||||
</clr-dg-row>
|
||||
|
@ -18,6 +18,7 @@ import { Observable, Subscription } from 'rxjs/Rx';
|
||||
import { ChannelService } from '../channel/index';
|
||||
|
||||
import { JobLogViewerComponent } from '../job-log-viewer/index';
|
||||
import {CopyInputComponent} from "../push-image/copy-input.component";
|
||||
|
||||
describe('TagComponent (inline template)', () => {
|
||||
|
||||
@ -53,7 +54,8 @@ describe('TagComponent (inline template)', () => {
|
||||
ConfirmationDialogComponent,
|
||||
VULNERABILITY_DIRECTIVES,
|
||||
FILTER_DIRECTIVES,
|
||||
JobLogViewerComponent
|
||||
JobLogViewerComponent,
|
||||
CopyInputComponent
|
||||
],
|
||||
providers: [
|
||||
ErrorHandler,
|
||||
|
@ -50,6 +50,7 @@ import {
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
||||
import { State, Comparator } from 'clarity-angular';
|
||||
import {CopyInputComponent} from "../push-image/copy-input.component";
|
||||
|
||||
@Component({
|
||||
selector: 'hbr-tag',
|
||||
@ -91,6 +92,8 @@ export class TagComponent implements OnInit {
|
||||
confirmationDialog: ConfirmationDialogComponent;
|
||||
|
||||
@ViewChild('digestTarget') textInput: ElementRef;
|
||||
@ViewChild('copyInput') copyInput: CopyInputComponent;
|
||||
|
||||
|
||||
constructor(
|
||||
private errorHandler: ErrorHandler,
|
||||
@ -253,7 +256,7 @@ export class TagComponent implements OnInit {
|
||||
}
|
||||
}
|
||||
|
||||
//Get vulnerability scanning status
|
||||
//Get vulnerability scanning status
|
||||
scanStatus(t: Tag): string {
|
||||
if (t && t.scan_overview && t.scan_overview.scan_status) {
|
||||
return t.scan_overview.scan_status;
|
||||
@ -285,4 +288,9 @@ export class TagComponent implements OnInit {
|
||||
this.channel.publishScanEvent(this.repoName + "/" + tagId);
|
||||
}
|
||||
}
|
||||
|
||||
//pull command
|
||||
onCpError($event: any): void {
|
||||
this.copyInput.setPullCommendShow();
|
||||
}
|
||||
}
|
||||
|
@ -31,7 +31,7 @@
|
||||
"clarity-icons": "^0.9.8",
|
||||
"clarity-ui": "^0.9.8",
|
||||
"core-js": "^2.4.1",
|
||||
"harbor-ui": "0.4.72",
|
||||
"harbor-ui": "0.4.83",
|
||||
"intl": "^1.2.5",
|
||||
"mutationobserver-shim": "^0.3.2",
|
||||
"ngx-cookie": "^1.0.0",
|
||||
|
Loading…
Reference in New Issue
Block a user