ngx-mat-multi-sort-fork
Version:
An extension for the angular material table to support multi-sorting.
56 lines • 7.55 kB
JavaScript
import { DataSource } from '@angular/cdk/collections';
import { BehaviorSubject } from 'rxjs';
export class MatMultiSortTableDataSource extends DataSource {
constructor(sort, clientSideSorting = false) {
super();
this._data = new BehaviorSubject([]);
this.sort = sort;
this.clientSideSorting = clientSideSorting;
}
set data(data) {
this._data.next(data);
}
get data() {
return this._data.value;
}
connect() {
return this._data;
}
disconnect() {
this._data.complete();
}
orderData() {
this._data.next(this.sortData(this._data.value, this.sort.actives, this.sort.directions));
}
sortData(data, actives, directions) {
const _data = Object.assign(new Array(), data);
if (this.clientSideSorting) {
return _data.sort((i1, i2) => {
return this._sortData(i1, i2, actives, directions);
});
}
return _data;
}
_sortData(d1, d2, params, dirs) {
// @ts-ignore -- need a typesafe way to express these accessor operations, ts-ignore could be a solution
// if there's not a suitable solution offered by typescript
if (d1[params[0]] > d2[params[0]]) {
return dirs[0] === 'asc' ? 1 : -1;
// @ts-ignore
}
else if (d1[params[0]] < d2[params[0]]) {
return dirs[0] === 'asc' ? -1 : 1;
}
else {
if (params.length > 1) {
params = params.slice(1, params.length);
dirs = dirs.slice(1, dirs.length);
return this._sortData(d1, d2, params, dirs);
}
else {
return 0;
}
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LW11bHRpLXNvcnQtZGF0YS1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXQtbXVsdGktc29ydC9zcmMvbGliL21hdC1tdWx0aS1zb3J0LWRhdGEtc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR3ZDLE1BQU0sT0FBTywyQkFBK0IsU0FBUSxVQUFhO0lBSzdELFlBQVksSUFBa0IsRUFBRSxpQkFBaUIsR0FBRyxLQUFLO1FBQ3JELEtBQUssRUFBRSxDQUFDO1FBTEosVUFBSyxHQUF5QixJQUFJLGVBQWUsQ0FBTSxFQUFFLENBQUMsQ0FBQztRQU0vRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUM7SUFDL0MsQ0FBQztJQUVELElBQVcsSUFBSSxDQUFDLElBQVM7UUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQVcsSUFBSTtRQUNYLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDNUIsQ0FBQztJQUVELE9BQU87UUFDSCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELFVBQVU7UUFDTixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxTQUFTO1FBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDOUYsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUFTLEVBQUUsT0FBaUIsRUFBRSxVQUFvQjtRQUN2RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxFQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDeEIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO2dCQUN6QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDdkQsQ0FBQyxDQUFDLENBQUM7U0FDTjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxTQUFTLENBQUMsRUFBSyxFQUFFLEVBQUssRUFBRSxNQUFnQixFQUFFLElBQWM7UUFDcEQsd0dBQXdHO1FBQ3hHLDJEQUEyRDtRQUMzRCxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDL0IsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLGFBQWE7U0FDWjthQUFNLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN0QyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDckM7YUFBTTtZQUNILElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ25CLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3hDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2xDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQzthQUMvQztpQkFBTTtnQkFDSCxPQUFPLENBQUMsQ0FBQzthQUNaO1NBQ0o7SUFDTCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1hdE11bHRpU29ydCB9IGZyb20gJy4vbWF0LW11bHRpLXNvcnQuZGlyZWN0aXZlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBNYXRNdWx0aVNvcnRUYWJsZURhdGFTb3VyY2U8VD4gZXh0ZW5kcyBEYXRhU291cmNlPFQ+IHtcclxuICAgIHByaXZhdGUgX2RhdGE6IEJlaGF2aW9yU3ViamVjdDxUW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUW10+KFtdKTtcclxuICAgIHByaXZhdGUgY2xpZW50U2lkZVNvcnRpbmc7XHJcbiAgICBzb3J0OiBNYXRNdWx0aVNvcnQ7XHJcblxyXG4gICAgY29uc3RydWN0b3Ioc29ydDogTWF0TXVsdGlTb3J0LCBjbGllbnRTaWRlU29ydGluZyA9IGZhbHNlKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLnNvcnQgPSBzb3J0O1xyXG4gICAgICAgIHRoaXMuY2xpZW50U2lkZVNvcnRpbmcgPSBjbGllbnRTaWRlU29ydGluZztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGRhdGEoZGF0YTogVFtdKSB7XHJcbiAgICAgICAgdGhpcy5fZGF0YS5uZXh0KGRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgZGF0YSgpOiBUW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbm5lY3QoKTogQmVoYXZpb3JTdWJqZWN0PFRbXT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGRpc2Nvbm5lY3QoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZGF0YS5jb21wbGV0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIG9yZGVyRGF0YSgpIHtcclxuICAgICAgICB0aGlzLl9kYXRhLm5leHQodGhpcy5zb3J0RGF0YSh0aGlzLl9kYXRhLnZhbHVlLCB0aGlzLnNvcnQuYWN0aXZlcywgdGhpcy5zb3J0LmRpcmVjdGlvbnMpKTtcclxuICAgIH1cclxuXHJcbiAgICBzb3J0RGF0YShkYXRhOiBUW10sIGFjdGl2ZXM6IHN0cmluZ1tdLCBkaXJlY3Rpb25zOiBzdHJpbmdbXSk6IFRbXSB7XHJcbiAgICAgICAgY29uc3QgX2RhdGEgPSBPYmplY3QuYXNzaWduKG5ldyBBcnJheTxUPigpLCBkYXRhKTtcclxuICAgICAgICBpZiAodGhpcy5jbGllbnRTaWRlU29ydGluZykge1xyXG4gICAgICAgICAgICByZXR1cm4gX2RhdGEuc29ydCgoaTEsIGkyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc29ydERhdGEoaTEsIGkyLCBhY3RpdmVzLCBkaXJlY3Rpb25zKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBfc29ydERhdGEoZDE6IFQsIGQyOiBULCBwYXJhbXM6IHN0cmluZ1tdLCBkaXJzOiBzdHJpbmdbXSk6IG51bWJlciB7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZSAtLSBuZWVkIGEgdHlwZXNhZmUgd2F5IHRvIGV4cHJlc3MgdGhlc2UgYWNjZXNzb3Igb3BlcmF0aW9ucywgdHMtaWdub3JlIGNvdWxkIGJlIGEgc29sdXRpb25cclxuICAgICAgICAvLyBpZiB0aGVyZSdzIG5vdCBhIHN1aXRhYmxlIHNvbHV0aW9uIG9mZmVyZWQgYnkgdHlwZXNjcmlwdFxyXG4gICAgICAgIGlmIChkMVtwYXJhbXNbMF1dID4gZDJbcGFyYW1zWzBdXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZGlyc1swXSA9PT0gJ2FzYycgPyAxIDogLTE7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIH0gZWxzZSBpZiAoZDFbcGFyYW1zWzBdXSA8IGQyW3BhcmFtc1swXV0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRpcnNbMF0gPT09ICdhc2MnID8gLTEgOiAxO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChwYXJhbXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zLnNsaWNlKDEsIHBhcmFtcy5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgZGlycyA9IGRpcnMuc2xpY2UoMSwgZGlycy5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NvcnREYXRhKGQxLCBkMiwgcGFyYW1zLCBkaXJzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==