@progress/kendo-angular-grid 13.4.0-develop.1 → 13.4.0-develop.11

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 (44) hide show
  1. package/column-menu/column-chooser-item-checked.directive.d.ts +20 -0
  2. package/column-menu/column-chooser.component.d.ts +9 -1
  3. package/column-menu/column-list-kb-nav.service.d.ts +22 -0
  4. package/column-menu/column-list.component.d.ts +10 -2
  5. package/column-menu/column-menu-item.component.d.ts +2 -0
  6. package/column-menu/column-menu.component.d.ts +10 -4
  7. package/column-menu/column-menu.module.d.ts +22 -21
  8. package/common/error-messages.d.ts +1 -1
  9. package/esm2020/column-menu/column-chooser-item-checked.directive.mjs +36 -0
  10. package/esm2020/column-menu/column-chooser.component.mjs +63 -12
  11. package/esm2020/column-menu/column-list-kb-nav.service.mjs +38 -0
  12. package/esm2020/column-menu/column-list.component.mjs +137 -26
  13. package/esm2020/column-menu/column-menu-autosize-all.component.mjs +2 -2
  14. package/esm2020/column-menu/column-menu-autosize.component.mjs +2 -2
  15. package/esm2020/column-menu/column-menu-chooser.component.mjs +3 -1
  16. package/esm2020/column-menu/column-menu-item.component.mjs +10 -4
  17. package/esm2020/column-menu/column-menu.component.mjs +79 -37
  18. package/esm2020/column-menu/column-menu.module.mjs +6 -2
  19. package/esm2020/common/error-messages.mjs +1 -1
  20. package/esm2020/filtering/cell/autocomplete-filter-cell.component.mjs +1 -1
  21. package/esm2020/filtering/cell/boolean-filter-cell.component.mjs +1 -1
  22. package/esm2020/filtering/cell/filter-cell-operators.component.mjs +1 -1
  23. package/esm2020/filtering/menu/date-filter-menu.component.mjs +1 -1
  24. package/esm2020/filtering/menu/filter-menu-container.component.mjs +2 -2
  25. package/esm2020/filtering/menu/filter-menu-input-wrapper.component.mjs +1 -1
  26. package/esm2020/filtering/menu/filter-menu.component.mjs +52 -10
  27. package/esm2020/filtering/menu/numeric-filter-menu.component.mjs +1 -1
  28. package/esm2020/filtering/menu/string-filter-menu.component.mjs +1 -1
  29. package/esm2020/navigation/logical-cell.directive.mjs +1 -1
  30. package/esm2020/package-metadata.mjs +2 -2
  31. package/esm2020/pager/pager-numeric-buttons.component.mjs +14 -8
  32. package/esm2020/pager/pager-page-sizes.component.mjs +1 -1
  33. package/esm2020/pager/pager.component.mjs +76 -42
  34. package/esm2020/rendering/footer/footer.component.mjs +1 -1
  35. package/esm2020/rendering/groups-expand.directive.mjs +9 -1
  36. package/esm2020/rendering/header/header.component.mjs +31 -21
  37. package/fesm2015/progress-kendo-angular-grid.mjs +914 -547
  38. package/fesm2020/progress-kendo-angular-grid.mjs +915 -556
  39. package/filtering/menu/filter-menu.component.d.ts +13 -4
  40. package/package.json +16 -16
  41. package/pager/pager-numeric-buttons.component.d.ts +2 -1
  42. package/pager/pager.component.d.ts +5 -1
  43. package/rendering/header/header.component.d.ts +4 -1
  44. package/schematics/ngAdd/index.js +3 -3
@@ -3,7 +3,7 @@
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import * as i0 from '@angular/core';
6
- import { InjectionToken, Component, HostBinding, Input, EventEmitter, Injectable, Directive, Optional, QueryList, isDevMode, ContentChildren, ContentChild, forwardRef, SkipSelf, Host, Inject, Output, SecurityContext, HostListener, ChangeDetectionStrategy, ViewChild, ViewChildren, Self, TemplateRef, Pipe, ViewEncapsulation, NgModule } from '@angular/core';
6
+ import { InjectionToken, Component, HostBinding, Input, EventEmitter, Injectable, Directive, Optional, QueryList, isDevMode, ContentChildren, ContentChild, forwardRef, SkipSelf, Host, Inject, Output, SecurityContext, HostListener, ChangeDetectionStrategy, ElementRef, ViewChild, ViewChildren, Self, TemplateRef, Pipe, ViewEncapsulation, NgModule } from '@angular/core';
7
7
  import * as i1$1 from '@progress/kendo-angular-common';
8
8
  import { isDocumentAvailable, Keys, isPresent as isPresent$1, closest as closest$1, isFocusable as isFocusable$1, anyChanged, isChanged as isChanged$1, KendoInput, guid, hasObservers, ResizeSensorComponent, DraggableModule, EventsModule, ResizeSensorModule } from '@progress/kendo-angular-common';
9
9
  import { merge, of, Subject, from, Subscription, interval, fromEvent, zip as zip$1, BehaviorSubject, Observable } from 'rxjs';
@@ -24,17 +24,17 @@ import * as i3 from '@progress/kendo-angular-icons';
24
24
  import { IconsModule } from '@progress/kendo-angular-icons';
25
25
  import * as i41 from '@progress/kendo-angular-utils';
26
26
  import { DragTargetContainerDirective, DropTargetContainerDirective, DragAndDropModule as DragAndDropModule$1 } from '@progress/kendo-angular-utils';
27
- import * as i4$1 from '@progress/kendo-angular-buttons';
28
- import { ButtonModule, ChipModule, Button } from '@progress/kendo-angular-buttons';
29
- import * as i3$1 from '@progress/kendo-angular-inputs';
30
- import { NumericTextBoxComponent, InputsModule, NumericTextBoxModule } from '@progress/kendo-angular-inputs';
31
27
  import * as i1$4 from '@progress/kendo-angular-dropdowns';
32
28
  import { DropDownListComponent, DropDownListModule, AutoCompleteModule, DropDownsModule } from '@progress/kendo-angular-dropdowns';
33
29
  import * as i5 from '@progress/kendo-angular-label';
34
30
  import { LabelModule } from '@progress/kendo-angular-label';
31
+ import * as i4$1 from '@progress/kendo-angular-buttons';
32
+ import { ButtonModule, ChipModule, Button } from '@progress/kendo-angular-buttons';
33
+ import * as i3$1 from '@progress/kendo-angular-inputs';
34
+ import { NumericTextBoxComponent, InputsModule, NumericTextBoxModule } from '@progress/kendo-angular-inputs';
35
35
  import * as i4$3 from '@progress/kendo-angular-dateinputs';
36
36
  import { DatePickerModule } from '@progress/kendo-angular-dateinputs';
37
- import * as i16 from '@progress/kendo-angular-layout';
37
+ import * as i17 from '@progress/kendo-angular-layout';
38
38
  import { TabStripComponent, TabStripModule } from '@progress/kendo-angular-layout';
39
39
  import { trigger, state, style, transition, animate } from '@angular/animations';
40
40
  import { getter } from '@progress/kendo-common';
@@ -4474,8 +4474,8 @@ const packageMetadata = {
4474
4474
  name: '@progress/kendo-angular-grid',
4475
4475
  productName: 'Kendo UI for Angular',
4476
4476
  productCodes: ['KENDOUIANGULAR', 'KENDOUICOMPLETE'],
4477
- publishDate: 1692286635,
4478
- version: '13.4.0-develop.1',
4477
+ publishDate: 1693036824,
4478
+ version: '13.4.0-develop.11',
4479
4479
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/'
4480
4480
  };
4481
4481
 
@@ -7105,23 +7105,46 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
7105
7105
  type: Input
7106
7106
  }] } });
7107
7107
 
7108
+ // eslint-disable no-access-missing-member
7108
7109
  /**
7109
- * Displays buttons for navigating to the first and to the previous page ([see example](slug:pager_template_grid#toc-using-built-in-pager-components)).
7110
+ * Displays information about the current page and the total number of records ([see example](slug:pager_template_grid#toc-using-built-in-pager-components)).
7110
7111
  */
7111
- class PagerPrevButtonsComponent extends PagerElementComponent {
7112
- constructor(ctx, pagerContext, cd, navigationService) {
7112
+ class PagerInfoComponent extends PagerElementComponent {
7113
+ constructor(ctx, cd, pagerContext) {
7113
7114
  super(ctx, pagerContext, cd);
7114
- this.navigationService = navigationService;
7115
+ this.pagerContext = pagerContext;
7116
+ }
7117
+ /**
7118
+ * @hidden
7119
+ *
7120
+ * @readonly
7121
+ * @type {number}
7122
+ * @memberOf PagerInfoComponent
7123
+ */
7124
+ get maxItems() {
7125
+ return Math.min(this.currentPage * this.pageSize, this.total);
7126
+ }
7127
+ /**
7128
+ * @hidden
7129
+ *
7130
+ * @readonly
7131
+ * @type {number}
7132
+ * @memberOf PagerInfoComponent
7133
+ */
7134
+ get currentPageText() {
7135
+ return this.total ?
7136
+ (this.currentPage - 1) * this.pageSize + 1 :
7137
+ 0;
7115
7138
  }
7116
7139
  /**
7117
7140
  * @hidden
7118
7141
  *
7119
7142
  * @readonly
7120
7143
  * @type {boolean}
7121
- * @memberOf PagerPrevButtonsComponent
7144
+ * @memberOf PagerInfoComponent
7122
7145
  */
7123
- get disabled() {
7124
- return this.currentPage === 1 || !this.total;
7146
+ get classes() {
7147
+ return true;
7125
7148
  }
7126
7149
  onChanges({ total, skip, pageSize }) {
7127
7150
  this.total = total;
@@ -7130,168 +7153,266 @@ class PagerPrevButtonsComponent extends PagerElementComponent {
7130
7153
  this.cd.markForCheck();
7131
7154
  }
7132
7155
  }
7133
- PagerPrevButtonsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerPrevButtonsComponent, deps: [{ token: ContextService }, { token: PagerContextService }, { token: i0.ChangeDetectorRef }, { token: NavigationService }], target: i0.ɵɵFactoryTarget.Component });
7134
- PagerPrevButtonsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: PagerPrevButtonsComponent, selector: "kendo-pager-prev-buttons", usesInheritance: true, ngImport: i0, template: `
7135
- <button
7136
- [kendoGridFocusable]="!disabled"
7137
- kendoButton
7138
- type="button"
7139
- [title]="textFor('pagerFirstPage')"
7140
- [attr.aria-label]="textFor('pagerFirstPage')"
7141
- (click)="currentPage !== 1 ? changePage(0) : false"
7142
- role="button"
7143
- [icon]="prevArrowIcons[0]"
7144
- [svgIcon]="prevArrowSVGIcons[0]"
7145
- class="k-pager-nav k-pager-first"
7146
- [disabled]="disabled"
7147
- fillMode="flat"
7148
- rounded="none"
7149
- [size]="size">
7150
- </button>
7151
- <button
7152
- kendoButton
7153
- [kendoGridFocusable]="!disabled"
7154
- type="button"
7155
- class="k-pager-nav"
7156
- [disabled]="disabled"
7157
- [icon]="prevArrowIcons[1]"
7158
- [svgIcon]="prevArrowSVGIcons[1]"
7159
- fillMode="flat"
7160
- rounded="none"
7161
- [size]="size"
7162
- [title]="textFor('pagerPreviousPage')"
7163
- [attr.aria-label]="textFor('pagerPreviousPage')"
7164
- (click)="currentPage !== 1 ? changePage(currentPage-2) : false">
7165
- </button>
7166
- `, isInline: true, components: [{ type: i4$1.ButtonComponent, selector: "button[kendoButton], span[kendoButton], kendo-button", inputs: ["toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "role", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }], directives: [{ type: FocusableDirective, selector: "[kendoGridFocusable],\n [kendoGridEditCommand],\n [kendoGridRemoveCommand],\n [kendoGridSaveCommand],\n [kendoGridCancelCommand],\n [kendoGridSelectionCheckbox]\n ", inputs: ["kendoGridFocusable"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7167
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerPrevButtonsComponent, decorators: [{
7156
+ PagerInfoComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerInfoComponent, deps: [{ token: ContextService }, { token: i0.ChangeDetectorRef }, { token: PagerContextService }], target: i0.ɵɵFactoryTarget.Component });
7157
+ PagerInfoComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: PagerInfoComponent, selector: "kendo-pager-info", host: { properties: { "class.k-pager-info": "this.classes", "class.k-label": "this.classes" } }, usesInheritance: true, ngImport: i0, template: `{{currentPageText}} - {{maxItems}} {{textFor('pagerOf')}} {{total}} {{textFor('pagerItems')}}`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
7158
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerInfoComponent, decorators: [{
7168
7159
  type: Component,
7169
7160
  args: [{
7170
7161
  changeDetection: ChangeDetectionStrategy.OnPush,
7171
- selector: 'kendo-pager-prev-buttons',
7172
- template: `
7173
- <button
7174
- [kendoGridFocusable]="!disabled"
7175
- kendoButton
7176
- type="button"
7177
- [title]="textFor('pagerFirstPage')"
7178
- [attr.aria-label]="textFor('pagerFirstPage')"
7179
- (click)="currentPage !== 1 ? changePage(0) : false"
7180
- role="button"
7181
- [icon]="prevArrowIcons[0]"
7182
- [svgIcon]="prevArrowSVGIcons[0]"
7183
- class="k-pager-nav k-pager-first"
7184
- [disabled]="disabled"
7185
- fillMode="flat"
7186
- rounded="none"
7187
- [size]="size">
7188
- </button>
7189
- <button
7190
- kendoButton
7191
- [kendoGridFocusable]="!disabled"
7192
- type="button"
7193
- class="k-pager-nav"
7194
- [disabled]="disabled"
7195
- [icon]="prevArrowIcons[1]"
7196
- [svgIcon]="prevArrowSVGIcons[1]"
7197
- fillMode="flat"
7198
- rounded="none"
7199
- [size]="size"
7200
- [title]="textFor('pagerPreviousPage')"
7201
- [attr.aria-label]="textFor('pagerPreviousPage')"
7202
- (click)="currentPage !== 1 ? changePage(currentPage-2) : false">
7203
- </button>
7204
- `
7162
+ selector: 'kendo-pager-info',
7163
+ template: `{{currentPageText}} - {{maxItems}} {{textFor('pagerOf')}} {{total}} {{textFor('pagerItems')}}`
7205
7164
  }]
7206
- }], ctorParameters: function () { return [{ type: ContextService }, { type: PagerContextService }, { type: i0.ChangeDetectorRef }, { type: NavigationService }]; } });
7165
+ }], ctorParameters: function () { return [{ type: ContextService }, { type: i0.ChangeDetectorRef }, { type: PagerContextService }]; }, propDecorators: { classes: [{
7166
+ type: HostBinding,
7167
+ args: ["class.k-pager-info"]
7168
+ }, {
7169
+ type: HostBinding,
7170
+ args: ["class.k-label"]
7171
+ }] } });
7207
7172
 
7208
7173
  /**
7209
- * Displays numeric buttons to enable navigation between the pages ([see example](slug:pager_template_grid#toc-using-built-in-pager-components)).
7174
+ * @hidden
7210
7175
  */
7211
- class PagerNumericButtonsComponent extends PagerElementComponent {
7212
- constructor(ctx, cd, pagerContext) {
7176
+ class PagerDropDownListDirective {
7177
+ constructor(host) {
7178
+ this.host = host;
7179
+ this.keydownHandler = (e) => {
7180
+ if (e.keyCode === Keys.Escape && this.host.isOpen) {
7181
+ e.stopPropagation();
7182
+ this.host.toggle(false);
7183
+ }
7184
+ };
7185
+ }
7186
+ ngAfterViewInit() {
7187
+ const wrapperElement = this.host.wrapper.nativeElement;
7188
+ wrapperElement.addEventListener('keydown', this.keydownHandler, true);
7189
+ }
7190
+ ngOnDestroy() {
7191
+ this.host.wrapper.nativeElement.removeEventListener('keydown', this.keydownHandler);
7192
+ }
7193
+ }
7194
+ PagerDropDownListDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerDropDownListDirective, deps: [{ token: i1$4.DropDownListComponent }], target: i0.ɵɵFactoryTarget.Directive });
7195
+ PagerDropDownListDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.12", type: PagerDropDownListDirective, selector: "[kendoGridPagerDropDown]", ngImport: i0 });
7196
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerDropDownListDirective, decorators: [{
7197
+ type: Directive,
7198
+ args: [{ selector: '[kendoGridPagerDropDown]' }]
7199
+ }], ctorParameters: function () { return [{ type: i1$4.DropDownListComponent }]; } });
7200
+
7201
+ /**
7202
+ * Displays a drop-down list for the page size selection ([see example](slug:pager_template_grid#toc-using-built-in-pager-components)).
7203
+ */
7204
+ class PagerPageSizesComponent extends PagerElementComponent {
7205
+ constructor(ctx, cd, pagerContext, navigationService) {
7213
7206
  super(ctx, pagerContext, cd);
7214
7207
  this.pagerContext = pagerContext;
7215
- this.numbersWrapClass = true;
7208
+ this.navigationService = navigationService;
7209
+ this._pageSizes = [];
7216
7210
  }
7217
7211
  /**
7218
- * @hidden
7219
- *
7220
- * @readonly
7221
- * @type {number[]}
7222
- * @memberOf PagerNumericButtonsComponent
7212
+ * The page sizes collection. Can be an Array of numbers and/or [`PageSizeItem`](slug:api_grid_pagesizeitem) objects
7213
+ * ([see example]({% slug paging_grid %}#toc-pager-templates))
7223
7214
  */
7224
- get buttons() {
7225
- const result = [];
7226
- for (let idx = this.start; idx <= this.end; idx++) {
7227
- result.push(idx);
7215
+ set pageSizes(pageSizes) {
7216
+ let normalizedItems = [];
7217
+ pageSizes.forEach(item => {
7218
+ if (typeof item === 'number') {
7219
+ normalizedItems.push({
7220
+ text: item.toString(),
7221
+ value: item
7222
+ });
7223
+ }
7224
+ else {
7225
+ normalizedItems.push(item);
7226
+ }
7227
+ });
7228
+ if (this.pageSize && !normalizedItems.some(item => item.value === this.pageSize)) {
7229
+ normalizedItems = [{ text: this.pageSize.toString(), value: this.pageSize }, ...normalizedItems];
7228
7230
  }
7229
- return result;
7231
+ this._pageSizes = normalizedItems;
7232
+ }
7233
+ get pageSizes() {
7234
+ return this._pageSizes;
7230
7235
  }
7231
7236
  /**
7232
7237
  * @hidden
7238
+ *
7239
+ * @readonly
7233
7240
  */
7234
- get end() {
7235
- return Math.min((this.start + this.buttonCount) - 1, this.totalPages);
7241
+ get classes() {
7242
+ return true;
7236
7243
  }
7237
7244
  /**
7238
7245
  * @hidden
7246
+ *
7247
+ * @readonly
7239
7248
  */
7240
- get start() {
7241
- const page = this.currentPage;
7242
- const buttonCount = this.buttonCount;
7243
- if (page > buttonCount) {
7244
- const reminder = (page % buttonCount);
7245
- return (reminder === 0) ? (page - buttonCount) + 1 : (page - reminder) + 1;
7246
- }
7247
- return 1;
7249
+ get showInitialPageSize() {
7250
+ return this.pageSizes
7251
+ .filter(item => {
7252
+ if (typeof item.value === 'number') {
7253
+ return item.value === Number(this.pageSize);
7254
+ }
7255
+ return this.total === Number(this.pageSize);
7256
+ })
7257
+ .length === 0;
7248
7258
  }
7249
7259
  /**
7250
7260
  * @hidden
7251
7261
  */
7252
- pageLabel(num) {
7253
- const pageText = this.textFor('pagerPage');
7254
- if (pageText) {
7255
- return pageText + ' ' + num;
7256
- }
7257
- return num.toString();
7262
+ pageSizeChange(value) {
7263
+ this.pageSize = typeof value === 'number' ? value : this.total;
7264
+ this.pagerContext.changePageSize(this.pageSize);
7258
7265
  }
7259
7266
  /**
7260
7267
  * @hidden
7261
7268
  */
7262
- onSelectChange(e) {
7263
- const target = e.target;
7264
- const valueAsNumber = Number(target.value);
7265
- if (!Number.isNaN(valueAsNumber)) {
7266
- this.changePage(valueAsNumber - 1);
7267
- }
7268
- else {
7269
- if (target.value === 'previousButtons') {
7270
- this.changePage(this.start - 2);
7271
- }
7272
- else {
7273
- this.changePage(this.end);
7274
- }
7275
- }
7269
+ getValue(page) {
7270
+ return typeof page.value === 'number' ? page.value : this.total;
7276
7271
  }
7277
7272
  onChanges({ total, skip, pageSize }) {
7278
7273
  this.total = total;
7279
7274
  this.skip = skip;
7280
- this.pageSize = pageSize;
7275
+ this.pageSize = typeof pageSize === 'number' ? pageSize : this.total;
7281
7276
  this.cd.markForCheck();
7282
7277
  }
7283
7278
  }
7284
- PagerNumericButtonsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerNumericButtonsComponent, deps: [{ token: ContextService }, { token: i0.ChangeDetectorRef }, { token: PagerContextService }], target: i0.ɵɵFactoryTarget.Component });
7285
- PagerNumericButtonsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: PagerNumericButtonsComponent, selector: "kendo-pager-numeric-buttons", inputs: { buttonCount: "buttonCount" }, host: { properties: { "class.k-pager-numbers-wrap": "this.numbersWrapClass" } }, usesInheritance: true, ngImport: i0, template: `
7286
- <select
7287
- class="k-dropdown-list k-dropdown k-picker k-picker-solid k-rounded-md"
7288
- kendoGridFocusable
7289
- [attr.title]="textFor('selectPage')"
7290
- [attr.aria-label]="textFor('selectPage')"
7291
- [ngClass]="{
7292
- 'k-picker-sm': size === 'small',
7293
- 'k-picker-md': size === 'medium' || !size
7294
- }"
7279
+ PagerPageSizesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerPageSizesComponent, deps: [{ token: ContextService }, { token: i0.ChangeDetectorRef }, { token: PagerContextService }, { token: NavigationService }], target: i0.ɵɵFactoryTarget.Component });
7280
+ PagerPageSizesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: PagerPageSizesComponent, selector: "kendo-pager-page-sizes", inputs: { pageSizes: "pageSizes" }, host: { properties: { "class.k-pager-sizes": "this.classes", "class.k-label": "this.classes" } }, usesInheritance: true, ngImport: i0, template: `
7281
+ <kendo-dropdownlist
7282
+ class="k-dropdown"
7283
+ #dropdownlist
7284
+ [size]="size"
7285
+ kendoGridPagerDropDown
7286
+ [tabindex]="0"
7287
+ kendoGridFocusable
7288
+ [data]="pageSizes"
7289
+ textField="text"
7290
+ valueField="value"
7291
+ [valuePrimitive]="true"
7292
+ [value]="pageSize"
7293
+ (valueChange)="pageSizeChange($event)"></kendo-dropdownlist>
7294
+ <kendo-label [for]="dropdownlist" [text]="textFor('pagerItemsPerPage')"></kendo-label>
7295
+ `, isInline: true, components: [{ type: i1$4.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["showStickyHeader", "iconClass", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }, { type: i5.LabelComponent, selector: "kendo-label", inputs: ["text", "for", "optional", "labelCssStyle", "labelCssClass"], exportAs: ["kendoLabel"] }], directives: [{ type: PagerDropDownListDirective, selector: "[kendoGridPagerDropDown]" }, { type: FocusableDirective, selector: "[kendoGridFocusable],\n [kendoGridEditCommand],\n [kendoGridRemoveCommand],\n [kendoGridSaveCommand],\n [kendoGridCancelCommand],\n [kendoGridSelectionCheckbox]\n ", inputs: ["kendoGridFocusable"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7296
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerPageSizesComponent, decorators: [{
7297
+ type: Component,
7298
+ args: [{
7299
+ changeDetection: ChangeDetectionStrategy.OnPush,
7300
+ selector: 'kendo-pager-page-sizes',
7301
+ template: `
7302
+ <kendo-dropdownlist
7303
+ class="k-dropdown"
7304
+ #dropdownlist
7305
+ [size]="size"
7306
+ kendoGridPagerDropDown
7307
+ [tabindex]="0"
7308
+ kendoGridFocusable
7309
+ [data]="pageSizes"
7310
+ textField="text"
7311
+ valueField="value"
7312
+ [valuePrimitive]="true"
7313
+ [value]="pageSize"
7314
+ (valueChange)="pageSizeChange($event)"></kendo-dropdownlist>
7315
+ <kendo-label [for]="dropdownlist" [text]="textFor('pagerItemsPerPage')"></kendo-label>
7316
+ `
7317
+ }]
7318
+ }], ctorParameters: function () { return [{ type: ContextService }, { type: i0.ChangeDetectorRef }, { type: PagerContextService }, { type: NavigationService }]; }, propDecorators: { pageSizes: [{
7319
+ type: Input
7320
+ }], classes: [{
7321
+ type: HostBinding,
7322
+ args: ['class.k-pager-sizes']
7323
+ }, {
7324
+ type: HostBinding,
7325
+ args: ['class.k-label']
7326
+ }] } });
7327
+
7328
+ /**
7329
+ * Displays numeric buttons to enable navigation between the pages ([see example](slug:pager_template_grid#toc-using-built-in-pager-components)).
7330
+ */
7331
+ class PagerNumericButtonsComponent extends PagerElementComponent {
7332
+ constructor(ctx, cd, pagerContext) {
7333
+ super(ctx, pagerContext, cd);
7334
+ this.pagerContext = pagerContext;
7335
+ }
7336
+ /**
7337
+ * @hidden
7338
+ *
7339
+ * @readonly
7340
+ * @type {number[]}
7341
+ * @memberOf PagerNumericButtonsComponent
7342
+ */
7343
+ get buttons() {
7344
+ const result = [];
7345
+ for (let idx = this.start; idx <= this.end; idx++) {
7346
+ result.push(idx);
7347
+ }
7348
+ return result;
7349
+ }
7350
+ /**
7351
+ * @hidden
7352
+ */
7353
+ get end() {
7354
+ return Math.min((this.start + this.buttonCount) - 1, this.totalPages);
7355
+ }
7356
+ /**
7357
+ * @hidden
7358
+ */
7359
+ get start() {
7360
+ const page = this.currentPage;
7361
+ const buttonCount = this.buttonCount;
7362
+ if (page > buttonCount) {
7363
+ const reminder = (page % buttonCount);
7364
+ return (reminder === 0) ? (page - buttonCount) + 1 : (page - reminder) + 1;
7365
+ }
7366
+ return 1;
7367
+ }
7368
+ /**
7369
+ * @hidden
7370
+ */
7371
+ pageLabel(num) {
7372
+ const pageText = this.textFor('pagerPage');
7373
+ if (pageText) {
7374
+ return pageText + ' ' + num;
7375
+ }
7376
+ return num.toString();
7377
+ }
7378
+ /**
7379
+ * @hidden
7380
+ */
7381
+ onSelectChange(e) {
7382
+ const target = e.target;
7383
+ const valueAsNumber = Number(target.value);
7384
+ if (!Number.isNaN(valueAsNumber)) {
7385
+ this.changePage(valueAsNumber - 1);
7386
+ }
7387
+ else {
7388
+ if (target.value === 'previousButtons') {
7389
+ this.changePage(this.start - 2);
7390
+ }
7391
+ else {
7392
+ this.changePage(this.end);
7393
+ }
7394
+ }
7395
+ }
7396
+ onChanges({ total, skip, pageSize }) {
7397
+ this.total = total;
7398
+ this.skip = skip;
7399
+ this.pageSize = pageSize;
7400
+ this.cd.markForCheck();
7401
+ }
7402
+ }
7403
+ PagerNumericButtonsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerNumericButtonsComponent, deps: [{ token: ContextService }, { token: i0.ChangeDetectorRef }, { token: PagerContextService }], target: i0.ɵɵFactoryTarget.Component });
7404
+ PagerNumericButtonsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: PagerNumericButtonsComponent, selector: "kendo-pager-numeric-buttons", inputs: { buttonCount: "buttonCount" }, viewQueries: [{ propertyName: "selectElement", first: true, predicate: ["select"], descendants: true, read: ElementRef }, { propertyName: "numbersElement", first: true, predicate: ["numbers"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: `
7405
+ <select
7406
+ #select
7407
+ class="k-dropdown-list k-dropdown k-picker k-picker-solid k-rounded-md"
7408
+ kendoGridFocusable
7409
+ [style.display]="'none'"
7410
+ [attr.title]="textFor('selectPage')"
7411
+ [attr.aria-label]="textFor('selectPage')"
7412
+ [ngClass]="{
7413
+ 'k-picker-sm': size === 'small',
7414
+ 'k-picker-md': size === 'medium' || !size
7415
+ }"
7295
7416
  (change)="onSelectChange($event)">
7296
7417
  <option *ngIf="start > 1"
7297
7418
  value="previousButtons"
@@ -7312,7 +7433,7 @@ PagerNumericButtonsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12
7312
7433
  [attr.aria-label]="pageLabel(end + 1)">...
7313
7434
  </option>
7314
7435
  </select>
7315
- <div class="k-pager-numbers">
7436
+ <div class="k-pager-numbers" #numbers>
7316
7437
  <button *ngIf="start > 1"
7317
7438
  type="button"
7318
7439
  kendoGridFocusable
@@ -7362,8 +7483,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
7362
7483
  selector: 'kendo-pager-numeric-buttons',
7363
7484
  template: `
7364
7485
  <select
7486
+ #select
7365
7487
  class="k-dropdown-list k-dropdown k-picker k-picker-solid k-rounded-md"
7366
7488
  kendoGridFocusable
7489
+ [style.display]="'none'"
7367
7490
  [attr.title]="textFor('selectPage')"
7368
7491
  [attr.aria-label]="textFor('selectPage')"
7369
7492
  [ngClass]="{
@@ -7390,7 +7513,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
7390
7513
  [attr.aria-label]="pageLabel(end + 1)">...
7391
7514
  </option>
7392
7515
  </select>
7393
- <div class="k-pager-numbers">
7516
+ <div class="k-pager-numbers" #numbers>
7394
7517
  <button *ngIf="start > 1"
7395
7518
  type="button"
7396
7519
  kendoGridFocusable
@@ -7434,13 +7557,116 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
7434
7557
  </div>
7435
7558
  `
7436
7559
  }]
7437
- }], ctorParameters: function () { return [{ type: ContextService }, { type: i0.ChangeDetectorRef }, { type: PagerContextService }]; }, propDecorators: { numbersWrapClass: [{
7438
- type: HostBinding,
7439
- args: ['class.k-pager-numbers-wrap']
7560
+ }], ctorParameters: function () { return [{ type: ContextService }, { type: i0.ChangeDetectorRef }, { type: PagerContextService }]; }, propDecorators: { selectElement: [{
7561
+ type: ViewChild,
7562
+ args: ['select', { read: ElementRef }]
7563
+ }], numbersElement: [{
7564
+ type: ViewChild,
7565
+ args: ['numbers', { read: ElementRef }]
7440
7566
  }], buttonCount: [{
7441
7567
  type: Input
7442
7568
  }] } });
7443
7569
 
7570
+ /**
7571
+ * Displays buttons for navigating to the first and to the previous page ([see example](slug:pager_template_grid#toc-using-built-in-pager-components)).
7572
+ */
7573
+ class PagerPrevButtonsComponent extends PagerElementComponent {
7574
+ constructor(ctx, pagerContext, cd, navigationService) {
7575
+ super(ctx, pagerContext, cd);
7576
+ this.navigationService = navigationService;
7577
+ }
7578
+ /**
7579
+ * @hidden
7580
+ *
7581
+ * @readonly
7582
+ * @type {boolean}
7583
+ * @memberOf PagerPrevButtonsComponent
7584
+ */
7585
+ get disabled() {
7586
+ return this.currentPage === 1 || !this.total;
7587
+ }
7588
+ onChanges({ total, skip, pageSize }) {
7589
+ this.total = total;
7590
+ this.skip = skip;
7591
+ this.pageSize = pageSize;
7592
+ this.cd.markForCheck();
7593
+ }
7594
+ }
7595
+ PagerPrevButtonsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerPrevButtonsComponent, deps: [{ token: ContextService }, { token: PagerContextService }, { token: i0.ChangeDetectorRef }, { token: NavigationService }], target: i0.ɵɵFactoryTarget.Component });
7596
+ PagerPrevButtonsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: PagerPrevButtonsComponent, selector: "kendo-pager-prev-buttons", usesInheritance: true, ngImport: i0, template: `
7597
+ <button
7598
+ [kendoGridFocusable]="!disabled"
7599
+ kendoButton
7600
+ type="button"
7601
+ [title]="textFor('pagerFirstPage')"
7602
+ [attr.aria-label]="textFor('pagerFirstPage')"
7603
+ (click)="currentPage !== 1 ? changePage(0) : false"
7604
+ role="button"
7605
+ [icon]="prevArrowIcons[0]"
7606
+ [svgIcon]="prevArrowSVGIcons[0]"
7607
+ class="k-pager-nav k-pager-first"
7608
+ [disabled]="disabled"
7609
+ fillMode="flat"
7610
+ rounded="none"
7611
+ [size]="size">
7612
+ </button>
7613
+ <button
7614
+ kendoButton
7615
+ [kendoGridFocusable]="!disabled"
7616
+ type="button"
7617
+ class="k-pager-nav"
7618
+ [disabled]="disabled"
7619
+ [icon]="prevArrowIcons[1]"
7620
+ [svgIcon]="prevArrowSVGIcons[1]"
7621
+ fillMode="flat"
7622
+ rounded="none"
7623
+ [size]="size"
7624
+ [title]="textFor('pagerPreviousPage')"
7625
+ [attr.aria-label]="textFor('pagerPreviousPage')"
7626
+ (click)="currentPage !== 1 ? changePage(currentPage-2) : false">
7627
+ </button>
7628
+ `, isInline: true, components: [{ type: i4$1.ButtonComponent, selector: "button[kendoButton], span[kendoButton], kendo-button", inputs: ["toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "role", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }], directives: [{ type: FocusableDirective, selector: "[kendoGridFocusable],\n [kendoGridEditCommand],\n [kendoGridRemoveCommand],\n [kendoGridSaveCommand],\n [kendoGridCancelCommand],\n [kendoGridSelectionCheckbox]\n ", inputs: ["kendoGridFocusable"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7629
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerPrevButtonsComponent, decorators: [{
7630
+ type: Component,
7631
+ args: [{
7632
+ changeDetection: ChangeDetectionStrategy.OnPush,
7633
+ selector: 'kendo-pager-prev-buttons',
7634
+ template: `
7635
+ <button
7636
+ [kendoGridFocusable]="!disabled"
7637
+ kendoButton
7638
+ type="button"
7639
+ [title]="textFor('pagerFirstPage')"
7640
+ [attr.aria-label]="textFor('pagerFirstPage')"
7641
+ (click)="currentPage !== 1 ? changePage(0) : false"
7642
+ role="button"
7643
+ [icon]="prevArrowIcons[0]"
7644
+ [svgIcon]="prevArrowSVGIcons[0]"
7645
+ class="k-pager-nav k-pager-first"
7646
+ [disabled]="disabled"
7647
+ fillMode="flat"
7648
+ rounded="none"
7649
+ [size]="size">
7650
+ </button>
7651
+ <button
7652
+ kendoButton
7653
+ [kendoGridFocusable]="!disabled"
7654
+ type="button"
7655
+ class="k-pager-nav"
7656
+ [disabled]="disabled"
7657
+ [icon]="prevArrowIcons[1]"
7658
+ [svgIcon]="prevArrowSVGIcons[1]"
7659
+ fillMode="flat"
7660
+ rounded="none"
7661
+ [size]="size"
7662
+ [title]="textFor('pagerPreviousPage')"
7663
+ [attr.aria-label]="textFor('pagerPreviousPage')"
7664
+ (click)="currentPage !== 1 ? changePage(currentPage-2) : false">
7665
+ </button>
7666
+ `
7667
+ }]
7668
+ }], ctorParameters: function () { return [{ type: ContextService }, { type: PagerContextService }, { type: i0.ChangeDetectorRef }, { type: NavigationService }]; } });
7669
+
7444
7670
  /**
7445
7671
  * @hidden
7446
7672
  */
@@ -7622,286 +7848,66 @@ PagerNextButtonsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.
7622
7848
  fillMode="flat"
7623
7849
  rounded="none"
7624
7850
  class="k-pager-nav"
7625
- [disabled]="disabled"
7626
- [title]="textFor('pagerNextPage')"
7627
- [attr.aria-label]="textFor('pagerNextPage')"
7628
- (click)="currentPage !== totalPages ? changePage(currentPage) : false">
7629
- </button>
7630
- <button
7631
- kendoButton
7632
- [kendoGridFocusable]="!disabled"
7633
- type="button"
7634
- [size]="size"
7635
- [icon]="nextArrowIcons[1]"
7636
- [svgIcon]="nextArrowSVGIcons[1]"
7637
- fillMode="flat"
7638
- rounded="none"
7639
- class="k-pager-nav k-pager-last"
7640
- [disabled]="disabled"
7641
- [title]="textFor('pagerLastPage')"
7642
- [attr.aria-label]="textFor('pagerLastPage')"
7643
- (click)="currentPage !== totalPages ? changePage(totalPages-1) : false">
7644
- </button>
7645
- `, isInline: true, components: [{ type: i4$1.ButtonComponent, selector: "button[kendoButton], span[kendoButton], kendo-button", inputs: ["toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "role", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }], directives: [{ type: FocusableDirective, selector: "[kendoGridFocusable],\n [kendoGridEditCommand],\n [kendoGridRemoveCommand],\n [kendoGridSaveCommand],\n [kendoGridCancelCommand],\n [kendoGridSelectionCheckbox]\n ", inputs: ["kendoGridFocusable"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7646
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerNextButtonsComponent, decorators: [{
7647
- type: Component,
7648
- args: [{
7649
- changeDetection: ChangeDetectionStrategy.OnPush,
7650
- selector: 'kendo-pager-next-buttons',
7651
- template: `
7652
- <button
7653
- kendoButton
7654
- [kendoGridFocusable]="!disabled"
7655
- type="button"
7656
- [size]="size"
7657
- [icon]="nextArrowIcons[0]"
7658
- [svgIcon]="nextArrowSVGIcons[0]"
7659
- fillMode="flat"
7660
- rounded="none"
7661
- class="k-pager-nav"
7662
- [disabled]="disabled"
7663
- [title]="textFor('pagerNextPage')"
7664
- [attr.aria-label]="textFor('pagerNextPage')"
7665
- (click)="currentPage !== totalPages ? changePage(currentPage) : false">
7666
- </button>
7667
- <button
7668
- kendoButton
7669
- [kendoGridFocusable]="!disabled"
7670
- type="button"
7671
- [size]="size"
7672
- [icon]="nextArrowIcons[1]"
7673
- [svgIcon]="nextArrowSVGIcons[1]"
7674
- fillMode="flat"
7675
- rounded="none"
7676
- class="k-pager-nav k-pager-last"
7677
- [disabled]="disabled"
7678
- [title]="textFor('pagerLastPage')"
7679
- [attr.aria-label]="textFor('pagerLastPage')"
7680
- (click)="currentPage !== totalPages ? changePage(totalPages-1) : false">
7681
- </button>
7682
- `
7683
- }]
7684
- }], ctorParameters: function () { return [{ type: ContextService }, { type: PagerContextService }, { type: i0.ChangeDetectorRef }, { type: NavigationService }]; } });
7685
-
7686
- // eslint-disable no-access-missing-member
7687
- /**
7688
- * Displays information about the current page and the total number of records ([see example](slug:pager_template_grid#toc-using-built-in-pager-components)).
7689
- */
7690
- class PagerInfoComponent extends PagerElementComponent {
7691
- constructor(ctx, cd, pagerContext) {
7692
- super(ctx, pagerContext, cd);
7693
- this.pagerContext = pagerContext;
7694
- }
7695
- /**
7696
- * @hidden
7697
- *
7698
- * @readonly
7699
- * @type {number}
7700
- * @memberOf PagerInfoComponent
7701
- */
7702
- get maxItems() {
7703
- return Math.min(this.currentPage * this.pageSize, this.total);
7704
- }
7705
- /**
7706
- * @hidden
7707
- *
7708
- * @readonly
7709
- * @type {number}
7710
- * @memberOf PagerInfoComponent
7711
- */
7712
- get currentPageText() {
7713
- return this.total ?
7714
- (this.currentPage - 1) * this.pageSize + 1 :
7715
- 0;
7716
- }
7717
- /**
7718
- * @hidden
7719
- *
7720
- * @readonly
7721
- * @type {boolean}
7722
- * @memberOf PagerInfoComponent
7723
- */
7724
- get classes() {
7725
- return true;
7726
- }
7727
- onChanges({ total, skip, pageSize }) {
7728
- this.total = total;
7729
- this.skip = skip;
7730
- this.pageSize = pageSize;
7731
- this.cd.markForCheck();
7732
- }
7733
- }
7734
- PagerInfoComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerInfoComponent, deps: [{ token: ContextService }, { token: i0.ChangeDetectorRef }, { token: PagerContextService }], target: i0.ɵɵFactoryTarget.Component });
7735
- PagerInfoComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: PagerInfoComponent, selector: "kendo-pager-info", host: { properties: { "class.k-pager-info": "this.classes", "class.k-label": "this.classes" } }, usesInheritance: true, ngImport: i0, template: `{{currentPageText}} - {{maxItems}} {{textFor('pagerOf')}} {{total}} {{textFor('pagerItems')}}`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
7736
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerInfoComponent, decorators: [{
7737
- type: Component,
7738
- args: [{
7739
- changeDetection: ChangeDetectionStrategy.OnPush,
7740
- selector: 'kendo-pager-info',
7741
- template: `{{currentPageText}} - {{maxItems}} {{textFor('pagerOf')}} {{total}} {{textFor('pagerItems')}}`
7742
- }]
7743
- }], ctorParameters: function () { return [{ type: ContextService }, { type: i0.ChangeDetectorRef }, { type: PagerContextService }]; }, propDecorators: { classes: [{
7744
- type: HostBinding,
7745
- args: ["class.k-pager-info"]
7746
- }, {
7747
- type: HostBinding,
7748
- args: ["class.k-label"]
7749
- }] } });
7750
-
7751
- /**
7752
- * @hidden
7753
- */
7754
- class PagerDropDownListDirective {
7755
- constructor(host) {
7756
- this.host = host;
7757
- this.keydownHandler = (e) => {
7758
- if (e.keyCode === Keys.Escape && this.host.isOpen) {
7759
- e.stopPropagation();
7760
- this.host.toggle(false);
7761
- }
7762
- };
7763
- }
7764
- ngAfterViewInit() {
7765
- const wrapperElement = this.host.wrapper.nativeElement;
7766
- wrapperElement.addEventListener('keydown', this.keydownHandler, true);
7767
- }
7768
- ngOnDestroy() {
7769
- this.host.wrapper.nativeElement.removeEventListener('keydown', this.keydownHandler);
7770
- }
7771
- }
7772
- PagerDropDownListDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerDropDownListDirective, deps: [{ token: i1$4.DropDownListComponent }], target: i0.ɵɵFactoryTarget.Directive });
7773
- PagerDropDownListDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.12", type: PagerDropDownListDirective, selector: "[kendoGridPagerDropDown]", ngImport: i0 });
7774
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerDropDownListDirective, decorators: [{
7775
- type: Directive,
7776
- args: [{ selector: '[kendoGridPagerDropDown]' }]
7777
- }], ctorParameters: function () { return [{ type: i1$4.DropDownListComponent }]; } });
7778
-
7779
- /**
7780
- * Displays a drop-down list for the page size selection ([see example](slug:pager_template_grid#toc-using-built-in-pager-components)).
7781
- */
7782
- class PagerPageSizesComponent extends PagerElementComponent {
7783
- constructor(ctx, cd, pagerContext, navigationService) {
7784
- super(ctx, pagerContext, cd);
7785
- this.pagerContext = pagerContext;
7786
- this.navigationService = navigationService;
7787
- this._pageSizes = [];
7788
- }
7789
- /**
7790
- * The page sizes collection. Can be an Array of numbers and/or [`PageSizeItem`](slug:api_grid_pagesizeitem) objects
7791
- * ([see example]({% slug paging_grid %}#toc-pager-templates))
7792
- */
7793
- set pageSizes(pageSizes) {
7794
- let normalizedItems = [];
7795
- pageSizes.forEach(item => {
7796
- if (typeof item === 'number') {
7797
- normalizedItems.push({
7798
- text: item.toString(),
7799
- value: item
7800
- });
7801
- }
7802
- else {
7803
- normalizedItems.push(item);
7804
- }
7805
- });
7806
- if (this.pageSize && !normalizedItems.some(item => item.value === this.pageSize)) {
7807
- normalizedItems = [{ text: this.pageSize.toString(), value: this.pageSize }, ...normalizedItems];
7808
- }
7809
- this._pageSizes = normalizedItems;
7810
- }
7811
- get pageSizes() {
7812
- return this._pageSizes;
7813
- }
7814
- /**
7815
- * @hidden
7816
- *
7817
- * @readonly
7818
- */
7819
- get classes() {
7820
- return true;
7821
- }
7822
- /**
7823
- * @hidden
7824
- *
7825
- * @readonly
7826
- */
7827
- get showInitialPageSize() {
7828
- return this.pageSizes
7829
- .filter(item => {
7830
- if (typeof item.value === 'number') {
7831
- return item.value === Number(this.pageSize);
7832
- }
7833
- return this.total === Number(this.pageSize);
7834
- })
7835
- .length === 0;
7836
- }
7837
- /**
7838
- * @hidden
7839
- */
7840
- pageSizeChange(value) {
7841
- this.pageSize = typeof value === 'number' ? value : this.total;
7842
- this.pagerContext.changePageSize(this.pageSize);
7843
- }
7844
- /**
7845
- * @hidden
7846
- */
7847
- getValue(page) {
7848
- return typeof page.value === 'number' ? page.value : this.total;
7849
- }
7850
- onChanges({ total, skip, pageSize }) {
7851
- this.total = total;
7852
- this.skip = skip;
7853
- this.pageSize = typeof pageSize === 'number' ? pageSize : this.total;
7854
- this.cd.markForCheck();
7855
- }
7856
- }
7857
- PagerPageSizesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerPageSizesComponent, deps: [{ token: ContextService }, { token: i0.ChangeDetectorRef }, { token: PagerContextService }, { token: NavigationService }], target: i0.ɵɵFactoryTarget.Component });
7858
- PagerPageSizesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: PagerPageSizesComponent, selector: "kendo-pager-page-sizes", inputs: { pageSizes: "pageSizes" }, host: { properties: { "class.k-pager-sizes": "this.classes", "class.k-label": "this.classes" } }, usesInheritance: true, ngImport: i0, template: `
7859
- <kendo-dropdownlist
7860
- class="k-dropdown"
7861
- #dropdownlist
7851
+ [disabled]="disabled"
7852
+ [title]="textFor('pagerNextPage')"
7853
+ [attr.aria-label]="textFor('pagerNextPage')"
7854
+ (click)="currentPage !== totalPages ? changePage(currentPage) : false">
7855
+ </button>
7856
+ <button
7857
+ kendoButton
7858
+ [kendoGridFocusable]="!disabled"
7859
+ type="button"
7862
7860
  [size]="size"
7863
- kendoGridPagerDropDown
7864
- [tabindex]="0"
7865
- kendoGridFocusable
7866
- [data]="pageSizes"
7867
- textField="text"
7868
- valueField="value"
7869
- [valuePrimitive]="true"
7870
- [value]="pageSize"
7871
- (valueChange)="pageSizeChange($event)"></kendo-dropdownlist>
7872
- <kendo-label [for]="dropdownlist" [text]="textFor('pagerItemsPerPage')"></kendo-label>
7873
- `, isInline: true, components: [{ type: i1$4.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["iconClass", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }, { type: i5.LabelComponent, selector: "kendo-label", inputs: ["text", "for", "optional", "labelCssStyle", "labelCssClass"], exportAs: ["kendoLabel"] }], directives: [{ type: PagerDropDownListDirective, selector: "[kendoGridPagerDropDown]" }, { type: FocusableDirective, selector: "[kendoGridFocusable],\n [kendoGridEditCommand],\n [kendoGridRemoveCommand],\n [kendoGridSaveCommand],\n [kendoGridCancelCommand],\n [kendoGridSelectionCheckbox]\n ", inputs: ["kendoGridFocusable"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7874
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerPageSizesComponent, decorators: [{
7861
+ [icon]="nextArrowIcons[1]"
7862
+ [svgIcon]="nextArrowSVGIcons[1]"
7863
+ fillMode="flat"
7864
+ rounded="none"
7865
+ class="k-pager-nav k-pager-last"
7866
+ [disabled]="disabled"
7867
+ [title]="textFor('pagerLastPage')"
7868
+ [attr.aria-label]="textFor('pagerLastPage')"
7869
+ (click)="currentPage !== totalPages ? changePage(totalPages-1) : false">
7870
+ </button>
7871
+ `, isInline: true, components: [{ type: i4$1.ButtonComponent, selector: "button[kendoButton], span[kendoButton], kendo-button", inputs: ["toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "role", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }], directives: [{ type: FocusableDirective, selector: "[kendoGridFocusable],\n [kendoGridEditCommand],\n [kendoGridRemoveCommand],\n [kendoGridSaveCommand],\n [kendoGridCancelCommand],\n [kendoGridSelectionCheckbox]\n ", inputs: ["kendoGridFocusable"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7872
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerNextButtonsComponent, decorators: [{
7875
7873
  type: Component,
7876
7874
  args: [{
7877
7875
  changeDetection: ChangeDetectionStrategy.OnPush,
7878
- selector: 'kendo-pager-page-sizes',
7876
+ selector: 'kendo-pager-next-buttons',
7879
7877
  template: `
7880
- <kendo-dropdownlist
7881
- class="k-dropdown"
7882
- #dropdownlist
7878
+ <button
7879
+ kendoButton
7880
+ [kendoGridFocusable]="!disabled"
7881
+ type="button"
7883
7882
  [size]="size"
7884
- kendoGridPagerDropDown
7885
- [tabindex]="0"
7886
- kendoGridFocusable
7887
- [data]="pageSizes"
7888
- textField="text"
7889
- valueField="value"
7890
- [valuePrimitive]="true"
7891
- [value]="pageSize"
7892
- (valueChange)="pageSizeChange($event)"></kendo-dropdownlist>
7893
- <kendo-label [for]="dropdownlist" [text]="textFor('pagerItemsPerPage')"></kendo-label>
7883
+ [icon]="nextArrowIcons[0]"
7884
+ [svgIcon]="nextArrowSVGIcons[0]"
7885
+ fillMode="flat"
7886
+ rounded="none"
7887
+ class="k-pager-nav"
7888
+ [disabled]="disabled"
7889
+ [title]="textFor('pagerNextPage')"
7890
+ [attr.aria-label]="textFor('pagerNextPage')"
7891
+ (click)="currentPage !== totalPages ? changePage(currentPage) : false">
7892
+ </button>
7893
+ <button
7894
+ kendoButton
7895
+ [kendoGridFocusable]="!disabled"
7896
+ type="button"
7897
+ [size]="size"
7898
+ [icon]="nextArrowIcons[1]"
7899
+ [svgIcon]="nextArrowSVGIcons[1]"
7900
+ fillMode="flat"
7901
+ rounded="none"
7902
+ class="k-pager-nav k-pager-last"
7903
+ [disabled]="disabled"
7904
+ [title]="textFor('pagerLastPage')"
7905
+ [attr.aria-label]="textFor('pagerLastPage')"
7906
+ (click)="currentPage !== totalPages ? changePage(totalPages-1) : false">
7907
+ </button>
7894
7908
  `
7895
7909
  }]
7896
- }], ctorParameters: function () { return [{ type: ContextService }, { type: i0.ChangeDetectorRef }, { type: PagerContextService }, { type: NavigationService }]; }, propDecorators: { pageSizes: [{
7897
- type: Input
7898
- }], classes: [{
7899
- type: HostBinding,
7900
- args: ['class.k-pager-sizes']
7901
- }, {
7902
- type: HostBinding,
7903
- args: ['class.k-label']
7904
- }] } });
7910
+ }], ctorParameters: function () { return [{ type: ContextService }, { type: PagerContextService }, { type: i0.ChangeDetectorRef }, { type: NavigationService }]; } });
7905
7911
 
7906
7912
  /**
7907
7913
  * @hidden
@@ -7932,18 +7938,33 @@ class PagerComponent {
7932
7938
  if (this.template || !element) {
7933
7939
  return;
7934
7940
  }
7935
- const width = element.offsetWidth;
7936
- if (width < RESPONSIVE_BREAKPOINT_MEDIUM) {
7937
- this.renderer.removeClass(element, 'k-pager-mobile-md');
7938
- this.renderer.addClass(element, 'k-pager-mobile-sm');
7939
- }
7940
- else if (width >= RESPONSIVE_BREAKPOINT_MEDIUM && width < RESPONSIVE_BREAKPOINT_LARGE) {
7941
- this.renderer.addClass(element, 'k-pager-mobile-md');
7942
- this.renderer.removeClass(element, 'k-pager-mobile-sm');
7943
- }
7944
- else {
7945
- this.clearResponsiveClasses();
7946
- }
7941
+ this.zone.runOutsideAngular(() => {
7942
+ setTimeout(() => {
7943
+ const width = element.offsetWidth;
7944
+ if (this.numericButtons) {
7945
+ const selectElement = this.numericButtons.selectElement.nativeElement;
7946
+ const numbersElement = this.numericButtons.numbersElement.nativeElement;
7947
+ this.renderer.removeStyle(numbersElement, 'display');
7948
+ this.renderer.setStyle(selectElement, 'display', 'none');
7949
+ if (width < RESPONSIVE_BREAKPOINT_MEDIUM) {
7950
+ this.renderer.removeStyle(selectElement, 'display');
7951
+ this.renderer.setStyle(numbersElement, 'display', 'none');
7952
+ }
7953
+ }
7954
+ if (this.pagerInfo) {
7955
+ this.renderer.removeStyle(this.pagerInfo.nativeElement, 'display');
7956
+ if (width < RESPONSIVE_BREAKPOINT_LARGE) {
7957
+ this.renderer.setStyle(this.pagerInfo.nativeElement, 'display', 'none');
7958
+ }
7959
+ }
7960
+ if (this.pagerPageSizes) {
7961
+ this.renderer.removeStyle(this.pagerPageSizes.nativeElement, 'display');
7962
+ if (width < RESPONSIVE_BREAKPOINT_MEDIUM) {
7963
+ this.renderer.setStyle(this.pagerPageSizes.nativeElement, 'display', 'none');
7964
+ }
7965
+ }
7966
+ });
7967
+ });
7947
7968
  };
7948
7969
  }
7949
7970
  set options(value) {
@@ -8062,12 +8083,10 @@ class PagerComponent {
8062
8083
  }
8063
8084
  const changesInTemplate = changes['template'];
8064
8085
  if (changesInTemplate) {
8065
- // eslint-disable-next-line no-unused-expressions
8066
- changesInTemplate.currentValue ? this.clearResponsiveClasses() : this.resizeHandler();
8086
+ changesInTemplate.currentValue ? this.clearResponsiveStyling() : this.resizeHandler();
8067
8087
  }
8068
8088
  if (changes['options']) {
8069
- // eslint-disable-next-line no-unused-expressions
8070
- this.settings.responsive ? this.resizeHandler() : this.clearResponsiveClasses();
8089
+ this.settings.responsive ? this.resizeHandler() : this.clearResponsiveStyling();
8071
8090
  }
8072
8091
  }
8073
8092
  ngOnDestroy() {
@@ -8093,11 +8112,6 @@ class PagerComponent {
8093
8112
  }
8094
8113
  });
8095
8114
  }
8096
- clearResponsiveClasses() {
8097
- const element = this.element.nativeElement;
8098
- this.renderer.removeClass(element, 'k-pager-mobile-sm');
8099
- this.renderer.removeClass(element, 'k-pager-mobile-md');
8100
- }
8101
8115
  shouldTriggerPageChange(target, condition) {
8102
8116
  return this.navigationService.pagerEnabled &&
8103
8117
  target === this.element.nativeElement &&
@@ -8120,6 +8134,18 @@ class PagerComponent {
8120
8134
  this.cellContext.focusGroup = this.focusGroup;
8121
8135
  }
8122
8136
  }
8137
+ clearResponsiveStyling() {
8138
+ this.zone.runOutsideAngular(() => {
8139
+ setTimeout(() => {
8140
+ if (this.numericButtons) {
8141
+ this.renderer.removeStyle(this.numericButtons.numbersElement.nativeElement, 'display');
8142
+ this.renderer.setStyle(this.numericButtons.selectElement.nativeElement, 'display', 'none');
8143
+ }
8144
+ this.pagerInfo && this.renderer.removeStyle(this.pagerInfo.nativeElement, 'display');
8145
+ this.pagerPageSizes && this.renderer.removeStyle(this.pagerPageSizes.nativeElement, 'display');
8146
+ });
8147
+ });
8148
+ }
8123
8149
  }
8124
8150
  PagerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: PagerComponent, deps: [{ token: PagerContextService }, { token: NavigationService }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: ContextService }, { token: CELL_CONTEXT, optional: true }, { token: FocusRoot }, { token: FocusGroup }], target: i0.ɵɵFactoryTarget.Component });
8125
8151
  PagerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: PagerComponent, selector: "kendo-pager", inputs: { total: "total", skip: "skip", pageSize: "pageSize", options: "options", size: "size", template: "template" }, outputs: { pageChange: "pageChange" }, host: { listeners: { "focusin": "onFocusIn($event)", "focusout": "onFocusOut()", "keydown.escape": "onEscape()", "keydown.enter": "onEnter($event)", "keydown.arrowleft": "navigateToPreviousPage($event)", "keydown.pageup": "navigateToPreviousPage($event)", "keydown.arrowright": "navigateToNextPage($event)", "keydown.pagedown": "navigateToNextPage($event)", "keydown.home": "navigateToFirstPage($event)", "keydown.end": "navigateToLastPage($event)" }, properties: { "class.k-pager-wrap": "this.pagerWrapClass", "class.k-grid-pager": "this.gridPagerClass", "class.k-pager-sm": "this.sizeSmallClass", "class.k-pager-md": "this.sizeMediumClass", "class.k-focus": "this.isFocused", "attr.aria-label": "this.pagerAriaLabel" } }, providers: [{
@@ -8133,7 +8159,7 @@ PagerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version
8133
8159
  provide: FocusGroup,
8134
8160
  deps: [FocusRoot],
8135
8161
  useClass: FocusGroup
8136
- }], usesOnChanges: true, ngImport: i0, template: `
8162
+ }], viewQueries: [{ propertyName: "pagerInfo", first: true, predicate: PagerInfoComponent, descendants: true, read: ElementRef }, { propertyName: "pagerPageSizes", first: true, predicate: PagerPageSizesComponent, descendants: true, read: ElementRef }, { propertyName: "numericButtons", first: true, predicate: PagerNumericButtonsComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: `
8137
8163
  <div
8138
8164
  *ngIf="navigationService.pagerEnabled"
8139
8165
  class="k-sr-only"
@@ -8147,20 +8173,21 @@ PagerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version
8147
8173
  [ngTemplateOutletContext]="templateContext">
8148
8174
  </ng-container>
8149
8175
  <ng-container *ngIf="!template?.templateRef">
8150
- <kendo-pager-prev-buttons [size]="size" *ngIf="settings.previousNext"></kendo-pager-prev-buttons>
8151
- <kendo-pager-numeric-buttons
8152
- [size]="size"
8153
- *ngIf="settings.type === 'numeric'"
8154
- [buttonCount]="settings.buttonCount">
8155
- </kendo-pager-numeric-buttons>
8156
- <kendo-pager-input [size]="size" *ngIf="settings.type === 'input'"></kendo-pager-input>
8157
- <kendo-pager-next-buttons [size]="size" *ngIf="settings.previousNext"></kendo-pager-next-buttons>
8176
+ <div class="k-pager-numbers-wrap">
8177
+ <kendo-pager-prev-buttons [size]="size" *ngIf="settings.previousNext"></kendo-pager-prev-buttons>
8178
+ <kendo-pager-numeric-buttons
8179
+ [size]="size"
8180
+ *ngIf="settings.type === 'numeric'"
8181
+ [buttonCount]="settings.buttonCount">
8182
+ </kendo-pager-numeric-buttons>
8183
+ <kendo-pager-input [size]="size" *ngIf="settings.type === 'input'"></kendo-pager-input>
8184
+ <kendo-pager-next-buttons [size]="size" *ngIf="settings.previousNext"></kendo-pager-next-buttons>
8185
+ </div>
8158
8186
  <kendo-pager-info *ngIf='settings.info'></kendo-pager-info>
8159
8187
  <kendo-pager-page-sizes
8160
8188
  [size]="size"
8161
8189
  *ngIf="settings.pageSizes"
8162
8190
  [pageSizes]="$any(settings.pageSizes)"
8163
- #pageSizes
8164
8191
  ></kendo-pager-page-sizes>
8165
8192
  </ng-container>
8166
8193
  <div
@@ -8202,20 +8229,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
8202
8229
  [ngTemplateOutletContext]="templateContext">
8203
8230
  </ng-container>
8204
8231
  <ng-container *ngIf="!template?.templateRef">
8205
- <kendo-pager-prev-buttons [size]="size" *ngIf="settings.previousNext"></kendo-pager-prev-buttons>
8206
- <kendo-pager-numeric-buttons
8207
- [size]="size"
8208
- *ngIf="settings.type === 'numeric'"
8209
- [buttonCount]="settings.buttonCount">
8210
- </kendo-pager-numeric-buttons>
8211
- <kendo-pager-input [size]="size" *ngIf="settings.type === 'input'"></kendo-pager-input>
8212
- <kendo-pager-next-buttons [size]="size" *ngIf="settings.previousNext"></kendo-pager-next-buttons>
8232
+ <div class="k-pager-numbers-wrap">
8233
+ <kendo-pager-prev-buttons [size]="size" *ngIf="settings.previousNext"></kendo-pager-prev-buttons>
8234
+ <kendo-pager-numeric-buttons
8235
+ [size]="size"
8236
+ *ngIf="settings.type === 'numeric'"
8237
+ [buttonCount]="settings.buttonCount">
8238
+ </kendo-pager-numeric-buttons>
8239
+ <kendo-pager-input [size]="size" *ngIf="settings.type === 'input'"></kendo-pager-input>
8240
+ <kendo-pager-next-buttons [size]="size" *ngIf="settings.previousNext"></kendo-pager-next-buttons>
8241
+ </div>
8213
8242
  <kendo-pager-info *ngIf='settings.info'></kendo-pager-info>
8214
8243
  <kendo-pager-page-sizes
8215
8244
  [size]="size"
8216
8245
  *ngIf="settings.pageSizes"
8217
8246
  [pageSizes]="$any(settings.pageSizes)"
8218
- #pageSizes
8219
8247
  ></kendo-pager-page-sizes>
8220
8248
  </ng-container>
8221
8249
  <div
@@ -8235,7 +8263,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
8235
8263
  type: Inject,
8236
8264
  args: [CELL_CONTEXT]
8237
8265
  }] }, { type: FocusRoot }, { type: FocusGroup }];
8238
- }, propDecorators: { total: [{
8266
+ }, propDecorators: { pagerInfo: [{
8267
+ type: ViewChild,
8268
+ args: [PagerInfoComponent, { read: ElementRef }]
8269
+ }], pagerPageSizes: [{
8270
+ type: ViewChild,
8271
+ args: [PagerPageSizesComponent, { read: ElementRef }]
8272
+ }], numericButtons: [{
8273
+ type: ViewChild,
8274
+ args: [PagerNumericButtonsComponent]
8275
+ }], total: [{
8239
8276
  type: Input
8240
8277
  }], skip: [{
8241
8278
  type: Input
@@ -9584,7 +9621,7 @@ FilterMenuInputWrapperComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion:
9584
9621
  (keydown.shift.tab)="onShiftTab($event)">
9585
9622
  </kendo-dropdownlist>
9586
9623
  <ng-content></ng-content>
9587
- `, isInline: true, components: [{ type: i1$4.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["iconClass", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }], directives: [{ type: FilterMenuDropDownListDirective, selector: "[kendoFilterMenuDropDown]", inputs: ["filterMenuDropDownLabel"] }] });
9624
+ `, isInline: true, components: [{ type: i1$4.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["showStickyHeader", "iconClass", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }], directives: [{ type: FilterMenuDropDownListDirective, selector: "[kendoFilterMenuDropDown]", inputs: ["filterMenuDropDownLabel"] }] });
9588
9625
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: FilterMenuInputWrapperComponent, decorators: [{
9589
9626
  type: Component,
9590
9627
  args: [{
@@ -9780,7 +9817,7 @@ StringFilterMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.
9780
9817
  [filter]="filter"
9781
9818
  [menuTabbingService]="menuTabbingService">
9782
9819
  </kendo-grid-string-filter-menu-input>
9783
- `, isInline: true, components: [{ type: StringFilterMenuInputComponent, selector: "kendo-grid-string-filter-menu-input", inputs: ["operators", "column", "filter", "operator", "currentFilter", "filterService", "isFirstDropDown", "menuTabbingService"] }, { type: i1$4.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["iconClass", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: FilterMenuDropDownListDirective, selector: "[kendoFilterMenuDropDown]", inputs: ["filterMenuDropDownLabel"] }] });
9820
+ `, isInline: true, components: [{ type: StringFilterMenuInputComponent, selector: "kendo-grid-string-filter-menu-input", inputs: ["operators", "column", "filter", "operator", "currentFilter", "filterService", "isFirstDropDown", "menuTabbingService"] }, { type: i1$4.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["showStickyHeader", "iconClass", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: FilterMenuDropDownListDirective, selector: "[kendoFilterMenuDropDown]", inputs: ["filterMenuDropDownLabel"] }] });
9784
9821
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: StringFilterMenuComponent, decorators: [{
9785
9822
  type: Component,
9786
9823
  args: [{
@@ -10186,7 +10223,7 @@ NumericFilterMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0
10186
10223
  [menuTabbingService]="menuTabbingService"
10187
10224
  >
10188
10225
  </kendo-grid-numeric-filter-menu-input>
10189
- `, isInline: true, components: [{ type: NumericFilterMenuInputComponent, selector: "kendo-grid-numeric-filter-menu-input", inputs: ["operators", "column", "filter", "operator", "currentFilter", "filterService", "filterDelay", "isFirstDropDown", "menuTabbingService", "step", "min", "max", "spinners", "decimals", "format"] }, { type: i1$4.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["iconClass", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: FilterMenuDropDownListDirective, selector: "[kendoFilterMenuDropDown]", inputs: ["filterMenuDropDownLabel"] }] });
10226
+ `, isInline: true, components: [{ type: NumericFilterMenuInputComponent, selector: "kendo-grid-numeric-filter-menu-input", inputs: ["operators", "column", "filter", "operator", "currentFilter", "filterService", "filterDelay", "isFirstDropDown", "menuTabbingService", "step", "min", "max", "spinners", "decimals", "format"] }, { type: i1$4.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["showStickyHeader", "iconClass", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: FilterMenuDropDownListDirective, selector: "[kendoFilterMenuDropDown]", inputs: ["filterMenuDropDownLabel"] }] });
10190
10227
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: NumericFilterMenuComponent, decorators: [{
10191
10228
  type: Component,
10192
10229
  args: [{
@@ -10641,7 +10678,7 @@ DateFilterMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0"
10641
10678
  [menuTabbingService]="menuTabbingService"
10642
10679
  >
10643
10680
  </kendo-grid-date-filter-menu-input>
10644
- `, isInline: true, components: [{ type: DateFilterMenuInputComponent, selector: "kendo-grid-date-filter-menu-input", inputs: ["operators", "column", "filter", "operator", "currentFilter", "filterService", "menuTabbingService", "format", "formatPlaceholder", "placeholder", "min", "max", "activeView", "bottomView", "topView", "weekNumber", "isFirstDropDown"] }, { type: i1$4.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["iconClass", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: FilterMenuDropDownListDirective, selector: "[kendoFilterMenuDropDown]", inputs: ["filterMenuDropDownLabel"] }] });
10681
+ `, isInline: true, components: [{ type: DateFilterMenuInputComponent, selector: "kendo-grid-date-filter-menu-input", inputs: ["operators", "column", "filter", "operator", "currentFilter", "filterService", "menuTabbingService", "format", "formatPlaceholder", "placeholder", "min", "max", "activeView", "bottomView", "topView", "weekNumber", "isFirstDropDown"] }, { type: i1$4.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["showStickyHeader", "iconClass", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: FilterMenuDropDownListDirective, selector: "[kendoFilterMenuDropDown]", inputs: ["filterMenuDropDownLabel"] }] });
10645
10682
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: DateFilterMenuComponent, decorators: [{
10646
10683
  type: Component,
10647
10684
  args: [{
@@ -11117,10 +11154,10 @@ class FilterMenuContainerComponent {
11117
11154
  e.preventDefault();
11118
11155
  if (buttonType === 'reset') {
11119
11156
  // eslint-disable-next-line no-unused-expressions
11120
- this.disabled ? this.menuTabbingService.firstFocusable.focus() : this.filterButton.nativeElement.focus();
11157
+ this.menuTabbingService.firstFocusable.focus();
11121
11158
  }
11122
11159
  else {
11123
- this.menuTabbingService.firstFocusable.focus();
11160
+ this.disabled ? this.menuTabbingService.firstFocusable.focus() : this.resetButton.nativeElement.focus();
11124
11161
  }
11125
11162
  }
11126
11163
  }
@@ -11246,15 +11283,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
11246
11283
  args: ['filterButton', { static: false }]
11247
11284
  }] } });
11248
11285
 
11286
+ let id$3 = 0;
11287
+ const getId$1 = (gridId) => `${gridId}-filter-menu-${id$3++}`;
11249
11288
  /**
11250
11289
  * @hidden
11251
11290
  */
11252
11291
  class FilterMenuComponent {
11253
- constructor(filterService, popupService, ctx, navigationService) {
11292
+ constructor(filterService, popupService, ctx, navigationService, renderer, cdr, idService) {
11254
11293
  this.filterService = filterService;
11255
11294
  this.popupService = popupService;
11256
11295
  this.ctx = ctx;
11257
11296
  this.navigationService = navigationService;
11297
+ this.renderer = renderer;
11298
+ this.cdr = cdr;
11299
+ this.idService = idService;
11258
11300
  this.filterIcon = filterIcon;
11259
11301
  this.tabIndex = '-1';
11260
11302
  }
@@ -11269,9 +11311,36 @@ class FilterMenuComponent {
11269
11311
  const columnName = this.column.title || this.column.field;
11270
11312
  return replaceMessagePlaceholder(localizationMsg, 'columnName', columnName);
11271
11313
  }
11314
+ /**
11315
+ * @hidden
11316
+ */
11317
+ get isNavigable() {
11318
+ return this.navigationService.tableEnabled;
11319
+ }
11272
11320
  toggle(anchor, template) {
11321
+ var _a;
11273
11322
  this.popupRef = this.popupService.open(anchor, template, this.popupRef);
11274
- if (!this.popupRef) {
11323
+ // Needed as changes to 'popupRef' are not reflected
11324
+ // automatically when the Popup is closed by clicking outside the anchor
11325
+ const ariaRoot = this.isNavigable ? anchor.closest('.k-table-th') : anchor;
11326
+ if (this.popupRef) {
11327
+ this.popupRef.popup.instance.close.pipe(take(1)).subscribe(() => {
11328
+ this.popupRef = null;
11329
+ const ariaRoot = this.isNavigable ? anchor.closest('.k-table-th') : anchor;
11330
+ ariaRoot && this.renderer.removeAttribute(ariaRoot, 'aria-controls');
11331
+ ariaRoot && this.renderer.setAttribute(ariaRoot, 'aria-expanded', 'false');
11332
+ });
11333
+ const popupAriaElement = this.popupRef.popupElement.querySelector('.k-grid-filter-popup');
11334
+ if (popupAriaElement) {
11335
+ const popupId = getId$1((_a = this.idService) === null || _a === void 0 ? void 0 : _a.gridId());
11336
+ this.renderer.setAttribute(popupAriaElement, 'id', popupId);
11337
+ this.renderer.setAttribute(popupAriaElement, 'role', 'dialog');
11338
+ this.renderer.setAttribute(popupAriaElement, 'aria-label', this.filterLabel);
11339
+ ariaRoot && this.renderer.setAttribute(ariaRoot, 'aria-controls', popupId);
11340
+ ariaRoot && this.renderer.setAttribute(ariaRoot, 'aria-expanded', 'true');
11341
+ }
11342
+ }
11343
+ else {
11275
11344
  if (this.navigationService.tableEnabled) {
11276
11345
  this.navigationService.focusCell(0, this.column.leafIndex);
11277
11346
  }
@@ -11283,6 +11352,8 @@ class FilterMenuComponent {
11283
11352
  }
11284
11353
  close() {
11285
11354
  this.popupService.destroy();
11355
+ this.popupRef = null;
11356
+ this.cdr.markForCheck();
11286
11357
  if (this.navigationService.tableEnabled) {
11287
11358
  this.navigationService.focusCell(0, this.column.leafIndex);
11288
11359
  }
@@ -11291,7 +11362,7 @@ class FilterMenuComponent {
11291
11362
  }
11292
11363
  }
11293
11364
  }
11294
- FilterMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: FilterMenuComponent, deps: [{ token: FilterService }, { token: SinglePopupService }, { token: ContextService }, { token: NavigationService }], target: i0.ɵɵFactoryTarget.Component });
11365
+ FilterMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: FilterMenuComponent, deps: [{ token: FilterService }, { token: SinglePopupService }, { token: ContextService }, { token: NavigationService }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: IdService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
11295
11366
  FilterMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: FilterMenuComponent, selector: "kendo-grid-filter-menu", inputs: { column: "column", filter: "filter", tabIndex: "tabIndex" }, viewQueries: [{ propertyName: "anchor", first: true, predicate: ["anchor"], descendants: true, static: true }, { propertyName: "template", first: true, predicate: ["template"], descendants: true, read: TemplateRef, static: true }], ngImport: i0, template: `
11296
11367
  <a #anchor
11297
11368
  class="k-grid-filter-menu k-grid-header-menu"
@@ -11300,7 +11371,9 @@ FilterMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ve
11300
11371
  (click)="toggle(anchor, template)"
11301
11372
  (keydown.enter)="$event.stopImmediatePropagation()"
11302
11373
  href="#"
11303
- [attr.title]="filterLabel">
11374
+ [attr.title]="filterLabel"
11375
+ [attr.aria-haspopup]="isNavigable ? undefined : 'dialog'"
11376
+ [attr.aria-expanded]="isNavigable ? undefined : false">
11304
11377
  <kendo-icon-wrapper
11305
11378
  name="filter"
11306
11379
  [svgIcon]="filterIcon"></kendo-icon-wrapper>
@@ -11328,7 +11401,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
11328
11401
  (click)="toggle(anchor, template)"
11329
11402
  (keydown.enter)="$event.stopImmediatePropagation()"
11330
11403
  href="#"
11331
- [attr.title]="filterLabel">
11404
+ [attr.title]="filterLabel"
11405
+ [attr.aria-haspopup]="isNavigable ? undefined : 'dialog'"
11406
+ [attr.aria-expanded]="isNavigable ? undefined : false">
11332
11407
  <kendo-icon-wrapper
11333
11408
  name="filter"
11334
11409
  [svgIcon]="filterIcon"></kendo-icon-wrapper>
@@ -11345,7 +11420,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
11345
11420
  </ng-template>
11346
11421
  `
11347
11422
  }]
11348
- }], ctorParameters: function () { return [{ type: FilterService }, { type: SinglePopupService }, { type: ContextService }, { type: NavigationService }]; }, propDecorators: { column: [{
11423
+ }], ctorParameters: function () {
11424
+ return [{ type: FilterService }, { type: SinglePopupService }, { type: ContextService }, { type: NavigationService }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: IdService, decorators: [{
11425
+ type: Optional
11426
+ }] }];
11427
+ }, propDecorators: { column: [{
11349
11428
  type: Input
11350
11429
  }], filter: [{
11351
11430
  type: Input
@@ -11403,7 +11482,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
11403
11482
  /**
11404
11483
  * @hidden
11405
11484
  */
11406
- const ColunnMenuErrorMessages = {
11485
+ const ColumnMenuErrorMessages = {
11407
11486
  autoSizeColumn: 'The auto size column does not work with enabled virtual columns',
11408
11487
  autoSizeAllColumns: 'The auto size all columns does not work with enabled virtual columns'
11409
11488
  };
@@ -11511,6 +11590,9 @@ class ColumnMenuItemComponent {
11511
11590
  this.collapse = new EventEmitter();
11512
11591
  this.contentState = 'collapsed';
11513
11592
  }
11593
+ ngAfterViewInit() {
11594
+ this.contentTemplate && (this.contentId = `k-${guid()}`);
11595
+ }
11514
11596
  ngOnChanges(changes) {
11515
11597
  if (changes.expanded) {
11516
11598
  this.updateContentState();
@@ -11545,13 +11627,14 @@ ColumnMenuItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0"
11545
11627
  [class.k-selected]="selected"
11546
11628
  [class.k-disabled]="disabled"
11547
11629
  role="button"
11548
- [attr.aria-expanded]="expanded">
11630
+ [attr.aria-expanded]="expanded"
11631
+ [attr.aria-controls]="expanded ? contentId : undefined">
11549
11632
  <kendo-icon-wrapper
11550
11633
  [name]="icon"
11551
11634
  [svgIcon]="svgIcon"></kendo-icon-wrapper>
11552
11635
  {{ text }}
11553
11636
  </div>
11554
- <div *ngIf="contentTemplate" [@state]="contentState" [style.overflow]="'hidden'" class="k-columnmenu-item-content">
11637
+ <div *ngIf="contentTemplate" [attr.id]="contentId" [@state]="contentState" [style.overflow]="'hidden'" class="k-columnmenu-item-content">
11555
11638
  <ng-container [ngTemplateOutlet]="contentTemplate.templateRef">
11556
11639
  </ng-container>
11557
11640
  <div>
@@ -11613,13 +11696,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
11613
11696
  [class.k-selected]="selected"
11614
11697
  [class.k-disabled]="disabled"
11615
11698
  role="button"
11616
- [attr.aria-expanded]="expanded">
11699
+ [attr.aria-expanded]="expanded"
11700
+ [attr.aria-controls]="expanded ? contentId : undefined">
11617
11701
  <kendo-icon-wrapper
11618
11702
  [name]="icon"
11619
11703
  [svgIcon]="svgIcon"></kendo-icon-wrapper>
11620
11704
  {{ text }}
11621
11705
  </div>
11622
- <div *ngIf="contentTemplate" [@state]="contentState" [style.overflow]="'hidden'" class="k-columnmenu-item-content">
11706
+ <div *ngIf="contentTemplate" [attr.id]="contentId" [@state]="contentState" [style.overflow]="'hidden'" class="k-columnmenu-item-content">
11623
11707
  <ng-container [ngTemplateOutlet]="contentTemplate.templateRef">
11624
11708
  </ng-container>
11625
11709
  <div>
@@ -11995,14 +12079,79 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
11995
12079
  type: Input
11996
12080
  }] } });
11997
12081
 
12082
+ /**
12083
+ * @hidden
12084
+ */
12085
+ class ColumnListKeyboardNavigation {
12086
+ constructor(renderer) {
12087
+ this.renderer = renderer;
12088
+ this.activeIndex = 0;
12089
+ }
12090
+ next() {
12091
+ this.toggle(this.activeIndex, false);
12092
+ this.activeIndex = Math.min(this.activeIndex + 1, this.items.length - 1);
12093
+ this.toggle(this.activeIndex, true);
12094
+ }
12095
+ prev() {
12096
+ this.toggle(this.activeIndex, false);
12097
+ this.activeIndex = Math.max(this.activeIndex - 1, 0);
12098
+ this.toggle(this.activeIndex, true);
12099
+ }
12100
+ toggle(index, active) {
12101
+ var _a;
12102
+ const element = (_a = this.items[index]) === null || _a === void 0 ? void 0 : _a.host.nativeElement;
12103
+ element && this.renderer.setAttribute(this.items[index].host.nativeElement, 'tabindex', active ? '0' : '-1');
12104
+ active && element && element.focus();
12105
+ }
12106
+ toggleCheckedState() {
12107
+ this.items[this.activeIndex].host.nativeElement.firstElementChild.click();
12108
+ }
12109
+ }
12110
+ ColumnListKeyboardNavigation.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ColumnListKeyboardNavigation, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Injectable });
12111
+ ColumnListKeyboardNavigation.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ColumnListKeyboardNavigation });
12112
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ColumnListKeyboardNavigation, decorators: [{
12113
+ type: Injectable
12114
+ }], ctorParameters: function () { return [{ type: i0.Renderer2 }]; } });
12115
+
12116
+ /**
12117
+ * @hidden
12118
+ */
12119
+ class ColumnMenuChooserItemCheckedDirective {
12120
+ constructor(host, renderer) {
12121
+ this.host = host;
12122
+ this.renderer = renderer;
12123
+ this.checkedChangeSub = new Subscription();
12124
+ }
12125
+ ngAfterViewInit() {
12126
+ this.checkedChangeSub.add(this.renderer.listen(this.host.nativeElement.firstElementChild, 'change', (e) => {
12127
+ this.kendoColumnMenuChooserItemChecked = e.target.checked;
12128
+ }));
12129
+ }
12130
+ ngOnDestroy() {
12131
+ this.checkedChangeSub.unsubscribe();
12132
+ }
12133
+ }
12134
+ ColumnMenuChooserItemCheckedDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ColumnMenuChooserItemCheckedDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
12135
+ ColumnMenuChooserItemCheckedDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.12", type: ColumnMenuChooserItemCheckedDirective, selector: "[kendoColumnMenuChooserItemChecked]", inputs: { kendoColumnMenuChooserItemChecked: "kendoColumnMenuChooserItemChecked" }, host: { properties: { "attr.aria-checked": "this.kendoColumnMenuChooserItemChecked" } }, ngImport: i0 });
12136
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ColumnMenuChooserItemCheckedDirective, decorators: [{
12137
+ type: Directive,
12138
+ args: [{ selector: '[kendoColumnMenuChooserItemChecked]' }]
12139
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { kendoColumnMenuChooserItemChecked: [{
12140
+ type: HostBinding,
12141
+ args: ['attr.aria-checked']
12142
+ }, {
12143
+ type: Input
12144
+ }] } });
12145
+
11998
12146
  /**
11999
12147
  * @hidden
12000
12148
  */
12001
12149
  class ColumnListComponent {
12002
- constructor(element, ngZone, renderer) {
12150
+ constructor(element, ngZone, renderer, listNavigationService) {
12003
12151
  this.element = element;
12004
12152
  this.ngZone = ngZone;
12005
12153
  this.renderer = renderer;
12154
+ this.listNavigationService = listNavigationService;
12006
12155
  this.reset = new EventEmitter();
12007
12156
  this.apply = new EventEmitter();
12008
12157
  this.columnChange = new EventEmitter();
@@ -12010,10 +12159,28 @@ class ColumnListComponent {
12010
12159
  this.allowHideAll = false;
12011
12160
  this.actionsClass = 'k-actions k-actions-stretched k-actions-horizontal';
12012
12161
  this.unlockedCount = 0;
12162
+ this.domSubscriptions = new Subscription();
12163
+ this.onKeydown = (e) => {
12164
+ if (e.keyCode !== Keys.Tab) {
12165
+ e.preventDefault();
12166
+ }
12167
+ if (e.keyCode === Keys.ArrowDown) {
12168
+ this.listNavigationService.next();
12169
+ }
12170
+ else if (e.keyCode === Keys.ArrowUp) {
12171
+ this.listNavigationService.prev();
12172
+ }
12173
+ else if (e.keyCode === Keys.Space && e.target.classList.contains('k-column-list-item')) {
12174
+ this.listNavigationService.toggleCheckedState();
12175
+ }
12176
+ };
12013
12177
  }
12014
12178
  get className() {
12015
12179
  return true;
12016
12180
  }
12181
+ isChecked(checkbox) {
12182
+ return checkbox.checked;
12183
+ }
12017
12184
  set columns(value) {
12018
12185
  this._columns = value.filter(column => column.includeInChooser !== false);
12019
12186
  this.allColumns = value;
@@ -12031,12 +12198,21 @@ class ColumnListComponent {
12031
12198
  return;
12032
12199
  }
12033
12200
  this.ngZone.runOutsideAngular(() => {
12034
- this.domSubscriptions = this.renderer.listen(this.element.nativeElement, 'click', (e) => {
12035
- if (hasClasses(e.target, 'k-checkbox')) {
12201
+ this.domSubscriptions.add(this.renderer.listen(this.element.nativeElement, 'click', (e) => {
12202
+ const closestItem = e.target.closest('.k-column-list-item');
12203
+ if (closestItem) {
12204
+ const checkbox = closestItem.querySelector('.k-checkbox');
12205
+ const index = parseInt(checkbox.getAttribute('data-index'), 10);
12206
+ if (e.target === checkbox) {
12207
+ closestItem.focus();
12208
+ }
12209
+ else {
12210
+ e.preventDefault();
12211
+ checkbox.checked = !checkbox.checked;
12212
+ }
12036
12213
  if (this.autoSync) {
12037
- const index = parseInt(e.target.getAttribute('data-index'), 10);
12038
12214
  const column = this.columns[index];
12039
- const hidden = !e.target.checked;
12215
+ const hidden = !checkbox.checked;
12040
12216
  if (Boolean(column.hidden) !== hidden) {
12041
12217
  this.ngZone.run(() => {
12042
12218
  column.hidden = hidden;
@@ -12047,10 +12223,20 @@ class ColumnListComponent {
12047
12223
  else {
12048
12224
  this.updateDisabled();
12049
12225
  }
12226
+ if (index !== this.listNavigationService.activeIndex) {
12227
+ this.listNavigationService.toggle(this.listNavigationService.activeIndex, false);
12228
+ this.listNavigationService.activeIndex = index;
12229
+ this.listNavigationService.toggle(index, true);
12230
+ }
12050
12231
  }
12051
- });
12232
+ }));
12233
+ this.domSubscriptions.add(this.renderer.listen(this.element.nativeElement, 'keydown', this.onKeydown));
12052
12234
  });
12053
12235
  }
12236
+ ngAfterViewInit() {
12237
+ this.listNavigationService.items = this.options.toArray();
12238
+ this.listNavigationService.toggle(0, true);
12239
+ }
12054
12240
  ngOnChanges(changes) {
12055
12241
  if (!this.service) {
12056
12242
  return;
@@ -12063,9 +12249,7 @@ class ColumnListComponent {
12063
12249
  }
12064
12250
  }
12065
12251
  ngOnDestroy() {
12066
- if (this.domSubscriptions) {
12067
- this.domSubscriptions();
12068
- }
12252
+ this.domSubscriptions.unsubscribe();
12069
12253
  }
12070
12254
  cancelChanges() {
12071
12255
  this.forEachCheckBox((element, index) => {
@@ -12093,6 +12277,9 @@ class ColumnListComponent {
12093
12277
  if (this.service) {
12094
12278
  this.service.menuTabbingService.firstFocusable.focus();
12095
12279
  }
12280
+ else {
12281
+ this.listNavigationService.toggle(this.listNavigationService.activeIndex, true);
12282
+ }
12096
12283
  }
12097
12284
  }
12098
12285
  forEachCheckBox(callback) {
@@ -12139,35 +12326,94 @@ class ColumnListComponent {
12139
12326
  }
12140
12327
  }
12141
12328
  }
12142
- ColumnListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ColumnListComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
12143
- ColumnListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: ColumnListComponent, selector: "kendo-grid-columnlist", inputs: { columns: "columns", autoSync: "autoSync", allowHideAll: "allowHideAll", applyText: "applyText", resetText: "resetText", actionsClass: "actionsClass", isLast: "isLast", isExpanded: "isExpanded", service: "service" }, outputs: { reset: "reset", apply: "apply", columnChange: "columnChange" }, host: { properties: { "class.k-column-list-wrapper": "this.className" } }, viewQueries: [{ propertyName: "applyButton", first: true, predicate: ["applyButton"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
12144
- <div class="k-column-list">
12145
- <label *ngFor="let column of columns; let index = index;" class='k-column-list-item'>
12146
- <input class="k-checkbox k-checkbox-md k-rounded-md" type="checkbox" [attr.data-index]="index" [checked]="!column.hidden" [disabled]="isDisabled(column)" /><span class="k-checkbox-label">{{ column.displayTitle }}</span>
12329
+ ColumnListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ColumnListComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: ColumnListKeyboardNavigation }], target: i0.ɵɵFactoryTarget.Component });
12330
+ ColumnListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: ColumnListComponent, selector: "kendo-grid-columnlist", inputs: { columns: "columns", autoSync: "autoSync", ariaLabel: "ariaLabel", allowHideAll: "allowHideAll", applyText: "applyText", resetText: "resetText", actionsClass: "actionsClass", isLast: "isLast", isExpanded: "isExpanded", service: "service" }, outputs: { reset: "reset", apply: "apply", columnChange: "columnChange" }, host: { properties: { "class.k-column-list-wrapper": "this.className" } }, providers: [ColumnListKeyboardNavigation], viewQueries: [{ propertyName: "resetButton", first: true, predicate: ["resetButton"], descendants: true }, { propertyName: "applyButton", first: true, predicate: ["applyButton"], descendants: true }, { propertyName: "options", predicate: ColumnMenuChooserItemCheckedDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: `
12331
+ <div
12332
+ class="k-column-list"
12333
+ role="listbox"
12334
+ aria-multiselectable="true"
12335
+ [attr.aria-label]="ariaLabel">
12336
+ <label
12337
+ *ngFor="let column of columns; let index = index;"
12338
+ class='k-column-list-item'
12339
+ [kendoColumnMenuChooserItemChecked]="!column.hidden"
12340
+ role="option">
12341
+ <input
12342
+ class="k-checkbox k-checkbox-md k-rounded-md"
12343
+ type="checkbox"
12344
+ [attr.data-index]="index"
12345
+ [checked]="!column.hidden"
12346
+ tabindex="-1"
12347
+ [attr.aria-hidden]="true"
12348
+ [disabled]="isDisabled(column)" />
12349
+ <span class="k-checkbox-label">{{ column.displayTitle }}</span>
12147
12350
  </label>
12148
12351
  </div>
12149
12352
  <div [ngClass]="actionsClass" *ngIf="!autoSync">
12150
- <button #applyButton type="button" (keydown.tab)="onTab($event)" class="k-button k-button-solid-primary k-button-solid k-button-md k-rounded-md k-button-rectangle" (click)="applyChanges()">{{ applyText }}</button>
12151
- <button type="button" class="k-button k-button-solid-base k-button-solid k-button-md k-rounded-md k-button-rectangle" (click)="cancelChanges()">{{ resetText }}</button>
12353
+ <button
12354
+ #applyButton
12355
+ type="button"
12356
+ class="k-button k-button-solid-primary k-button-solid k-button-md k-rounded-md k-button-rectangle"
12357
+ (click)="applyChanges()"
12358
+ (keydown.enter)="$event.preventDefault(); $event.stopPropagation; applyChanges();"
12359
+ (keydown.space)="$event.preventDefault(); $event.stopPropagation; applyChanges();">{{ applyText }}</button>
12360
+ <button
12361
+ #resetButton
12362
+ type="button"
12363
+ (keydown.tab)="onTab($event)"
12364
+ class="k-button k-button-solid-base k-button-solid k-button-md k-rounded-md k-button-rectangle"
12365
+ (click)="cancelChanges()"
12366
+ (keydown.enter)="$event.preventDefault(); $event.stopPropagation; cancelChanges();"
12367
+ (keydown.space)="$event.preventDefault(); $event.stopPropagation; cancelChanges();">{{ resetText }}</button>
12152
12368
  </div>
12153
- `, isInline: true, directives: [{ type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
12369
+ `, isInline: true, directives: [{ type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: ColumnMenuChooserItemCheckedDirective, selector: "[kendoColumnMenuChooserItemChecked]", inputs: ["kendoColumnMenuChooserItemChecked"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
12154
12370
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ColumnListComponent, decorators: [{
12155
12371
  type: Component,
12156
12372
  args: [{
12157
12373
  selector: 'kendo-grid-columnlist',
12374
+ providers: [ColumnListKeyboardNavigation],
12158
12375
  template: `
12159
- <div class="k-column-list">
12160
- <label *ngFor="let column of columns; let index = index;" class='k-column-list-item'>
12161
- <input class="k-checkbox k-checkbox-md k-rounded-md" type="checkbox" [attr.data-index]="index" [checked]="!column.hidden" [disabled]="isDisabled(column)" /><span class="k-checkbox-label">{{ column.displayTitle }}</span>
12376
+ <div
12377
+ class="k-column-list"
12378
+ role="listbox"
12379
+ aria-multiselectable="true"
12380
+ [attr.aria-label]="ariaLabel">
12381
+ <label
12382
+ *ngFor="let column of columns; let index = index;"
12383
+ class='k-column-list-item'
12384
+ [kendoColumnMenuChooserItemChecked]="!column.hidden"
12385
+ role="option">
12386
+ <input
12387
+ class="k-checkbox k-checkbox-md k-rounded-md"
12388
+ type="checkbox"
12389
+ [attr.data-index]="index"
12390
+ [checked]="!column.hidden"
12391
+ tabindex="-1"
12392
+ [attr.aria-hidden]="true"
12393
+ [disabled]="isDisabled(column)" />
12394
+ <span class="k-checkbox-label">{{ column.displayTitle }}</span>
12162
12395
  </label>
12163
12396
  </div>
12164
12397
  <div [ngClass]="actionsClass" *ngIf="!autoSync">
12165
- <button #applyButton type="button" (keydown.tab)="onTab($event)" class="k-button k-button-solid-primary k-button-solid k-button-md k-rounded-md k-button-rectangle" (click)="applyChanges()">{{ applyText }}</button>
12166
- <button type="button" class="k-button k-button-solid-base k-button-solid k-button-md k-rounded-md k-button-rectangle" (click)="cancelChanges()">{{ resetText }}</button>
12398
+ <button
12399
+ #applyButton
12400
+ type="button"
12401
+ class="k-button k-button-solid-primary k-button-solid k-button-md k-rounded-md k-button-rectangle"
12402
+ (click)="applyChanges()"
12403
+ (keydown.enter)="$event.preventDefault(); $event.stopPropagation; applyChanges();"
12404
+ (keydown.space)="$event.preventDefault(); $event.stopPropagation; applyChanges();">{{ applyText }}</button>
12405
+ <button
12406
+ #resetButton
12407
+ type="button"
12408
+ (keydown.tab)="onTab($event)"
12409
+ class="k-button k-button-solid-base k-button-solid k-button-md k-rounded-md k-button-rectangle"
12410
+ (click)="cancelChanges()"
12411
+ (keydown.enter)="$event.preventDefault(); $event.stopPropagation; cancelChanges();"
12412
+ (keydown.space)="$event.preventDefault(); $event.stopPropagation; cancelChanges();">{{ resetText }}</button>
12167
12413
  </div>
12168
12414
  `
12169
12415
  }]
12170
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.Renderer2 }]; }, propDecorators: { className: [{
12416
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: ColumnListKeyboardNavigation }]; }, propDecorators: { className: [{
12171
12417
  type: HostBinding,
12172
12418
  args: ["class.k-column-list-wrapper"]
12173
12419
  }], reset: [{
@@ -12180,6 +12426,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
12180
12426
  type: Input
12181
12427
  }], autoSync: [{
12182
12428
  type: Input
12429
+ }], ariaLabel: [{
12430
+ type: Input
12183
12431
  }], allowHideAll: [{
12184
12432
  type: Input
12185
12433
  }], applyText: [{
@@ -12194,9 +12442,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
12194
12442
  type: Input
12195
12443
  }], service: [{
12196
12444
  type: Input
12445
+ }], resetButton: [{
12446
+ type: ViewChild,
12447
+ args: ['resetButton', { static: false }]
12197
12448
  }], applyButton: [{
12198
12449
  type: ViewChild,
12199
12450
  args: ['applyButton', { static: false }]
12451
+ }], options: [{
12452
+ type: ViewChildren,
12453
+ args: [ColumnMenuChooserItemCheckedDirective]
12200
12454
  }] } });
12201
12455
 
12202
12456
  /**
@@ -12289,6 +12543,7 @@ ColumnMenuChooserComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0
12289
12543
  <kendo-grid-columnlist
12290
12544
  [applyText]="ctx.localization.get('columnsApply')"
12291
12545
  [resetText]="ctx.localization.get('columnsReset')"
12546
+ [ariaLabel]="ctx.localization.get('columns')"
12292
12547
  [columns]="columns"
12293
12548
  [autoSync]="false"
12294
12549
  [allowHideAll]="false"
@@ -12300,7 +12555,7 @@ ColumnMenuChooserComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0
12300
12555
  </kendo-grid-columnlist>
12301
12556
  </ng-template>
12302
12557
  </kendo-grid-columnmenu-item>
12303
- `, isInline: true, components: [{ type: ColumnMenuItemComponent, selector: "kendo-grid-columnmenu-item", inputs: ["icon", "svgIcon", "text", "selected", "disabled", "expanded"], outputs: ["itemClick", "expand", "collapse"] }, { type: ColumnListComponent, selector: "kendo-grid-columnlist", inputs: ["columns", "autoSync", "allowHideAll", "applyText", "resetText", "actionsClass", "isLast", "isExpanded", "service"], outputs: ["reset", "apply", "columnChange"] }], directives: [{ type: ColumnMenuItemContentTemplateDirective, selector: "[kendoGridColumnMenuItemContentTemplate]" }] });
12558
+ `, isInline: true, components: [{ type: ColumnMenuItemComponent, selector: "kendo-grid-columnmenu-item", inputs: ["icon", "svgIcon", "text", "selected", "disabled", "expanded"], outputs: ["itemClick", "expand", "collapse"] }, { type: ColumnListComponent, selector: "kendo-grid-columnlist", inputs: ["columns", "autoSync", "ariaLabel", "allowHideAll", "applyText", "resetText", "actionsClass", "isLast", "isExpanded", "service"], outputs: ["reset", "apply", "columnChange"] }], directives: [{ type: ColumnMenuItemContentTemplateDirective, selector: "[kendoGridColumnMenuItemContentTemplate]" }] });
12304
12559
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ColumnMenuChooserComponent, decorators: [{
12305
12560
  type: Component,
12306
12561
  args: [{
@@ -12317,6 +12572,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
12317
12572
  <kendo-grid-columnlist
12318
12573
  [applyText]="ctx.localization.get('columnsApply')"
12319
12574
  [resetText]="ctx.localization.get('columnsReset')"
12575
+ [ariaLabel]="ctx.localization.get('columns')"
12320
12576
  [columns]="columns"
12321
12577
  [autoSync]="false"
12322
12578
  [allowHideAll]="false"
@@ -12720,7 +12976,7 @@ class ColumnMenuAutoSizeColumnComponent extends ColumnMenuItemBase {
12720
12976
  ngOnInit() {
12721
12977
  const isVirtualColumns = this.ctx.grid.columnMenuTemplate && this.ctx.grid.virtualColumns;
12722
12978
  if (isVirtualColumns && isDevMode()) {
12723
- console.warn(ColunnMenuErrorMessages.autoSizeColumn);
12979
+ console.warn(ColumnMenuErrorMessages.autoSizeColumn);
12724
12980
  }
12725
12981
  }
12726
12982
  /**
@@ -12787,7 +13043,7 @@ class ColumnMenuAutoSizeAllColumnsComponent extends ColumnMenuItemBase {
12787
13043
  ngOnInit() {
12788
13044
  const isVirtualColumns = this.ctx.grid.columnMenuTemplate && this.ctx.grid.virtualColumns;
12789
13045
  if (isVirtualColumns && isDevMode()) {
12790
- console.warn(ColunnMenuErrorMessages.autoSizeAllColumns);
13046
+ console.warn(ColumnMenuErrorMessages.autoSizeAllColumns);
12791
13047
  }
12792
13048
  }
12793
13049
  /**
@@ -12824,6 +13080,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
12824
13080
  }], ctorParameters: function () { return [{ type: ContextService }]; } });
12825
13081
 
12826
13082
  const POPUP_CLASS = 'k-grid-columnmenu-popup';
13083
+ let id$2 = 0;
13084
+ const getId = (gridId) => `${gridId}-column-menu-${id$2++}`;
12827
13085
  /**
12828
13086
  * Represents the [column menu](slug:columnmenu_grid#toc-customizing-the-position) component.
12829
13087
  *
@@ -12836,7 +13094,7 @@ const POPUP_CLASS = 'k-grid-columnmenu-popup';
12836
13094
  * </kendo-grid>
12837
13095
  */
12838
13096
  class ColumnMenuComponent {
12839
- constructor(navigationService, popupService, service, ctx, renderer, cdr, columnInfoService) {
13097
+ constructor(navigationService, popupService, service, ctx, renderer, cdr, columnInfoService, idService) {
12840
13098
  this.navigationService = navigationService;
12841
13099
  this.popupService = popupService;
12842
13100
  this.service = service;
@@ -12844,6 +13102,7 @@ class ColumnMenuComponent {
12844
13102
  this.renderer = renderer;
12845
13103
  this.cdr = cdr;
12846
13104
  this.columnInfoService = columnInfoService;
13105
+ this.idService = idService;
12847
13106
  /**
12848
13107
  * @hidden
12849
13108
  */
@@ -12889,7 +13148,7 @@ class ColumnMenuComponent {
12889
13148
  */
12890
13149
  this.expandedPosition = false;
12891
13150
  this.moreVerticalIcon = moreVerticalIcon;
12892
- this.closeSubscription = service.closeMenu.subscribe(this.close.bind(this));
13151
+ this.closeSubscription = service.closeMenu.subscribe(this.close.bind(this, true));
12893
13152
  }
12894
13153
  /**
12895
13154
  * @hidden
@@ -12915,6 +13174,12 @@ class ColumnMenuComponent {
12915
13174
  get hasFilter() {
12916
13175
  return hasFilter(this.settings, this.column);
12917
13176
  }
13177
+ /**
13178
+ * @hidden
13179
+ */
13180
+ get isNavigable() {
13181
+ return this.navigationService.tableEnabled;
13182
+ }
12918
13183
  /**
12919
13184
  * @hidden
12920
13185
  */
@@ -12931,7 +13196,7 @@ class ColumnMenuComponent {
12931
13196
  * @hidden
12932
13197
  */
12933
13198
  onApply(changed) {
12934
- this.close();
13199
+ this.close(true);
12935
13200
  if (changed.length) {
12936
13201
  this.cdr.markForCheck();
12937
13202
  this.columnInfoService.changeVisibility(changed);
@@ -12977,11 +13242,11 @@ class ColumnMenuComponent {
12977
13242
  if (this.ctx.grid.virtualColumns && isDevMode()) {
12978
13243
  if (this.settings.autoSizeAllColumns) {
12979
13244
  this.settings.autoSizeAllColumns = false;
12980
- console.warn(ColunnMenuErrorMessages.autoSizeAllColumns);
13245
+ console.warn(ColumnMenuErrorMessages.autoSizeAllColumns);
12981
13246
  }
12982
13247
  if (this.settings.autoSizeColumn) {
12983
13248
  this.settings.autoSizeColumn = false;
12984
- console.warn(ColunnMenuErrorMessages.autoSizeColumn);
13249
+ console.warn(ColumnMenuErrorMessages.autoSizeColumn);
12985
13250
  }
12986
13251
  }
12987
13252
  this.service.menuTabbingService.isTabbedInterface = this.settings.view === 'tabbed' ? true : false;
@@ -13000,7 +13265,7 @@ class ColumnMenuComponent {
13000
13265
  * @hidden
13001
13266
  */
13002
13267
  toggle(e, anchor, template) {
13003
- var _a;
13268
+ var _a, _b;
13004
13269
  if (e) {
13005
13270
  e.preventDefault();
13006
13271
  e.stopImmediatePropagation();
@@ -13009,12 +13274,32 @@ class ColumnMenuComponent {
13009
13274
  this.expandedColumns = this.getExpandedState(this.settings.columnChooser);
13010
13275
  this.expandedPosition = this.getExpandedState(this.settings.setColumnPosition);
13011
13276
  this.popupRef = this.popupService.open(anchor, template, this.popupRef, POPUP_CLASS);
13012
- if (this.popupRef && this.settings.view === 'tabbed') {
13013
- this.renderer.addClass(this.popupRef.popupElement.firstChild, 'k-column-menu-tabbed');
13014
- this.cdr.detectChanges();
13015
- (_a = this.tabStrip) === null || _a === void 0 ? void 0 : _a.selectTab(0);
13277
+ // Needed as changes to 'popupRef' and 'popupId' are not reflected
13278
+ // automatically when the Popup is closed by clicking outside the anchor
13279
+ const ariaRoot = this.isNavigable ? anchor.closest('.k-table-th') : anchor;
13280
+ if (this.popupRef) {
13281
+ this.popupRef.popup.instance.close.pipe(take(1)).subscribe(() => {
13282
+ this.popupRef = null;
13283
+ const ariaRoot = this.isNavigable ? anchor.closest('.k-table-th') : anchor;
13284
+ ariaRoot && this.renderer.removeAttribute(ariaRoot, 'aria-controls');
13285
+ ariaRoot && this.renderer.setAttribute(ariaRoot, 'aria-expanded', 'false');
13286
+ });
13287
+ const popupAriaElement = this.popupRef.popupElement.querySelector('.k-grid-columnmenu-popup');
13288
+ if (popupAriaElement) {
13289
+ const popupId = getId((_a = this.idService) === null || _a === void 0 ? void 0 : _a.gridId());
13290
+ this.renderer.setAttribute(popupAriaElement, 'id', popupId);
13291
+ this.renderer.setAttribute(popupAriaElement, 'role', 'dialog');
13292
+ this.renderer.setAttribute(popupAriaElement, 'aria-label', this.columnMenuTitle);
13293
+ ariaRoot && this.renderer.setAttribute(ariaRoot, 'aria-controls', popupId);
13294
+ ariaRoot && this.renderer.setAttribute(ariaRoot, 'aria-expanded', 'true');
13295
+ }
13296
+ if (this.settings.view === 'tabbed') {
13297
+ this.renderer.addClass(this.popupRef.popupElement.querySelector('.k-grid-columnmenu-popup'), 'k-column-menu-tabbed');
13298
+ this.cdr.detectChanges();
13299
+ (_b = this.tabStrip) === null || _b === void 0 ? void 0 : _b.selectTab(0);
13300
+ }
13016
13301
  }
13017
- if (!this.popupRef) {
13302
+ else {
13018
13303
  if (this.navigationService.tableEnabled) {
13019
13304
  this.navigationService.focusCell(0, this.column.leafIndex);
13020
13305
  }
@@ -13026,9 +13311,13 @@ class ColumnMenuComponent {
13026
13311
  /**
13027
13312
  * @hidden
13028
13313
  */
13029
- close() {
13314
+ close(triggerFocus = false) {
13030
13315
  this.popupService.destroy();
13031
13316
  this.popupRef = null;
13317
+ this.cdr.markForCheck();
13318
+ if (!triggerFocus) {
13319
+ return;
13320
+ }
13032
13321
  if (this.navigationService.tableEnabled) {
13033
13322
  this.navigationService.focusCell(0, this.column.leafIndex);
13034
13323
  }
@@ -13048,7 +13337,7 @@ class ColumnMenuComponent {
13048
13337
  return typeof (menuItemSettings) === 'object' ? menuItemSettings.expanded : false;
13049
13338
  }
13050
13339
  }
13051
- ColumnMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ColumnMenuComponent, deps: [{ token: NavigationService }, { token: SinglePopupService }, { token: ColumnMenuService }, { token: ContextService }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: ColumnInfoService }], target: i0.ɵɵFactoryTarget.Component });
13340
+ ColumnMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ColumnMenuComponent, deps: [{ token: NavigationService }, { token: SinglePopupService }, { token: ColumnMenuService }, { token: ContextService }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: ColumnInfoService }, { token: IdService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
13052
13341
  ColumnMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: ColumnMenuComponent, selector: "kendo-grid-column-menu", inputs: { standalone: "standalone", column: "column", settings: "settings", sort: "sort", filter: "filter", sortable: "sortable", columnMenuTemplate: "columnMenuTemplate", tabIndex: "tabIndex" }, host: { properties: { "class.k-grid-column-menu-standalone": "this.standalone" } }, providers: [
13053
13342
  ColumnMenuService,
13054
13343
  MenuTabbingService
@@ -13060,7 +13349,9 @@ ColumnMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ve
13060
13349
  (keydown.enter)="$event.stopImmediatePropagation()"
13061
13350
  href="#"
13062
13351
  [tabindex]="tabIndex"
13063
- [attr.title]="columnMenuTitle">
13352
+ [attr.title]="columnMenuTitle"
13353
+ [attr.aria-expanded]="isNavigable ? undefined: false"
13354
+ [attr.aria-haspopup]="isNavigable ? undefined : 'dialog'">
13064
13355
  <kendo-icon-wrapper
13065
13356
  name="more-vertical"
13066
13357
  [svgIcon]="moreVerticalIcon"></kendo-icon-wrapper>
@@ -13073,7 +13364,7 @@ ColumnMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ve
13073
13364
  </ng-template>
13074
13365
  <ng-template #defaultTemplate>
13075
13366
  <kendo-grid-columnmenu-container
13076
- (keydown.escape)="close()"
13367
+ (keydown.escape)="close(true)"
13077
13368
  (keydown.enter)="$event.stopImmediatePropagation()">
13078
13369
  <kendo-grid-columnmenu-sort #sortItem [kendoGridColumnMenuItem]="sortItem" *ngIf="hasSort" [service]="service">
13079
13370
  </kendo-grid-columnmenu-sort>
@@ -13125,7 +13416,7 @@ ColumnMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ve
13125
13416
  </kendo-grid-columnmenu-container>
13126
13417
  </ng-template>
13127
13418
  <ng-template #tabbedInterfaceTemplate>
13128
- <kendo-tabstrip #tabstrip (keydown.escape)="close()">
13419
+ <kendo-tabstrip #tabstrip (keydown.escape)="close(true)">
13129
13420
  <kendo-tabstrip-tab *ngIf="hasFilter">
13130
13421
  <ng-template kendoTabTitle>
13131
13422
  <kendo-icon-wrapper
@@ -13212,7 +13503,7 @@ ColumnMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ve
13212
13503
  </kendo-tabstrip-tab>
13213
13504
  </kendo-tabstrip>
13214
13505
  </ng-template>
13215
- `, isInline: true, components: [{ type: i3.IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }, { type: ColumnMenuContainerComponent, selector: "kendo-grid-columnmenu-container" }, { type: ColumnMenuSortComponent, selector: "kendo-grid-columnmenu-sort" }, { type: ColumnMenuLockComponent, selector: "kendo-grid-columnmenu-lock" }, { type: ColumnMenuStickComponent, selector: "kendo-grid-columnmenu-stick" }, { type: ColumnMenuPositionComponent, selector: "kendo-grid-columnmenu-position", inputs: ["expanded", "showLock", "showStick", "isLast"], outputs: ["expand", "collapse"] }, { type: ColumnMenuChooserComponent, selector: "kendo-grid-columnmenu-chooser", inputs: ["expanded", "isLast"], outputs: ["expand", "collapse"] }, { type: ColumnMenuAutoSizeColumnComponent, selector: "kendo-grid-columnmenu-autosize-column", inputs: ["column"] }, { type: ColumnMenuAutoSizeAllColumnsComponent, selector: "kendo-grid-columnmenu-autosize-all-columns" }, { type: ColumnMenuFilterComponent, selector: "kendo-grid-columnmenu-filter", inputs: ["expanded", "isLast"], outputs: ["expand", "collapse"] }, { type: i16.TabStripComponent, selector: "kendo-tabstrip", inputs: ["height", "animate", "tabAlignment", "tabPosition", "keepTabContent", "closable", "scrollable", "closeIcon", "closeIconClass", "closeSVGIcon"], outputs: ["tabSelect", "tabClose", "tabScroll"], exportAs: ["kendoTabStrip"] }, { type: i16.TabStripTabComponent, selector: "kendo-tabstrip-tab", inputs: ["title", "disabled", "cssClass", "cssStyle", "selected", "closable", "closeIcon", "closeIconClass", "closeSVGIcon"], exportAs: ["kendoTabStripTab"] }, { type: FilterMenuContainerComponent, selector: "kendo-grid-filter-menu-container", inputs: ["column", "isLast", "isExpanded", "menuTabbingService", "filter", "actionsClass"], outputs: ["close"] }, { type: ColumnListComponent, selector: "kendo-grid-columnlist", inputs: ["columns", "autoSync", "allowHideAll", "applyText", "resetText", "actionsClass", "isLast", "isExpanded", "service"], outputs: ["reset", "apply", "columnChange"] }], directives: [{ type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: ColumnMenuItemDirective, selector: "[kendoGridColumnMenuItem]", inputs: ["kendoGridColumnMenuItem"] }, { type: i16.TabTitleDirective, selector: "[kendoTabTitle]" }, { type: i16.TabContentDirective, selector: "[kendoTabContent]" }] });
13506
+ `, isInline: true, components: [{ type: i3.IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }, { type: ColumnMenuContainerComponent, selector: "kendo-grid-columnmenu-container" }, { type: ColumnMenuSortComponent, selector: "kendo-grid-columnmenu-sort" }, { type: ColumnMenuLockComponent, selector: "kendo-grid-columnmenu-lock" }, { type: ColumnMenuStickComponent, selector: "kendo-grid-columnmenu-stick" }, { type: ColumnMenuPositionComponent, selector: "kendo-grid-columnmenu-position", inputs: ["expanded", "showLock", "showStick", "isLast"], outputs: ["expand", "collapse"] }, { type: ColumnMenuChooserComponent, selector: "kendo-grid-columnmenu-chooser", inputs: ["expanded", "isLast"], outputs: ["expand", "collapse"] }, { type: ColumnMenuAutoSizeColumnComponent, selector: "kendo-grid-columnmenu-autosize-column", inputs: ["column"] }, { type: ColumnMenuAutoSizeAllColumnsComponent, selector: "kendo-grid-columnmenu-autosize-all-columns" }, { type: ColumnMenuFilterComponent, selector: "kendo-grid-columnmenu-filter", inputs: ["expanded", "isLast"], outputs: ["expand", "collapse"] }, { type: i17.TabStripComponent, selector: "kendo-tabstrip", inputs: ["height", "animate", "tabAlignment", "tabPosition", "keepTabContent", "closable", "scrollable", "closeIcon", "closeIconClass", "closeSVGIcon"], outputs: ["tabSelect", "tabClose", "tabScroll"], exportAs: ["kendoTabStrip"] }, { type: i17.TabStripTabComponent, selector: "kendo-tabstrip-tab", inputs: ["title", "disabled", "cssClass", "cssStyle", "selected", "closable", "closeIcon", "closeIconClass", "closeSVGIcon"], exportAs: ["kendoTabStripTab"] }, { type: FilterMenuContainerComponent, selector: "kendo-grid-filter-menu-container", inputs: ["column", "isLast", "isExpanded", "menuTabbingService", "filter", "actionsClass"], outputs: ["close"] }, { type: ColumnListComponent, selector: "kendo-grid-columnlist", inputs: ["columns", "autoSync", "ariaLabel", "allowHideAll", "applyText", "resetText", "actionsClass", "isLast", "isExpanded", "service"], outputs: ["reset", "apply", "columnChange"] }], directives: [{ type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: ColumnMenuItemDirective, selector: "[kendoGridColumnMenuItem]", inputs: ["kendoGridColumnMenuItem"] }, { type: i17.TabTitleDirective, selector: "[kendoTabTitle]" }, { type: i17.TabContentDirective, selector: "[kendoTabContent]" }] });
13216
13507
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ColumnMenuComponent, decorators: [{
13217
13508
  type: Component,
13218
13509
  args: [{
@@ -13229,7 +13520,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
13229
13520
  (keydown.enter)="$event.stopImmediatePropagation()"
13230
13521
  href="#"
13231
13522
  [tabindex]="tabIndex"
13232
- [attr.title]="columnMenuTitle">
13523
+ [attr.title]="columnMenuTitle"
13524
+ [attr.aria-expanded]="isNavigable ? undefined: false"
13525
+ [attr.aria-haspopup]="isNavigable ? undefined : 'dialog'">
13233
13526
  <kendo-icon-wrapper
13234
13527
  name="more-vertical"
13235
13528
  [svgIcon]="moreVerticalIcon"></kendo-icon-wrapper>
@@ -13242,7 +13535,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
13242
13535
  </ng-template>
13243
13536
  <ng-template #defaultTemplate>
13244
13537
  <kendo-grid-columnmenu-container
13245
- (keydown.escape)="close()"
13538
+ (keydown.escape)="close(true)"
13246
13539
  (keydown.enter)="$event.stopImmediatePropagation()">
13247
13540
  <kendo-grid-columnmenu-sort #sortItem [kendoGridColumnMenuItem]="sortItem" *ngIf="hasSort" [service]="service">
13248
13541
  </kendo-grid-columnmenu-sort>
@@ -13294,7 +13587,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
13294
13587
  </kendo-grid-columnmenu-container>
13295
13588
  </ng-template>
13296
13589
  <ng-template #tabbedInterfaceTemplate>
13297
- <kendo-tabstrip #tabstrip (keydown.escape)="close()">
13590
+ <kendo-tabstrip #tabstrip (keydown.escape)="close(true)">
13298
13591
  <kendo-tabstrip-tab *ngIf="hasFilter">
13299
13592
  <ng-template kendoTabTitle>
13300
13593
  <kendo-icon-wrapper
@@ -13383,7 +13676,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
13383
13676
  </ng-template>
13384
13677
  `
13385
13678
  }]
13386
- }], ctorParameters: function () { return [{ type: NavigationService }, { type: SinglePopupService }, { type: ColumnMenuService }, { type: ContextService }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: ColumnInfoService }]; }, propDecorators: { standalone: [{
13679
+ }], ctorParameters: function () {
13680
+ return [{ type: NavigationService }, { type: SinglePopupService }, { type: ColumnMenuService }, { type: ContextService }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: ColumnInfoService }, { type: IdService, decorators: [{
13681
+ type: Optional
13682
+ }] }];
13683
+ }, propDecorators: { standalone: [{
13387
13684
  type: HostBinding,
13388
13685
  args: ['class.k-grid-column-menu-standalone']
13389
13686
  }, {
@@ -13553,7 +13850,7 @@ FilterCellOperatorsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12
13553
13850
  [size]="size"
13554
13851
  (click)="clearClick()"
13555
13852
  (keydown)="clearKeydown($event)"></button>
13556
- `, isInline: true, components: [{ type: i1$4.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["iconClass", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }, { type: i4$1.ButtonComponent, selector: "button[kendoButton], span[kendoButton], kendo-button", inputs: ["toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "role", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: FocusableDirective, selector: "[kendoGridFocusable],\n [kendoGridEditCommand],\n [kendoGridRemoveCommand],\n [kendoGridSaveCommand],\n [kendoGridCancelCommand],\n [kendoGridSelectionCheckbox]\n ", inputs: ["kendoGridFocusable"] }] });
13853
+ `, isInline: true, components: [{ type: i1$4.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["showStickyHeader", "iconClass", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }, { type: i4$1.ButtonComponent, selector: "button[kendoButton], span[kendoButton], kendo-button", inputs: ["toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "role", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: FocusableDirective, selector: "[kendoGridFocusable],\n [kendoGridEditCommand],\n [kendoGridRemoveCommand],\n [kendoGridSaveCommand],\n [kendoGridCancelCommand],\n [kendoGridSelectionCheckbox]\n ", inputs: ["kendoGridFocusable"] }] });
13557
13854
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: FilterCellOperatorsComponent, decorators: [{
13558
13855
  type: Component,
13559
13856
  args: [{
@@ -13958,7 +14255,7 @@ BooleanFilterCellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0
13958
14255
  [value]="currentFilter?.value">
13959
14256
  </kendo-dropdownlist>
13960
14257
  </kendo-grid-filter-wrapper-cell>
13961
- `, isInline: true, components: [{ type: FilterCellWrapperComponent, selector: "kendo-grid-filter-wrapper-cell", inputs: ["showOperators"] }, { type: i1$4.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["iconClass", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }], directives: [{ type: FilterInputDirective, selector: "[kendoFilterInput]", inputs: ["filterDelay", "columnLabel", "value"] }, { type: FocusableDirective, selector: "[kendoGridFocusable],\n [kendoGridEditCommand],\n [kendoGridRemoveCommand],\n [kendoGridSaveCommand],\n [kendoGridCancelCommand],\n [kendoGridSelectionCheckbox]\n ", inputs: ["kendoGridFocusable"] }] });
14258
+ `, isInline: true, components: [{ type: FilterCellWrapperComponent, selector: "kendo-grid-filter-wrapper-cell", inputs: ["showOperators"] }, { type: i1$4.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["showStickyHeader", "iconClass", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }], directives: [{ type: FilterInputDirective, selector: "[kendoFilterInput]", inputs: ["filterDelay", "columnLabel", "value"] }, { type: FocusableDirective, selector: "[kendoGridFocusable],\n [kendoGridEditCommand],\n [kendoGridRemoveCommand],\n [kendoGridSaveCommand],\n [kendoGridCancelCommand],\n [kendoGridSelectionCheckbox]\n ", inputs: ["kendoGridFocusable"] }] });
13962
14259
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: BooleanFilterCellComponent, decorators: [{
13963
14260
  type: Component,
13964
14261
  args: [{
@@ -14326,7 +14623,7 @@ class LogicalCellDirective {
14326
14623
  this.renderer.addClass(el, 'k-focus');
14327
14624
  }
14328
14625
  if (this.headerLabelText) {
14329
- el.setAttribute('aria-label', '');
14626
+ el.removeAttribute('aria-label');
14330
14627
  }
14331
14628
  }
14332
14629
  else {
@@ -15024,7 +15321,7 @@ const modifierKeys = ['alt', 'ctrl', 'shift', 'meta'];
15024
15321
  * @hidden
15025
15322
  */
15026
15323
  class HeaderComponent {
15027
- constructor(popupService, hint, cue, reorderService, idService, sortService, columnInfoService, cd, contextService) {
15324
+ constructor(popupService, hint, cue, reorderService, idService, sortService, columnInfoService, cd, contextService, navigationService) {
15028
15325
  this.popupService = popupService;
15029
15326
  this.hint = hint;
15030
15327
  this.cue = cue;
@@ -15034,6 +15331,7 @@ class HeaderComponent {
15034
15331
  this.columnInfoService = columnInfoService;
15035
15332
  this.cd = cd;
15036
15333
  this.contextService = contextService;
15334
+ this.navigationService = navigationService;
15037
15335
  this.columns = [];
15038
15336
  this.groups = [];
15039
15337
  this.sort = new Array();
@@ -15168,6 +15466,9 @@ class HeaderComponent {
15168
15466
  return 'descending';
15169
15467
  }
15170
15468
  }
15469
+ get isNavigable() {
15470
+ return this.navigationService.tableEnabled;
15471
+ }
15171
15472
  /**
15172
15473
  *
15173
15474
  * @param column
@@ -15278,7 +15579,7 @@ class HeaderComponent {
15278
15579
  }
15279
15580
  addStickyStyles(column) {
15280
15581
  const stickyStyles = this.columnInfoService.stickyColumnsStyles(column);
15281
- return Object.assign(Object.assign({}, column.style), stickyStyles);
15582
+ return Object.assign(Object.assign({}, column.headerStyle), stickyStyles);
15282
15583
  }
15283
15584
  toggleDirection(field, allowUnsort, initialDirection) {
15284
15585
  const descriptor = this.sortDescriptor(field);
@@ -15395,7 +15696,7 @@ class HeaderComponent {
15395
15696
  });
15396
15697
  }
15397
15698
  }
15398
- HeaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: HeaderComponent, deps: [{ token: SinglePopupService }, { token: DragHintService }, { token: DropCueService }, { token: ColumnReorderService }, { token: IdService }, { token: SortService }, { token: ColumnInfoService }, { token: i0.ChangeDetectorRef }, { token: ContextService }], target: i0.ɵɵFactoryTarget.Component });
15699
+ HeaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: HeaderComponent, deps: [{ token: SinglePopupService }, { token: DragHintService }, { token: DropCueService }, { token: ColumnReorderService }, { token: IdService }, { token: SortService }, { token: ColumnInfoService }, { token: i0.ChangeDetectorRef }, { token: ContextService }, { token: NavigationService }], target: i0.ɵɵFactoryTarget.Component });
15399
15700
  HeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: HeaderComponent, selector: "[kendoGridHeader]", inputs: { totalColumnLevels: "totalColumnLevels", columns: "columns", groups: "groups", detailTemplate: "detailTemplate", scrollable: "scrollable", filterable: "filterable", sort: "sort", filter: "filter", sortable: "sortable", groupable: "groupable", lockedColumnsCount: "lockedColumnsCount", resizable: "resizable", reorderable: "reorderable", columnMenu: "columnMenu", columnMenuTemplate: "columnMenuTemplate", totalColumnsCount: "totalColumnsCount", totalColumns: "totalColumns", tabIndex: "tabIndex", size: "size" }, host: { properties: { "class.k-grid-header": "this.headerClass", "class.k-table-thead": "this.hostClass" } }, viewQueries: [{ propertyName: "dropTargets", predicate: DropTargetDirective, descendants: true }, { propertyName: "filterMenus", predicate: FilterMenuComponent, descendants: true }, { propertyName: "columnMenus", predicate: ColumnMenuComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: `
15400
15701
  <ng-container>
15401
15702
  <tr *ngFor="let i of columnLevels; let levelIndex = index"
@@ -15447,7 +15748,9 @@ HeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", versio
15447
15748
  [ngStyle]="column.sticky ? addStickyStyles(column) : column.headerStyle"
15448
15749
  [attr.rowspan]="column.rowspan(totalColumnLevels)"
15449
15750
  [attr.colspan]="column.colspan"
15450
- [attr.aria-haspopup]="(showFilterMenu || showColumnMenu(column)) ? 'dialog' : undefined">
15751
+ [attr.aria-haspopup]="isNavigable && (showFilterMenu || showColumnMenu(column)) ? 'dialog' : undefined"
15752
+ [attr.aria-expanded]="isNavigable && (showFilterMenu || showColumnMenu(column)) ? false : undefined"
15753
+ [attr.aria-keyshortcuts]="isNavigable ? 'Alt + ArrowDown' : undefined">
15451
15754
 
15452
15755
  <ng-container *ngIf="!isSortable(getColumnComponent(column))">
15453
15756
  <span class="k-cell-inner">
@@ -15669,7 +15972,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
15669
15972
  [ngStyle]="column.sticky ? addStickyStyles(column) : column.headerStyle"
15670
15973
  [attr.rowspan]="column.rowspan(totalColumnLevels)"
15671
15974
  [attr.colspan]="column.colspan"
15672
- [attr.aria-haspopup]="(showFilterMenu || showColumnMenu(column)) ? 'dialog' : undefined">
15975
+ [attr.aria-haspopup]="isNavigable && (showFilterMenu || showColumnMenu(column)) ? 'dialog' : undefined"
15976
+ [attr.aria-expanded]="isNavigable && (showFilterMenu || showColumnMenu(column)) ? false : undefined"
15977
+ [attr.aria-keyshortcuts]="isNavigable ? 'Alt + ArrowDown' : undefined">
15673
15978
 
15674
15979
  <ng-container *ngIf="!isSortable(getColumnComponent(column))">
15675
15980
  <span class="k-cell-inner">
@@ -15837,7 +16142,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
15837
16142
  </ng-container>
15838
16143
  `
15839
16144
  }]
15840
- }], ctorParameters: function () { return [{ type: SinglePopupService }, { type: DragHintService }, { type: DropCueService }, { type: ColumnReorderService }, { type: IdService }, { type: SortService }, { type: ColumnInfoService }, { type: i0.ChangeDetectorRef }, { type: ContextService }]; }, propDecorators: { totalColumnLevels: [{
16145
+ }], ctorParameters: function () { return [{ type: SinglePopupService }, { type: DragHintService }, { type: DropCueService }, { type: ColumnReorderService }, { type: IdService }, { type: SortService }, { type: ColumnInfoService }, { type: i0.ChangeDetectorRef }, { type: ContextService }, { type: NavigationService }]; }, propDecorators: { totalColumnLevels: [{
15841
16146
  type: Input
15842
16147
  }], columns: [{
15843
16148
  type: Input
@@ -18809,7 +19114,7 @@ class FooterComponent {
18809
19114
  }
18810
19115
  addStickyStyles(column) {
18811
19116
  const stickyStyles = this.columnInfoService.stickyColumnsStyles(column);
18812
- return Object.assign(Object.assign({}, column.style), stickyStyles);
19117
+ return Object.assign(Object.assign({}, column.footerStyle), stickyStyles);
18813
19118
  }
18814
19119
  }
18815
19120
  FooterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: FooterComponent, deps: [{ token: ColumnInfoService }], target: i0.ɵɵFactoryTarget.Component });
@@ -22927,7 +23232,16 @@ class ExpandGroupDirective {
22927
23232
  this.expandedGroupKeys.push(key);
22928
23233
  }
22929
23234
  else {
22930
- const index = this.expandedGroupKeys.indexOf(key);
23235
+ const index = this.expandedGroupKeys.findIndex(group => {
23236
+ var _a;
23237
+ if (this.expandGroupBy) {
23238
+ return group === key;
23239
+ }
23240
+ else if (((_a = key.parentGroupKeys) === null || _a === void 0 ? void 0 : _a.length) === 0) {
23241
+ return group.value === key.value;
23242
+ }
23243
+ return JSON.stringify(group) === JSON.stringify(key);
23244
+ });
22931
23245
  this.expandedGroupKeys.splice(index, 1);
22932
23246
  }
22933
23247
  this.expandedGroupKeysChange.emit(this.expandedGroupKeys.slice());
@@ -23045,7 +23359,7 @@ AutoCompleteFilterCellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion:
23045
23359
  [value]="currentFilter?.value">
23046
23360
  </kendo-autocomplete>
23047
23361
  </kendo-grid-filter-wrapper-cell>
23048
- `, isInline: true, components: [{ type: FilterCellWrapperComponent, selector: "kendo-grid-filter-wrapper-cell", inputs: ["showOperators"] }, { type: i1$4.AutoCompleteComponent, selector: "kendo-autocomplete", inputs: ["highlightFirst", "focusableId", "data", "value", "valueField", "placeholder", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "loading", "clearButton", "suggest", "disabled", "itemDisabled", "readonly", "tabindex", "tabIndex", "filterable", "virtual", "size", "rounded", "fillMode"], outputs: ["valueChange", "filterChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoAutoComplete"] }], directives: [{ type: FilterInputDirective, selector: "[kendoFilterInput]", inputs: ["filterDelay", "columnLabel", "value"] }] });
23362
+ `, isInline: true, components: [{ type: FilterCellWrapperComponent, selector: "kendo-grid-filter-wrapper-cell", inputs: ["showOperators"] }, { type: i1$4.AutoCompleteComponent, selector: "kendo-autocomplete", inputs: ["highlightFirst", "showStickyHeader", "focusableId", "data", "value", "valueField", "placeholder", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "loading", "clearButton", "suggest", "disabled", "itemDisabled", "readonly", "tabindex", "tabIndex", "filterable", "virtual", "size", "rounded", "fillMode"], outputs: ["valueChange", "filterChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoAutoComplete"] }], directives: [{ type: FilterInputDirective, selector: "[kendoFilterInput]", inputs: ["filterDelay", "columnLabel", "value"] }] });
23049
23363
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: AutoCompleteFilterCellComponent, decorators: [{
23050
23364
  type: Component,
23051
23365
  args: [{
@@ -24156,6 +24470,7 @@ class ColumnChooserComponent {
24156
24470
  * @hidden
24157
24471
  */
24158
24472
  toggle(anchor, template) {
24473
+ var _a;
24159
24474
  if (!this.popupRef) {
24160
24475
  const direction = this.ctx.localization.rtl ? 'right' : 'left';
24161
24476
  this.popupRef = this.popupService.open({
@@ -24165,13 +24480,30 @@ class ColumnChooserComponent {
24165
24480
  anchorAlign: { vertical: 'bottom', horizontal: direction },
24166
24481
  popupAlign: { vertical: 'top', horizontal: direction }
24167
24482
  });
24168
- this.renderer.setAttribute(this.popupRef.popupElement, 'dir', this.ctx.localization.rtl ? 'rtl' : 'ltr');
24483
+ const popupElement = (_a = this.popupRef) === null || _a === void 0 ? void 0 : _a.popupElement;
24484
+ if (popupElement) {
24485
+ const popupId = `k-${guid()}`;
24486
+ const popupAriaElement = popupElement.querySelector('.k-popup');
24487
+ this.ngZone.runOutsideAngular(() => {
24488
+ this.escapeListener = this.renderer.listen(popupAriaElement, 'keydown', (e) => {
24489
+ if (e.keyCode === Keys.Escape) {
24490
+ this.close(true);
24491
+ }
24492
+ });
24493
+ });
24494
+ this.renderer.setAttribute(popupElement, 'dir', this.ctx.localization.rtl ? 'rtl' : 'ltr');
24495
+ this.renderer.setAttribute(popupAriaElement, 'id', popupId);
24496
+ this.renderer.setAttribute(popupAriaElement, 'role', 'dialog');
24497
+ this.popupId = popupId;
24498
+ }
24169
24499
  if (!isDocumentAvailable()) {
24170
24500
  return;
24171
24501
  }
24172
24502
  this.ngZone.runOutsideAngular(() => this.closeClick = this.renderer.listen('document', 'click', ({ target }) => {
24173
24503
  if (!closest(target, node => node === this.popupRef.popupElement || node === anchor.element)) {
24174
- this.close();
24504
+ this.ngZone.run(() => {
24505
+ this.close();
24506
+ });
24175
24507
  }
24176
24508
  }));
24177
24509
  }
@@ -24183,7 +24515,7 @@ class ColumnChooserComponent {
24183
24515
  * @hidden
24184
24516
  */
24185
24517
  onApply(changed) {
24186
- this.close();
24518
+ this.close(true);
24187
24519
  if (changed.length) {
24188
24520
  this.changeDetector.markForCheck();
24189
24521
  this.columnInfoService.changeVisibility(changed);
@@ -24196,12 +24528,24 @@ class ColumnChooserComponent {
24196
24528
  this.changeDetector.markForCheck();
24197
24529
  this.columnInfoService.changeVisibility(changed);
24198
24530
  }
24199
- close() {
24531
+ /**
24532
+ * @hidden
24533
+ */
24534
+ onShiftTab(e) {
24535
+ if (e.target.matches('.k-column-list-item')) {
24536
+ e.preventDefault();
24537
+ this.columnList.resetButton.nativeElement.focus();
24538
+ }
24539
+ }
24540
+ close(focusAnchor = false) {
24200
24541
  if (this.popupRef) {
24201
24542
  this.popupRef.close();
24202
24543
  this.popupRef = null;
24544
+ this.changeDetector.markForCheck();
24545
+ this.escapeListener && this.escapeListener();
24203
24546
  }
24204
24547
  this.detachClose();
24548
+ focusAnchor && this.anchor.element.focus();
24205
24549
  }
24206
24550
  detachClose() {
24207
24551
  if (this.closeClick) {
@@ -24211,7 +24555,7 @@ class ColumnChooserComponent {
24211
24555
  }
24212
24556
  }
24213
24557
  ColumnChooserComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ColumnChooserComponent, deps: [{ token: ContextService }, { token: ColumnInfoService }, { token: i1$2.PopupService }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
24214
- ColumnChooserComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: ColumnChooserComponent, selector: "kendo-grid-column-chooser", inputs: { autoSync: "autoSync", allowHideAll: "allowHideAll" }, ngImport: i0, template: `
24558
+ ColumnChooserComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: ColumnChooserComponent, selector: "kendo-grid-column-chooser", inputs: { autoSync: "autoSync", allowHideAll: "allowHideAll" }, viewQueries: [{ propertyName: "anchor", first: true, predicate: ["anchor"], descendants: true }, { propertyName: "columnList", first: true, predicate: ["columnList"], descendants: true }], ngImport: i0, template: `
24215
24559
  <button #anchor
24216
24560
  kendoButton
24217
24561
  type="button"
@@ -24219,20 +24563,27 @@ ColumnChooserComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
24219
24563
  fillMode="flat"
24220
24564
  [attr.title]="ctx.localization.get('columns')"
24221
24565
  icon="columns"
24222
- [svgIcon]="columnsIcon"></button>
24566
+ [svgIcon]="columnsIcon"
24567
+ [attr.aria-haspopup]="'dialog'"
24568
+ [attr.aria-expanded]="!!(popupRef)"
24569
+ [attr.aria-controls]="!!(popupRef) ? popupId : undefined"></button>
24223
24570
  <ng-template #template>
24224
24571
  <span class='k-column-chooser-title'>{{ ctx.localization.get('columns') }}</span>
24225
24572
  <kendo-grid-columnlist
24573
+ #columnList
24226
24574
  [columns]="columns"
24575
+ [ariaLabel]="ctx.localization.get('columns')"
24576
+ [isLast]="true"
24227
24577
  [applyText]="ctx.localization.get('columnsApply')"
24228
24578
  [resetText]="ctx.localization.get('columnsReset')"
24229
24579
  [autoSync]="autoSync"
24230
24580
  [allowHideAll]="allowHideAll"
24231
24581
  (apply)="onApply($event)"
24232
- (columnChange)="onChange($event)">
24582
+ (columnChange)="onChange($event)"
24583
+ (keydown.shift.tab)="onShiftTab($event)">
24233
24584
  </kendo-grid-columnlist>
24234
24585
  </ng-template>
24235
- `, isInline: true, components: [{ type: i4$1.ButtonComponent, selector: "button[kendoButton], span[kendoButton], kendo-button", inputs: ["toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "role", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { type: ColumnListComponent, selector: "kendo-grid-columnlist", inputs: ["columns", "autoSync", "allowHideAll", "applyText", "resetText", "actionsClass", "isLast", "isExpanded", "service"], outputs: ["reset", "apply", "columnChange"] }] });
24586
+ `, isInline: true, components: [{ type: i4$1.ButtonComponent, selector: "button[kendoButton], span[kendoButton], kendo-button", inputs: ["toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "role", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { type: ColumnListComponent, selector: "kendo-grid-columnlist", inputs: ["columns", "autoSync", "ariaLabel", "allowHideAll", "applyText", "resetText", "actionsClass", "isLast", "isExpanded", "service"], outputs: ["reset", "apply", "columnChange"] }] });
24236
24587
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ColumnChooserComponent, decorators: [{
24237
24588
  type: Component,
24238
24589
  args: [{
@@ -24245,17 +24596,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
24245
24596
  fillMode="flat"
24246
24597
  [attr.title]="ctx.localization.get('columns')"
24247
24598
  icon="columns"
24248
- [svgIcon]="columnsIcon"></button>
24599
+ [svgIcon]="columnsIcon"
24600
+ [attr.aria-haspopup]="'dialog'"
24601
+ [attr.aria-expanded]="!!(popupRef)"
24602
+ [attr.aria-controls]="!!(popupRef) ? popupId : undefined"></button>
24249
24603
  <ng-template #template>
24250
24604
  <span class='k-column-chooser-title'>{{ ctx.localization.get('columns') }}</span>
24251
24605
  <kendo-grid-columnlist
24606
+ #columnList
24252
24607
  [columns]="columns"
24608
+ [ariaLabel]="ctx.localization.get('columns')"
24609
+ [isLast]="true"
24253
24610
  [applyText]="ctx.localization.get('columnsApply')"
24254
24611
  [resetText]="ctx.localization.get('columnsReset')"
24255
24612
  [autoSync]="autoSync"
24256
24613
  [allowHideAll]="allowHideAll"
24257
24614
  (apply)="onApply($event)"
24258
- (columnChange)="onChange($event)">
24615
+ (columnChange)="onChange($event)"
24616
+ (keydown.shift.tab)="onShiftTab($event)">
24259
24617
  </kendo-grid-columnlist>
24260
24618
  </ng-template>
24261
24619
  `
@@ -24264,9 +24622,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
24264
24622
  type: Input
24265
24623
  }], allowHideAll: [{
24266
24624
  type: Input
24625
+ }], anchor: [{
24626
+ type: ViewChild,
24627
+ args: ['anchor']
24628
+ }], columnList: [{
24629
+ type: ViewChild,
24630
+ args: ['columnList']
24267
24631
  }] } });
24268
24632
 
24269
24633
  const COMPONENTS = [
24634
+ ColumnMenuChooserItemCheckedDirective,
24270
24635
  ColumnListComponent,
24271
24636
  ColumnChooserComponent,
24272
24637
  ColumnMenuChooserComponent,
@@ -24309,7 +24674,8 @@ class ColumnMenuModule {
24309
24674
  }
24310
24675
  }
24311
24676
  ColumnMenuModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ColumnMenuModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
24312
- ColumnMenuModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ColumnMenuModule, declarations: [ColumnListComponent,
24677
+ ColumnMenuModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: ColumnMenuModule, declarations: [ColumnMenuChooserItemCheckedDirective,
24678
+ ColumnListComponent,
24313
24679
  ColumnChooserComponent,
24314
24680
  ColumnMenuChooserComponent,
24315
24681
  ColumnMenuFilterComponent,
@@ -24324,7 +24690,8 @@ ColumnMenuModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", versio
24324
24690
  ColumnMenuStickComponent,
24325
24691
  ColumnMenuPositionComponent,
24326
24692
  ColumnMenuAutoSizeColumnComponent,
24327
- ColumnMenuAutoSizeAllColumnsComponent], imports: [CommonModule, FilterMenuModule, ButtonModule, TabStripModule], exports: [ColumnListComponent,
24693
+ ColumnMenuAutoSizeAllColumnsComponent], imports: [CommonModule, FilterMenuModule, ButtonModule, TabStripModule], exports: [ColumnMenuChooserItemCheckedDirective,
24694
+ ColumnListComponent,
24328
24695
  ColumnChooserComponent,
24329
24696
  ColumnMenuChooserComponent,
24330
24697
  ColumnMenuFilterComponent,