Skip to content

Commit da75100

Browse files
committed
fix(pivot): headers activedescendants & clean up redundant row/rowgroup roles
1 parent 50dfe46 commit da75100

10 files changed

+77
-26
lines changed

projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid.component.html

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
<igx-pivot-header-row class="igx-grid-thead igx-grid-thead--pivot" tabindex="0"
66
[grid]="this"
77
[hasMRL]="hasColumnLayouts"
8-
[activeDescendant]="activeDescendant"
98
[width]="calcWidth"
109
[pinnedColumnCollection]="pinnedColumns"
1110
[unpinnedColumnCollection]="unpinnedColumns"
@@ -19,7 +18,7 @@
1918

2019
<div igxGridBody (keydown.control.c)="copyHandler($event)" (copy)="copyHandler($event)" class="igx-grid__tbody" role="rowgroup">
2120
<ng-container *ngTemplateOutlet="rowDimensions.length ? (hasHorizontalLayout ? horizontalRowDimensionsTemplate : defaultRowDimensionsTemplate) : emptyRowDimensionsTemplate; context: this"></ng-container>
22-
<div class="igx-grid__tbody-content" tabindex="0" [attr.role]="dataView.length ? null : 'row'" (keydown)="navigation.handleNavigation($event)" (focus)="navigation.focusTbody($event)"
21+
<div class="igx-grid__tbody-content" tabindex="0" [attr.aria-activedescendant]="activeDescendant" [attr.role]="dataView.length ? null : 'row'" (keydown)="navigation.handleNavigation($event)" (focus)="navigation.focusTbody($event)"
2322
(dragStop)="selectionService.dragMode = $event" (scroll)="preventContainerScroll($event)"
2423
(dragScroll)="dragScroll($event)" [igxGridDragSelect]="selectionService.dragMode"
2524
[style.height.px]="totalHeight" [style.width.px]="pivotContentCalcWidth || null" [style.width]="!platform.isBrowser ? '100%' : undefined" #tbody [attr.aria-activedescendant]="activeDescendant">
@@ -139,7 +138,8 @@
139138

140139
<ng-template #defaultRowDimensionsTemplate>
141140
@for (dim of rowDimensions; track dim.memberName; let dimIndex = $index) {
142-
<div tabindex="0" [style.height.px]="totalHeight" #rowDimensionContainer role="rowgroup" class="igx-grid__tbody-pivot-dimension" (focus)="navigation.focusTbody($event)" (keydown)="navigation.handleNavigation($event)">
141+
<div tabindex="0" [style.height.px]="totalHeight" #rowDimensionContainer class="igx-grid__tbody-pivot-dimension" (focus)="navigation.focusTbody($event)" (keydown)="navigation.handleNavigation($event)"
142+
[attr.aria-activedescendant]="headerRowActiveDescendant">
143143
<ng-template igxGridFor let-rowData
144144
[igxGridForOf]="dataView | pivotGridCellMerging:pivotConfiguration:dim:pipeTrigger"
145145
let-rowIndex="index" [igxForScrollOrientation]="'vertical'" [igxForScrollContainer]="verticalScroll"
@@ -149,7 +149,7 @@
149149
#verticalRowDimScrollContainer
150150
>
151151
<igx-pivot-row-dimension-content
152-
role="row" class="igx-grid-thead" [grid]="this"
152+
class="igx-grid-thead" [grid]="this"
153153
[dimension]="rowData.dimensions[dimIndex]"
154154
[rootDimension]="dim"
155155
[style.height.px]="renderedRowHeight * (rowData.rowSpan || 1)"
@@ -163,7 +163,8 @@
163163
</ng-template>
164164

165165
<ng-template #horizontalRowDimensionsTemplate>
166-
<div tabindex="0" class="igx-grid__tbody-pivot-mrl-dimension" #rowDimensionContainer [style.height.px]="totalHeight" (focus)="navigation.focusTbody($event)" (keydown)="navigation.handleNavigation($event)">
166+
<div tabindex="0" class="igx-grid__tbody-pivot-mrl-dimension" #rowDimensionContainer [style.height.px]="totalHeight" (focus)="navigation.focusTbody($event)" (keydown)="navigation.handleNavigation($event)"
167+
[attr.aria-activedescendant]="headerRowActiveDescendant">
167168
@if (dataView | pivotGridHorizontalRowGrouping:pivotConfiguration:pipeTrigger:regroupTrigger; as groupedData) {
168169
<ng-template #verticalRowDimScrollContainer role="rowgroup" igxGridFor let-rowGroup let-rowIndex="index"
169170
[igxGridForOf]="groupedData"
@@ -181,9 +182,10 @@
181182
</ng-template>
182183

183184
<ng-template #emptyRowDimensionsTemplate>
184-
<div tabindex="0" #rowDimensionContainer role="rowgroup" class="igx-grid__tbody-pivot-dimension" (focus)="navigation.focusTbody($event)" (keydown)="navigation.handleNavigation($event)">
185+
<div tabindex="0" #rowDimensionContainer role="rowgroup" class="igx-grid__tbody-pivot-dimension" (focus)="navigation.focusTbody($event)" (keydown)="navigation.handleNavigation($event)"
186+
[attr.aria-activedescendant]="headerRowActiveDescendant">
185187
@if ((columnDimensions.length > 0 || values.length > 0) && data.length > 0) {
186-
<igx-pivot-row-dimension-content role="row" class="igx-grid-thead" [grid]="this"
188+
<igx-pivot-row-dimension-content class="igx-grid-thead" [grid]="this"
187189
[dimension]="emptyRowDimension"
188190
[rootDimension]="emptyRowDimension"
189191
[rowIndex]="0" [rowData]="dataView[0]"

projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid.component.ts

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,6 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
391391
@HostBinding('attr.role')
392392
public role = 'grid';
393393

394-
395394
/**
396395
* Enables a super compact theme for the component.
397396
* @remarks
@@ -446,6 +445,12 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
446445
@ViewChild('record_template', { read: TemplateRef, static: true })
447446
public recordTemplate: TemplateRef<any>;
448447

448+
/**
449+
* @hidden @internal
450+
*/
451+
@ViewChild(IgxPivotRowDimensionMrlRowComponent, { read: IgxPivotRowDimensionMrlRowComponent })
452+
public rowDimensionMrlComponent: IgxPivotRowDimensionMrlRowComponent;
453+
449454
/**
450455
* @hidden @internal
451456
*/
@@ -2072,17 +2077,27 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
20722077

20732078
/** @hidden @internal */
20742079
public override get activeDescendant() {
2075-
const activeElem = this.navigation.activeNode;
2076-
if ((this.navigation as IgxPivotGridNavigationService).isRowHeaderActive ||
2077-
(this.navigation as IgxPivotGridNavigationService).isRowDimensionHeaderActive) {
2078-
if (!activeElem || !Object.keys(activeElem).length) {
2079-
return this.id;
2080-
}
2080+
if (this.navigation.isRowHeaderActive || this.navigation.isRowDimensionHeaderActive) {
2081+
return null;
2082+
}
2083+
return super.activeDescendant;
2084+
}
20812085

2082-
return `${this.id}_${activeElem.row}_${activeElem.column}`;
2086+
/** @hidden @internal */
2087+
public get headerRowActiveDescendant() {
2088+
const activeElem = this.navigation.activeNode;
2089+
if (!activeElem || !Object.keys(activeElem).length || !this.navigation.isRowHeaderActive) {
2090+
return null;
20832091
}
20842092

2085-
return super.activeDescendant;
2093+
const rowDimensions = this.rowDimensionContentCollection.length > 0 ?
2094+
this.rowDimensionContentCollection.toArray() :
2095+
this.rowDimensionMrlComponent.rowDimensionContentCollection.toArray();
2096+
2097+
const rowDimensionContentActive = rowDimensions.find(rd => rd && rd.headerGroups?.some(hg => hg.active));
2098+
const activeHeader = rowDimensionContentActive?.headerGroups.toArray().find(hg => hg.active);
2099+
2100+
return activeHeader ? `${this.id}_${activeHeader.title}` : null;
20862101
}
20872102

20882103
protected resolveToggle(groupColumn: IgxColumnComponent, state: boolean) {

projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-header-row.component.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@
194194
</div>
195195
</div>
196196
<div role="rowgroup" class="igx-grid-thead__wrapper" [style.width.px]="width"
197-
[attr.aria-activedescendant]="activeDescendant" [class.igx-grid__tr--mrl]="hasMRL">
197+
[class.igx-grid__tr--mrl]="hasMRL">
198198

199199
<!-- Column headers area -->
200200
<div class="igx-grid__tr" role="row" [style.width.px]="width">
@@ -248,7 +248,7 @@
248248
}
249249

250250
@if (grid.pivotUI.showRowHeaders && grid.rowDimensions.length > 0) {
251-
<div class="igx-grid__tr igx-grid__tr-header-row" role="row" [style.width.px]="grid.pivotRowWidths - 1">
251+
<div class="igx-grid__tr igx-grid__tr-header-row" [style.width.px]="grid.pivotRowWidths - 1">
252252
@for (dim of grid.visibleRowDimensions; track dim; let colIndex = $index; let isLast = $last) {
253253
@if (getRowDimensionColumn(dim); as dimCol) {
254254
<igx-pivot-row-header-group #rowDimensionHeaders

projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-header-row.component.ts

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import {
99
Renderer2,
1010
ViewChild,
1111
SimpleChanges,
12-
ViewChildren
12+
ViewChildren,
13+
HostBinding
1314
} from '@angular/core';
1415
import { IBaseChipEventArgs, IgxChipComponent } from '../../chips/chip.component';
1516
import { IgxChipsAreaComponent } from '../../chips/chips-area.component';
@@ -37,8 +38,6 @@ import { IgxIconComponent } from '../../icon/icon.component';
3738
import { IgxDropDirective } from '../../directives/drag-drop/drag-drop.directive';
3839
import { NgTemplateOutlet, NgClass, NgStyle } from '@angular/common';
3940
import { IgxPivotRowHeaderGroupComponent } from './pivot-row-header-group.component';
40-
import { IgxPivotRowDimensionHeaderGroupComponent } from './pivot-row-dimension-header-group.component';
41-
import { GridColumnDataType } from '../../data-operations/data-util';
4241

4342
/**
4443
*
@@ -128,12 +127,31 @@ export class IgxPivotHeaderRowComponent extends IgxGridHeaderRowComponent implem
128127
* @internal
129128
*/
130129
@ViewChildren('rowDimensionHeaders')
131-
public rowDimensionHeaders: QueryList<IgxPivotRowDimensionHeaderGroupComponent>;
130+
public rowDimensionHeaders: QueryList<IgxPivotRowHeaderGroupComponent>;
132131

133132
public override get headerForOf() {
134133
return this.headerContainers?.last;
135134
}
136135

136+
@HostBinding('attr.aria-activedescendant')
137+
public override get activeDescendant(): string {
138+
const activeElem = this.navigation.activeNode;
139+
if (!activeElem || !Object.keys(activeElem).length || this.grid.navigation.headerRowActiveDescendant) {
140+
return null;
141+
}
142+
143+
if (this.navigation.isRowDimensionHeaderActive) {
144+
const activeHeader = this.grid.theadRow.rowDimensionHeaders.find(h => h.active);
145+
if (activeHeader) {
146+
const key = activeHeader.title ?? activeHeader.rootDimension?.memberName;
147+
return key ? `${this.grid.id}_${key}` : null;
148+
}
149+
return null;
150+
}
151+
152+
return super.activeDescendant;
153+
}
154+
137155
constructor(
138156
@Inject(IGX_GRID_BASE) public override grid: PivotGridType,
139157
ref: ElementRef<HTMLElement>,

projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-row-dimension-content.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<div role="rowgroup" class="igx-grid-thead__wrapper" [style.width.px]="width"
1+
<div class="igx-grid-thead__wrapper" [style.width.px]="width"
22
[class.igx-grid__tr--mrl]="hasMRL">
33
<div class="igx-grid__tr igx-grid__tr-header-row" role="row" [style.width.px]="width">
44
<igx-pivot-row-dimension-header-group [ngClass]="rowDimensionColumn.headerGroupClasses"

projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-row-dimension-header-group.component.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414
<span class="igx-grid-th__drop-indicator-left"></span>
1515
}
1616
<igx-pivot-row-dimension-header
17-
role="columnheader"
17+
[attr.role]="role"
1818
class="igx-grid-th--fw"
19-
[id]="grid.id + '_' + column.field"
19+
[id]="grid.id + '_' + header ? header.title : column.field"
2020
[ngClass]="column.headerClasses"
2121
[ngStyle]="column.headerStyles | igxHeaderGroupStyle:column:grid.pipeTrigger"
2222
[igxColumnMovingDrag]="column"

projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-row-dimension-header-group.component.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,13 @@ export class IgxPivotRowDimensionHeaderGroupComponent extends IgxGridHeaderGroup
3232
@HostBinding('style.user-select')
3333
public userSelect = 'none';
3434

35+
/**
36+
* @hidden
37+
*/
38+
public get role(): string {
39+
return 'rowheader';
40+
}
41+
3542
constructor(private cdRef: ChangeDetectorRef,
3643
@Inject(IGX_GRID_BASE) public override grid: PivotGridType,
3744
private elementRef: ElementRef<HTMLElement>,

projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-row-dimension-mrl-row.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
cell of rowGroup | pivotGridHorizontalRowCellMerging:grid.pivotConfiguration:grid.pipeTrigger;
33
track getGroupKey(cell); let cellIndex = $index
44
) {
5-
<igx-pivot-row-dimension-content role="row" class="igx-grid-thead"
5+
<igx-pivot-row-dimension-content class="igx-grid-thead"
66
[grid]="grid"
77
[dimension]="cell.rootDimension"
88
[rootDimension]="cell.rootDimension"

projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-row-dimension-mrl-row.component.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ import { PivotUtil } from './pivot-util';
3434
imports: [IgxPivotRowDimensionContentComponent, IgxPivotGridHorizontalRowCellMerging]
3535
})
3636
export class IgxPivotRowDimensionMrlRowComponent extends IgxGridHeaderRowComponent {
37+
@ViewChildren(IgxPivotRowDimensionContentComponent)
38+
public rowDimensionContentCollection: QueryList<IgxPivotRowDimensionContentComponent>;
3739

3840
@HostBinding('class.igx-grid__tbody-pivot-dimension')
3941
public pivotDim = true;

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ export class IgxPivotRowHeaderGroupComponent extends IgxGridHeaderGroupComponent
3131
@HostBinding('style.user-select')
3232
public userSelect = 'none';
3333

34+
/**
35+
* @hidden
36+
*/
37+
public get role(): string {
38+
return 'columnheader';
39+
}
40+
3441
constructor(private cdRef: ChangeDetectorRef,
3542
@Inject(IGX_GRID_BASE) public override grid: PivotGridType,
3643
private elementRef: ElementRef<HTMLElement>,

0 commit comments

Comments
 (0)