igniteui-angular-sovn
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
143 lines (126 loc) • 6.39 kB
text/typescript
import { Inject, Pipe, PipeTransform } from '@angular/core';
import { ISummaryRecord } from '../summaries/grid-summary';
import { IGroupByRecord } from '../../data-operations/groupby-record.interface';
import { IGroupByResult } from '../../data-operations/grouping-result.interface';
import { GridSummaryCalculationMode, GridSummaryPosition } from '../common/enums';
import { GridType, IGX_GRID_BASE } from '../common/grid.interface';
/** @hidden */
interface ISkipRecord { skip?: boolean }
/** @hidden */
export class IgxGridSummaryPipe implements PipeTransform {
constructor( private grid: GridType) { }
public transform(collection: IGroupByResult,
hasSummary: boolean,
summaryCalculationMode: GridSummaryCalculationMode,
summaryPosition: GridSummaryPosition,
id: string, showSummary, _: number, __: number): any[] {
if (!collection.data || !hasSummary || summaryCalculationMode === GridSummaryCalculationMode.rootLevelOnly) {
return collection.data;
}
return this.addSummaryRows(id, collection, summaryPosition, showSummary);
}
private addSummaryRows(gridId: string, collection: IGroupByResult, summaryPosition: GridSummaryPosition, showSummary): any[] {
const recordsWithSummary = [];
const lastChildMap = new Map<any, IGroupByRecord[]>();
const maxSummaryHeight = this.grid.summaryService.calcMaxSummaryHeight();
if (collection.metadata.length && !this.grid.isGroupByRecord(collection.data[0]) &&
this.grid.isGroupByRecord(collection.metadata[0]) && summaryPosition === GridSummaryPosition.bottom) {
const groups: Array<IGroupByRecord & ISkipRecord> = [];
groups.push(collection.metadata[0]);
while (groups[groups.length - 1].groupParent) {
groups.push(groups[groups.length - 1].groupParent);
}
groups.reverse();
groups.forEach(g => g.skip = true);
collection.data.splice(0, 0, ...groups);
}
for (const record of collection.data) {
let skipAdd = false;
let recordId;
let groupByRecord: IGroupByRecord = null;
if (this.grid.isGroupByRecord(record)) {
skipAdd = !!record.skip;
record.skip = null;
groupByRecord = record as IGroupByRecord;
recordId = this.grid.gridAPI.get_groupBy_record_id(groupByRecord);
} else {
recordId = this.grid.gridAPI.get_row_id(record);
}
if (!skipAdd) {
recordsWithSummary.push(record);
}
if (summaryPosition === GridSummaryPosition.bottom && showSummary &&
(groupByRecord && !this.grid.isExpandedGroup(groupByRecord))) {
const records = this.removeDeletedRecord(this.grid, groupByRecord.records.slice());
const summaries = this.grid.summaryService.calculateSummaries(recordId, records);
const summaryRecord: ISummaryRecord = {
summaries,
max: maxSummaryHeight
};
recordsWithSummary.push(summaryRecord);
}
if (summaryPosition === GridSummaryPosition.bottom && lastChildMap.has(recordId)) {
const groupRecords = lastChildMap.get(recordId);
for (const groupRecord of groupRecords) {
const groupRecordId = this.grid.gridAPI.get_groupBy_record_id(groupRecord);
const records = this.removeDeletedRecord(this.grid, groupRecord.records.slice());
const summaries = this.grid.summaryService.calculateSummaries(groupRecordId, records, groupRecord);
const summaryRecord: ISummaryRecord = {
summaries,
max: maxSummaryHeight
};
recordsWithSummary.push(summaryRecord);
}
}
const showSummaries = showSummary ? false : (groupByRecord && !this.grid.isExpandedGroup(groupByRecord));
if (groupByRecord === null || showSummaries) {
continue;
}
if (summaryPosition === GridSummaryPosition.top) {
const records = this.removeDeletedRecord(this.grid, groupByRecord.records.slice());
const summaries = this.grid.summaryService.calculateSummaries(recordId, records, groupByRecord);
const summaryRecord: ISummaryRecord = {
summaries,
max: maxSummaryHeight
};
recordsWithSummary.push(summaryRecord);
} else if (summaryPosition === GridSummaryPosition.bottom) {
let lastChild = groupByRecord;
while (lastChild.groups && lastChild.groups.length > 0 && this.grid.isExpandedGroup(lastChild)) {
lastChild = lastChild.groups[lastChild.groups.length - 1];
}
let lastChildId;
if (this.grid.isExpandedGroup(lastChild)) {
lastChildId = this.grid.gridAPI.get_row_id(lastChild.records[lastChild.records.length - 1]);
} else {
lastChildId = this.grid.gridAPI.get_groupBy_record_id(lastChild);
}
let groupRecords = lastChildMap.get(lastChildId);
if (!groupRecords) {
groupRecords = [];
lastChildMap.set(lastChildId, groupRecords);
}
groupRecords.unshift(groupByRecord);
}
}
return recordsWithSummary;
}
private removeDeletedRecord(grid: GridType, data: any[]) {
if (!grid.transactions.enabled) {
return data;
}
const deletedRows = grid.transactions.getTransactionLog().filter(t => t.type === 'delete').map(t => t.id);
deletedRows.forEach(rowID => {
const tempData = grid.primaryKey ? data.map(rec => rec[grid.primaryKey]) : data;
const index = tempData.indexOf(rowID);
if (index !== -1) {
data.splice(index, 1);
}
});
return data;
}
}