Skip to content

Commit ba9ac86

Browse files
authored
Merge branch 'master' into bpachilova/drp-clear-icon-16087
2 parents e88e576 + 6d36570 commit ba9ac86

15 files changed

+188
-22
lines changed

LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@ and refer to the purchasing options in the pricing section on the product page.
1111
This repository includes code originally copied from https://github.com/zloirock/core-js
1212
in the projects/igniteui-angular/src/lib/core/setImmediate.ts file. The original version of the code is MIT licensed. See the file header for details.
1313

14-
© Copyright 2020 INFRAGISTICS. All Rights Reserved.
14+
© Copyright 2025 INFRAGISTICS. All Rights Reserved.
1515
The Infragistics Ultimate license & copyright applies to this distribution.
1616
For information on that license, please go to our website https://www.infragistics.com/legal/license.

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ In order for us to verify your eligibility for free usage, please [register for
337337

338338
To acquire a license for commercial usage, please [register for trial](https://Infragistics.com/Angular) and refer to the purchasing options in the pricing section on the product page.
339339

340-
© Copyright 2020 INFRAGISTICS. All Rights Reserved.
340+
© Copyright 2025 INFRAGISTICS. All Rights Reserved.
341341
The Infragistics Ultimate license & copyright applies to this distribution.
342342
For information on that license, please go to our website [https://www.infragistics.com/legal/license](https://www.infragistics.com/legal/license).
343343

ROADMAP.md

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

33
# Current Milestone
44

5-
## Milestone 38, version 20.0 (Due by Jun, 2025)
6-
1. Support of Angular 20.0
5+
## Milestone 38, version 20.1 (Due by Sep, 2025)
6+
1. Grid cell merging feature [#3514](https://github.com/IgniteUI/igniteui-angular/issues/3514)
7+
2. “Clear Selection” button in Combo component is keyboard accessible [#15841](https://github.com/IgniteUI/igniteui-angular/issues/15841)
8+
3. Selecting a slide by index in the Carousel component [#16046](https://github.com/IgniteUI/igniteui-angular/issues/16046)
79

810
## Going down the road
911

10-
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)
11-
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)
12-
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)
12+
1. AI Chat UI component [#16094](https://github.com/IgniteUI/igniteui-angular/issues/16094)
1313

1414
# Previous Milestone
1515

16+
## Milestone 38, version 20.0 (Released Jun 09th, 2025)
17+
1. **[DONE]** Support of Angular 20.0
18+
1619
## Milestone 37, version 19.2 (Released Apr 16th, 2025), [Release Blog 19.2](https://www.infragistics.com/blogs/ignite-ui-for-angular-19-2/)
1720

18-
1. Tile Manager - layout component [#239](https://github.com/IgniteUI/igniteui-angular/issues/239)
19-
2. SSR Grid Improvements - [15202](https://github.com/IgniteUI/igniteui-angular/issues/15202)
21+
1. **[DONE]** Tile Manager - layout component [#239](https://github.com/IgniteUI/igniteui-angular/issues/239)
22+
2. **[DONE]** SSR Grid Improvements - [15202](https://github.com/IgniteUI/igniteui-angular/issues/15202)
2023

2124
## Milestone 36, version 19.1 (Released Feb 27th, 2025), [Release Blog 19.1](https://www.infragistics.com/blogs/ignite-ui-for-angular-19-1/)
2225

@@ -26,8 +29,8 @@
2629

2730
## Milestone 35, version 19.0 (Released Nov 25th, 2024)
2831

29-
1. Angular 19 support
30-
2. Simplify hiding Grid summary results through API [#14905](https://github.com/IgniteUI/igniteui-angular/issues/14905)
32+
1. **[DONE]** Angular 19 support
33+
2. **[DONE]** Simplify hiding Grid summary results through API [#14905](https://github.com/IgniteUI/igniteui-angular/issues/14905)
3134

3235
## Milestone 34, version 18.2 (Released Oct 25th, 2024)
3336

projects/igniteui-angular/src/lib/directives/tooltip/tooltip.directive.spec.ts

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { DebugElement } from '@angular/core';
22
import { fakeAsync, TestBed, tick, flush, waitForAsync, ComponentFixture } from '@angular/core/testing';
33
import { By } from '@angular/platform-browser';
44
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
5-
import { IgxTooltipSingleTargetComponent, IgxTooltipMultipleTargetsComponent, IgxTooltipPlainStringComponent, IgxTooltipWithToggleActionComponent } from '../../test-utils/tooltip-components.spec';
5+
import { IgxTooltipSingleTargetComponent, IgxTooltipMultipleTargetsComponent, IgxTooltipPlainStringComponent, IgxTooltipWithToggleActionComponent, IgxTooltipMultipleTooltipsComponent } from '../../test-utils/tooltip-components.spec';
66
import { UIInteractions } from '../../test-utils/ui-interactions.spec';
77
import { HorizontalAlignment, VerticalAlignment, AutoPositionStrategy } from '../../services/public_api';
88
import { IgxTooltipDirective } from './tooltip.directive';
@@ -621,6 +621,36 @@ describe('IgxTooltip', () => {
621621
}));
622622
});
623623

624+
describe('Multiple tooltips', () => {
625+
let targetOne: IgxTooltipTargetDirective;
626+
627+
let tooltipOne: IgxTooltipDirective;
628+
let tooltipTwo: IgxTooltipDirective;
629+
630+
beforeEach(waitForAsync(() => {
631+
fix = TestBed.createComponent(IgxTooltipMultipleTooltipsComponent);
632+
fix.detectChanges();
633+
targetOne = fix.componentInstance.targetOne;
634+
tooltipOne = fix.componentInstance.tooltipOne;
635+
tooltipTwo = fix.componentInstance.tooltipTwo;
636+
}));
637+
638+
it('should not add multiple document:touchstart event listeners when having multiple igxTooltip instances - #16100', fakeAsync(() => {
639+
spyOn<any>(tooltipOne, 'onDocumentTouchStart').and.callThrough();
640+
spyOn<any>(tooltipTwo, 'onDocumentTouchStart').and.callThrough();
641+
642+
touchElement(targetOne);
643+
tick(500);
644+
645+
const dummyDiv = fix.debugElement.query(By.css('.dummyDiv'));
646+
touchElement(dummyDiv);
647+
flush();
648+
649+
expect(tooltipOne['onDocumentTouchStart']).toHaveBeenCalledTimes(1);
650+
expect(tooltipTwo['onDocumentTouchStart']).not.toHaveBeenCalled();
651+
}));
652+
});
653+
624654
describe('Tooltip integration', () => {
625655
beforeEach(waitForAsync(() => {
626656
fix = TestBed.createComponent(IgxTooltipWithToggleActionComponent);

projects/igniteui-angular/src/lib/directives/tooltip/tooltip.directive.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,10 @@ export class IgxTooltipDirective extends IgxToggleDirective implements OnDestroy
122122
super(elementRef, cdr, overlayService, navigationService);
123123

124124
this.onDocumentTouchStart = this.onDocumentTouchStart.bind(this);
125-
this.overlayService.opening.pipe(takeUntil(this._destroy$)).subscribe(() => {
125+
this.opening.pipe(takeUntil(this._destroy$)).subscribe(() => {
126126
this._document.addEventListener('touchstart', this.onDocumentTouchStart, { passive: true });
127127
});
128-
this.overlayService.closed.pipe(takeUntil(this._destroy$)).subscribe(() => {
128+
this.closed.pipe(takeUntil(this._destroy$)).subscribe(() => {
129129
this._document.removeEventListener('touchstart', this.onDocumentTouchStart);
130130
});
131131
}

projects/igniteui-angular/src/lib/grids/cell.component.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -519,11 +519,7 @@ export class IgxGridCellComponent implements OnInit, OnChanges, OnDestroy, CellT
519519
/** @hidden @internal */
520520
@HostBinding('attr.aria-describedby')
521521
public get ariaDescribeBy() {
522-
let describeBy = (this.gridID + '_' + this.column.field).replace('.', '_');
523-
if (this.isInvalid) {
524-
describeBy += ' ' + this.ariaErrorMessage;
525-
}
526-
return describeBy;
522+
return this.isInvalid ? this.ariaErrorMessage : null;
527523
}
528524

529525
/** @hidden @internal */

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

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,65 @@ describe('IgxGrid - multi-column headers #grid', () => {
145145

146146
}));
147147

148+
it('Should render a hidden row of the leaf column headers for accessibility purposes.', fakeAsync(() => {
149+
fixture = TestBed.createComponent(BlueWhaleGridComponent) as ComponentFixture<BlueWhaleGridComponent>;
150+
(fixture as ComponentFixture<BlueWhaleGridComponent>).componentInstance.firstGroupRepeats = 0;
151+
(fixture as ComponentFixture<BlueWhaleGridComponent>).componentInstance.secondGroupRepeats = 0;
152+
tick();
153+
fixture.detectChanges();
154+
tick();
155+
fixture.detectChanges();
156+
157+
grid = fixture.componentInstance.grid;
158+
const gridHeader = GridFunctions.getGridHeader(grid);
159+
160+
const groupHeaderEls = Array.from(gridHeader.nativeElement.querySelectorAll('.' + GRID_COL_GROUP_THEAD_TITLE_CLASS));
161+
for (const header of groupHeaderEls) {
162+
expect(header.getAttribute('aria-hidden')).toBe('true');
163+
}
164+
165+
const columnHeaders = GridFunctions.getColumnHeaders(fixture);
166+
for (const header of columnHeaders) {
167+
expect(header.nativeNode.getAttribute('aria-hidden')).toBe('true');
168+
}
169+
170+
const hiddenRow = gridHeader.nativeElement.querySelectorAll('[role="row"]')[1];
171+
const horizontalVirtualization = grid.rowList.first.virtDirRow;
172+
const chunkSize = horizontalVirtualization.state.chunkSize;
173+
174+
expect(hiddenRow.children.length).toBeLessThanOrEqual(chunkSize);
175+
expect(grid.columns.length).toBeGreaterThan(chunkSize);
176+
177+
expect(hiddenRow.children[0].textContent).toBe('ID');
178+
expect(hiddenRow.children[1].textContent).toBe('Company Name');
179+
expect(hiddenRow.children[2].textContent).toBe('ContactName');
180+
expect(hiddenRow.children[3].textContent).toBe('ContactTitle');
181+
expect(hiddenRow.children[4].textContent).toBe('Country');
182+
expect(hiddenRow.children[5].textContent).toBe('Region');
183+
expect(hiddenRow.children[6].textContent).toBe('City');
184+
}));
185+
186+
it('The hidden row of the leaf columns contains only headers of the rendered cells', fakeAsync(() => {
187+
fixture = TestBed.createComponent(BlueWhaleGridComponent) as ComponentFixture<BlueWhaleGridComponent>;
188+
tick();
189+
fixture.detectChanges();
190+
191+
grid = fixture.componentInstance.grid;
192+
const horizontalVirtualization = grid.rowList.first.virtDirRow;
193+
const chunkSize = horizontalVirtualization.state.chunkSize;
194+
195+
tick();
196+
fixture.detectChanges();
197+
198+
const gridHeader = GridFunctions.getGridHeader(grid);
199+
const hiddenRow = gridHeader.nativeElement.querySelectorAll('[role="row"]')[1];
200+
201+
expect(hiddenRow.children.length).toBeLessThanOrEqual(chunkSize);
202+
for (const ariaHeader of Array.from(hiddenRow.children)) {
203+
expect(ariaHeader.textContent).toBe('ID');
204+
}
205+
}));
206+
148207
it('Should render dynamic column group header correctly (#12165).', () => {
149208
fixture = TestBed.createComponent(BlueWhaleGridComponent) as ComponentFixture<BlueWhaleGridComponent>;
150209
(fixture as ComponentFixture<BlueWhaleGridComponent>).componentInstance.firstGroupRepeats = 1;

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -577,8 +577,6 @@ describe('IgxGrid - Column Pinning #grid', () => {
577577

578578
GridSelectionFunctions.verifyRowHasCheckbox(row);
579579
expect(GridFunctions.getRowDisplayContainer(fix, 0)).toBeDefined();
580-
expect(row.children[2].getAttribute('aria-describedby')).toBe(grid.id + '_CompanyName');
581-
expect(row.children[3].getAttribute('aria-describedby')).toBe(grid.id + '_ContactName');
582580

583581
// check scrollbar DOM
584582
const scrBarStartSection = fix.debugElement.query(By.css(`${GRID_SCROLL_CLASS}-start`));
@@ -695,7 +693,6 @@ describe('IgxGrid - Column Pinning #grid', () => {
695693
for (let i = 0; i <= pinnedCols.length - 1; i++) {
696694
const elem = row.children[i + 1];
697695
expect(parseInt((elem as any).style.left, 10)).toBe(-330);
698-
expect(elem.getAttribute('aria-describedby')).toBe(grid.id + '_' + pinnedCols[i].field);
699696
}
700697

701698
// check correct headers have left border

projects/igniteui-angular/src/lib/grids/headers/grid-header-group.component.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
}
4343
<div class="igx-grid-thead__title"
4444
role="columnheader"
45+
[attr.aria-hidden]="ariaHidden"
4546
[attr.aria-label]="column.header || column.field"
4647
[attr.aria-expanded]="column.expanded"
4748
[attr.aria-selected]="column.selected"
@@ -97,6 +98,7 @@
9798
}
9899
<igx-grid-header
99100
role="columnheader"
101+
[attr.aria-hidden]="ariaHidden"
100102
class="igx-grid-th--fw"
101103
[id]="grid.id + '_' + column.field"
102104
[ngClass]="column.headerClasses"

projects/igniteui-angular/src/lib/grids/headers/grid-header-group.component.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,13 @@ export class IgxGridHeaderGroupComponent implements DoCheck {
158158
return Z_INDEX - this.grid.pinnedColumns.indexOf(this.column);
159159
}
160160

161+
/**
162+
* @hidden
163+
*/
164+
public get ariaHidden(): boolean {
165+
return this.grid.hasColumnGroups && (this.column.hidden || this.grid.navigation.activeNode.row !== -1);
166+
}
167+
161168
/**
162169
* Gets whether the header group belongs to a column that is filtered.
163170
*

0 commit comments

Comments
 (0)