igniteui-angular-sovn
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
143 lines (124 loc) • 5.21 kB
text/typescript
import { Inject, Pipe, PipeTransform } from '@angular/core';
import { cloneArray } from '../../core/utils';
import { DataUtil } from '../../data-operations/data-util';
import { IGroupByExpandState } from '../../data-operations/groupby-expand-state.interface';
import { IGroupByResult } from '../../data-operations/grouping-result.interface';
import { IFilteringExpressionsTree, FilteringExpressionsTree } from '../../data-operations/filtering-expressions-tree';
import { IGroupingExpression } from '../../data-operations/grouping-expression.interface';
import { GridType, IGX_GRID_BASE } from '../common/grid.interface';
import { FilterUtil, IFilteringStrategy } from '../../data-operations/filtering-strategy';
import { GridPagingMode } from '../common/enums';
import { ISortingExpression } from '../../data-operations/sorting-strategy';
import { IGridSortingStrategy, IGridGroupingStrategy } from '../common/strategy';
/**
* @hidden
*/
export class IgxGridSortingPipe implements PipeTransform {
constructor( private grid: GridType) { }
public transform(collection: any[], sortExpressions: ISortingExpression[], groupExpressions: IGroupingExpression[], sorting: IGridSortingStrategy,
id: string, pipeTrigger: number, pinned?): any[] {
let result: any[];
const expressions = groupExpressions.concat(sortExpressions);
if (!expressions.length) {
result = collection;
} else {
result = DataUtil.sort(cloneArray(collection), expressions, sorting, this.grid);
}
this.grid.setFilteredSortedData(result, pinned);
return result;
}
}
/**
* @hidden
*/
export class IgxGridGroupingPipe implements PipeTransform {
constructor( private grid: GridType) { }
public transform(collection: any[], expression: IGroupingExpression | IGroupingExpression[],
expansion: IGroupByExpandState | IGroupByExpandState[],
groupingStrategy: IGridGroupingStrategy, defaultExpanded: boolean,
id: string, groupsRecords: any[], _pipeTrigger: number): IGroupByResult {
const state = { expressions: [], expansion: [], defaultExpanded };
state.expressions = this.grid.groupingExpressions;
let result: IGroupByResult;
const fullResult: IGroupByResult = { data: [], metadata: [] };
if (!state.expressions.length) {
// empty the array without changing reference
groupsRecords.splice(0, groupsRecords.length);
result = {
data: collection,
metadata: collection
};
} else {
state.expansion = this.grid.groupingExpansionState;
state.defaultExpanded = this.grid.groupsExpanded;
result = DataUtil.group(cloneArray(collection), state, groupingStrategy, this.grid, groupsRecords, fullResult);
}
this.grid.groupingFlatResult = result.data;
this.grid.groupingResult = fullResult.data;
this.grid.groupingMetadata = fullResult.metadata;
return result;
}
}
/**
* @hidden
*/
export class IgxGridPagingPipe implements PipeTransform {
constructor( private grid: GridType) { }
public transform(collection: IGroupByResult, enabled: boolean, page = 0, perPage = 15, _: number): IGroupByResult {
if (!enabled || this.grid.pagingMode !== GridPagingMode.Local) {
return collection;
}
const state = {
index: page,
recordsPerPage: perPage
};
const total = this.grid._totalRecords >= 0 ? this.grid._totalRecords : collection.data?.length;
DataUtil.correctPagingState(state, total);
const result = {
data: DataUtil.page(cloneArray(collection.data), state, total),
metadata: DataUtil.page(cloneArray(collection.metadata), state, total)
};
if (this.grid.page !== state.index) {
this.grid.page = state.index;
}
this.grid.pagingState = state;
return result;
}
}
/**
* @hidden
*/
export class IgxGridFilteringPipe implements PipeTransform {
constructor( private grid: GridType) { }
public transform(collection: any[], expressionsTree: IFilteringExpressionsTree,
filterStrategy: IFilteringStrategy,
advancedExpressionsTree: IFilteringExpressionsTree, id: string, pipeTrigger: number, filteringPipeTrigger: number, pinned?) {
const state = {
expressionsTree,
strategy: filterStrategy,
advancedExpressionsTree
};
if (FilteringExpressionsTree.empty(state.expressionsTree) && FilteringExpressionsTree.empty(state.advancedExpressionsTree)) {
return collection;
}
const result = FilterUtil.filter(cloneArray(collection), state, this.grid);
this.grid.setFilteredData(result, pinned);
return result;
}
}