Projects list can be sorted, Fixes: #99

This commit is contained in:
ziajka 2018-04-10 10:57:29 +02:00
parent 6286980327
commit 31df9cfb93
3 changed files with 39 additions and 8 deletions

View File

@ -22,6 +22,7 @@ import {
MatCheckboxModule, MatCheckboxModule,
MatListModule, MatListModule,
MatExpansionModule, MatExpansionModule,
MatSortModule,
} from '@angular/material'; } from '@angular/material';
import { D3Service } from 'd3-ng2-service'; import { D3Service } from 'd3-ng2-service';
@ -108,6 +109,7 @@ Raven
AppRoutingModule, AppRoutingModule,
FormsModule, FormsModule,
BrowserAnimationsModule, BrowserAnimationsModule,
CdkTableModule,
MatButtonModule, MatButtonModule,
MatMenuModule, MatMenuModule,
MatCardModule, MatCardModule,
@ -123,7 +125,7 @@ Raven
MatCheckboxModule, MatCheckboxModule,
MatListModule, MatListModule,
MatExpansionModule, MatExpansionModule,
CdkTableModule, MatSortModule,
CartographyModule, CartographyModule,
HotkeyModule.forRoot(), HotkeyModule.forRoot(),
PersistenceModule, PersistenceModule,

View File

@ -5,7 +5,7 @@
<div class="default-content"> <div class="default-content">
<div class="example-container mat-elevation-z8"> <div class="example-container mat-elevation-z8">
<mat-table #table [dataSource]="dataSource"> <mat-table #table [dataSource]="dataSource" matSort>
<ng-container matColumnDef="name"> <ng-container matColumnDef="name">
<mat-header-cell *matHeaderCellDef mat-sort-header> Name </mat-header-cell> <mat-header-cell *matHeaderCellDef mat-sort-header> Name </mat-header-cell>

View File

@ -1,5 +1,6 @@
import { Component, OnInit } from '@angular/core'; import { AfterViewInit, Component, OnInit, ViewChild } from '@angular/core';
import { ActivatedRoute, ParamMap } from '@angular/router'; import { ActivatedRoute, ParamMap } from '@angular/router';
import { MatSort, MatSortable } from "@angular/material";
import { Project } from "../shared/models/project"; import { Project } from "../shared/models/project";
import { ProjectService } from "../shared/services/project.service"; import { ProjectService } from "../shared/services/project.service";
@ -9,6 +10,7 @@ import { BehaviorSubject } from "rxjs/BehaviorSubject";
import { DataSource } from "@angular/cdk/collections"; import { DataSource } from "@angular/cdk/collections";
import { Observable } from "rxjs/Observable"; import { Observable } from "rxjs/Observable";
@Component({ @Component({
selector: 'app-projects', selector: 'app-projects',
templateUrl: './projects.component.html', templateUrl: './projects.component.html',
@ -20,13 +22,23 @@ export class ProjectsComponent implements OnInit {
dataSource: ProjectDataSource; dataSource: ProjectDataSource;
displayedColumns = ['name', 'actions']; displayedColumns = ['name', 'actions'];
@ViewChild(MatSort) sort: MatSort;
constructor(private route: ActivatedRoute, constructor(private route: ActivatedRoute,
private serverService: ServerService, private serverService: ServerService,
private projectService: ProjectService) { private projectService: ProjectService) {
this.dataSource = new ProjectDataSource(this.projectDatabase);
} }
ngOnInit() { ngOnInit() {
this.sort.sort(<MatSortable>{
id: 'name',
start: 'asc'
}
);
this.dataSource = new ProjectDataSource(this.projectDatabase, this.sort);
this.route.paramMap this.route.paramMap
.switchMap((params: ParamMap) => { .switchMap((params: ParamMap) => {
const server_id = parseInt(params.get('server_id'), 10); const server_id = parseInt(params.get('server_id'), 10);
@ -47,7 +59,6 @@ export class ProjectsComponent implements OnInit {
this.projectDatabase.remove(project); this.projectDatabase.remove(project);
}); });
} }
} }
@ -72,13 +83,31 @@ export class ProjectDatabase {
} }
export class ProjectDataSource extends DataSource<any> { export class ProjectDataSource extends DataSource<any> {
constructor(private projectDatabase: ProjectDatabase) {
constructor(private projectDatabase: ProjectDatabase, private sort: MatSort) {
super(); super();
} }
connect(): Observable<Project[]> { connect(): Observable<Project[]> {
return Observable.merge(this.projectDatabase.dataChange).map(() => { const displayDataChanges = [
this.projectDatabase.dataChange,
this.sort.sortChange,
];
return Observable.merge(...displayDataChanges).map(() => {
if (!this.sort.active || this.sort.direction === '') {
return this.projectDatabase.data; return this.projectDatabase.data;
}
return this.projectDatabase.data.sort((a, b) => {
const propertyA = a[this.sort.active];
const propertyB = b[this.sort.active];
const valueA = isNaN(+propertyA) ? propertyA : +propertyA;
const valueB = isNaN(+propertyB) ? propertyB : +propertyB;
return (valueA < valueB ? -1 : 1) * (this.sort.direction === 'asc' ? 1 : -1);
});
}); });
} }