Refine the access level of project creation

This commit is contained in:
Steven Zou 2017-05-15 17:57:20 -07:00
parent 4f66279c33
commit 153d807fca
5 changed files with 85 additions and 69 deletions

View File

@ -1,12 +1,12 @@
<clr-modal [(clrModalOpen)]="createProjectOpened" [clrModalStaticBackdrop]="staticBackdrop" [clrModalClosable]="closable"> <clr-modal [(clrModalOpen)]="createProjectOpened" [clrModalStaticBackdrop]="staticBackdrop" [clrModalClosable]="closable">
<h3 class="modal-title">{{'PROJECT.NEW_PROJECT' | translate}}</h3> <h3 class="modal-title">{{'PROJECT.NEW_PROJECT' | translate}}</h3>
<inline-alert class="modal-title" (confirmEvt)="confirmCancel($event)"></inline-alert> <inline-alert class="modal-title" (confirmEvt)="confirmCancel($event)"></inline-alert>
<div class="modal-body" style="height: 12.8em; overflow-y: hidden;"> <div class="modal-body" style="height: 16.8em; overflow-y: hidden;">
<form #projectForm="ngForm"> <form #projectForm="ngForm">
<section class="form-block"> <section class="form-block">
<div class="form-group" style="padding-left: 135px;"> <div class="form-group" style="padding-left: 135px;">
<label for="create_project_name" class="col-md-3 form-group-label-override">{{'PROJECT.NAME' | translate}}</label> <label for="create_project_name" class="col-md-3 form-group-label-override">{{'PROJECT.NAME' | translate}}</label>
<label for="create_project_name" aria-haspopup="true" role="tooltip" [class.invalid]="projectName.invalid && (projectName.dirty || projectName.touched)" class="tooltip tooltip-validation tooltip-sm tooltip-bottom-left"> <label for="create_project_name" aria-haspopup="true" role="tooltip" [class.invalid]="projectName.invalid && (projectName.dirty || projectName.touched)" class="tooltip tooltip-validation tooltip-sm tooltip-bottom-left">
<input type="text" id="create_project_name" [(ngModel)]="project.name" name="name" size="38" required minlength="2" #projectName="ngModel" targetExists="PROJECT_NAME"> <input type="text" id="create_project_name" [(ngModel)]="project.name" name="name" size="38" required minlength="2" #projectName="ngModel" targetExists="PROJECT_NAME">
<span class="tooltip-content" *ngIf="projectName.errors && projectName.errors.required && (projectName.dirty || projectName.touched)"> <span class="tooltip-content" *ngIf="projectName.errors && projectName.errors.required && (projectName.dirty || projectName.touched)">
{{'PROJECT.NAME_IS_REQUIRED' | translate}} {{'PROJECT.NAME_IS_REQUIRED' | translate}}
@ -18,23 +18,24 @@
{{'PROJECT.NAME_ALREADY_EXISTS' | translate}} {{'PROJECT.NAME_ALREADY_EXISTS' | translate}}
</span> </span>
</label> </label>
</div> </div>
<div class="form-group"> <div class="form-group" style="padding-left: 135px;">
<label class="col-md-4 form-group-label-override">{{'PROJECT.PUBLIC' | translate}}</label> <label class="col-md-4 form-group-label-override">{{'PROJECT.ACCESS_LEVEL' | translate}}</label>
<div class="checkbox-inline"> <div class="checkbox-inline">
<input type="checkbox" id="create_project_public" [(ngModel)]="project.public" name="public"> <input type="checkbox" id="create_project_public" [(ngModel)]="project.public" name="public">
<label for="create_project_public"></label> <label for="create_project_public"></label>
<a href="javascript:void(0)" role="tooltip" aria-haspopup="true" class="tooltip tooltip-lg tooltip-right" style="top:-8px; left:-8px;"> <span class="access-level-label">{{ accessLevelDisplayText | translate}}</span>
<clr-icon shape="info-circle" class="info-tips-icon" size="24"></clr-icon> <a href="javascript:void(0)" role="tooltip" aria-haspopup="true" class="tooltip tooltip-md tooltip-bottom-right" style="top:-8px; left:-8px;">
<span class="tooltip-content" style="margin-left: 5px;">{{'PROJECT.INLINE_HELP_PUBLIC' | translate }}</span> <clr-icon shape="info-circle" class="info-tips-icon" size="24"></clr-icon>
</a> <span class="tooltip-content" style="margin-left: 5px;">{{'PROJECT.INLINE_HELP_PUBLIC' | translate }}</span>
</div> </a>
</div> </div>
</section> </div>
</form> </section>
</div> </form>
<div class="modal-footer"> </div>
<button type="button" class="btn btn-outline" (click)="onCancel()">{{'BUTTON.CANCEL' | translate}}</button> <div class="modal-footer">
<button type="button" class="btn btn-primary" [disabled]="projectForm.form.invalid" (click)="onSubmit()">{{'BUTTON.OK' | translate}}</button> <button type="button" class="btn btn-outline" (click)="onCancel()">{{'BUTTON.CANCEL' | translate}}</button>
</div> <button type="button" class="btn btn-primary" [disabled]="projectForm.form.invalid" (click)="onSubmit()">{{'BUTTON.OK' | translate}}</button>
</div>
</clr-modal> </clr-modal>

View File

@ -26,7 +26,7 @@ import { TranslateService } from '@ngx-translate/core';
@Component({ @Component({
selector: 'create-project', selector: 'create-project',
templateUrl: 'create-project.component.html', templateUrl: 'create-project.component.html',
styleUrls: [ 'create-project.css' ] styleUrls: ['create-project.css']
}) })
export class CreateProjectComponent implements AfterViewChecked { export class CreateProjectComponent implements AfterViewChecked {
@ -50,44 +50,48 @@ export class CreateProjectComponent implements AfterViewChecked {
inlineAlert: InlineAlertComponent; inlineAlert: InlineAlertComponent;
constructor(private projectService: ProjectService, constructor(private projectService: ProjectService,
private translateService: TranslateService, private translateService: TranslateService,
private messageHandlerService: MessageHandlerService) {} private messageHandlerService: MessageHandlerService) { }
public get accessLevelDisplayText(): string {
return this.project.public ? 'PROJECT.PUBLIC' : 'PROJECT.PRIVATE';
}
onSubmit() { onSubmit() {
this.projectService this.projectService
.createProject(this.project.name, this.project.public ? 1 : 0) .createProject(this.project.name, this.project.public ? 1 : 0)
.subscribe( .subscribe(
status=>{ status => {
this.create.emit(true); this.create.emit(true);
this.messageHandlerService.showSuccess('PROJECT.CREATED_SUCCESS'); this.messageHandlerService.showSuccess('PROJECT.CREATED_SUCCESS');
this.createProjectOpened = false;
},
error => {
let errorMessage: string;
if (error instanceof Response) {
switch (error.status) {
case 409:
this.translateService.get('PROJECT.NAME_ALREADY_EXISTS').subscribe(res => errorMessage = res);
break;
case 400:
this.translateService.get('PROJECT.NAME_IS_ILLEGAL').subscribe(res => errorMessage = res);
break;
default:
this.translateService.get('PROJECT.UNKNOWN_ERROR').subscribe(res => errorMessage = res);
}
if (this.messageHandlerService.isAppLevel(error)) {
this.messageHandlerService.handleError(error);
this.createProjectOpened = false; this.createProjectOpened = false;
}, } else {
error=>{ this.inlineAlert.showInlineError(errorMessage);
let errorMessage: string; }
if (error instanceof Response) { }
switch(error.status) { });
case 409:
this.translateService.get('PROJECT.NAME_ALREADY_EXISTS').subscribe(res=>errorMessage = res);
break;
case 400:
this.translateService.get('PROJECT.NAME_IS_ILLEGAL').subscribe(res=>errorMessage = res);
break;
default:
this.translateService.get('PROJECT.UNKNOWN_ERROR').subscribe(res=>errorMessage = res);
}
if(this.messageHandlerService.isAppLevel(error)) {
this.messageHandlerService.handleError(error);
this.createProjectOpened = false;
} else {
this.inlineAlert.showInlineError(errorMessage);
}
}
});
} }
onCancel() { onCancel() {
if(this.hasChanged) { if (this.hasChanged) {
this.inlineAlert.showInlineConfirmation({message: 'ALERT.FORM_CHANGE_CONFIRMATION'}); this.inlineAlert.showInlineConfirmation({ message: 'ALERT.FORM_CHANGE_CONFIRMATION' });
} else { } else {
this.createProjectOpened = false; this.createProjectOpened = false;
this.projectForm.reset(); this.projectForm.reset();
@ -97,12 +101,12 @@ export class CreateProjectComponent implements AfterViewChecked {
ngAfterViewChecked(): void { ngAfterViewChecked(): void {
this.projectForm = this.currentForm; this.projectForm = this.currentForm;
if(this.projectForm) { if (this.projectForm) {
this.projectForm.valueChanges.subscribe(data=>{ this.projectForm.valueChanges.subscribe(data => {
for(let i in data) { for (let i in data) {
let origin = this.initVal[i]; let origin = this.initVal[i];
let current = data[i]; let current = data[i];
if(current && current !== origin) { if (current && current !== origin) {
this.hasChanged = true; this.hasChanged = true;
break; break;
} else { } else {

View File

@ -2,3 +2,12 @@
font-size: 14px; font-size: 14px;
font-weight: 400; font-weight: 400;
} }
.access-level-label {
font-size: 14px;
font-weight: 400;
margin-left: -4px;
margin-right: 12px;
top: -6px;
position: relative;
}

View File

@ -126,6 +126,7 @@
"PUBLIC_OR_PRIVATE": "Access Level", "PUBLIC_OR_PRIVATE": "Access Level",
"REPO_COUNT": "Repositories Count", "REPO_COUNT": "Repositories Count",
"CREATION_TIME": "Creation Time", "CREATION_TIME": "Creation Time",
"ACCESS_LEVEL": "Access Level",
"PUBLIC": "Public", "PUBLIC": "Public",
"PRIVATE": "Private", "PRIVATE": "Private",
"MAKE": "Make", "MAKE": "Make",

View File

@ -126,6 +126,7 @@
"PUBLIC_OR_PRIVATE": "访问级别", "PUBLIC_OR_PRIVATE": "访问级别",
"REPO_COUNT": "镜像仓库数", "REPO_COUNT": "镜像仓库数",
"CREATION_TIME": "创建时间", "CREATION_TIME": "创建时间",
"ACCESS_LEVEL": "访问级别",
"PUBLIC": "公开", "PUBLIC": "公开",
"PRIVATE": "私有", "PRIVATE": "私有",
"MAKE": "设为", "MAKE": "设为",