Skip to content

Commit f18406c

Browse files
authored
Merge branch '5.3.x' into styling-regression-fixes
2 parents 897b7db + 5801cfb commit f18406c

8 files changed

+86
-15
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
You can find source files under the [`src`](https://github.com/IgniteUI/igniteui-angular/tree/master/src) folder, including samples and tests.
1010

1111
#### [**View running samples here**](https://www.infragistics.com/products/ignite-ui-angular/angular/components/grid.html)
12+
#### [**Install our VSCode tooltip extension**](https://marketplace.visualstudio.com/items?itemName=Infragistics.igniteui-angular-tooltips)
13+
![](https://dl.infragistics.com/tools/extensions/angular-tooltips/tooltip_preview.gif)
1214

1315
**IMPORTANT** The repository has been renamed from `igniteui-js-blocks` to `igniteui-angular`. Read more on our new [naming convention](https://www.infragistics.com/community/blogs/b/infragistics/posts/ignite-ui-github-repo-name-changes).
1416

ROADMAP.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Roadmap - Ignite UI for Angular
22

3-
## Milestone 2 (due April 16th, 2018)
3+
## Milestone 2 (due April 23rd, 2018)
44
1.**[DONE]** Expanding Ignite UI CLI views and templates with Ignite UI for Angular
55
1. [DONE]Adding component views like App Host, Tabbar, List
66
2. [DONE]Updating the default project look

src/grid/api.service.ts

+17-3
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,23 @@ export class IgxGridAPIService {
2727
public get_column_by_name(id: string, name: string): IgxColumnComponent {
2828
return this.get(id).columnList.find((col) => col.field === name);
2929
}
30+
3031
public set_summary_by_column_name(id: string, name: string) {
3132
if (!this.summaryCacheMap.get(id)) {
3233
this.summaryCacheMap.set(id, new Map<string, any[]>());
3334
}
3435
const column = this.get_column_by_name(id, name);
35-
if (!this.summaryCacheMap.get(id).get(column.field)) {
36-
this.summaryCacheMap.get(id).set(column.field,
37-
column.summaries.operate(this.get(id).data.map((rec) => rec[column.field])));
36+
if (this.get(id).filteredData) {
37+
if (this.get(id).filteredData.length > 0) {
38+
this.calculateSummaries(id, column, this.get(id).filteredData.map((rec) => rec[column.field]));
39+
} else {
40+
this.calculateSummaries(id, column, this.get(id).filteredData.map((rec) => rec[column.field]));
41+
}
42+
} else {
43+
this.calculateSummaries(id, column, this.get(id).data.map((rec) => rec[column.field]));
3844
}
3945
}
46+
4047
public get_summaries(id: string) {
4148
return this.summaryCacheMap.get(id);
4249
}
@@ -162,6 +169,13 @@ export class IgxGridAPIService {
162169
this.get(id).filteredData = null;
163170
}
164171

172+
protected calculateSummaries(id: string, column, data) {
173+
if (!this.summaryCacheMap.get(id).get(column.field)) {
174+
this.summaryCacheMap.get(id).set(column.field,
175+
column.summaries.operate(data));
176+
}
177+
}
178+
165179
public clear_sort(id, fieldName) {
166180
const sortingState = this.get(id).sortingExpressions;
167181
const index = sortingState.findIndex((expr) => expr.fieldName === fieldName);

src/grid/grid-filtering.component.ts

+1
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ export class IgxGridFilterComponent implements IGridBus, OnInit, OnDestroy {
190190
this._value = null;
191191
this._filterCondition = undefined;
192192
this.gridAPI.clear_filter(this.gridID, this.column.field);
193+
this.gridAPI.get(this.gridID).clearSummaryCache();
193194
}
194195

195196
public conditionChanged(value): void {

src/grid/grid-summary.component.ts

+10
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ export class IgxGridSummaryComponent implements IGridBus, OnInit, OnDestroy, DoC
6161
protected subscriptionOnEdit$;
6262
protected subscriptionOnAdd$;
6363
protected subscriptionOnDelete$;
64+
protected subscriptionOnFilter$;
6465
private itemClass = "igx-grid-summary__item";
6566
private hiddenItemClass = "igx-grid-summary__item--inactive";
6667
private summaryResultClass = "igx-grid-summary-item__result--left-align";
@@ -82,6 +83,9 @@ export class IgxGridSummaryComponent implements IGridBus, OnInit, OnDestroy, DoC
8283
if (this.subscriptionOnDelete$) {
8384
this.subscriptionOnDelete$.unsubscribe();
8485
}
86+
if (this.subscriptionOnFilter$) {
87+
this.subscriptionOnFilter$.unsubscribe();
88+
}
8589
}
8690

8791
ngDoCheck() {
@@ -98,6 +102,10 @@ export class IgxGridSummaryComponent implements IGridBus, OnInit, OnDestroy, DoC
98102
this.clearAll();
99103
}
100104
});
105+
this.subscriptionOnFilter$ = this.gridAPI.get(this.gridID).onFilteringDone.subscribe((data) => {
106+
this.fieldName = data.fieldName;
107+
this.clearAll();
108+
});
101109
this.subscriptionOnAdd$ = this.gridAPI.get(this.gridID).onRowAdded.subscribe(() => this.clearAll());
102110
this.subscriptionOnDelete$ = this.gridAPI.get(this.gridID).onRowDeleted.subscribe(() => this.clearAll());
103111
}
@@ -111,6 +119,8 @@ export class IgxGridSummaryComponent implements IGridBus, OnInit, OnDestroy, DoC
111119
@autoWire(true)
112120
clearAll() {
113121
this.gridAPI.remove_summary(this.gridID);
122+
this.gridAPI.get(this.gridID).markForCheck();
123+
this.cdr.detectChanges();
114124
}
115125

116126
get resolveSummaries(): any[] {

src/grid/grid-summary.spec.ts

+51-6
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
import { Component, DebugElement, ViewChild } from "@angular/core";
22
import { async, fakeAsync, TestBed, tick } from "@angular/core/testing";
33
import { By } from "@angular/platform-browser";
4+
import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
5+
import { IgxInputDirective } from "../directives/input/input.directive";
46
import { IgxDateSummaryOperand, IgxNumberSummaryOperand } from "./grid-summary";
57
import { IgxGridComponent } from "./grid.component";
68
import { IgxGridModule } from "./index";
79

810
describe("IgxGrid - Summaries", () => {
911
const SUMMARY_CLASS = ".igx-grid-summary";
1012
const SUMMARY_LABEL_CLASS = ".igx-grid-summary__label";
11-
const SUMMARY_VALUE_CLASS = "igx-grid-summary__result";
13+
const SUMMARY_VALUE_CLASS = ".igx-grid-summary__result";
1214
const ITEM_CLASS = "igx-grid-summary__item";
1315
const HIDDEN_ITEM_CLASS = "igx-grid-summary__item--inactive";
1416

@@ -18,7 +20,7 @@ describe("IgxGrid - Summaries", () => {
1820
NoActiveSummariesComponent,
1921
SummaryColumnComponent
2022
],
21-
imports: [IgxGridModule.forRoot()]
23+
imports: [BrowserAnimationsModule, IgxGridModule.forRoot()]
2224
})
2325
.compileComponents();
2426
}));
@@ -270,10 +272,12 @@ describe("IgxGrid - Summaries", () => {
270272
it("should calc tfoot height according number of summary functions", () => {
271273
const fixture = TestBed.createComponent(SummaryColumnComponent);
272274
fixture.detectChanges();
273-
275+
const initialSummarySize = 36.36;
274276
const grid = fixture.componentInstance.grid1;
275277
const summaries = fixture.debugElement.queryAll(By.css("igx-grid-summary"));
276-
const tfootSize = fixture.debugElement.query(By.css(".igx-grid__tfoot")).query(By.css(".igx-grid__tr")).nativeElement.clientHeight;
278+
const footerRow = fixture.debugElement.query(By.css(".igx-grid__tfoot")).query(By.css(".igx-grid__tr"))
279+
.nativeElement.style["height"].match(/\d+\.+\d/);
280+
const tfootSize = +footerRow;
277281

278282
let maxSummaryLength = 0;
279283
let index = 0;
@@ -284,7 +288,7 @@ describe("IgxGrid - Summaries", () => {
284288
}
285289
index++;
286290
});
287-
const expectedHeight = maxSummaryLength * 36;
291+
const expectedHeight = maxSummaryLength * initialSummarySize;
288292
expect(tfootSize).toBe(expectedHeight);
289293
});
290294
it("should calculate summaries for 'number' dataType or return if no data is provided", () => {
@@ -325,6 +329,47 @@ describe("IgxGrid - Summaries", () => {
325329
expect(emptySummaries[1].summaryResult).toBe(undefined);
326330
expect(emptySummaries[2].summaryResult).toBe(undefined);
327331
});
332+
it("should calculate summaries only over filteredData", (done) => {
333+
const fixture = TestBed.createComponent(SummaryColumnComponent);
334+
fixture.detectChanges();
335+
336+
const grid = fixture.componentInstance.grid1;
337+
const filterUIContainer = fixture.debugElement.query(By.css("igx-grid-filter"));
338+
const filterIcon = filterUIContainer.query(By.css("igx-icon"));
339+
const input = filterUIContainer.query(By.directive(IgxInputDirective));
340+
const select = filterUIContainer.query(By.css("div > select"));
341+
const summaries = fixture.debugElement.queryAll(By.css("igx-grid-summary"));
342+
343+
filterIcon.nativeElement.click();
344+
fixture.detectChanges();
345+
select.nativeElement.value = "equals";
346+
select.nativeElement.dispatchEvent(new Event("change"));
347+
348+
sendInput(input, "0", fixture).then(() => {
349+
fixture.detectChanges();
350+
const filterResult = grid.rowList.length;
351+
expect(filterResult).toEqual(3);
352+
let index = 0;
353+
grid.columnList.forEach((col) => {
354+
if (col.hasSummary) {
355+
const values = summaries[index].queryAll(By.css(SUMMARY_VALUE_CLASS));
356+
expect(+values[0].nativeElement.innerText).toBe(filterResult);
357+
if (col.field === "UnitsInStock") {
358+
expect(values[1].nativeElement.innerText).toBe("0");
359+
expect(values[2].nativeElement.innerText).toBe("0");
360+
}
361+
}
362+
index++;
363+
});
364+
done();
365+
});
366+
});
367+
function sendInput(element, text: string, fix) {
368+
element.nativeElement.value = text;
369+
element.nativeElement.dispatchEvent(new Event("input"));
370+
fix.detectChanges();
371+
return fix.whenStable();
372+
}
328373

329374
});
330375

@@ -372,7 +417,7 @@ export class NoActiveSummariesComponent {
372417
</igx-column>
373418
<igx-column field="InStock" [dataType]="'boolean'" [hasSummary]="true">
374419
</igx-column>
375-
<igx-column field="UnitsInStock" [dataType]="'number'" [hasSummary]="true">
420+
<igx-column field="UnitsInStock" [dataType]="'number'" [hasSummary]="true" [filterable]="true">
376421
</igx-column>
377422
<igx-column field="OrderDate" width="200px" [dataType]="'date'" [sortable]="true" [hasSummary]="true">
378423
</igx-column>

src/grid/grid.component.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ import { IgxGridRowComponent } from "./row.component";
4646

4747
let NEXT_ID = 0;
4848
const DEBOUNCE_TIME = 16;
49-
49+
const DEFAULT_SUMMARY_HEIGHT = 36.36;
5050
export interface IGridCellEventArgs {
5151
cell: IgxGridCellComponent;
5252
event: Event;
@@ -698,6 +698,7 @@ export class IgxGridComponent implements OnInit, OnDestroy, AfterContentInit, Af
698698
if (!this.gridAPI.get_column_by_name(this.id, name)) {
699699
return;
700700
}
701+
this.clearSummaryCache();
701702
this.gridAPI.clear_filter(this.id, name);
702703
}
703704

@@ -741,7 +742,6 @@ export class IgxGridComponent implements OnInit, OnDestroy, AfterContentInit, Af
741742
this._unpinnedColumns.splice(this._unpinnedColumns.indexOf(col), 1);
742743
}
743744
}
744-
745745
this.markForCheck();
746746
return true;
747747
}
@@ -838,7 +838,7 @@ export class IgxGridComponent implements OnInit, OnDestroy, AfterContentInit, Af
838838
maxSummaryLength = currentLength;
839839
}
840840
});
841-
return maxSummaryLength * (this.tfoot.nativeElement.clientHeight ? this.tfoot.nativeElement.clientHeight : 36);
841+
return maxSummaryLength * (this.tfoot.nativeElement.clientHeight ? this.tfoot.nativeElement.clientHeight : DEFAULT_SUMMARY_HEIGHT);
842842
}
843843

844844
protected calculateGridSizes() {

src/tabs/tabs.component.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import {
2020
ViewChildren
2121
} from "@angular/core";
2222

23-
import { isNullOrUndefined } from "util";
2423
import { IgxBadgeModule } from "../badge/badge.component";
2524
import { IgxRippleModule } from "../directives/ripple/ripple.directive";
2625
import { IgxIconModule } from "../icon";
@@ -85,7 +84,7 @@ export class IgxTabsComponent implements AfterViewInit {
8584
}
8685

8786
// Layout fix for items with icons
88-
if (!isNullOrUndefined(iconLabelFound)) {
87+
if (iconLabelFound !== undefined) {
8988
css = `${css} ${iconStyle}`;
9089
}
9190

0 commit comments

Comments
 (0)