mirror of
https://github.com/goharbor/harbor.git
synced 2024-11-23 02:35:17 +01:00
Merge pull request #4376 from pengpengshui/reptolib
Modify pagenation in Use, project name exist issue #4350 #4205 #4177
This commit is contained in:
commit
c24e0a5959
@ -27,7 +27,6 @@ h4{
|
|||||||
.filterSelect clr-icon{margin-left: 15px;}
|
.filterSelect clr-icon{margin-left: 15px;}
|
||||||
.filterSelect label{width: 136px;}
|
.filterSelect label{width: 136px;}
|
||||||
.filterSelect label input{width: 100%;}
|
.filterSelect label input{width: 100%;}
|
||||||
.cursor{cursor: pointer;}
|
|
||||||
.pull-left{float: left;}
|
.pull-left{float: left;}
|
||||||
.padLeft0{padding-left: 0;}
|
.padLeft0{padding-left: 0;}
|
||||||
.floatSetPar{display: inline-block; width: 120px;margin-right: 10px;}
|
.floatSetPar{display: inline-block; width: 120px;margin-right: 10px;}
|
||||||
@ -56,6 +55,7 @@ h4{
|
|||||||
.selectBox ul li{
|
.selectBox ul li{
|
||||||
list-style: none;
|
list-style: none;
|
||||||
padding: 3px 20px
|
padding: 3px 20px
|
||||||
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
.selectBox ul li:hover{
|
.selectBox ul li:hover{
|
||||||
color: #262626;
|
color: #262626;
|
||||||
|
@ -69,7 +69,7 @@ export const CREATE_EDIT_RULE_TEMPLATE: string = `
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<label *ngIf="noEndpointInfo.length != 0" class="colorRed alertLabel">{{noEndpointInfo | translate}}</label>
|
<label *ngIf="noEndpointInfo.length != 0" class="colorRed alertLabel">{{noEndpointInfo | translate}}</label>
|
||||||
<span class="goLink" *ngIf="noEndpointInfo.length != 0" (click)="goRegistry()">{{'SIDE_NAV.SYSTEM_MGMT.REGISTRY' | translate}}</span>
|
<span class="alertLabel goLink" *ngIf="noEndpointInfo.length != 0" (click)="goRegistry()">{{'SIDE_NAV.SYSTEM_MGMT.REGISTRY' | translate}}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!--Trigger-->
|
<!--Trigger-->
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core';
|
import {Component, Input, Output, EventEmitter, ViewChild, OnChanges} from '@angular/core';
|
||||||
import { NgModel } from '@angular/forms';
|
import { NgModel } from '@angular/forms';
|
||||||
|
|
||||||
import { DATETIME_PICKER_TEMPLATE } from './datetime-picker.component.html';
|
import { DATETIME_PICKER_TEMPLATE } from './datetime-picker.component.html';
|
||||||
@ -7,7 +7,7 @@ import { DATETIME_PICKER_TEMPLATE } from './datetime-picker.component.html';
|
|||||||
selector: 'hbr-datetime',
|
selector: 'hbr-datetime',
|
||||||
template: DATETIME_PICKER_TEMPLATE
|
template: DATETIME_PICKER_TEMPLATE
|
||||||
})
|
})
|
||||||
export class DatePickerComponent {
|
export class DatePickerComponent implements OnChanges{
|
||||||
|
|
||||||
@Input() dateInput: string;
|
@Input() dateInput: string;
|
||||||
@Input() oneDayOffset: boolean;
|
@Input() oneDayOffset: boolean;
|
||||||
@ -17,6 +17,10 @@ export class DatePickerComponent {
|
|||||||
|
|
||||||
@Output() search = new EventEmitter<string>();
|
@Output() search = new EventEmitter<string>();
|
||||||
|
|
||||||
|
ngOnChanges(): void {
|
||||||
|
this.dateInput = this.dateInput.trim();
|
||||||
|
}
|
||||||
|
|
||||||
get dateInvalid(): boolean {
|
get dateInvalid(): boolean {
|
||||||
return (this.searchTime.errors && this.searchTime.errors.dateValidator && (this.searchTime.dirty || this.searchTime.touched)) || false;
|
return (this.searchTime.errors && this.searchTime.errors.dateValidator && (this.searchTime.dirty || this.searchTime.touched)) || false;
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
export const LIST_REPLICATION_RULE_TEMPLATE: string = `
|
export const LIST_REPLICATION_RULE_TEMPLATE: string = `
|
||||||
<div style="padding-bottom: 15px;">
|
<div style="padding-bottom: 15px;">
|
||||||
<clr-datagrid [clrDgLoading]="loading" [(clrDgSingleSelected)]="selectedRow" [clDgRowSelection]="true">
|
<clr-datagrid [clrDgLoading]="loading" [(clrDgSingleSelected)]="selectedRow" [clDgRowSelection]="true">
|
||||||
<clr-dg-action-bar style="height:24px;" *ngIf="isSystemAdmin">
|
<clr-dg-action-bar style="height:24px;">
|
||||||
<button type="button" class="btn btn-sm btn-secondary" (click)="openModal()"><clr-icon shape="plus" size="16"></clr-icon> {{'REPLICATION.NEW_REPLICATION_RULE' | translate}}</button>
|
<button type="button" class="btn btn-sm btn-secondary" *ngIf="isSystemAdmin" (click)="openModal()"><clr-icon shape="plus" size="16"></clr-icon> {{'REPLICATION.NEW_REPLICATION_RULE' | translate}}</button>
|
||||||
<button type="button" class="btn btn-sm btn-secondary" [disabled]="!selectedRow" (click)="editRule(selectedRow)"><clr-icon shape="pencil" size="16"></clr-icon> {{'REPLICATION.EDIT_POLICY' | translate}}</button>
|
<button type="button" class="btn btn-sm btn-secondary" *ngIf="isSystemAdmin" [disabled]="!selectedRow" (click)="editRule(selectedRow)"><clr-icon shape="pencil" size="16"></clr-icon> {{'REPLICATION.EDIT_POLICY' | translate}}</button>
|
||||||
<button type="button" class="btn btn-sm btn-secondary" [disabled]="!selectedRow" (click)="deleteRule(selectedRow)"><clr-icon shape="times" size="16"></clr-icon> {{'REPLICATION.DELETE_POLICY' | translate}}</button>
|
<button type="button" class="btn btn-sm btn-secondary" *ngIf="isSystemAdmin" [disabled]="!selectedRow" (click)="deleteRule(selectedRow)"><clr-icon shape="times" size="16"></clr-icon> {{'REPLICATION.DELETE_POLICY' | translate}}</button>
|
||||||
<button type="button" class="btn btn-sm btn-secondary" [disabled]="!selectedRow" (click)="replicateRule(selectedRow)"><clr-icon shape="export" size="16"></clr-icon> {{'REPLICATION.REPLICATE' | translate}}</button>
|
<button type="button" class="btn btn-sm btn-secondary" *ngIf="isSystemAdmin" [disabled]="!selectedRow" (click)="replicateRule(selectedRow)"><clr-icon shape="export" size="16"></clr-icon> {{'REPLICATION.REPLICATE' | translate}}</button>
|
||||||
</clr-dg-action-bar>
|
</clr-dg-action-bar>
|
||||||
<clr-dg-column [clrDgField]="'name'">{{'REPLICATION.NAME' | translate}}</clr-dg-column>
|
<clr-dg-column [clrDgField]="'name'">{{'REPLICATION.NAME' | translate}}</clr-dg-column>
|
||||||
<clr-dg-column [clrDgField]="'projects'" *ngIf="!projectScope">{{'REPLICATION.PROJECT' | translate}}</clr-dg-column>
|
<clr-dg-column [clrDgField]="'projects'" *ngIf="!projectScope">{{'REPLICATION.PROJECT' | translate}}</clr-dg-column>
|
||||||
|
@ -388,6 +388,9 @@ export class ReplicationComponent implements OnInit, OnDestroy {
|
|||||||
|
|
||||||
|
|
||||||
refreshJobs() {
|
refreshJobs() {
|
||||||
|
this.currentJobStatus = this.jobStatus[0];
|
||||||
|
this.search.startTime = ' ';
|
||||||
|
this.search.endTime = ' ';
|
||||||
this.search.repoName = "";
|
this.search.repoName = "";
|
||||||
this.search.startTimestamp = "";
|
this.search.startTimestamp = "";
|
||||||
this.search.endTimestamp = "";
|
this.search.endTimestamp = "";
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
"clarity-icons": "^0.10.17",
|
"clarity-icons": "^0.10.17",
|
||||||
"clarity-ui": "^0.10.17",
|
"clarity-ui": "^0.10.17",
|
||||||
"core-js": "^2.4.1",
|
"core-js": "^2.4.1",
|
||||||
"harbor-ui": "0.6.46",
|
"harbor-ui": "0.6.47",
|
||||||
"intl": "^1.2.5",
|
"intl": "^1.2.5",
|
||||||
"mutationobserver-shim": "^0.3.2",
|
"mutationobserver-shim": "^0.3.2",
|
||||||
"ngx-cookie": "^1.0.0",
|
"ngx-cookie": "^1.0.0",
|
||||||
|
@ -12,7 +12,8 @@
|
|||||||
required
|
required
|
||||||
pattern="^[a-z0-9]+(?:[._-][a-z0-9]+)*$"
|
pattern="^[a-z0-9]+(?:[._-][a-z0-9]+)*$"
|
||||||
minlength="2"
|
minlength="2"
|
||||||
#projectName="ngModel"
|
#projectName="ngModel"
|
||||||
|
autocomplete="off"
|
||||||
(keyup)='handleValidation()'>
|
(keyup)='handleValidation()'>
|
||||||
<span class="tooltip-content">
|
<span class="tooltip-content">
|
||||||
{{ nameTooltipText | translate }}
|
{{ nameTooltipText | translate }}
|
||||||
|
@ -74,7 +74,7 @@ export class CreateProjectComponent implements AfterViewChecked, OnInit, OnDestr
|
|||||||
ngOnInit(): void {
|
ngOnInit(): void {
|
||||||
this.proNameChecker
|
this.proNameChecker
|
||||||
.debounceTime(500)
|
.debounceTime(500)
|
||||||
.distinctUntilChanged()
|
//.distinctUntilChanged()
|
||||||
.subscribe((name: string) => {
|
.subscribe((name: string) => {
|
||||||
let cont = this.currentForm.controls["create_project_name"];
|
let cont = this.currentForm.controls["create_project_name"];
|
||||||
if (cont && this.hasChanged) {
|
if (cont && this.hasChanged) {
|
||||||
@ -166,6 +166,8 @@ export class CreateProjectComponent implements AfterViewChecked, OnInit, OnDestr
|
|||||||
newProject() {
|
newProject() {
|
||||||
this.project = new Project();
|
this.project = new Project();
|
||||||
this.hasChanged = false;
|
this.hasChanged = false;
|
||||||
|
this.isNameValid = true;
|
||||||
|
|
||||||
this.createProjectOpened = true;
|
this.createProjectOpened = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,10 +49,6 @@ import {BatchInfo, BathInfoChanges} from '../shared/confirmation-dialog/confirma
|
|||||||
export class UserComponent implements OnInit, OnDestroy {
|
export class UserComponent implements OnInit, OnDestroy {
|
||||||
users: User[] = [];
|
users: User[] = [];
|
||||||
originalUsers: Promise<User[]>;
|
originalUsers: Promise<User[]>;
|
||||||
private onGoing: boolean = true;
|
|
||||||
private adminMenuText: string = "";
|
|
||||||
private adminColumn: string = "";
|
|
||||||
private deletionSubscription: Subscription;
|
|
||||||
selectedRow: User[] = [];
|
selectedRow: User[] = [];
|
||||||
ISADMNISTRATOR: string = "USER.ENABLE_ADMIN_ACTION";
|
ISADMNISTRATOR: string = "USER.ENABLE_ADMIN_ACTION";
|
||||||
batchDelectionInfos: BatchInfo[] = [];
|
batchDelectionInfos: BatchInfo[] = [];
|
||||||
@ -60,12 +56,15 @@ export class UserComponent implements OnInit, OnDestroy {
|
|||||||
currentTerm: string;
|
currentTerm: string;
|
||||||
totalCount: number = 0;
|
totalCount: number = 0;
|
||||||
currentPage: number = 1;
|
currentPage: number = 1;
|
||||||
|
timerHandler: any;
|
||||||
|
|
||||||
|
private onGoing: boolean = true;
|
||||||
|
private adminMenuText: string = "";
|
||||||
|
private adminColumn: string = "";
|
||||||
|
private deletionSubscription: Subscription;
|
||||||
@ViewChild(NewUserModalComponent)
|
@ViewChild(NewUserModalComponent)
|
||||||
newUserDialog: NewUserModalComponent;
|
newUserDialog: NewUserModalComponent;
|
||||||
|
|
||||||
timerHandler: any;
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private userService: UserService,
|
private userService: UserService,
|
||||||
private translate: TranslateService,
|
private translate: TranslateService,
|
||||||
@ -98,10 +97,6 @@ export class UserComponent implements OnInit, OnDestroy {
|
|||||||
return this.selectedRow.length === 1 && this.isMySelf(this.selectedRow[0].user_id);
|
return this.selectedRow.length === 1 && this.isMySelf(this.selectedRow[0].user_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
private isMatchFilterTerm(terms: string, testedItem: string): boolean {
|
|
||||||
return testedItem.toLowerCase().indexOf(terms.toLowerCase()) !== -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public get canCreateUser(): boolean {
|
public get canCreateUser(): boolean {
|
||||||
let appConfig = this.appConfigService.getConfig();
|
let appConfig = this.appConfigService.getConfig();
|
||||||
if (appConfig) {
|
if (appConfig) {
|
||||||
@ -173,9 +168,12 @@ export class UserComponent implements OnInit, OnDestroy {
|
|||||||
if (terms.trim() === "") {
|
if (terms.trim() === "") {
|
||||||
this.refreshUser((this.currentPage - 1) * 15, this.currentPage * 15);
|
this.refreshUser((this.currentPage - 1) * 15, this.currentPage * 15);
|
||||||
} else {
|
} else {
|
||||||
this.users = users.filter(user => {
|
let selectUsers = users.filter(user => {
|
||||||
return this.isMatchFilterTerm(terms, user.username);
|
return this.isMatchFilterTerm(terms, user.username);
|
||||||
});
|
});
|
||||||
|
this.totalCount = selectUsers.length;
|
||||||
|
this.users = selectUsers.slice((this.currentPage - 1) * 15, this.currentPage * 15);//First page
|
||||||
|
|
||||||
this.forceRefreshView(5000);
|
this.forceRefreshView(5000);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -367,4 +365,8 @@ export class UserComponent implements OnInit, OnDestroy {
|
|||||||
}, duration);
|
}, duration);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private isMatchFilterTerm(terms: string, testedItem: string): boolean {
|
||||||
|
return testedItem.toLowerCase().indexOf(terms.toLowerCase()) !== -1;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user