Sort by Disc Number + improve sort-by pipe algo

This commit is contained in:
2018-03-20 00:47:27 +01:00
parent 3867d9513f
commit 594328525e
4 changed files with 20 additions and 3 deletions

View File

@@ -4,4 +4,5 @@ export class Song {
'Play Count': number;
Album: string;
'Track Number': number; // TODO Default property
'Disc Number': number;
}

View File

@@ -14,7 +14,7 @@
</tr>
</thead>
<tbody>
<tr *ngFor="let song of songs | sortBy : 'Year':'Album':'Track Number'">
<tr *ngFor="let song of songs | sortBy : 'Year':'Album':'Disc Number':'Track Number'">
<td>{{song['Track Number'] ? (("0" + song['Track Number']).slice(-2)) : "--"}}</td>
<td>{{song.Name}}</td>
<td>

View File

@@ -49,7 +49,7 @@ export class SongTableComponent {
}
sort(): void {
this.songs = new SortByPipe().transform(this.songs, 'Year', 'Album', 'Track Number', 'Play Count');
this.songs = new SortByPipe().transform(this.songs, 'Year', 'Album', 'Disc Number', 'Track Number', 'Play Count');
this.sortable = false;
}

View File

@@ -5,9 +5,25 @@ import { Pipe, PipeTransform } from '@angular/core';
})
export class SortByPipe implements PipeTransform {
/**
* Sort an array by multiple elements.
*
* Example to sort an array respectively by Year, Album, Disc Number, etc.
* Typescript usage:
* <pre>
* new SortByPipe().transform(this.songs, 'Year', 'Album', 'Disc Number', 'Track Number', 'Play Count');
* </pre>
* In HTML usage:
* <pre>
* <tr *ngFor="let song of songs | sortBy : 'Year':'Album':'Disc Number':'Track Number'">
* </pre>
*
* @param array array to sort
* @param args elements used to sort in oder
*/
transform(array: Array<any>, ...args: any[]): Array<any> {
array.sort((a: any, b: any) => {
for (let i = 0; i < array.length; i++) {
for (let i = 0; i < args.length; i++) {
const arg = args[i];
if (a[arg] === undefined && b[arg] !== undefined) { return -1; }