@progress/kendo-angular-treelist 12.0.2-develop.3 → 12.1.0-develop.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/common/provider.service.d.ts +6 -0
  2. package/esm2020/common/provider.service.mjs +9 -3
  3. package/esm2020/filtering/cell/filter-cell-operators.component.mjs +1 -1
  4. package/esm2020/filtering/cell/numeric-filter-cell.component.mjs +1 -1
  5. package/esm2020/filtering/cell/string-filter-cell.component.mjs +1 -1
  6. package/esm2020/filtering/filter-row.component.mjs +2 -2
  7. package/esm2020/index.mjs +1 -0
  8. package/esm2020/localization/messages.mjs +7 -1
  9. package/esm2020/navigation/focus-group.mjs +1 -0
  10. package/esm2020/navigation/focus-root.mjs +18 -8
  11. package/esm2020/navigation/focusable.directive.mjs +28 -11
  12. package/esm2020/navigation/navigation.service.mjs +1 -1
  13. package/esm2020/package-metadata.mjs +2 -2
  14. package/esm2020/pager/pager-input.component.mjs +16 -6
  15. package/esm2020/pager/pager-next-buttons.component.mjs +34 -15
  16. package/esm2020/pager/pager-numeric-buttons.component.mjs +12 -8
  17. package/esm2020/pager/pager-page-sizes.component.mjs +11 -5
  18. package/esm2020/pager/pager-prev-buttons.component.mjs +31 -14
  19. package/esm2020/pager/pager.component.mjs +232 -21
  20. package/esm2020/rendering/cell.component.mjs +3 -1
  21. package/esm2020/rendering/common/dom-queries.mjs +21 -1
  22. package/esm2020/rendering/header/header.component.mjs +10 -3
  23. package/esm2020/rendering/list.component.mjs +2 -2
  24. package/esm2020/rendering/table-body.component.mjs +6 -2
  25. package/esm2020/rendering/toolbar/toolbar-focusable.directive.mjs +63 -0
  26. package/esm2020/rendering/toolbar/toolbar-navigation.service.mjs +53 -0
  27. package/esm2020/rendering/toolbar/toolbar.component.mjs +44 -5
  28. package/esm2020/treelist.component.mjs +64 -11
  29. package/esm2020/treelist.module.mjs +8 -3
  30. package/esm2020/utils.mjs +4 -0
  31. package/fesm2015/progress-kendo-angular-treelist.mjs +636 -115
  32. package/fesm2020/progress-kendo-angular-treelist.mjs +631 -115
  33. package/index.d.ts +1 -0
  34. package/localization/messages.d.ts +20 -1
  35. package/navigation/focus-group.d.ts +2 -1
  36. package/navigation/focus-root.d.ts +8 -2
  37. package/navigation/focusable.directive.d.ts +7 -1
  38. package/package.json +15 -15
  39. package/pager/pager-input.component.d.ts +3 -1
  40. package/pager/pager-next-buttons.component.d.ts +12 -2
  41. package/pager/pager-page-sizes.component.d.ts +3 -2
  42. package/pager/pager-prev-buttons.component.d.ts +7 -1
  43. package/pager/pager.component.d.ts +35 -4
  44. package/rendering/common/dom-queries.d.ts +8 -0
  45. package/rendering/toolbar/toolbar-focusable.directive.d.ts +28 -0
  46. package/rendering/toolbar/toolbar-navigation.service.d.ts +21 -0
  47. package/rendering/toolbar/toolbar.component.d.ts +14 -4
  48. package/schematics/ngAdd/index.js +3 -3
  49. package/treelist.component.d.ts +7 -0
  50. package/treelist.module.d.ts +76 -75
  51. package/utils.d.ts +4 -0
@@ -2,35 +2,53 @@
2
2
  * Copyright © 2023 Progress Software Corporation. All rights reserved.
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
- import { Component, Input, EventEmitter, Output, HostBinding, ElementRef, Renderer2 } from '@angular/core';
5
+ import { Component, Input, EventEmitter, Output, HostBinding, ElementRef, Renderer2, ViewChild, NgZone } from '@angular/core';
6
6
  import { normalize } from './pager-settings';
7
7
  import { PagerTemplateDirective } from "./pager-template.directive";
8
- import { anyChanged } from "../utils";
8
+ import { anyChanged, replaceMessagePlaceholder } from "../utils";
9
9
  import { PagerContextService } from "./pager-context.service";
10
10
  import { Subscription } from "rxjs";
11
11
  import { RESPONSIVE_BREAKPOINT_LARGE, RESPONSIVE_BREAKPOINT_MEDIUM } from '../constants';
12
+ import { LocalizationService } from '@progress/kendo-angular-l10n';
13
+ import { Keys } from '@progress/kendo-angular-common';
14
+ import { take } from 'rxjs/operators';
15
+ import { FOCUS_ROOT_ACTIVE, FocusRoot } from '../navigation/focus-root';
16
+ import { NavigationService } from '../navigation/navigation.service';
17
+ import { FocusGroup } from '../navigation/focus-group';
18
+ import { findFocusableChild, findLastFocusableChild } from '../rendering/common/dom-queries';
12
19
  import * as i0 from "@angular/core";
13
- import * as i1 from "./pager-context.service";
14
- import * as i2 from "./pager-prev-buttons.component";
15
- import * as i3 from "./pager-numeric-buttons.component";
16
- import * as i4 from "./pager-input.component";
17
- import * as i5 from "./pager-next-buttons.component";
18
- import * as i6 from "./pager-info.component";
19
- import * as i7 from "./pager-page-sizes.component";
20
- import * as i8 from "@progress/kendo-angular-common";
21
- import * as i9 from "@angular/common";
20
+ import * as i1 from "../navigation/navigation.service";
21
+ import * as i2 from "@progress/kendo-angular-l10n";
22
+ import * as i3 from "./pager-context.service";
23
+ import * as i4 from "../navigation/focus-group";
24
+ import * as i5 from "../navigation/focus-root";
25
+ import * as i6 from "./pager-prev-buttons.component";
26
+ import * as i7 from "./pager-numeric-buttons.component";
27
+ import * as i8 from "./pager-input.component";
28
+ import * as i9 from "./pager-next-buttons.component";
29
+ import * as i10 from "./pager-info.component";
30
+ import * as i11 from "./pager-page-sizes.component";
31
+ import * as i12 from "@progress/kendo-angular-common";
32
+ import * as i13 from "@angular/common";
22
33
  /**
23
34
  * @hidden
24
35
  */
25
36
  export class PagerComponent {
26
- constructor(pagerContext, element, renderer) {
37
+ constructor(navigationService, localizationService, pagerContext, focusGroup, focusRoot, renderer, element, zone) {
38
+ this.navigationService = navigationService;
39
+ this.localizationService = localizationService;
27
40
  this.pagerContext = pagerContext;
28
- this.element = element;
41
+ this.focusGroup = focusGroup;
42
+ this.focusRoot = focusRoot;
29
43
  this.renderer = renderer;
44
+ this.element = element;
45
+ this.zone = zone;
30
46
  this.allCount = 0;
31
47
  this.total = 0;
32
48
  this.skip = 1;
33
49
  this.pageChange = new EventEmitter();
50
+ this.pagerRole = 'application';
51
+ this.pagerRoleDescription = 'pager';
34
52
  this.pagerWrapClass = true;
35
53
  this.gridPagerClass = true;
36
54
  this.pagerClass = true;
@@ -60,6 +78,12 @@ export class PagerComponent {
60
78
  set options(value) {
61
79
  this.settings = normalize(value);
62
80
  }
81
+ get hostTabindex() {
82
+ return this.navigationService.enabled ? '0' : '-1';
83
+ }
84
+ get hostAriaLabel() {
85
+ return this.pagerLabel;
86
+ }
63
87
  get totalPages() {
64
88
  return Math.ceil((this.total || 0) / this.pageSize);
65
89
  }
@@ -77,7 +101,13 @@ export class PagerComponent {
77
101
  return context;
78
102
  }
79
103
  ngOnInit() {
104
+ const element = this.element.nativeElement;
80
105
  this.subscriptions.add(this.pagerContext.pageChange.subscribe(this.changePage.bind(this)));
106
+ this.subscriptions.add(this.renderer.listen(element, 'focusin', event => this.onFocusIn(event)));
107
+ this.subscriptions.add(this.renderer.listen(element, 'keydown', event => this.onKeyDown(event)));
108
+ if (this.navigationService.enabled) {
109
+ this.focusRoot.deactivate();
110
+ }
81
111
  }
82
112
  ngOnChanges(changes) {
83
113
  if (anyChanged(["pageSize", "skip", "total", "allCount"], changes, false)) {
@@ -103,18 +133,135 @@ export class PagerComponent {
103
133
  this.subscriptions.unsubscribe();
104
134
  }
105
135
  }
136
+ get pagerLabel() {
137
+ const localizationMsg = this.localizationService.get('pagerLabel') || '';
138
+ return replaceMessagePlaceholder(replaceMessagePlaceholder(localizationMsg, 'currentPage', this.currentPage.toString()), 'totalPages', this.totalPages.toString());
139
+ }
140
+ get focusTrapTabIndex() {
141
+ return this.focusGroup.isActive ? '0' : '-1';
142
+ }
143
+ onKeyDown(event) {
144
+ const keyCode = event.keyCode;
145
+ const target = event.target;
146
+ if (this.navigationService.enabled) {
147
+ if (keyCode === Keys.Enter && target === this.element.nativeElement) {
148
+ this.onEnterEvent(event);
149
+ }
150
+ else if (keyCode === Keys.Escape) {
151
+ this.onEscapeEvent();
152
+ }
153
+ }
154
+ if ((keyCode === Keys.ArrowLeft || keyCode === Keys.PageUp) ||
155
+ (keyCode === Keys.ArrowRight || keyCode === Keys.PageDown)) {
156
+ event.preventDefault();
157
+ this.onArrowEvent(keyCode, target);
158
+ }
159
+ else if (keyCode === Keys.Home || keyCode === Keys.End) {
160
+ event.preventDefault();
161
+ this.onHomeEndEvent(keyCode, target);
162
+ }
163
+ }
106
164
  changePage(event) {
107
165
  this.pageChange.emit(event);
108
166
  }
167
+ onInnerFocusIn(event, position) {
168
+ this.zone.onStable.pipe(take(1)).subscribe(() => {
169
+ if (position === 'start') {
170
+ if (event.relatedTarget === this.element.nativeElement) {
171
+ this.focusFirstElement();
172
+ }
173
+ else {
174
+ this.focusLastElement();
175
+ }
176
+ }
177
+ else {
178
+ this.focusFirstElement();
179
+ }
180
+ });
181
+ }
182
+ onEnterEvent(event) {
183
+ const isTargetCompElement = event.target === this.element.nativeElement;
184
+ if (this.navigationService.enabled && isTargetCompElement) {
185
+ event.preventDefault();
186
+ this.focusRoot.activate();
187
+ this.focusFirstElement();
188
+ }
189
+ }
190
+ onEscapeEvent() {
191
+ if (this.navigationService.enabled) {
192
+ this.focusRoot.deactivate();
193
+ this.element.nativeElement.focus();
194
+ }
195
+ }
196
+ onArrowEvent(keyCode, target) {
197
+ const isArrowLeft = keyCode === Keys.ArrowLeft || keyCode === Keys.PageUp;
198
+ const condition = isArrowLeft ? this.currentPage > 1 : this.currentPage < this.totalPages;
199
+ if (this.shouldTriggerPageChange(target, condition)) {
200
+ const pageDir = isArrowLeft ? 'prevPage' : 'nextPage';
201
+ this.pagerContext[pageDir]();
202
+ }
203
+ }
204
+ onHomeEndEvent(keyCode, target) {
205
+ const isHome = keyCode === Keys.Home;
206
+ const condition = isHome ? this.currentPage > 1 : this.currentPage < this.totalPages;
207
+ if (this.shouldTriggerPageChange(target, condition)) {
208
+ const pageNumber = isHome ? 0 : this.totalPages - 1;
209
+ this.pagerContext.changePage(pageNumber);
210
+ }
211
+ }
212
+ onFocusIn(event) {
213
+ if (this.navigationService.enabled) {
214
+ const shouldFocusPager = event.target === this.element.nativeElement;
215
+ if (shouldFocusPager) {
216
+ this.focusRoot.deactivate();
217
+ }
218
+ else {
219
+ this.focusRoot.activate();
220
+ }
221
+ }
222
+ }
223
+ focusFirstElement() {
224
+ const first = findFocusableChild(this.element.nativeElement, true);
225
+ if (first) {
226
+ first.focus();
227
+ }
228
+ }
229
+ focusLastElement() {
230
+ const last = findLastFocusableChild(this.element.nativeElement, true);
231
+ if (last) {
232
+ last.focus();
233
+ }
234
+ }
235
+ shouldTriggerPageChange(target, condition) {
236
+ return this.navigationService.enabled && target === this.element.nativeElement && condition;
237
+ }
109
238
  clearResponsiveClasses() {
110
239
  const element = this.element.nativeElement;
111
240
  this.renderer.removeClass(element, 'k-pager-mobile-sm');
112
241
  this.renderer.removeClass(element, 'k-pager-mobile-md');
113
242
  }
114
243
  }
115
- PagerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerComponent, deps: [{ token: i1.PagerContextService }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
116
- PagerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: PagerComponent, selector: "kendo-treelist-pager", inputs: { allCount: "allCount", total: "total", skip: "skip", pageSize: "pageSize", options: "options", template: "template" }, outputs: { pageChange: "pageChange" }, host: { properties: { "class.k-pager-wrap": "this.pagerWrapClass", "class.k-grid-pager": "this.gridPagerClass", "class.k-pager": "this.pagerClass", "class.k-pager-md": "this.pagerSizingClass" } }, usesOnChanges: true, ngImport: i0, template: `
117
- <ng-container
244
+ PagerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerComponent, deps: [{ token: i1.NavigationService }, { token: i2.LocalizationService }, { token: i3.PagerContextService }, { token: i4.FocusGroup }, { token: i5.FocusRoot }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
245
+ PagerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: PagerComponent, selector: "kendo-treelist-pager", inputs: { allCount: "allCount", total: "total", skip: "skip", navigable: "navigable", pageSize: "pageSize", options: "options", template: "template" }, outputs: { pageChange: "pageChange" }, host: { properties: { "attr.role": "this.pagerRole", "attr.aria-roledescription": "this.pagerRoleDescription", "class.k-pager-wrap": "this.pagerWrapClass", "class.k-grid-pager": "this.gridPagerClass", "class.k-pager": "this.pagerClass", "class.k-pager-md": "this.pagerSizingClass", "attr.tabindex": "this.hostTabindex", "attr.aria-label": "this.hostAriaLabel" } }, providers: [{
246
+ provide: FOCUS_ROOT_ACTIVE,
247
+ useValue: true
248
+ }, {
249
+ provide: FocusRoot,
250
+ deps: [FOCUS_ROOT_ACTIVE],
251
+ useClass: FocusRoot
252
+ }, {
253
+ provide: FocusGroup,
254
+ deps: [FocusRoot],
255
+ useClass: FocusGroup
256
+ }], viewQueries: [{ propertyName: "prevButtons", first: true, predicate: ["prevButtons"], descendants: true }, { propertyName: "nextButtons", first: true, predicate: ["nextButtons"], descendants: true }, { propertyName: "numericButtons", first: true, predicate: ["numericButtons"], descendants: true }, { propertyName: "pagerInput", first: true, predicate: ["pagerInput"], descendants: true }, { propertyName: "pageSizes", first: true, predicate: ["pageSizes"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
257
+ <div
258
+ *ngIf="navigationService.enabled"
259
+ class="k-sr-only"
260
+ [tabindex]="focusTrapTabIndex"
261
+ [attr.aria-hidden]="true"
262
+ (focusin)="onInnerFocusIn($event, 'start')">
263
+ </div>
264
+ <ng-container
118
265
  *ngIf="template?.templateRef"
119
266
  [ngTemplateOutlet]="template.templateRef"
120
267
  [ngTemplateOutletContext]="templateContext">
@@ -123,21 +270,48 @@ PagerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version
123
270
  <kendo-treelist-pager-prev-buttons *ngIf="settings.previousNext"></kendo-treelist-pager-prev-buttons>
124
271
  <kendo-treelist-pager-numeric-buttons
125
272
  *ngIf="settings.type === 'numeric'"
126
- [buttonCount]="settings.buttonCount">
273
+ [buttonCount]="settings.buttonCount"
274
+ >
127
275
  </kendo-treelist-pager-numeric-buttons>
128
276
  <kendo-treelist-pager-input *ngIf="settings.type === 'input'"></kendo-treelist-pager-input>
129
277
  <kendo-treelist-pager-next-buttons *ngIf="settings.previousNext"></kendo-treelist-pager-next-buttons>
130
278
  <kendo-treelist-pager-info *ngIf='settings.info'></kendo-treelist-pager-info>
131
279
  <kendo-treelist-pager-page-sizes *ngIf="settings.pageSizes" [pageSizes]="$any(settings.pageSizes)"></kendo-treelist-pager-page-sizes>
132
280
  </ng-container>
281
+ <div
282
+ *ngIf="navigationService.enabled"
283
+ class="k-sr-only"
284
+ [tabindex]="focusTrapTabIndex"
285
+ [attr.aria-hidden]="true"
286
+ (focusin)="onInnerFocusIn($event, 'end')">
287
+ </div>
133
288
  <kendo-resize-sensor *ngIf="settings.responsive" (resize)="resizeHandler()"></kendo-resize-sensor>
134
- `, isInline: true, components: [{ type: i2.PagerPrevButtonsComponent, selector: "kendo-treelist-pager-prev-buttons" }, { type: i3.PagerNumericButtonsComponent, selector: "kendo-treelist-pager-numeric-buttons", inputs: ["buttonCount"] }, { type: i4.PagerInputComponent, selector: "kendo-treelist-pager-input" }, { type: i5.PagerNextButtonsComponent, selector: "kendo-treelist-pager-next-buttons" }, { type: i6.PagerInfoComponent, selector: "kendo-treelist-pager-info" }, { type: i7.PagerPageSizesComponent, selector: "kendo-treelist-pager-page-sizes", inputs: ["pageSizes"] }, { type: i8.ResizeSensorComponent, selector: "kendo-resize-sensor", inputs: ["rateLimit"], outputs: ["resize"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
289
+ `, isInline: true, components: [{ type: i6.PagerPrevButtonsComponent, selector: "kendo-treelist-pager-prev-buttons" }, { type: i7.PagerNumericButtonsComponent, selector: "kendo-treelist-pager-numeric-buttons", inputs: ["buttonCount"] }, { type: i8.PagerInputComponent, selector: "kendo-treelist-pager-input" }, { type: i9.PagerNextButtonsComponent, selector: "kendo-treelist-pager-next-buttons", inputs: ["navigable"] }, { type: i10.PagerInfoComponent, selector: "kendo-treelist-pager-info" }, { type: i11.PagerPageSizesComponent, selector: "kendo-treelist-pager-page-sizes", inputs: ["pageSizes"] }, { type: i12.ResizeSensorComponent, selector: "kendo-resize-sensor", inputs: ["rateLimit"], outputs: ["resize"] }], directives: [{ type: i13.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i13.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
135
290
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerComponent, decorators: [{
136
291
  type: Component,
137
292
  args: [{
138
293
  selector: 'kendo-treelist-pager',
294
+ providers: [{
295
+ provide: FOCUS_ROOT_ACTIVE,
296
+ useValue: true
297
+ }, {
298
+ provide: FocusRoot,
299
+ deps: [FOCUS_ROOT_ACTIVE],
300
+ useClass: FocusRoot
301
+ }, {
302
+ provide: FocusGroup,
303
+ deps: [FocusRoot],
304
+ useClass: FocusGroup
305
+ }],
139
306
  template: `
140
- <ng-container
307
+ <div
308
+ *ngIf="navigationService.enabled"
309
+ class="k-sr-only"
310
+ [tabindex]="focusTrapTabIndex"
311
+ [attr.aria-hidden]="true"
312
+ (focusin)="onInnerFocusIn($event, 'start')">
313
+ </div>
314
+ <ng-container
141
315
  *ngIf="template?.templateRef"
142
316
  [ngTemplateOutlet]="template.templateRef"
143
317
  [ngTemplateOutletContext]="templateContext">
@@ -146,22 +320,47 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
146
320
  <kendo-treelist-pager-prev-buttons *ngIf="settings.previousNext"></kendo-treelist-pager-prev-buttons>
147
321
  <kendo-treelist-pager-numeric-buttons
148
322
  *ngIf="settings.type === 'numeric'"
149
- [buttonCount]="settings.buttonCount">
323
+ [buttonCount]="settings.buttonCount"
324
+ >
150
325
  </kendo-treelist-pager-numeric-buttons>
151
326
  <kendo-treelist-pager-input *ngIf="settings.type === 'input'"></kendo-treelist-pager-input>
152
327
  <kendo-treelist-pager-next-buttons *ngIf="settings.previousNext"></kendo-treelist-pager-next-buttons>
153
328
  <kendo-treelist-pager-info *ngIf='settings.info'></kendo-treelist-pager-info>
154
329
  <kendo-treelist-pager-page-sizes *ngIf="settings.pageSizes" [pageSizes]="$any(settings.pageSizes)"></kendo-treelist-pager-page-sizes>
155
330
  </ng-container>
331
+ <div
332
+ *ngIf="navigationService.enabled"
333
+ class="k-sr-only"
334
+ [tabindex]="focusTrapTabIndex"
335
+ [attr.aria-hidden]="true"
336
+ (focusin)="onInnerFocusIn($event, 'end')">
337
+ </div>
156
338
  <kendo-resize-sensor *ngIf="settings.responsive" (resize)="resizeHandler()"></kendo-resize-sensor>
157
339
  `
158
340
  }]
159
- }], ctorParameters: function () { return [{ type: i1.PagerContextService }, { type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { allCount: [{
341
+ }], ctorParameters: function () { return [{ type: i1.NavigationService }, { type: i2.LocalizationService }, { type: i3.PagerContextService }, { type: i4.FocusGroup }, { type: i5.FocusRoot }, { type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { prevButtons: [{
342
+ type: ViewChild,
343
+ args: ['prevButtons']
344
+ }], nextButtons: [{
345
+ type: ViewChild,
346
+ args: ['nextButtons']
347
+ }], numericButtons: [{
348
+ type: ViewChild,
349
+ args: ['numericButtons']
350
+ }], pagerInput: [{
351
+ type: ViewChild,
352
+ args: ['pagerInput']
353
+ }], pageSizes: [{
354
+ type: ViewChild,
355
+ args: ['pageSizes']
356
+ }], allCount: [{
160
357
  type: Input
161
358
  }], total: [{
162
359
  type: Input
163
360
  }], skip: [{
164
361
  type: Input
362
+ }], navigable: [{
363
+ type: Input
165
364
  }], pageSize: [{
166
365
  type: Input
167
366
  }], options: [{
@@ -170,6 +369,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
170
369
  type: Input
171
370
  }], pageChange: [{
172
371
  type: Output
372
+ }], pagerRole: [{
373
+ type: HostBinding,
374
+ args: ['attr.role']
375
+ }], pagerRoleDescription: [{
376
+ type: HostBinding,
377
+ args: ['attr.aria-roledescription']
173
378
  }], pagerWrapClass: [{
174
379
  type: HostBinding,
175
380
  args: ['class.k-pager-wrap']
@@ -182,4 +387,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
182
387
  }], pagerSizingClass: [{
183
388
  type: HostBinding,
184
389
  args: ['class.k-pager-md']
390
+ }], hostTabindex: [{
391
+ type: HostBinding,
392
+ args: ['attr.tabindex']
393
+ }], hostAriaLabel: [{
394
+ type: HostBinding,
395
+ args: ['attr.aria-label']
185
396
  }] } });
@@ -121,6 +121,7 @@ CellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version:
121
121
  <ng-container *ngIf="column.expandable">
122
122
  <span class="k-icon k-i-none" *ngFor="let item of level | levelItems : hasChildren && expandIcons"></span>
123
123
  <kendo-icon-wrapper
124
+ aria-hidden="true"
124
125
  *ngIf="hasChildren && expandIcons && !loading"
125
126
  [name]="isExpanded ? 'caret-alt-down' : 'caret-alt-right'"
126
127
  [svgIcon]="isExpanded ? caretAltDownIcon : caretAltRightIcon"></kendo-icon-wrapper>
@@ -183,7 +184,7 @@ CellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version:
183
184
  </ng-container>
184
185
  </ng-container>
185
186
  </ng-container>
186
- `, isInline: true, components: [{ type: i3.IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass"], exportAs: ["kendoIconWrapper"] }, { type: i4.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode"], outputs: ["valueChange", "focus", "blur"], exportAs: ["kendoNumericTextBox"] }, { type: i5.DatePickerComponent, selector: "kendo-datepicker", inputs: ["focusableId", "cellTemplate", "monthCellTemplate", "yearCellTemplate", "decadeCellTemplate", "centuryCellTemplate", "weekNumberTemplate", "headerTitleTemplate", "navigationItemTemplate", "activeView", "bottomView", "topView", "calendarType", "animateCalendarNavigation", "disabled", "readonly", "readOnlyInput", "popupSettings", "navigation", "min", "max", "incompleteDateValidation", "focusedDate", "value", "format", "twoDigitYearMax", "formatPlaceholder", "placeholder", "tabindex", "tabIndex", "disabledDates", "title", "subtitle", "rangeValidation", "disabledDatesValidation", "weekNumber", "size", "rounded", "fillMode", "adaptiveMode"], outputs: ["valueChange", "focus", "blur", "open", "close"], exportAs: ["kendo-datepicker"] }], directives: [{ type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i7.FocusableDirective, selector: "[kendoTreeListFocusable],\n [kendoTreeListAddCommand],\n [kendoTreeListEditCommand],\n [kendoTreeListRemoveCommand],\n [kendoTreeListSaveCommand],\n [kendoTreeListCancelCommand]\n ", inputs: ["kendoTreeListFocusable", "kendoTreeListAddCommand", "kendoTreeListEditCommand", "kendoTreeListRemoveCommand", "kendoTreeListSaveCommand", "kendoTreeListCancelCommand"] }, { type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i8.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i6.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }], pipes: { "levelItems": i9.LevelItemsPipe, "valueOf": i10.FieldAccessorPipe } });
187
+ `, isInline: true, components: [{ type: i3.IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass"], exportAs: ["kendoIconWrapper"] }, { type: i4.NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode"], outputs: ["valueChange", "focus", "blur"], exportAs: ["kendoNumericTextBox"] }, { type: i5.DatePickerComponent, selector: "kendo-datepicker", inputs: ["focusableId", "cellTemplate", "monthCellTemplate", "yearCellTemplate", "decadeCellTemplate", "centuryCellTemplate", "weekNumberTemplate", "headerTitleTemplate", "navigationItemTemplate", "activeView", "bottomView", "topView", "calendarType", "animateCalendarNavigation", "disabled", "readonly", "readOnlyInput", "popupSettings", "navigation", "min", "max", "incompleteDateValidation", "focusedDate", "value", "format", "twoDigitYearMax", "formatPlaceholder", "placeholder", "tabindex", "tabIndex", "disabledDates", "title", "subtitle", "rangeValidation", "disabledDatesValidation", "weekNumber", "size", "rounded", "fillMode", "adaptiveMode"], outputs: ["valueChange", "focus", "blur", "open", "close"], exportAs: ["kendo-datepicker"] }], directives: [{ type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i7.FocusableDirective, selector: "[kendoTreeListFocusable],\n [kendoTreeListAddCommand],\n [kendoTreeListEditCommand],\n [kendoTreeListRemoveCommand],\n [kendoTreeListSaveCommand],\n [kendoTreeListCancelCommand]\n ", inputs: ["kendoTreeListFocusable", "enabled", "kendoTreeListAddCommand", "kendoTreeListEditCommand", "kendoTreeListRemoveCommand", "kendoTreeListSaveCommand", "kendoTreeListCancelCommand"] }, { type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i8.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i6.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }], pipes: { "levelItems": i9.LevelItemsPipe, "valueOf": i10.FieldAccessorPipe } });
187
188
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: CellComponent, decorators: [{
188
189
  type: Component,
189
190
  args: [{
@@ -194,6 +195,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
194
195
  <ng-container *ngIf="column.expandable">
195
196
  <span class="k-icon k-i-none" *ngFor="let item of level | levelItems : hasChildren && expandIcons"></span>
196
197
  <kendo-icon-wrapper
198
+ aria-hidden="true"
197
199
  *ngIf="hasChildren && expandIcons && !loading"
198
200
  [name]="isExpanded ? 'caret-alt-down' : 'caret-alt-right'"
199
201
  [svgIcon]="isExpanded ? caretAltDownIcon : caretAltRightIcon"></kendo-icon-wrapper>
@@ -87,8 +87,9 @@ export const isFocusableWithTabKey = (element, checkVisibility = true) => {
87
87
  return false;
88
88
  }
89
89
  const tabIndex = element.getAttribute('tabIndex');
90
+ const ariaHidden = element.getAttribute('aria-hidden') === 'true';
90
91
  const visible = !checkVisibility || isVisible(element);
91
- return visible && tabIndex !== '-1';
92
+ return visible && !ariaHidden && tabIndex !== '-1';
92
93
  };
93
94
  /**
94
95
  * @hidden
@@ -111,6 +112,19 @@ export const findElement = (node, predicate, matchSelf = true) => {
111
112
  node = node.nextSibling;
112
113
  }
113
114
  };
115
+ /**
116
+ * @hidden
117
+ */
118
+ export const findLastElement = (node, predicate, matchSelf = true) => {
119
+ let last = null;
120
+ findElement(node, (node) => {
121
+ if (predicate(node)) {
122
+ last = node;
123
+ }
124
+ return false;
125
+ }, matchSelf);
126
+ return last;
127
+ };
114
128
  /**
115
129
  * @hidden
116
130
  */
@@ -123,6 +137,12 @@ export const findFocusable = (element, checkVisibility = true) => {
123
137
  export const findFocusableChild = (element, checkVisibility = true) => {
124
138
  return findElement(element, (node) => isFocusableWithTabKey(node, checkVisibility), false);
125
139
  };
140
+ /**
141
+ * @hidden
142
+ */
143
+ export const findLastFocusableChild = (element, checkVisibility = true) => {
144
+ return findLastElement(element, (node) => isFocusableWithTabKey(node, checkVisibility), false);
145
+ };
126
146
  /**
127
147
  * @hidden
128
148
  */
@@ -2,6 +2,7 @@
2
2
  * Copyright © 2023 Progress Software Corporation. All rights reserved.
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
+ /* eslint-disable @typescript-eslint/no-explicit-any */
5
6
  import { Component, ChangeDetectorRef, HostBinding, Input, QueryList, ViewChildren, TemplateRef } from '@angular/core';
6
7
  import { Subscription, of, merge } from "rxjs";
7
8
  import { filter, map, switchMap, tap, takeUntil } from 'rxjs/operators';
@@ -356,7 +357,7 @@ export class HeaderComponent {
356
357
  }
357
358
  HeaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: HeaderComponent, deps: [{ token: i1.SinglePopupService }, { token: i2.DragHintService }, { token: i3.DropCueService }, { token: i4.ColumnReorderService }, { token: i5.SortService }, { token: i6.SelectionService }, { token: i7.LocalizationService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
358
359
  HeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: HeaderComponent, selector: "[kendoTreeListHeader]", inputs: { totalColumnLevels: "totalColumnLevels", columns: "columns", scrollable: "scrollable", filterable: "filterable", sort: "sort", filter: "filter", sortable: "sortable", lockedColumnsCount: "lockedColumnsCount", resizable: "resizable", reorderable: "reorderable", columnMenu: "columnMenu", columnMenuTemplate: "columnMenuTemplate", totalColumnsCount: "totalColumnsCount" }, host: { properties: { "class.k-grid-header": "this.headerClass", "class.k-table-thead": "this.hostClass" } }, viewQueries: [{ propertyName: "dropTargets", predicate: DropTargetDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: `
359
- <tr *ngFor="let i of columnLevels; let levelIndex = index"
360
+ <tr *ngFor="let i of columnLevels; let levelIndex = index" role="row"
360
361
  kendoTreeListLogicalRow
361
362
  [logicalRowIndex]="levelIndex"
362
363
  [logicalSlaveRow]="lockedColumnsCount > 0"
@@ -386,6 +387,7 @@ HeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", versio
386
387
  }"
387
388
  class="k-header k-table-th"
388
389
  [class.k-filterable]="(showFilterMenu && isFilterable(getColumnComponent(column))) || showColumnMenu(column)"
390
+ [attr.aria-haspopup]="(showFilterMenu || showColumnMenu(column)) ? 'dialog' : undefined"
389
391
  [class.k-first]="isFirstOnRow(getColumnComponent(column), columnIndex)"
390
392
  [ngClass]="column.headerClass"
391
393
  [ngStyle]="column.headerStyle"
@@ -494,7 +496,9 @@ HeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", versio
494
496
  }"
495
497
  class="k-header k-table-th"
496
498
  [class.k-first]="isFirstOnRow(getColumnComponent(column), columnIndex)"
499
+ [attr.aria-haspopup]="(showFilterMenu || showColumnMenu(column)) ? 'dialog' : undefined"
497
500
  [class.k-filterable]="showColumnMenu(column)"
501
+ [attr.aria-expanded]="showColumnMenu(column)"
498
502
  [ngClass]="column.headerClass"
499
503
  [ngStyle]="column.headerStyle"
500
504
  [attr.rowspan]="column.rowspan(totalColumnLevels)"
@@ -536,13 +540,13 @@ HeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", versio
536
540
  [logicalSlaveCellsCount]="unlockedColumnsCount"
537
541
  >
538
542
  </tr>
539
- `, isInline: true, components: [{ type: i8.FilterMenuComponent, selector: "kendo-treelist-filter-menu", inputs: ["column", "filter"] }, { type: i9.ColumnMenuComponent, selector: "kendo-treelist-column-menu", inputs: ["standalone", "column", "settings", "sort", "filter", "sortable", "columnMenuTemplate"] }, { type: i10.IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass"], exportAs: ["kendoIconWrapper"] }, { type: i11.FilterRowComponent, selector: "[kendoTreeListFilterRow]", inputs: ["columns", "filter", "logicalRowIndex", "lockedColumnsCount"] }], directives: [{ type: i12.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i13.LogicalRowDirective, selector: "[kendoTreeListLogicalRow]", inputs: ["logicalRowIndex", "logicalSlaveRow", "logicalCellsCount", "logicalSlaveCellsCount", "dataRowIndex", "dataItem", "isNew"] }, { type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i14.LogicalCellDirective, selector: "[kendoTreeListLogicalCell]", inputs: ["logicalColIndex", "logicalRowIndex", "logicalSlaveCell", "column", "colIndex", "colSpan", "rowSpan", "dataRowIndex", "dataItem", "expandable"] }, { type: i15.DropTargetDirective, selector: "[kendoDropTarget]", inputs: ["context"], outputs: ["enter", "leave", "drop"] }, { type: i16.DraggableDirective, selector: "[kendoDraggable]", inputs: ["enableDrag"], outputs: ["kendoPress", "kendoDrag", "kendoRelease"] }, { type: i17.DraggableColumnDirective, selector: "[kendoDraggableColumn]", inputs: ["context", "enableDrag"], outputs: ["drag"] }, { type: i12.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i12.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i18.TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }, { type: i19.FocusableDirective, selector: "[kendoTreeListFocusable],\n [kendoTreeListAddCommand],\n [kendoTreeListEditCommand],\n [kendoTreeListRemoveCommand],\n [kendoTreeListSaveCommand],\n [kendoTreeListCancelCommand]\n ", inputs: ["kendoTreeListFocusable", "kendoTreeListAddCommand", "kendoTreeListEditCommand", "kendoTreeListRemoveCommand", "kendoTreeListSaveCommand", "kendoTreeListCancelCommand"] }, { type: i20.ColumnHandleDirective, selector: "[kendoTreeListColumnHandle]", inputs: ["columns", "column"] }] });
543
+ `, isInline: true, components: [{ type: i8.FilterMenuComponent, selector: "kendo-treelist-filter-menu", inputs: ["column", "filter"] }, { type: i9.ColumnMenuComponent, selector: "kendo-treelist-column-menu", inputs: ["standalone", "column", "settings", "sort", "filter", "sortable", "columnMenuTemplate"] }, { type: i10.IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass"], exportAs: ["kendoIconWrapper"] }, { type: i11.FilterRowComponent, selector: "[kendoTreeListFilterRow]", inputs: ["columns", "filter", "logicalRowIndex", "lockedColumnsCount"] }], directives: [{ type: i12.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i13.LogicalRowDirective, selector: "[kendoTreeListLogicalRow]", inputs: ["logicalRowIndex", "logicalSlaveRow", "logicalCellsCount", "logicalSlaveCellsCount", "dataRowIndex", "dataItem", "isNew"] }, { type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i14.LogicalCellDirective, selector: "[kendoTreeListLogicalCell]", inputs: ["logicalColIndex", "logicalRowIndex", "logicalSlaveCell", "column", "colIndex", "colSpan", "rowSpan", "dataRowIndex", "dataItem", "expandable"] }, { type: i15.DropTargetDirective, selector: "[kendoDropTarget]", inputs: ["context"], outputs: ["enter", "leave", "drop"] }, { type: i16.DraggableDirective, selector: "[kendoDraggable]", inputs: ["enableDrag"], outputs: ["kendoPress", "kendoDrag", "kendoRelease"] }, { type: i17.DraggableColumnDirective, selector: "[kendoDraggableColumn]", inputs: ["context", "enableDrag"], outputs: ["drag"] }, { type: i12.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i12.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i18.TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }, { type: i19.FocusableDirective, selector: "[kendoTreeListFocusable],\n [kendoTreeListAddCommand],\n [kendoTreeListEditCommand],\n [kendoTreeListRemoveCommand],\n [kendoTreeListSaveCommand],\n [kendoTreeListCancelCommand]\n ", inputs: ["kendoTreeListFocusable", "enabled", "kendoTreeListAddCommand", "kendoTreeListEditCommand", "kendoTreeListRemoveCommand", "kendoTreeListSaveCommand", "kendoTreeListCancelCommand"] }, { type: i20.ColumnHandleDirective, selector: "[kendoTreeListColumnHandle]", inputs: ["columns", "column"] }] });
540
544
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: HeaderComponent, decorators: [{
541
545
  type: Component,
542
546
  args: [{
543
547
  selector: '[kendoTreeListHeader]',
544
548
  template: `
545
- <tr *ngFor="let i of columnLevels; let levelIndex = index"
549
+ <tr *ngFor="let i of columnLevels; let levelIndex = index" role="row"
546
550
  kendoTreeListLogicalRow
547
551
  [logicalRowIndex]="levelIndex"
548
552
  [logicalSlaveRow]="lockedColumnsCount > 0"
@@ -572,6 +576,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
572
576
  }"
573
577
  class="k-header k-table-th"
574
578
  [class.k-filterable]="(showFilterMenu && isFilterable(getColumnComponent(column))) || showColumnMenu(column)"
579
+ [attr.aria-haspopup]="(showFilterMenu || showColumnMenu(column)) ? 'dialog' : undefined"
575
580
  [class.k-first]="isFirstOnRow(getColumnComponent(column), columnIndex)"
576
581
  [ngClass]="column.headerClass"
577
582
  [ngStyle]="column.headerStyle"
@@ -680,7 +685,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
680
685
  }"
681
686
  class="k-header k-table-th"
682
687
  [class.k-first]="isFirstOnRow(getColumnComponent(column), columnIndex)"
688
+ [attr.aria-haspopup]="(showFilterMenu || showColumnMenu(column)) ? 'dialog' : undefined"
683
689
  [class.k-filterable]="showColumnMenu(column)"
690
+ [attr.aria-expanded]="showColumnMenu(column)"
684
691
  [ngClass]="column.headerClass"
685
692
  [ngStyle]="column.headerStyle"
686
693
  [attr.rowspan]="column.rowspan(totalColumnLevels)"
@@ -561,7 +561,7 @@ ListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version:
561
561
  [columns]="$any(nonLockedColumnsToRender)">
562
562
  </colgroup>
563
563
  <tbody kendoTreeListTableBody
564
- role="presentation"
564
+ role="rowgroup"
565
565
  [view]="view"
566
566
  [columns]="$any(nonLockedColumnsToRender)"
567
567
  [allColumns]="$any(nonLockedLeafColumns)"
@@ -646,7 +646,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
646
646
  [columns]="$any(nonLockedColumnsToRender)">
647
647
  </colgroup>
648
648
  <tbody kendoTreeListTableBody
649
- role="presentation"
649
+ role="rowgroup"
650
650
  [view]="view"
651
651
  [columns]="$any(nonLockedColumnsToRender)"
652
652
  [allColumns]="$any(nonLockedLeafColumns)"
@@ -349,6 +349,7 @@ TableBodyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ver
349
349
  class="k-table-row{{isOdd(item) ? ' k-alt k-table-alt-row' : ''}}"
350
350
  [class.k-grid-edit-row]="isEditingRow(item)"
351
351
  [class.k-grid-add-row]="item.isNew"
352
+ [attr.aria-selected]="item.selected"
352
353
  [class.k-selected]="item.selected"
353
354
  [attr.data-treelist-view-index]="rowIndex">
354
355
 
@@ -384,7 +385,7 @@ TableBodyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ver
384
385
  *ngFor="let column of columns; let columnIndex = index; trackBy: trackByColumns;">
385
386
  </td>
386
387
  </tr>
387
- <tr *ngIf="item.type === 'footer' && hasFooter"
388
+ <tr *ngIf="item.type === 'footer' && hasFooter" role="row"
388
389
  class="k-footer"
389
390
  [attr.data-treelist-view-index]="rowIndex"
390
391
  kendoTreeListLogicalRow
@@ -398,6 +399,7 @@ TableBodyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ver
398
399
  [logicalColIndex]="logicalColIndex(column)"
399
400
  [column]="column"
400
401
  [colIndex]="columnIndex"
402
+ role="gridcell"
401
403
  class="k-table-td"
402
404
  [ngClass]="column.footerClass"
403
405
  [ngStyle]="column.footerStyle"
@@ -449,6 +451,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
449
451
  class="k-table-row{{isOdd(item) ? ' k-alt k-table-alt-row' : ''}}"
450
452
  [class.k-grid-edit-row]="isEditingRow(item)"
451
453
  [class.k-grid-add-row]="item.isNew"
454
+ [attr.aria-selected]="item.selected"
452
455
  [class.k-selected]="item.selected"
453
456
  [attr.data-treelist-view-index]="rowIndex">
454
457
 
@@ -484,7 +487,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
484
487
  *ngFor="let column of columns; let columnIndex = index; trackBy: trackByColumns;">
485
488
  </td>
486
489
  </tr>
487
- <tr *ngIf="item.type === 'footer' && hasFooter"
490
+ <tr *ngIf="item.type === 'footer' && hasFooter" role="row"
488
491
  class="k-footer"
489
492
  [attr.data-treelist-view-index]="rowIndex"
490
493
  kendoTreeListLogicalRow
@@ -498,6 +501,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
498
501
  [logicalColIndex]="logicalColIndex(column)"
499
502
  [column]="column"
500
503
  [colIndex]="columnIndex"
504
+ role="gridcell"
501
505
  class="k-table-td"
502
506
  [ngClass]="column.footerClass"
503
507
  [ngStyle]="column.footerStyle"