Fix: Product ledger was not totalling. This is because for some reason, pydantic was sending the data as string when the field was nullable
74 lines
2.2 KiB
TypeScript
74 lines
2.2 KiB
TypeScript
import { DataSource } from '@angular/cdk/collections';
|
|
import { EventEmitter } from '@angular/core';
|
|
import { MatPaginator, PageEvent } from '@angular/material/paginator';
|
|
import { MatSort, Sort } from '@angular/material/sort';
|
|
import { merge, Observable, of as observableOf } from 'rxjs';
|
|
import { map } from 'rxjs/operators';
|
|
|
|
import { LedgerItem } from './ledger-item';
|
|
|
|
/** Simple sort comparator for example ID/Name columns (for client-side sorting). */
|
|
const compare = (a: string | number, b: string | number, isAsc: boolean) => (a < b ? -1 : 1) * (isAsc ? 1 : -1);
|
|
export class LedgerDataSource extends DataSource<LedgerItem> {
|
|
constructor(
|
|
public data: LedgerItem[],
|
|
private paginator?: MatPaginator,
|
|
private sort?: MatSort,
|
|
) {
|
|
super();
|
|
}
|
|
|
|
connect(): Observable<LedgerItem[]> {
|
|
const dataMutations: (EventEmitter<PageEvent> | EventEmitter<Sort>)[] = [];
|
|
if (this.paginator) {
|
|
dataMutations.push((this.paginator as MatPaginator).page);
|
|
}
|
|
if (this.sort) {
|
|
dataMutations.push((this.sort as MatSort).sortChange);
|
|
}
|
|
|
|
// Set the paginators length
|
|
if (this.paginator) {
|
|
this.paginator.length = this.data.length;
|
|
}
|
|
|
|
return merge(observableOf(this.data), ...dataMutations).pipe(
|
|
map(() => this.getPagedData(this.getSortedData([...this.data]))),
|
|
);
|
|
}
|
|
|
|
disconnect() {}
|
|
|
|
private getPagedData(data: LedgerItem[]) {
|
|
if (this.paginator === undefined) {
|
|
return data;
|
|
}
|
|
const startIndex = this.paginator.pageIndex * this.paginator.pageSize;
|
|
return data.splice(startIndex, this.paginator.pageSize);
|
|
}
|
|
|
|
private getSortedData(data: LedgerItem[]) {
|
|
if (this.sort === undefined) {
|
|
return data;
|
|
}
|
|
if (!this.sort.active || this.sort.direction === '') {
|
|
return data;
|
|
}
|
|
|
|
const sort = this.sort as MatSort;
|
|
return data.sort((a, b) => {
|
|
const isAsc = sort.direction === 'asc';
|
|
switch (sort.active) {
|
|
case 'date':
|
|
return compare(a.date, b.date, isAsc);
|
|
case 'debit':
|
|
return compare(+a.debit, +b.debit, isAsc);
|
|
case 'credit':
|
|
return compare(+a.credit, +b.credit, isAsc);
|
|
default:
|
|
return 0;
|
|
}
|
|
});
|
|
}
|
|
}
|