Skip to content

Commit d29c105

Browse files
authored
Merge branch 'master' into simeonoff/fix-15412-19.2.x
2 parents 02fb4f9 + d887757 commit d29c105

File tree

13 files changed

+181
-57
lines changed

13 files changed

+181
-57
lines changed

ROADMAP.md

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,25 @@
22

33
# Current Milestone
44

5-
## Milestone 36, version 19.1 (Due by Feb, 2025)
5+
## Milestone 37, version 19.2 (Due by Mar, 2025)
66

7-
1. Query Builder multi-table query support [#14979](https://github.com/IgniteUI/igniteui-angular/issues/14979)
8-
2. IgxBannerComponent - Support collapsed input [#14890](https://github.com/IgniteUI/igniteui-angular/issues/14890)
9-
3. Carousel component vertical orientation support [#15025](https://github.com/IgniteUI/igniteui-angular/issues/15025)
7+
1. Tile Manager - layout component [#239](https://github.com/IgniteUI/igniteui-angular/issues/239)
8+
2. SSR Grid Improvements - [15202](https://github.com/IgniteUI/igniteui-angular/issues/15202)
109

1110
## Going down the road
1211

1312
1. Provide an option to modify the default enter edit mode conditions, to e.g. allow edit mode start on a single click [#14658](https://github.com/IgniteUI/igniteui-angular/issues/14658)
1413
2. Provide an excel-like navigation mode for editing where all arrow keys navigate the cell in edit mode. [#14659](https://github.com/IgniteUI/igniteui-angular/issues/14659)
1514
3. Extend the 18.2 editorOptions property to allow modifying numeric editors to not change the value on up/down arrow press [#14660](https://github.com/IgniteUI/igniteui-angular/issues/14660)
16-
4. Tile Manager - layout component [#239](https://github.com/IgniteUI/igniteui-angular/issues/239)
1715

1816
# Previous Milestone
1917

18+
## Milestone 36, version 19.1 (Released Feb 27th, 2025)
19+
20+
1. **[DONE]** Query Builder multi-table query support [#14979](https://github.com/IgniteUI/igniteui-angular/issues/14979)
21+
2. **[DONE]** IgxBannerComponent - Support collapsed input [#14890](https://github.com/IgniteUI/igniteui-angular/issues/14890)
22+
3. **[DONE]** Carousel component vertical orientation support [#15025](https://github.com/IgniteUI/igniteui-angular/issues/15025)
23+
2024
## Milestone 35, version 19.0 (Released Nov 25th, 2024)
2125

2226
1. Angular 19 support

projects/igniteui-angular/src/lib/carousel/carousel.component.spec.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Component, ViewChild, TemplateRef } from '@angular/core';
1+
import { Component, ViewChild, TemplateRef, ChangeDetectionStrategy } from '@angular/core';
22
import { TestBed, fakeAsync, tick, waitForAsync } from '@angular/core/testing';
33
import { By } from '@angular/platform-browser';
44
import {
@@ -1143,7 +1143,8 @@ class CarouselTestComponent {
11431143
<igx-slide><h3>Slide4</h3></igx-slide>
11441144
</igx-carousel>
11451145
`,
1146-
imports: [IgxCarouselComponent, IgxSlideComponent]
1146+
imports: [IgxCarouselComponent, IgxSlideComponent],
1147+
changeDetection: ChangeDetectionStrategy.OnPush
11471148
})
11481149
class CarouselAnimationsComponent {
11491150
@ViewChild('carousel', { static: true }) public carousel: IgxCarouselComponent;
@@ -1224,7 +1225,7 @@ class CarouselTemplateSetInTypescriptTestComponent {
12241225
@Component({
12251226
template: `
12261227
<igx-carousel #carousel [loop]="loop" [animationType]="'none'">
1227-
@for (slide of slides; track slide) {
1228+
@for (slide of slides; track slide.text) {
12281229
<igx-slide [active]="slide.active">
12291230
<igx-slide><h3>{{slide.text}}</h3></igx-slide>
12301231
</igx-slide>
@@ -1240,10 +1241,6 @@ class CarouselDynamicSlidesComponent {
12401241
public slides = [];
12411242

12421243
constructor() {
1243-
this.addNewSlide();
1244-
}
1245-
1246-
public addNewSlide() {
12471244
this.slides.push(
12481245
{ text: 'Slide 1', active: false },
12491246
{ text: 'Slide 2', active: false },

projects/igniteui-angular/src/lib/carousel/carousel.component.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1048,6 +1048,7 @@ export class IgxCarouselComponent extends IgxCarouselComponentBase implements On
10481048
}
10491049
this.slideChanged.emit({ carousel: this, slide });
10501050
this.restartInterval();
1051+
this.cdr.markForCheck();
10511052
}
10521053
}
10531054

projects/igniteui-angular/src/lib/directives/drag-drop/drag-drop.spec.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2107,13 +2107,13 @@ class TestDragDropStrategiesComponent extends TestDragDropLinkedSingleComponent
21072107
<igx-icon igxDragHandle>drag_indicator</igx-icon>
21082108
<span>Movies list</span>
21092109
</div>
2110-
@for (category of categoriesNotes; track category) {
2110+
@for (category of categoriesNotes; track category.text) {
21112111
<div class="movieListItem" igxDrag [ghost]="false">
21122112
<div>
21132113
<igx-icon igxDragHandle>drag_indicator</igx-icon>
21142114
<span>{{category.text}}</span>
21152115
</div>
2116-
@for (note of getCategoryMovies(category.text); track note) {
2116+
@for (note of getCategoryMovies(category.text); track note.text) {
21172117
<div class="movieListItem" igxDrag [ghost]="false">
21182118
<div>
21192119
<igx-icon igxDragHandle>drag_indicator</igx-icon>
@@ -2128,11 +2128,11 @@ class TestDragDropStrategiesComponent extends TestDragDropLinkedSingleComponent
21282128
imports: [IgxIconComponent, IgxDragDirective, IgxDragHandleDirective]
21292129
})
21302130
class TestDragDropNestedComponent extends TestDragDropComponent {
2131-
public categoriesNotes = [
2131+
protected categoriesNotes = [
21322132
{ text: 'Action', dragged: false },
21332133
{ text: 'Fantasy', dragged: false }
21342134
];
2135-
public listNotes = [
2135+
protected listNotes = [
21362136
{ text: 'Avengers: Endgame', category: 'Action', dragged: false },
21372137
{ text: 'Avatar', category: 'Fantasy', dragged: false },
21382138
{ text: 'Titanic', category: 'Drama', dragged: false },
@@ -2142,7 +2142,7 @@ class TestDragDropNestedComponent extends TestDragDropComponent {
21422142
{ text: 'The Avengers', category: 'Action', dragged: false }
21432143
];
21442144

2145-
public getCategoryMovies(inCategory: string){
2145+
protected getCategoryMovies(inCategory: string){
21462146
return this.listNotes.filter(item => item.category === inCategory);
21472147
}
21482148
}

projects/igniteui-angular/src/lib/grids/columns/column.component.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Subject } from 'rxjs';
2+
import { isEqual } from 'lodash-es';
23
import {
34
AfterContentInit,
45
ChangeDetectorRef,
@@ -1090,12 +1091,16 @@ export class IgxColumnComponent implements AfterContentInit, OnDestroy, ColumnTy
10901091
*
10911092
* @memberof IgxColumnComponent
10921093
*/
1094+
@WatchColumnChanges()
10931095
@Input()
10941096
public get disabledSummaries(): string[] {
10951097
return this._disabledSummaries;
10961098
}
10971099

10981100
public set disabledSummaries(value: string[]) {
1101+
if (isEqual(this._disabledSummaries, value)) {
1102+
return;
1103+
}
10991104
this._disabledSummaries = value;
11001105
if (this.grid) {
11011106
this.grid.summaryService.removeSummariesCachePerColumn(this.field);

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

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,13 @@ import {
1515
IgxGridAdvancedFilteringComponent,
1616
IgxGridExternalAdvancedFilteringComponent,
1717
IgxGridAdvancedFilteringBindingComponent,
18-
IgxGridAdvancedFilteringDynamicColumnsComponent
18+
IgxGridAdvancedFilteringDynamicColumnsComponent,
19+
IgxGridAdvancedFilteringWithToolbarComponent
1920
} from '../../test-utils/grid-samples.spec';
2021
import { FormattedValuesFilteringStrategy } from '../../data-operations/filtering-strategy';
2122
import { IgxHierGridExternalAdvancedFilteringComponent } from '../../test-utils/hierarchical-grid-components.spec';
2223
import { IgxHierarchicalGridComponent } from '../hierarchical-grid/public_api';
23-
import { IFilteringEventArgs } from '../public_api';
24+
import { IFilteringEventArgs, IgxGridToolbarAdvancedFilteringComponent } from '../public_api';
2425
import { SampleTestData } from '../../test-utils/sample-test-data.spec';
2526
import { QueryBuilderFunctions } from '../../query-builder/query-builder-functions.spec';
2627
import { By } from '@angular/platform-browser';
@@ -37,7 +38,8 @@ describe('IgxGrid - Advanced Filtering #grid - ', () => {
3738
IgxGridExternalAdvancedFilteringComponent,
3839
IgxGridAdvancedFilteringBindingComponent,
3940
IgxHierGridExternalAdvancedFilteringComponent,
40-
IgxGridAdvancedFilteringDynamicColumnsComponent
41+
IgxGridAdvancedFilteringDynamicColumnsComponent,
42+
IgxGridAdvancedFilteringWithToolbarComponent
4143
]
4244
});
4345
}));
@@ -1194,6 +1196,65 @@ describe('IgxGrid - Advanced Filtering #grid - ', () => {
11941196
}));
11951197
});
11961198

1199+
describe('Advanced filtering with toolbar', () => {
1200+
let fix: ComponentFixture<IgxGridAdvancedFilteringWithToolbarComponent>;
1201+
let grid: IgxGridComponent;
1202+
1203+
beforeEach(fakeAsync(() => {
1204+
fix = TestBed.createComponent(IgxGridAdvancedFilteringWithToolbarComponent);
1205+
grid = fix.componentInstance.grid;
1206+
fix.detectChanges();
1207+
}));
1208+
1209+
it('Should update toolbar when advancedFilteringExpressionsTreeChange emits a new value', fakeAsync(() => {
1210+
// Set initial filtering expressions tree
1211+
const tree = new FilteringExpressionsTree(FilteringLogic.And);
1212+
tree.filteringOperands.push({
1213+
fieldName: 'ProductName',
1214+
condition: IgxStringFilteringOperand.instance().condition('contains'),
1215+
searchVal: 'angular',
1216+
ignoreCase: true
1217+
});
1218+
1219+
// Apply the initial filtering tree
1220+
grid.advancedFilteringExpressionsTree = tree;
1221+
fix.detectChanges();
1222+
1223+
// Create a new filtering tree with more filters
1224+
const updatedTree = new FilteringExpressionsTree(FilteringLogic.And);
1225+
updatedTree.filteringOperands.push({
1226+
fieldName: 'Downloads',
1227+
condition: IgxStringFilteringOperand.instance().condition('equals'),
1228+
searchVal: 10,
1229+
ignoreCase: true
1230+
});
1231+
updatedTree.filteringOperands.push({
1232+
fieldName: 'ProductName',
1233+
condition: IgxStringFilteringOperand.instance().condition('contains'),
1234+
searchVal: 'angular',
1235+
ignoreCase: true
1236+
});
1237+
updatedTree.filteringOperands.push({
1238+
fieldName: 'Category',
1239+
condition: IgxStringFilteringOperand.instance().condition('equals'),
1240+
searchVal: 'electronics',
1241+
ignoreCase: false
1242+
});
1243+
1244+
// Update the filtering expressions tree
1245+
grid.advancedFilteringExpressionsTree = updatedTree;
1246+
fix.detectChanges();
1247+
1248+
// Verify the correct number of filters
1249+
const toolbarDebugElement = fix.debugElement.query(By.directive(IgxGridToolbarAdvancedFilteringComponent));
1250+
const toolbarComponent = toolbarDebugElement.componentInstance as IgxGridToolbarAdvancedFilteringComponent;
1251+
const numberOfFilters = (toolbarComponent as any).numberOfColumns;
1252+
1253+
expect(grid.advancedFilteringExpressionsTree.filteringOperands.length).toEqual(3);
1254+
expect(numberOfFilters).toEqual(3);
1255+
}));
1256+
})
1257+
11971258
describe('Localization - ', () => {
11981259
it('Should correctly change resource strings for Advanced Filtering dialog.', fakeAsync(() => {
11991260
const fix = TestBed.createComponent(IgxGridAdvancedFilteringComponent);

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,6 @@ describe('IgxGrid - Summaries #grid', () => {
160160

161161
const column = grid.getColumnByName('UnitsInStock');
162162

163-
column.disabledSummaries = [];
164-
fixture.detectChanges();
165-
tick();
166163
GridSummaryFunctions.verifyColumnSummaries(
167164
GridSummaryFunctions.getRootSummaryRow(fixture), 3,
168165
['Count', 'Min', 'Max', 'Sum', 'Avg'],

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1085,6 +1085,40 @@ describe('Basic IgxHierarchicalGrid #hGrid', () => {
10851085
expect(childGrid1.columns[0].editable).toBeTrue();
10861086
expect(childGrid1.columns[1].editable).toBeTrue();
10871087
});
1088+
1089+
it('should update the row island summary UI when disabledSummaries is changed at runtime', fakeAsync(() => {
1090+
const masterRow = hierarchicalGrid.gridAPI.get_row_by_index(0) as IgxHierarchicalRowComponent;
1091+
UIInteractions.simulateClickAndSelectEvent(masterRow.expander);
1092+
fixture.detectChanges();
1093+
1094+
const childGrid = hierarchicalGrid.gridAPI.getChildGrids(false)[0] as IgxHierarchicalGridComponent;
1095+
fixture.detectChanges();
1096+
1097+
childGrid.columns.forEach(c => c.hasSummary = true);
1098+
fixture.detectChanges();
1099+
tick();
1100+
1101+
const column = childGrid.columns.find(c => c.field === 'ProductName');
1102+
expect(column).toBeDefined();
1103+
fixture.detectChanges();
1104+
tick();
1105+
1106+
const summaryCells = childGrid.nativeElement.querySelectorAll('igx-grid-summary-cell');
1107+
const summaryCell = summaryCells[1];
1108+
1109+
expect(summaryCell).toBeDefined();
1110+
expect(summaryCell.textContent.trim().length).toBeGreaterThan(0);
1111+
1112+
const getterSpy = spyOnProperty(column, 'disabledSummaries', 'get').and.callThrough();
1113+
1114+
column.disabledSummaries = ['count'];
1115+
fixture.detectChanges();
1116+
tick();
1117+
fixture.detectChanges();
1118+
1119+
expect(getterSpy).toHaveBeenCalledTimes(7);
1120+
expect(summaryCell.textContent.trim()).toEqual('');
1121+
}));
10881122
});
10891123

10901124
describe('IgxHierarchicalGrid Children Sizing #hGrid', () => {

projects/igniteui-angular/src/lib/grids/toolbar/grid-toolbar-advanced-filtering.component.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { AfterViewInit, Component, Inject, Input } from '@angular/core';
1+
import { AfterViewInit, Component, Inject, Input, OnInit } from '@angular/core';
22
import { IgxToolbarToken } from './token';
33
import { OverlaySettings } from '../../services/overlay/utilities';
44
import { IgxIconComponent } from '../../icon/icon.component';
@@ -31,7 +31,7 @@ import { isTree } from '../../data-operations/expressions-tree-util';
3131
templateUrl: './grid-toolbar-advanced-filtering.component.html',
3232
imports: [IgxButtonDirective, IgxRippleDirective, IgxIconComponent]
3333
})
34-
export class IgxGridToolbarAdvancedFilteringComponent implements AfterViewInit {
34+
export class IgxGridToolbarAdvancedFilteringComponent implements OnInit {
3535
protected numberOfColumns: number;
3636
/**
3737
* Returns the grid containing this component.
@@ -44,17 +44,19 @@ export class IgxGridToolbarAdvancedFilteringComponent implements AfterViewInit {
4444
@Input()
4545
public overlaySettings: OverlaySettings;
4646

47-
constructor( @Inject(IgxToolbarToken) private toolbar: IgxToolbarToken) {
48-
this.grid?.advancedFilteringExpressionsTreeChange.subscribe(filteringTree => {
49-
this.numberOfColumns = this.extractUniqueFieldNamesFromFilterTree(filteringTree).length;
50-
});
51-
}
47+
constructor( @Inject(IgxToolbarToken) private toolbar: IgxToolbarToken) { }
5248

5349
/**
5450
* @hidden
5551
*/
56-
public ngAfterViewInit(): void {
52+
public ngOnInit(): void {
53+
// Initial value
5754
this.numberOfColumns = this.grid?.advancedFilteringExpressionsTree ? this.extractUniqueFieldNamesFromFilterTree(this.grid?.advancedFilteringExpressionsTree).length : 0;
55+
56+
// Subscribing for future updates
57+
this.grid?.advancedFilteringExpressionsTreeChange.subscribe(filteringTree => {
58+
this.numberOfColumns = this.extractUniqueFieldNamesFromFilterTree(filteringTree).length;
59+
});
5860
}
5961

6062
protected extractUniqueFieldNamesFromFilterTree(filteringTree?: IFilteringExpressionsTree) : string[] {

projects/igniteui-angular/src/lib/select/select.component.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3053,7 +3053,7 @@ class IgxSelectTemplateFormComponent {
30533053
<igx-icon>alarm</igx-icon>
30543054
</igx-prefix>
30553055
<igx-select-item>None</igx-select-item>
3056-
@for (item of items; track item) {
3056+
@for (item of items; track item.field) {
30573057
<igx-select-item [value]="item.field">
30583058
{{ item.field }}
30593059
</igx-select-item>

0 commit comments

Comments
 (0)