Merge pull request #1420 from wknet123/harbor-clarity

Refactored codes of project component.
This commit is contained in:
kun wang 2017-02-23 14:46:38 +08:00 committed by GitHub
commit c64ebc8b57
11 changed files with 99 additions and 142 deletions

View File

@ -37,9 +37,11 @@ export class CreateProjectComponent {
if (error instanceof Response) { if (error instanceof Response) {
switch(error.status) { switch(error.status) {
case 409: case 409:
this.errorMessage = 'Project name already exists.'; break; this.errorMessage = 'Project name already exists.';
break;
case 400: case 400:
this.errorMessage = 'Project name is illegal.'; break; this.errorMessage = 'Project name is illegal.';
break;
default: default:
this.errorMessage = 'Unknown error for project name.'; this.errorMessage = 'Unknown error for project name.';
this.messageService.announceMessage(this.errorMessage); this.messageService.announceMessage(this.errorMessage);

View File

@ -1,9 +0,0 @@
<clr-dropdown [clrMenuPosition]="'bottom-left'">
<button class="btn btn-sm btn-link" clrDropdownToggle>
{{currentType.value}}
<clr-icon shape="caret down"></clr-icon>
</button>
<div class="dropdown-menu">
<a href="javascript:void(0)" clrDropdownItem *ngFor="let p of types" (click)="doFilter(p.key)">{{p.value}}</a>
</div>
</clr-dropdown>

View File

@ -1,23 +0,0 @@
import { Component, Output, EventEmitter } from '@angular/core';
export const projectTypes = [
{ 'key' : 0, 'value': 'My Projects' },
{ 'key' : 1, 'value': 'Public Projects'}
];
@Component({
selector: 'filter-project',
templateUrl: 'filter-project.component.html'
})
export class FilterProjectComponent {
@Output() filter = new EventEmitter<number>();
types = projectTypes;
currentType = projectTypes[0];
doFilter(type: number) {
console.log('Filtered projects by:' + type);
this.currentType = projectTypes.find(item=>item.key === type);
this.filter.emit(type);
}
}

View File

@ -1,10 +1,10 @@
<clr-datagrid [(clrDgSelected)]="selected"> <clr-datagrid>
<clr-dg-column>Name</clr-dg-column> <clr-dg-column>Name</clr-dg-column>
<clr-dg-column>Public/Private</clr-dg-column> <clr-dg-column>Public/Private</clr-dg-column>
<clr-dg-column>Repositories</clr-dg-column> <clr-dg-column>Repositories</clr-dg-column>
<clr-dg-column>Creation time</clr-dg-column> <clr-dg-column>Creation time</clr-dg-column>
<clr-dg-column>Description</clr-dg-column> <clr-dg-column>Description</clr-dg-column>
<clr-dg-row *clrDgItems="let p of projects" [clrDgItem]="p" [(clrDgSelected)]="p.selected"> <clr-dg-row *clrDgItems="let p of projects" [clrDgItem]="p">
<!--<clr-dg-action-overflow> <!--<clr-dg-action-overflow>
<button class="action-item" (click)="onEdit(p)">Edit</button> <button class="action-item" (click)="onEdit(p)">Edit</button>
<button class="action-item" (click)="onDelete(p)">Delete</button> <button class="action-item" (click)="onDelete(p)">Delete</button>
@ -19,9 +19,6 @@
<action-project (togglePublic)="toggleProject($event)" (deleteProject)="deleteProject($event)" [project]="p"></action-project> <action-project (togglePublic)="toggleProject($event)" (deleteProject)="deleteProject($event)" [project]="p"></action-project>
</span> </span>
</clr-dg-cell> </clr-dg-cell>
</clr-dg-row> </clr-dg-row>
<clr-dg-footer>{{ (projects ? projects.length : 0) }} item(s)</clr-dg-footer> <clr-dg-footer>{{ (projects ? projects.length : 0) }} item(s)</clr-dg-footer>
</clr-datagrid> </clr-datagrid>

View File

@ -1,4 +1,4 @@
import { Component, EventEmitter, Output } from '@angular/core'; import { Component, EventEmitter, Output, Input } from '@angular/core';
import { Project } from '../project'; import { Project } from '../project';
import { ProjectService } from '../project.service'; import { ProjectService } from '../project.service';
@ -9,53 +9,17 @@ import { ProjectService } from '../project.service';
}) })
export class ListProjectComponent { export class ListProjectComponent {
projects: Project[]; @Input() projects: Project[];
errorMessage: string;
selected = []; @Output() toggle = new EventEmitter<Project>();
@Output() delete = new EventEmitter<Project>();
@Output() actionPerform = new EventEmitter<boolean>();
constructor(private projectService: ProjectService) {}
retrieve(name: string, isPublic: number): void {
this.projectService
.listProjects(name, isPublic)
.subscribe(
response => this.projects = response,
error => this.errorMessage = <any>error);
}
toggleProject(p: Project) { toggleProject(p: Project) {
this.projectService this.toggle.emit(p);
.toggleProjectPublic(p.project_id, p.public)
.subscribe(
response=>console.log(response),
error=>console.log(error)
);
} }
deleteProject(p: Project) { deleteProject(p: Project) {
this.projectService this.delete.emit(p);
.deleteProject(p.project_id)
.subscribe(
response=>{
console.log(response);
this.actionPerform.emit(true);
},
error=>console.log(error)
);
} }
deleteSelectedProjects() {
this.selected.forEach(p=>this.deleteProject(p));
}
onEdit(p: Project) {
}
onDelete(p: Project) {
}
} }

View File

@ -1,15 +1,23 @@
<h3>Projects</h3> <h3>Projects</h3>
<div class="row flex-items-xs-between"> <div class="row flex-items-xs-between">
<div class="col-xs-4"> <div class="col-xs-4">
<button class="btn btn-link" (click)="openModal()"><clr-icon shape="add"></clr-icon>New Project</button> <button class="btn btn-link" (click)="openModal()"><clr-icon shape="add"></clr-icon> New Project</button>
<button class="btn btn-link" (click)="deleteSelectedProjects()"><clr-icon shape="close"></clr-icon>Delete</button>
<create-project (create)="createProject($event)" (openModal)="openModal($event)"></create-project> <create-project (create)="createProject($event)" (openModal)="openModal($event)"></create-project>
</div> </div>
<div class="col-xs-4"> <div class="col-xs-5">
<filter-project (filter)="filterProjects($event)"></filter-project> <clr-dropdown [clrMenuPosition]="'bottom-left'">
<search-project (search)="searchProjects($event)"></search-project> <button class="btn btn-sm btn-link" clrDropdownToggle>
{{projectTypes[currentFilteredType]}}
<clr-icon shape="caret down"></clr-icon>
</button>
<div class="dropdown-menu">
<a href="javascript:void(0)" clrDropdownItem (click)="doFilterProjects(0)">{{projectTypes[0]}}</a>
<a href="javascript:void(0)" clrDropdownItem (click)="doFilterProjects(1)">{{projectTypes[1]}}</a>
</div>
</clr-dropdown>
<clr-icon shape="filter" style="position: relative; left: 15px;"></clr-icon><input style="padding-left: 20px;" type="text" placeholder="Search for projects" #searchProject (keyup.enter)="doSearchProjects(searchProject.value)" >
</div> </div>
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12"> <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<list-project (actionPerform)="actionPerform($event)"></list-project> <list-project [projects]="changedProjects" (toggle)="toggleProject($event)" (delete)="deleteProject($event)"></list-project>
</div> </div>
</div> </div>

View File

@ -2,9 +2,17 @@ import { Component, OnInit, ViewChild } from '@angular/core';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { ListProjectComponent } from './list-project/list-project.component'; import { Project } from './project';
import { ProjectService } from './project.service';
import { CreateProjectComponent } from './create-project/create-project.component'; import { CreateProjectComponent } from './create-project/create-project.component';
import { ListProjectComponent } from './list-project/list-project.component';
import { MessageService } from '../global-message/message.service';
export const types: {} = { 0: 'My Projects', 1: 'Public Projects'};
@Component({ @Component({
selector: 'project', selector: 'project',
templateUrl: 'project.component.html', templateUrl: 'project.component.html',
@ -12,45 +20,74 @@ import { CreateProjectComponent } from './create-project/create-project.componen
}) })
export class ProjectComponent implements OnInit { export class ProjectComponent implements OnInit {
@ViewChild(ListProjectComponent) selected = [];
listProjects: ListProjectComponent; changedProjects: Project[];
projectTypes = types;
@ViewChild(CreateProjectComponent) @ViewChild(CreateProjectComponent)
creationProject: CreateProjectComponent; creationProject: CreateProjectComponent;
lastFilteredType: number = 0; @ViewChild(ListProjectComponent)
listProject: ListProjectComponent;
openModal(): void { currentFilteredType: number = 0;
this.creationProject.newProject(); lastFilteredType: number = 0;
constructor(private projectService: ProjectService, private messageService: MessageService){}
ngOnInit(): void {
this.retrieve('', this.lastFilteredType);
}
retrieve(name: string, isPublic: number): void {
this.projectService
.listProjects(name, isPublic)
.subscribe(
response => this.changedProjects = response,
error => this.messageService.announceMessage(error));
}
openModal(): void {
this.creationProject.newProject();
}
createProject(created: boolean) {
if(created) {
this.retrieve('', this.lastFilteredType);
} }
}
deleteSelectedProjects(): void { doSearchProjects(projectName: string): void {
this.listProjects.deleteSelectedProjects(); console.log('Search for project name:' + projectName);
} this.retrieve(projectName, this.lastFilteredType);
}
createProject(created: boolean): void { doFilterProjects(filteredType: number): void {
console.log('Project has been created:' + created); console.log('Filter projects with type:' + types[filteredType]);
this.listProjects.retrieve('', 0); this.lastFilteredType = filteredType;
} this.currentFilteredType = filteredType;
this.retrieve('', this.lastFilteredType);
}
filterProjects(type: number): void { toggleProject(p: Project) {
this.lastFilteredType = type; this.projectService
this.listProjects.retrieve('', type); .toggleProjectPublic(p.project_id, p.public)
console.log('Projects were filtered by:' + type); .subscribe(
response=>console.log('Successful toggled project_id:' + p.project_id),
error=>this.messageService.announceMessage(error)
);
}
} deleteProject(p: Project) {
this.projectService
searchProjects(projectName: string): void { .deleteProject(p.project_id)
console.log('Search for project name:' + projectName); .subscribe(
this.listProjects.retrieve(projectName, this.lastFilteredType); response=>{
} console.log('Successful delete project_id:' + p.project_id);
this.retrieve('', this.lastFilteredType);
actionPerform(performed: boolean): void { },
this.listProjects.retrieve('', 0); error=>console.log(error)
} );
}
ngOnInit(): void {
this.listProjects.retrieve('', 0);
}
} }

View File

@ -7,14 +7,13 @@ import { LogModule } from '../log/log.module';
import { ProjectComponent } from './project.component'; import { ProjectComponent } from './project.component';
import { CreateProjectComponent } from './create-project/create-project.component'; import { CreateProjectComponent } from './create-project/create-project.component';
import { SearchProjectComponent } from './search-project/search-project.component';
import { FilterProjectComponent } from './filter-project/filter-project.component';
import { ActionProjectComponent } from './action-project/action-project.component'; import { ActionProjectComponent } from './action-project/action-project.component';
import { ListProjectComponent } from './list-project/list-project.component';
import { ProjectDetailComponent } from './project-detail/project-detail.component'; import { ProjectDetailComponent } from './project-detail/project-detail.component';
import { MemberComponent } from './member/member.component'; import { MemberComponent } from './member/member.component';
import { AddMemberComponent } from './member/add-member/add-member.component'; import { AddMemberComponent } from './member/add-member/add-member.component';
import { ProjectRoutingModule } from './project-routing.module'; import { ProjectRoutingModule } from './project-routing.module';
import { ProjectService } from './project.service'; import { ProjectService } from './project.service';
@ -31,15 +30,12 @@ import { MemberService } from './member/member.service';
declarations: [ declarations: [
ProjectComponent, ProjectComponent,
CreateProjectComponent, CreateProjectComponent,
SearchProjectComponent,
FilterProjectComponent,
ActionProjectComponent, ActionProjectComponent,
ListProjectComponent,
ProjectDetailComponent, ProjectDetailComponent,
MemberComponent, MemberComponent,
AddMemberComponent AddMemberComponent
], ],
exports: [ ListProjectComponent ], exports: [ ProjectComponent ],
providers: [ ProjectService, MemberService ] providers: [ ProjectService, MemberService ]
}) })
export class ProjectModule { export class ProjectModule {

View File

@ -29,5 +29,4 @@ export class Project {
update_time: Date; update_time: Date;
current_user_role_id: number; current_user_role_id: number;
repo_count: number; repo_count: number;
selected: boolean;
} }

View File

@ -1 +0,0 @@
<input type="text" placeholder="Search for projects" #searchProject (keyup.enter)="doSearch(searchProject.value)" >

View File

@ -1,13 +0,0 @@
import { Component, EventEmitter, Output } from '@angular/core';
@Component({
selector: 'search-project',
templateUrl: 'search-project.component.html'
})
export class SearchProjectComponent {
@Output() search = new EventEmitter<string>();
doSearch(projectName) {
this.search.emit(projectName);
}
}