Skip to content

Commit bbf3bca

Browse files
authored
Merge pull request #5966 from IgniteUI/ddincheva/summary5754
Access all grid data from each summary
2 parents ce9218c + 93a9014 commit bbf3bca

File tree

8 files changed

+130
-28
lines changed

8 files changed

+130
-28
lines changed

projects/igniteui-angular/src/lib/grids/grid/grid-summary.spec.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,37 @@ describe('IgxGrid - Summaries #grid', () => {
287287
'summary cell and data cell are not right aligned');
288288
}));
289289

290+
it('should be able to access alldata from each summary', fakeAsync(() => {
291+
const fixture = TestBed.createComponent(CustomSummariesComponent);
292+
const grid = fixture.componentInstance.grid1;
293+
fixture.detectChanges();
294+
295+
const summaryRow = fixture.debugElement.query(By.css(SUMMARY_ROW));
296+
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 3, ['Count', 'Sum', 'Avg'], ['10', '39,004', '3,900.4']);
297+
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 4, ['Earliest'], ['5/17/1990']);
298+
GridSummaryFunctions.verifyVisibleSummariesHeight(fixture, 3, grid.defaultSummaryHeight);
299+
grid.getColumnByName('UnitsInStock').summaries = fixture.componentInstance.inStockSummary;
300+
tick(100);
301+
fixture.detectChanges();
302+
303+
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 3, ['Count', 'Min', 'Max', 'Sum', 'Avg', 'Items InStock'],
304+
['10', '0', '20,000', '39,004', '3,900.4', '6']);
305+
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 4, ['Earliest'], ['5/17/1990']);
306+
307+
grid.getCellByColumn(4, 'InStock').update(true);
308+
tick();
309+
fixture.detectChanges();
310+
311+
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 3, ['Count', 'Min', 'Max', 'Sum', 'Avg', 'Items InStock'],
312+
['10', '0', '20,000', '39,004', '3,900.4', '7']);
313+
314+
grid.filter('UnitsInStock', 0, IgxNumberFilteringOperand.instance().condition('equals'));
315+
fixture.detectChanges();
316+
317+
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 3, ['Count', 'Min', 'Max', 'Sum', 'Avg', 'Items InStock'],
318+
['3', '0', '0', '0', '0', '1']);
319+
}));
320+
290321
describe('', () => {
291322
let fix;
292323
let grid: IgxGridComponent;
@@ -2441,6 +2472,24 @@ class EarliestSummary extends IgxDateSummaryOperand {
24412472
}
24422473
}
24432474

2475+
class InStockSummary extends IgxNumberSummaryOperand {
2476+
constructor() {
2477+
super();
2478+
}
2479+
2480+
public operate(summaries?: any[], allData = [], field?): IgxSummaryResult[] {
2481+
const result = super.operate(summaries);
2482+
if (field && field === 'UnitsInStock') {
2483+
result.push({
2484+
key: 'test',
2485+
label: 'Items InStock',
2486+
summaryResult: allData.filter((rec) => rec.InStock).length
2487+
});
2488+
}
2489+
return result;
2490+
}
2491+
}
2492+
24442493
@Component({
24452494
template: `
24462495
<igx-grid #grid1 [data]="data" [primaryKey]="'ProductID'" [allowFiltering]="true">
@@ -2466,6 +2515,7 @@ export class CustomSummariesComponent {
24662515
public dealsSummary = DealsSummary;
24672516
public dealsSummaryMinMax = DealsSummaryMinMax;
24682517
public earliest = EarliestSummary;
2518+
public inStockSummary = InStockSummary;
24692519
}
24702520

24712521
@Component({

projects/igniteui-angular/src/lib/grids/summaries/grid-summary.service.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,8 @@ export class IgxGridSummaryService {
107107
if (!this.hasSummarizedColumns || !data) {return rowSummaries; }
108108
this.grid.columnList.filter(col => col.hasSummary).forEach((column) => {
109109
if (!rowSummaries.get(column.field)) {
110-
const columnValues = data.map(record => record[column.field]);
111110
rowSummaries.set(column.field,
112-
column.summaries.operate(columnValues));
111+
column.summaries.operate(data.map(r => r[column.field]), data, column.field));
113112
}
114113
});
115114
return rowSummaries;

projects/igniteui-angular/src/lib/grids/summaries/grid-summary.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export class IgxSummaryOperand {
4545
* constructor() {
4646
* super();
4747
* }
48-
* public operate(data?: any[]): IgxSummaryResult[] {
48+
* public operate(data: any[], allData: any[], fieldName: string): IgxSummaryResult[] {
4949
* const result = [];
5050
* result.push({
5151
* key: "test",
@@ -59,7 +59,7 @@ export class IgxSummaryOperand {
5959
* ```
6060
* @memberof IgxSummaryOperand
6161
*/
62-
public operate(data: any[] = []): IgxSummaryResult[] {
62+
public operate(data: any[] = [], allData: any[] = [], fieldName?: string): IgxSummaryResult[] {
6363
return [{
6464
key: 'count',
6565
label: 'Count',
@@ -129,7 +129,7 @@ export class IgxNumberSummaryOperand extends IgxSummaryOperand {
129129
* constructor() {
130130
* super();
131131
* }
132-
* public operate(data?: any[]): IgxSummaryResult[] {
132+
* public operate(data: any[], allData: any[], fieldName: string): IgxSummaryResult[] {
133133
* const result = [];
134134
* result.push({
135135
* key: "avg",
@@ -148,8 +148,8 @@ export class IgxNumberSummaryOperand extends IgxSummaryOperand {
148148
* ```
149149
* @memberof IgxNumberSummaryOperand
150150
*/
151-
public operate(data: any[] = []): IgxSummaryResult[] {
152-
const result = super.operate(data);
151+
public operate(data: any[] = [], allData: any[] = [], fieldName?: string): IgxSummaryResult[] {
152+
const result = super.operate(data, allData, fieldName);
153153
result.push({
154154
key: 'min',
155155
label: 'Min',
@@ -215,7 +215,7 @@ export class IgxDateSummaryOperand extends IgxSummaryOperand {
215215
* constructor() {
216216
* super();
217217
* }
218-
* public operate(data?: any[]): IgxSummaryResult[] {
218+
* public operate(data: any[], allData: any[], fieldName: string): IgxSummaryResult[] {
219219
* const result = [];
220220
* result.push({
221221
* key: "latest",
@@ -229,8 +229,8 @@ export class IgxDateSummaryOperand extends IgxSummaryOperand {
229229
* ```
230230
* @memberof IgxDateSummaryOperand
231231
*/
232-
public operate(data: any[] = []): IgxSummaryResult[] {
233-
const result = super.operate(data);
232+
public operate(data: any[] = [], allData: any[] = [], fieldName?: string): IgxSummaryResult[] {
233+
const result = super.operate(data, allData, fieldName);
234234
result.push({
235235
key: 'earliest',
236236
label: 'Earliest',

projects/igniteui-angular/src/lib/grids/tree-grid/tree-grid-summaries.spec.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1609,6 +1609,44 @@ describe('IgxTreeGrid - Summaries #tGrid', () => {
16091609
verifySummaryForRow847(fix, 6);
16101610
}));
16111611

1612+
it('should be able to access alldata from each summary', fakeAsync(() => {
1613+
const fix = TestBed.createComponent(IgxTreeGridCustomSummariesComponent);
1614+
fix.detectChanges();
1615+
const treeGrid = fix.componentInstance.treeGrid;
1616+
1617+
treeGrid.expandAll();
1618+
fix.detectChanges();
1619+
1620+
let summaryRow = GridSummaryFunctions.getSummaryRowByDataRowIndex(fix, 6);
1621+
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 1, ['Count'], ['2']);
1622+
summaryRow = GridSummaryFunctions.getSummaryRowByDataRowIndex(fix, 7);
1623+
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 1, ['Count'], ['3']);
1624+
summaryRow = GridSummaryFunctions.getSummaryRowByDataRowIndex(fix, 0);
1625+
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 1, ['Count'], ['4']);
1626+
1627+
treeGrid.getColumnByName('Name').summaries = fix.componentInstance.ptoSummary;
1628+
tick();
1629+
fix.detectChanges();
1630+
1631+
summaryRow = GridSummaryFunctions.getSummaryRowByDataRowIndex(fix, 6);
1632+
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 1, ['Count', 'People on PTO'], ['2', '1']);
1633+
summaryRow = GridSummaryFunctions.getSummaryRowByDataRowIndex(fix, 7);
1634+
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 1, ['Count', 'People on PTO'], ['3', '1']);
1635+
summaryRow = GridSummaryFunctions.getSummaryRowByDataRowIndex(fix, 0);
1636+
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 1, ['Count', 'People on PTO'], ['4', '0']);
1637+
1638+
treeGrid.getCellByColumn(5, 'OnPTO').update(true);
1639+
tick();
1640+
fix.detectChanges();
1641+
1642+
summaryRow = GridSummaryFunctions.getSummaryRowByDataRowIndex(fix, 6);
1643+
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 1, ['Count', 'People on PTO'], ['2', '2']);
1644+
summaryRow = GridSummaryFunctions.getSummaryRowByDataRowIndex(fix, 7);
1645+
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 1, ['Count', 'People on PTO'], ['3', '1']);
1646+
summaryRow = GridSummaryFunctions.getSummaryRowByDataRowIndex(fix, 0);
1647+
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 1, ['Count', 'People on PTO'], ['4', '0']);
1648+
}));
1649+
16121650
it('should render rows correctly after collapse and expand', async () => {
16131651
const fix = TestBed.createComponent(IgxTreeGridSummariesScrollingComponent);
16141652
const treeGrid = fix.componentInstance.treeGrid;

projects/igniteui-angular/src/lib/test-utils/tree-grid-components.spec.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Component, ViewChild, OnInit } from '@angular/core';
22
import { IgxTreeGridComponent } from '../grids/tree-grid/tree-grid.component';
33
import { SampleTestData } from './sample-test-data.spec';
4-
import { IgxNumberSummaryOperand, IgxSummaryResult } from '../grids';
4+
import { IgxSummaryOperand, IgxNumberSummaryOperand, IgxSummaryResult } from '../grids';
55
import { IgxGridTransaction } from '../grids/grid-base.component';
66
import { IgxTransactionService } from '../services/transaction/igx-transaction';
77
import { IgxHierarchicalTransactionService } from '../services/transaction/igx-hierarchical-transaction';
@@ -400,6 +400,24 @@ class AgeSummaryTest extends IgxNumberSummaryOperand {
400400
}
401401
}
402402

403+
class PTOSummary extends IgxSummaryOperand {
404+
constructor() {
405+
super();
406+
}
407+
408+
public operate(summaries?: any[], allData = [], field?): IgxSummaryResult[] {
409+
const result = super.operate(summaries);
410+
if (field && field === 'Name') {
411+
result.push({
412+
key: 'test',
413+
label: 'People on PTO',
414+
summaryResult: allData.filter((rec) => rec.OnPTO).length
415+
});
416+
}
417+
return result;
418+
}
419+
}
420+
403421
@Component({
404422
template: `
405423
<igx-tree-grid #treeGrid [data]="data" primaryKey="ID" foreignKey="ParentID" [rowEditable]="true" width="900px" height="600px">
@@ -433,6 +451,7 @@ export class IgxTreeGridCustomSummariesComponent {
433451
public data = SampleTestData.employeeTreeData();
434452
public ageSummary = AgeSummary;
435453
public ageSummaryTest = AgeSummaryTest;
454+
public ptoSummary = PTOSummary;
436455
}
437456

438457
@Component({

src/app/grid-groupby/grid-groupby.sample.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<div class="density-chooser" style="margin-bottom: 16px">
55
<igx-buttongroup [values]="summaryModes" (onSelect)="selectSummaryMode($event)" style="display: block; width: 500px"></igx-buttongroup>
66
</div>
7-
<igx-grid #grid1 [data]="data" [allowFiltering]="true" [cellSelection]="'single'" [width]="'1200px'" (onGroupingDone)="onGroupingDoneHandler($event)" [hideGroupedColumns]="hideGroupedColumns" [(groupingExpressions)]='groupingExpressions'
7+
<igx-grid #grid1 [data]="data" [allowFiltering]="true" [cellSelection]="'single'" [width]="'1200px'" [hideGroupedColumns]="hideGroupedColumns"
88
[height]="'700px'" [(groupingExpansionState)]='expState' [rowSelectable]='true' [summaryCalculationMode]="summaryMode">
99
<igx-column *ngFor="let c of columns" [sortable]="true" [field]="c.field" [header]="c.field" [width]="c.width"
1010
[hidden]='c.hidden' [sortable]='true' [groupable]='c.groupable' [movable]='true' [pinned]='!!c.pinned' [editable]="true" [hasSummary]="true" [dataType]='c.dataType'>

src/app/grid-summaries/grid-summaries.sample.html

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<igx-grid #grid1 [data]="data" [autoGenerate]="false" [displayDensity]="'compact'" [width]="w" [height]="h"
2-
[paging]="false" [allowFiltering]='true' [filterMode]="'excelStyleFilter'">
2+
[paging]="false" [allowFiltering]='true' [filterMode]="'excelStyleFilter'" [summaryCalculationMode]="'rootAndChildLevels'">
33
<igx-column field="Index" header="Index" [width]="cw">
44
</igx-column>
55
<igx-column field="ProductID" header="Product ID" [width]="cw" [headerClasses]="'prodId'" [groupable]="groupable">
@@ -9,30 +9,26 @@
99
</igx-column>
1010
<igx-column field="ReorderLevel" [width]="cw" [sortable]="true" [groupable]="groupable" [filterable]="filterable"
1111
editable="true" [dataType]="'number'" [disableHiding]="disableHiding" [disablePinning]="disablePinning">
12-
<ng-template igxCell let-cell="cell" let-val let-row>
13-
{{val}} {{row.gridID}}
14-
</ng-template>
1512
</igx-column>
1613
<igx-column field="QuantityPerUnit" [width]="cw" header="QuantityPerUnit" [sortable]="true" [dataType]="'string'"
1714
[editable]="true">
1815
</igx-column>
19-
<igx-column field="UnitsInStock" header="UnitsInStock" [width]="cw" [dataType]="'number'" [summaries]="mySummary"
16+
<igx-column field="UnitsInStock" header="UnitsInStock" [width]="cw" [dataType]="'number'"
2017
[hasSummary]="hasSummaryUnit" [hidden]="hasHidden" editable="true" [sortable]="true">
2118
<ng-template igxCell let-cell="cell" let-val let-row>
2219
${{val}}
2320
</ng-template>
2421
</igx-column>
2522
<igx-column field="OrderDate" [width]="cw" [dataType]="'date'" [hasSummary]="false" [sortable]="true">
26-
<ng-template igxCell let-cell="cell" let-val let-row>
27-
{{val}}
28-
</ng-template>
2923
</igx-column>
3024
<igx-column field="Discontinued" header="Discontinued" [dataType]="'boolean'" [width]="cw" [hasSummary]="false"
3125
editable="true">
3226
<ng-template igxCell let-cell="cell" let-val>
3327
{{val}}
3428
</ng-template>
3529
</igx-column>
30+
<igx-column field="Sum" [hasSummary]="true" [summaries]="mySummary">
31+
</igx-column>
3632
</igx-grid>
3733

3834
<div class="properties-input">

src/app/grid-summaries/grid-summaries.sample.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@ class MySummary extends IgxNumberSummaryOperand {
1414
super();
1515
}
1616

17-
operate(data?: any[]): IgxSummaryResult[] {
18-
const result = super.operate(data);
19-
result.push({
20-
key: 'test',
21-
label: 'Test',
22-
summaryResult: data.filter((rec) => rec > 10 && rec < 30).length
23-
});
24-
17+
operate(data: any[], allData = [], fieldName?): IgxSummaryResult[] {
18+
fieldName = fieldName === 'Sum' ? 'ReorderLevel' : fieldName;
19+
const result = super.operate(allData.map(r => r[fieldName]));
20+
result.push({
21+
key: 'test',
22+
label: 'Total Discounted',
23+
summaryResult: allData.filter((rec) => rec.Discontinued).length
24+
});
2525
return result;
2626
}
2727
}

0 commit comments

Comments
 (0)