mirror of
https://github.com/GNS3/gns3-web-ui.git
synced 2025-05-31 22:40:43 +00:00
Projects list can be sorted, Fixes: #99
This commit is contained in:
parent
6286980327
commit
31df9cfb93
@ -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,
|
||||||
|
@ -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>
|
||||||
|
@ -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);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user