common-ui/src/lib/sorting/sorting.service.ts
2021-08-26 20:45:15 +03:00

46 lines
1.5 KiB
TypeScript

import { Injectable } from '@angular/core';
import { orderBy } from 'lodash';
import { BehaviorSubject } from 'rxjs';
import { SortingOption } from './models/sorting-option.model';
import { SortingOrder, SortingOrders } from './models/sorting-order.type';
import { KeysOf } from '../utils';
@Injectable()
export class SortingService<T> {
private readonly _sortingOption$ = new BehaviorSubject<SortingOption<T> | undefined>(undefined);
readonly sortingOption$ = this._sortingOption$.asObservable();
get sortingOption(): SortingOption<T> | undefined {
return this._sortingOption$.getValue();
}
static sort<T>(values: T[], order?: SortingOrder, column?: KeysOf<T>): T[] {
if (!values || values.length <= 1 || !order) {
return values;
}
if (!column) {
/** sort 1D array */
const result = [...values].sort();
return order === SortingOrders.asc ? result : result.reverse();
}
return orderBy(values, [column], [order]);
}
setSortingOption(value: SortingOption<T>): void {
this._sortingOption$.next(value);
}
defaultSort(values: T[]): T[] {
return SortingService.sort(values, this.sortingOption?.order, this.sortingOption?.column);
}
toggleSort(column: KeysOf<T>): void {
const sameColumn = this.sortingOption?.column === column;
const order = sameColumn ? SortingOrders.inverseOf(this.sortingOption?.order) : SortingOrders.asc;
this._sortingOption$.next({ column, order });
}
}