@progress/kendo-angular-treelist 18.2.1-develop.2 → 18.3.0-develop.1

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 (109) hide show
  1. package/column-menu/column-chooser-item-checked.directive.d.ts +21 -0
  2. package/column-menu/column-chooser.component.d.ts +14 -3
  3. package/column-menu/column-list-kb-nav.service.d.ts +22 -0
  4. package/column-menu/column-list.component.d.ts +20 -5
  5. package/column-menu/column-menu-autosize-all.component.d.ts +39 -0
  6. package/column-menu/column-menu-autosize.component.d.ts +43 -0
  7. package/column-menu/column-menu-chooser.component.d.ts +16 -4
  8. package/column-menu/column-menu-container.component.d.ts +21 -0
  9. package/column-menu/column-menu-expandable-item.interface.d.ts +14 -0
  10. package/column-menu/column-menu-filter.component.d.ts +16 -3
  11. package/column-menu/column-menu-item.component.d.ts +11 -3
  12. package/column-menu/column-menu-item.directive.d.ts +45 -0
  13. package/column-menu/column-menu-settings.interface.d.ts +11 -2
  14. package/column-menu/column-menu.component.d.ts +40 -15
  15. package/column-menu/column-menu.service.d.ts +14 -0
  16. package/column-menu/utils.d.ts +13 -0
  17. package/columns/sort-settings.d.ts +12 -0
  18. package/common/error-messages.d.ts +8 -0
  19. package/common/id.service.d.ts +3 -0
  20. package/common/provider.service.d.ts +3 -1
  21. package/esm2022/column-menu/column-chooser-item-checked.directive.mjs +45 -0
  22. package/esm2022/column-menu/column-chooser.component.mjs +69 -14
  23. package/esm2022/column-menu/column-list-kb-nav.service.mjs +40 -0
  24. package/esm2022/column-menu/column-list.component.mjs +172 -50
  25. package/esm2022/column-menu/column-menu-autosize-all.component.mjs +79 -0
  26. package/esm2022/column-menu/column-menu-autosize.component.mjs +87 -0
  27. package/esm2022/column-menu/column-menu-chooser.component.mjs +44 -12
  28. package/esm2022/column-menu/column-menu-container.component.mjs +58 -0
  29. package/esm2022/column-menu/column-menu-expandable-item.interface.mjs +5 -0
  30. package/esm2022/column-menu/column-menu-filter.component.mjs +58 -25
  31. package/esm2022/column-menu/column-menu-item-base.mjs +2 -1
  32. package/esm2022/column-menu/column-menu-item.component.mjs +34 -5
  33. package/esm2022/column-menu/column-menu-item.directive.mjs +125 -0
  34. package/esm2022/column-menu/column-menu-lock.component.mjs +1 -1
  35. package/esm2022/column-menu/column-menu-sort.component.mjs +1 -1
  36. package/esm2022/column-menu/column-menu.component.mjs +264 -67
  37. package/esm2022/column-menu/column-menu.service.mjs +18 -2
  38. package/esm2022/column-menu/utils.mjs +21 -1
  39. package/esm2022/common/error-messages.mjs +15 -0
  40. package/esm2022/common/id.service.mjs +9 -0
  41. package/esm2022/common/provider.service.mjs +7 -3
  42. package/esm2022/filtering/cell/boolean-filter-cell.component.mjs +5 -2
  43. package/esm2022/filtering/cell/date-filter-cell.component.mjs +20 -3
  44. package/esm2022/filtering/cell/numeric-filter-cell.component.mjs +17 -3
  45. package/esm2022/filtering/filter-row.component.mjs +1 -1
  46. package/esm2022/filtering/filter.service.mjs +17 -3
  47. package/esm2022/filtering/menu/boolean-filter-menu.component.mjs +40 -14
  48. package/esm2022/filtering/menu/date-filter-menu-input.component.mjs +47 -17
  49. package/esm2022/filtering/menu/date-filter-menu.component.mjs +27 -7
  50. package/esm2022/filtering/menu/filter-menu-container.component.mjs +83 -31
  51. package/esm2022/filtering/menu/filter-menu-dropdownlist.directive.mjs +44 -0
  52. package/esm2022/filtering/menu/filter-menu-host.directive.mjs +6 -1
  53. package/esm2022/filtering/menu/filter-menu-input-wrapper.component.mjs +52 -9
  54. package/esm2022/filtering/menu/filter-menu.component.mjs +111 -16
  55. package/esm2022/filtering/menu/menu-tabbing.service.mjs +22 -0
  56. package/esm2022/filtering/menu/numeric-filter-menu-input.component.mjs +49 -35
  57. package/esm2022/filtering/menu/numeric-filter-menu.component.mjs +37 -7
  58. package/esm2022/filtering/menu/string-filter-menu-input.component.mjs +13 -4
  59. package/esm2022/filtering/menu/string-filter-menu.component.mjs +27 -8
  60. package/esm2022/filtering/operators/after-eq-filter-operator.component.mjs +2 -2
  61. package/esm2022/filtering/operators/after-filter-operator.component.mjs +2 -2
  62. package/esm2022/filtering/operators/before-eq-filter-operator.component.mjs +2 -2
  63. package/esm2022/filtering/operators/before-filter-operator.component.mjs +2 -2
  64. package/esm2022/filtering/operators/contains-filter-operator.component.mjs +1 -1
  65. package/esm2022/filtering/operators/ends-with-filter-operator.component.mjs +1 -1
  66. package/esm2022/filtering/operators/eq-filter-operator.component.mjs +1 -1
  67. package/esm2022/filtering/operators/filter-operator.base.mjs +18 -18
  68. package/esm2022/filtering/operators/gt-filter-operator.component.mjs +1 -1
  69. package/esm2022/filtering/operators/gte-filter-operator.component.mjs +1 -1
  70. package/esm2022/filtering/operators/is-empty-filter-operator.component.mjs +1 -1
  71. package/esm2022/filtering/operators/is-not-empty-filter-operator.component.mjs +1 -1
  72. package/esm2022/filtering/operators/is-not-null-filter-operator.component.mjs +1 -1
  73. package/esm2022/filtering/operators/isnull-filter-operator.component.mjs +1 -1
  74. package/esm2022/filtering/operators/lt-filter-operator.component.mjs +1 -1
  75. package/esm2022/filtering/operators/lte-filter-operator.component.mjs +1 -1
  76. package/esm2022/filtering/operators/neq-filter-operator.component.mjs +1 -1
  77. package/esm2022/filtering/operators/not-contains-filter-operator.component.mjs +1 -1
  78. package/esm2022/filtering/operators/starts-with-filter-operator.component.mjs +1 -1
  79. package/esm2022/localization/messages.mjs +97 -3
  80. package/esm2022/navigation/logical-cell.directive.mjs +4 -1
  81. package/esm2022/navigation/navigation.service.mjs +4 -4
  82. package/esm2022/package-metadata.mjs +2 -2
  83. package/esm2022/rendering/header/header.component.mjs +336 -178
  84. package/esm2022/rendering/table-body.component.mjs +1 -1
  85. package/esm2022/selection/selection.service.mjs +2 -2
  86. package/esm2022/treelist.component.mjs +73 -9
  87. package/fesm2022/progress-kendo-angular-treelist.mjs +2231 -628
  88. package/filtering/cell/date-filter-cell.component.d.ts +4 -0
  89. package/filtering/cell/numeric-filter-cell.component.d.ts +4 -0
  90. package/filtering/filter.service.d.ts +10 -1
  91. package/filtering/menu/boolean-filter-menu.component.d.ts +19 -7
  92. package/filtering/menu/date-filter-menu-input.component.d.ts +10 -3
  93. package/filtering/menu/date-filter-menu.component.d.ts +7 -1
  94. package/filtering/menu/filter-menu-container.component.d.ts +23 -6
  95. package/filtering/menu/filter-menu-dropdownlist.directive.d.ts +19 -0
  96. package/filtering/menu/filter-menu-host.directive.d.ts +3 -1
  97. package/filtering/menu/filter-menu-input-wrapper.component.d.ts +12 -2
  98. package/filtering/menu/filter-menu.component.d.ts +30 -7
  99. package/filtering/menu/menu-tabbing.service.d.ts +18 -0
  100. package/filtering/menu/numeric-filter-menu-input.component.d.ts +12 -26
  101. package/filtering/menu/numeric-filter-menu.component.d.ts +13 -1
  102. package/filtering/menu/string-filter-menu-input.component.d.ts +4 -1
  103. package/filtering/menu/string-filter-menu.component.d.ts +7 -1
  104. package/index.d.ts +1 -0
  105. package/localization/messages.d.ts +79 -3
  106. package/navigation/logical-cell.directive.d.ts +2 -1
  107. package/package.json +18 -18
  108. package/rendering/header/header.component.d.ts +43 -10
  109. package/schematics/ngAdd/index.js +3 -3
@@ -2,7 +2,7 @@
2
2
  * Copyright © 2025 Progress Software Corporation. All rights reserved.
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
- import { Component, Input, SkipSelf, Output, EventEmitter, ChangeDetectorRef } from '@angular/core';
5
+ import { Component, Input, SkipSelf, Output, EventEmitter, ChangeDetectorRef, ViewChild, ElementRef } from '@angular/core';
6
6
  import { NgSwitch, NgSwitchCase, NgIf, NgTemplateOutlet, NgClass } from '@angular/common';
7
7
  import { ReactiveFormsModule, FormsModule } from '@angular/forms';
8
8
  import { ColumnComponent } from "../../columns/column.component";
@@ -12,10 +12,12 @@ import { isPresent, isNullOrEmptyString } from "../../utils";
12
12
  import { LocalizationService } from '@progress/kendo-angular-l10n';
13
13
  import { cloneFilters } from '../../common/filter-descriptor-differ';
14
14
  import { FilterMenuHostDirective } from './filter-menu-host.directive';
15
+ import { MenuTabbingService } from './menu-tabbing.service';
15
16
  import * as i0 from "@angular/core";
16
17
  import * as i1 from "../filter.service";
17
18
  import * as i2 from "@progress/kendo-angular-l10n";
18
- import * as i3 from "@angular/forms";
19
+ import * as i3 from "./menu-tabbing.service";
20
+ import * as i4 from "@angular/forms";
19
21
  const isNoValueOperator = operator => (operator === "isnull"
20
22
  || operator === "isnotnull"
21
23
  || operator === "isempty"
@@ -57,9 +59,18 @@ export class FilterMenuContainerComponent {
57
59
  * @type {ColumnComponent}
58
60
  */
59
61
  column;
60
- get filter() {
61
- return this._filter;
62
- }
62
+ /**
63
+ * @hidden
64
+ */
65
+ isLast;
66
+ /**
67
+ * @hidden
68
+ */
69
+ isExpanded;
70
+ /**
71
+ * @hidden
72
+ */
73
+ menuTabbingService;
63
74
  /**
64
75
  * The current root filter.
65
76
  * @type {CompositeFilterDescriptor}
@@ -67,6 +78,9 @@ export class FilterMenuContainerComponent {
67
78
  set filter(value) {
68
79
  this._filter = cloneFilters(value);
69
80
  }
81
+ get filter() {
82
+ return this._filter;
83
+ }
70
84
  /**
71
85
  * @hidden
72
86
  */
@@ -80,24 +94,33 @@ export class FilterMenuContainerComponent {
80
94
  }
81
95
  return this._childFilter;
82
96
  }
97
+ resetButton;
98
+ filterButton;
83
99
  _childFilter;
84
100
  subscription;
85
101
  _templateContext = {};
86
102
  _filter;
87
- constructor(parentService, childService, localization, cd) {
103
+ constructor(parentService, childService, localization, cd, menuTabbingService) {
88
104
  this.parentService = parentService;
89
105
  this.childService = childService;
90
106
  this.localization = localization;
91
107
  this.cd = cd;
108
+ this.menuTabbingService = menuTabbingService;
92
109
  }
93
110
  ngOnInit() {
94
111
  this.subscription = this.childService.changes.subscribe(filter => this._childFilter = filter);
95
112
  this.subscription.add(this.localization.changes.subscribe(() => this.cd.markForCheck()));
96
113
  }
114
+ ngAfterViewChecked() {
115
+ if (!this.menuTabbingService.isColumnMenu || (this.isLast && this.isExpanded)) {
116
+ this.menuTabbingService.lastFocusable = this.resetButton.nativeElement;
117
+ }
118
+ }
97
119
  ngOnDestroy() {
98
120
  if (this.subscription) {
99
121
  this.subscription.unsubscribe();
100
122
  }
123
+ this.menuTabbingService.lastFocusable = undefined;
101
124
  }
102
125
  get disabled() {
103
126
  return !this.childFilter.filters.some(validFilters);
@@ -135,14 +158,28 @@ export class FilterMenuContainerComponent {
135
158
  this.parentService.filter(root);
136
159
  this.close.emit();
137
160
  }
161
+ onTab(e, buttonType) {
162
+ if (this.menuTabbingService.firstFocusable && (!this.menuTabbingService.isColumnMenu || this.isLast)) {
163
+ e.preventDefault();
164
+ if (buttonType === 'reset') {
165
+ this.menuTabbingService.firstFocusable.focus();
166
+ }
167
+ else {
168
+ this.disabled ? this.menuTabbingService.firstFocusable.focus() : this.resetButton.nativeElement.focus();
169
+ }
170
+ }
171
+ }
138
172
  get clearText() {
139
173
  return this.localization.get("filterClearButton");
140
174
  }
141
175
  get filterText() {
142
176
  return this.localization.get("filterFilterButton");
143
177
  }
144
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FilterMenuContainerComponent, deps: [{ token: i1.FilterService, skipSelf: true }, { token: i1.FilterService }, { token: i2.LocalizationService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
145
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FilterMenuContainerComponent, isStandalone: true, selector: "kendo-treelist-filter-menu-container", inputs: { column: "column", filter: "filter", actionsClass: "actionsClass" }, outputs: { close: "close" }, providers: [FilterService], ngImport: i0, template: `
178
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FilterMenuContainerComponent, deps: [{ token: i1.FilterService, skipSelf: true }, { token: i1.FilterService }, { token: i2.LocalizationService }, { token: i0.ChangeDetectorRef }, { token: i3.MenuTabbingService }], target: i0.ɵɵFactoryTarget.Component });
179
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FilterMenuContainerComponent, isStandalone: true, selector: "kendo-treelist-filter-menu-container", inputs: { column: "column", isLast: "isLast", isExpanded: "isExpanded", menuTabbingService: "menuTabbingService", filter: "filter", actionsClass: "actionsClass" }, outputs: { close: "close" }, providers: [
180
+ FilterService,
181
+ MenuTabbingService
182
+ ], viewQueries: [{ propertyName: "resetButton", first: true, predicate: ["resetButton"], descendants: true }, { propertyName: "filterButton", first: true, predicate: ["filterButton"], descendants: true }], ngImport: i0, template: `
146
183
  <form (submit)="submit()" (reset)="reset()"
147
184
  class="k-filter-menu">
148
185
  <div class="k-filter-menu-container">
@@ -152,7 +189,8 @@ export class FilterMenuContainerComponent {
152
189
  kendoFilterMenuHost
153
190
  [filterService]="childService"
154
191
  [column]="column"
155
- [filter]="childFilter">
192
+ [filter]="childFilter"
193
+ [menuTabbingService]="menuTabbingService">
156
194
  </ng-container>
157
195
  </ng-container>
158
196
  <ng-container *ngSwitchCase="true">
@@ -165,26 +203,28 @@ export class FilterMenuContainerComponent {
165
203
  </ng-container>
166
204
  </ng-container>
167
205
  <div [ngClass]="actionsClass">
168
- <button
169
- type="reset"
170
- class="k-button k-button-solid-base k-button-solid k-button-md k-rounded-md k-button-rectangle">
171
- {{clearText}}
172
- </button>
173
- <button
206
+ <button #filterButton
174
207
  type="submit"
175
208
  class="k-button k-button-solid-primary k-button-solid k-button-md k-rounded-md k-button-rectangle"
176
- [disabled]="disabled">
177
- {{filterText}}
178
- </button>
209
+ [disabled]="disabled"
210
+ (keydown.tab)="onTab($event, 'filter')">{{filterText}}</button>
211
+ <button
212
+ #resetButton
213
+ type="reset"
214
+ class="k-button k-button-solid-base k-button-solid k-button-md k-rounded-md k-button-rectangle"
215
+ (keydown.tab)="onTab($event, 'reset')">{{clearText}}</button>
179
216
  </div>
180
217
  </div>
181
218
  </form>
182
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: FilterMenuHostDirective, selector: "[kendoFilterMenuHost]", inputs: ["filterService"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
219
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: FilterMenuHostDirective, selector: "[kendoFilterMenuHost]", inputs: ["filterService", "menuTabbingService"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
183
220
  }
184
221
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FilterMenuContainerComponent, decorators: [{
185
222
  type: Component,
186
223
  args: [{
187
- providers: [FilterService],
224
+ providers: [
225
+ FilterService,
226
+ MenuTabbingService
227
+ ],
188
228
  selector: 'kendo-treelist-filter-menu-container',
189
229
  template: `
190
230
  <form (submit)="submit()" (reset)="reset()"
@@ -196,7 +236,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
196
236
  kendoFilterMenuHost
197
237
  [filterService]="childService"
198
238
  [column]="column"
199
- [filter]="childFilter">
239
+ [filter]="childFilter"
240
+ [menuTabbingService]="menuTabbingService">
200
241
  </ng-container>
201
242
  </ng-container>
202
243
  <ng-container *ngSwitchCase="true">
@@ -209,17 +250,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
209
250
  </ng-container>
210
251
  </ng-container>
211
252
  <div [ngClass]="actionsClass">
212
- <button
213
- type="reset"
214
- class="k-button k-button-solid-base k-button-solid k-button-md k-rounded-md k-button-rectangle">
215
- {{clearText}}
216
- </button>
217
- <button
253
+ <button #filterButton
218
254
  type="submit"
219
255
  class="k-button k-button-solid-primary k-button-solid k-button-md k-rounded-md k-button-rectangle"
220
- [disabled]="disabled">
221
- {{filterText}}
222
- </button>
256
+ [disabled]="disabled"
257
+ (keydown.tab)="onTab($event, 'filter')">{{filterText}}</button>
258
+ <button
259
+ #resetButton
260
+ type="reset"
261
+ class="k-button k-button-solid-base k-button-solid k-button-md k-rounded-md k-button-rectangle"
262
+ (keydown.tab)="onTab($event, 'reset')">{{clearText}}</button>
223
263
  </div>
224
264
  </div>
225
265
  </form>
@@ -229,12 +269,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
229
269
  }]
230
270
  }], ctorParameters: function () { return [{ type: i1.FilterService, decorators: [{
231
271
  type: SkipSelf
232
- }] }, { type: i1.FilterService }, { type: i2.LocalizationService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { close: [{
272
+ }] }, { type: i1.FilterService }, { type: i2.LocalizationService }, { type: i0.ChangeDetectorRef }, { type: i3.MenuTabbingService }]; }, propDecorators: { close: [{
233
273
  type: Output
234
274
  }], column: [{
235
275
  type: Input
276
+ }], isLast: [{
277
+ type: Input
278
+ }], isExpanded: [{
279
+ type: Input
280
+ }], menuTabbingService: [{
281
+ type: Input
236
282
  }], filter: [{
237
283
  type: Input
238
284
  }], actionsClass: [{
239
285
  type: Input
286
+ }], resetButton: [{
287
+ type: ViewChild,
288
+ args: ['resetButton', { static: false }]
289
+ }], filterButton: [{
290
+ type: ViewChild,
291
+ args: ['filterButton', { static: false }]
240
292
  }] } });
@@ -0,0 +1,44 @@
1
+ /**-----------------------------------------------------------------------------------------
2
+ * Copyright © 2025 Progress Software Corporation. All rights reserved.
3
+ * Licensed under commercial license. See LICENSE.md in the project root for more information
4
+ *-------------------------------------------------------------------------------------------*/
5
+ import { DropDownListComponent } from '@progress/kendo-angular-dropdowns';
6
+ import { Directive, Input } from '@angular/core';
7
+ import { Keys } from '@progress/kendo-angular-common';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@progress/kendo-angular-dropdowns";
10
+ /**
11
+ * @hidden
12
+ */
13
+ export class FilterMenuDropDownListDirective {
14
+ host;
15
+ filterMenuDropDownLabel;
16
+ constructor(host) {
17
+ this.host = host;
18
+ }
19
+ ngAfterViewInit() {
20
+ const wrapperElement = this.host.wrapper.nativeElement;
21
+ wrapperElement.setAttribute('aria-label', this.filterMenuDropDownLabel);
22
+ wrapperElement.addEventListener('keydown', this.keydownHandler, true);
23
+ }
24
+ ngOnDestroy() {
25
+ this.host.wrapper.nativeElement.removeEventListener('keydown', this.keydownHandler);
26
+ }
27
+ keydownHandler = (e) => {
28
+ if (e.keyCode === Keys.Escape && this.host.isOpen) {
29
+ e.stopPropagation();
30
+ this.host.toggle(false);
31
+ }
32
+ };
33
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FilterMenuDropDownListDirective, deps: [{ token: i1.DropDownListComponent }], target: i0.ɵɵFactoryTarget.Directive });
34
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: FilterMenuDropDownListDirective, isStandalone: true, selector: "[kendoFilterMenuDropDown]", inputs: { filterMenuDropDownLabel: "filterMenuDropDownLabel" }, ngImport: i0 });
35
+ }
36
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FilterMenuDropDownListDirective, decorators: [{
37
+ type: Directive,
38
+ args: [{
39
+ selector: '[kendoFilterMenuDropDown]',
40
+ standalone: true
41
+ }]
42
+ }], ctorParameters: function () { return [{ type: i1.DropDownListComponent }]; }, propDecorators: { filterMenuDropDownLabel: [{
43
+ type: Input
44
+ }] } });
@@ -8,12 +8,14 @@ import { isNullOrEmptyString, isPresent } from "../../utils";
8
8
  import { filterMenuComponentFactory } from "./filter-menu-component.factory";
9
9
  import { StringFilterMenuComponent } from "./string-filter-menu.component";
10
10
  import { FilterService } from "../filter.service";
11
+ import { MenuTabbingService } from "./menu-tabbing.service";
11
12
  import * as i0 from "@angular/core";
12
13
  /**
13
14
  * @hidden
14
15
  */
15
16
  export class FilterMenuHostDirective extends FilterHostDirective {
16
17
  filterService;
18
+ menuTabbingService;
17
19
  constructor(host, resolver) {
18
20
  super(host, resolver);
19
21
  }
@@ -26,9 +28,10 @@ export class FilterMenuHostDirective extends FilterHostDirective {
26
28
  initComponent(ctx) {
27
29
  super.initComponent(ctx);
28
30
  this.component.instance.filterService = this.filterService;
31
+ this.component.instance.menuTabbingService = this.menuTabbingService;
29
32
  }
30
33
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FilterMenuHostDirective, deps: [{ token: i0.ViewContainerRef }, { token: i0.ComponentFactoryResolver }], target: i0.ɵɵFactoryTarget.Directive });
31
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: FilterMenuHostDirective, isStandalone: true, selector: "[kendoFilterMenuHost]", inputs: { filterService: "filterService" }, usesInheritance: true, ngImport: i0 });
34
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: FilterMenuHostDirective, isStandalone: true, selector: "[kendoFilterMenuHost]", inputs: { filterService: "filterService", menuTabbingService: "menuTabbingService" }, usesInheritance: true, ngImport: i0 });
32
35
  }
33
36
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FilterMenuHostDirective, decorators: [{
34
37
  type: Directive,
@@ -38,4 +41,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
38
41
  }]
39
42
  }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.ComponentFactoryResolver }]; }, propDecorators: { filterService: [{
40
43
  type: Input
44
+ }], menuTabbingService: [{
45
+ type: Input
41
46
  }] } });
@@ -2,16 +2,25 @@
2
2
  * Copyright © 2025 Progress Software Corporation. All rights reserved.
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
- import { Component, Input } from '@angular/core';
5
+ import { Component, Input, ViewChild } from '@angular/core';
6
6
  import { DropDownListComponent } from '@progress/kendo-angular-dropdowns';
7
7
  import { FilterService } from '../filter.service';
8
8
  import { FilterInputWrapperComponent } from "../filter-input-wrapper.component";
9
+ import { MenuTabbingService } from './menu-tabbing.service';
10
+ import { FilterMenuDropDownListDirective } from './filter-menu-dropdownlist.directive';
11
+ import { replaceMessagePlaceholder } from '../../utils';
12
+ import { ContextService } from '../../common/provider.service';
9
13
  import * as i0 from "@angular/core";
14
+ import * as i1 from "../../common/provider.service";
10
15
  /**
11
16
  * @hidden
12
17
  */
13
18
  export class FilterMenuInputWrapperComponent extends FilterInputWrapperComponent {
19
+ ctx;
14
20
  filterService;
21
+ isFirstDropDown;
22
+ menuTabbingService;
23
+ firstOperatorDropDown;
15
24
  _currentFilter;
16
25
  /**
17
26
  * @hidden
@@ -19,8 +28,17 @@ export class FilterMenuInputWrapperComponent extends FilterInputWrapperComponent
19
28
  get hostClasses() {
20
29
  return false;
21
30
  }
22
- constructor() {
31
+ constructor(ctx) {
23
32
  super(null);
33
+ this.ctx = ctx;
34
+ }
35
+ ngAfterViewInit() {
36
+ const shouldFocusFirstFocusable = this.isFirstDropDown && this.filterService?.menuTabbingService;
37
+ const isTabbedInterface = this.menuTabbingService?.isTabbedInterface;
38
+ if (shouldFocusFirstFocusable && !isTabbedInterface) {
39
+ this.filterService.menuTabbingService.firstFocusable = this.firstOperatorDropDown;
40
+ this.firstOperatorDropDown.focus();
41
+ }
24
42
  }
25
43
  operatorChange(dataItem) {
26
44
  this.currentOperator = dataItem;
@@ -55,18 +73,33 @@ export class FilterMenuInputWrapperComponent extends FilterInputWrapperComponent
55
73
  value: value
56
74
  }));
57
75
  }
58
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FilterMenuInputWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
59
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FilterMenuInputWrapperComponent, isStandalone: true, selector: "kendo-treelist-filter-menu-input-wrapper", inputs: { filterService: "filterService", currentFilter: "currentFilter" }, usesInheritance: true, ngImport: i0, template: `
76
+ onShiftTab(e) {
77
+ e.stopImmediatePropagation();
78
+ if (!this.menuTabbingService?.isColumnMenu && this.isFirstDropDown && this.filterService.menuTabbingService.lastFocusable) {
79
+ e.preventDefault();
80
+ this.filterService.menuTabbingService.lastFocusable.focus();
81
+ }
82
+ }
83
+ get filterMenuDropDownLabel() {
84
+ const localizationMsg = this.ctx.localization.get('filterMenuOperatorsDropDownLabel') || '';
85
+ const columnName = this.column ? this.column.title || this.column.field : '';
86
+ return replaceMessagePlaceholder(localizationMsg, 'columnName', columnName);
87
+ }
88
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FilterMenuInputWrapperComponent, deps: [{ token: i1.ContextService }], target: i0.ɵɵFactoryTarget.Component });
89
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FilterMenuInputWrapperComponent, isStandalone: true, selector: "kendo-treelist-filter-menu-input-wrapper", inputs: { filterService: "filterService", isFirstDropDown: "isFirstDropDown", menuTabbingService: "menuTabbingService", currentFilter: "currentFilter" }, viewQueries: [{ propertyName: "firstOperatorDropDown", first: true, predicate: DropDownListComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: `
60
90
  <kendo-dropdownlist
91
+ kendoFilterMenuDropDown
92
+ [filterMenuDropDownLabel]="filterMenuDropDownLabel"
61
93
  [data]="operators"
62
94
  (valueChange)="operatorChange($event)"
63
95
  [value]="currentOperator"
64
96
  [valuePrimitive]="true"
65
97
  textField="text"
66
- valueField="value">
98
+ valueField="value"
99
+ (keydown.shift.tab)="onShiftTab($event)">
67
100
  </kendo-dropdownlist>
68
101
  <ng-content></ng-content>
69
- `, isInline: true, dependencies: [{ kind: "component", type: DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["customIconClass", "showStickyHeader", "icon", "svgIcon", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "leftRightArrowsNavigation", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }] });
102
+ `, isInline: true, dependencies: [{ kind: "component", type: DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["customIconClass", "showStickyHeader", "icon", "svgIcon", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "leftRightArrowsNavigation", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }, { kind: "directive", type: FilterMenuDropDownListDirective, selector: "[kendoFilterMenuDropDown]", inputs: ["filterMenuDropDownLabel"] }] });
70
103
  }
71
104
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FilterMenuInputWrapperComponent, decorators: [{
72
105
  type: Component,
@@ -74,20 +107,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
74
107
  selector: 'kendo-treelist-filter-menu-input-wrapper',
75
108
  template: `
76
109
  <kendo-dropdownlist
110
+ kendoFilterMenuDropDown
111
+ [filterMenuDropDownLabel]="filterMenuDropDownLabel"
77
112
  [data]="operators"
78
113
  (valueChange)="operatorChange($event)"
79
114
  [value]="currentOperator"
80
115
  [valuePrimitive]="true"
81
116
  textField="text"
82
- valueField="value">
117
+ valueField="value"
118
+ (keydown.shift.tab)="onShiftTab($event)">
83
119
  </kendo-dropdownlist>
84
120
  <ng-content></ng-content>
85
121
  `,
86
122
  standalone: true,
87
- imports: [DropDownListComponent]
123
+ imports: [DropDownListComponent, FilterMenuDropDownListDirective]
88
124
  }]
89
- }], ctorParameters: function () { return []; }, propDecorators: { filterService: [{
125
+ }], ctorParameters: function () { return [{ type: i1.ContextService }]; }, propDecorators: { filterService: [{
126
+ type: Input
127
+ }], isFirstDropDown: [{
128
+ type: Input
129
+ }], menuTabbingService: [{
90
130
  type: Input
131
+ }], firstOperatorDropDown: [{
132
+ type: ViewChild,
133
+ args: [DropDownListComponent, { static: false }]
91
134
  }], currentFilter: [{
92
135
  type: Input
93
136
  }] } });
@@ -2,8 +2,7 @@
2
2
  * Copyright © 2025 Progress Software Corporation. All rights reserved.
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
- import { Component, Input } from '@angular/core';
6
- import { LocalizationService } from "@progress/kendo-angular-l10n";
5
+ import { ChangeDetectorRef, Component, ElementRef, Input, Optional, Renderer2, TemplateRef, ViewChild } from '@angular/core';
7
6
  import { filterIcon } from '@progress/kendo-svg-icons';
8
7
  import { IconWrapperComponent } from '@progress/kendo-angular-icons';
9
8
  import { FilterService } from "../filter.service";
@@ -11,17 +10,29 @@ import { ColumnComponent } from '../../columns/column.component';
11
10
  import { SinglePopupService } from '../../common/single-popup.service';
12
11
  import { filtersByField } from '../base-filter-cell.component';
13
12
  import { FilterMenuContainerComponent } from './filter-menu-container.component';
13
+ import { ContextService } from '../../common/provider.service';
14
+ import { NavigationService } from '../../navigation/navigation.service';
15
+ import { IdService } from '../../common/id.service';
16
+ import { replaceMessagePlaceholder } from '../../utils';
14
17
  import * as i0 from "@angular/core";
15
18
  import * as i1 from "../filter.service";
16
19
  import * as i2 from "../../common/single-popup.service";
17
- import * as i3 from "@progress/kendo-angular-l10n";
20
+ import * as i3 from "../../common/provider.service";
21
+ import * as i4 from "../../navigation/navigation.service";
22
+ import * as i5 from "../../common/id.service";
23
+ let id = 0;
24
+ const getId = (gridId) => `${gridId}-filter-menu-${id++}`;
18
25
  /**
19
26
  * @hidden
20
27
  */
21
28
  export class FilterMenuComponent {
22
29
  filterService;
23
30
  popupService;
24
- localization;
31
+ ctx;
32
+ navigationService;
33
+ renderer;
34
+ cdr;
35
+ idService;
25
36
  filterIcon = filterIcon;
26
37
  /**
27
38
  * The column with which the filter is associated.
@@ -33,32 +44,100 @@ export class FilterMenuComponent {
33
44
  * @type {CompositeFilterDescriptor}
34
45
  */
35
46
  filter;
36
- filterLabel;
47
+ anchor;
48
+ template;
49
+ tabIndex = '-1';
37
50
  popupRef;
38
- constructor(filterService, popupService, localization) {
51
+ popupSubs;
52
+ constructor(filterService, popupService, ctx, navigationService, renderer, cdr, idService) {
39
53
  this.filterService = filterService;
40
54
  this.popupService = popupService;
41
- this.localization = localization;
42
- this.filterLabel = this.localization.get('filter');
55
+ this.ctx = ctx;
56
+ this.navigationService = navigationService;
57
+ this.renderer = renderer;
58
+ this.cdr = cdr;
59
+ this.idService = idService;
60
+ }
61
+ ngOnDestroy() {
62
+ this.cleanUp();
43
63
  }
44
64
  get hasFilters() {
45
65
  return filtersByField(this.filter, (this.column || {}).field).length > 0;
46
66
  }
67
+ /**
68
+ * @hidden
69
+ */
70
+ get filterLabel() {
71
+ const localizationMsg = this.ctx.localization.get('filterMenuTitle') || '';
72
+ const columnName = this.column.title || this.column.field;
73
+ return replaceMessagePlaceholder(localizationMsg, 'columnName', columnName);
74
+ }
75
+ /**
76
+ * @hidden
77
+ */
78
+ get isNavigable() {
79
+ return this.navigationService.enabled;
80
+ }
47
81
  toggle(anchor, template) {
48
82
  this.popupRef = this.popupService.open(anchor, template, this.popupRef);
83
+ // Needed as changes to 'popupRef' are not reflected
84
+ // automatically when the Popup is closed by clicking outside the anchor
85
+ const ariaRoot = this.isNavigable ? anchor.closest('.k-table-th') : anchor;
86
+ if (this.popupRef) {
87
+ this.popupSubs?.unsubscribe();
88
+ this.popupSubs = this.popupRef.popup.instance.anchorViewportLeave.subscribe(() => {
89
+ this.close();
90
+ this.updateAria(ariaRoot);
91
+ });
92
+ this.popupSubs.add(() => this.popupRef.popup.instance.close.subscribe(() => {
93
+ this.popupRef = null;
94
+ this.updateAria(ariaRoot);
95
+ }));
96
+ const popupAriaElement = this.popupRef.popupElement.querySelector('.k-grid-filter-popup');
97
+ if (popupAriaElement) {
98
+ const popupId = getId(this.idService?.gridId());
99
+ this.renderer.setAttribute(popupAriaElement, 'id', popupId);
100
+ this.renderer.setAttribute(popupAriaElement, 'role', 'dialog');
101
+ this.renderer.setAttribute(popupAriaElement, 'aria-label', this.filterLabel);
102
+ ariaRoot && this.renderer.setAttribute(ariaRoot, 'aria-controls', popupId);
103
+ ariaRoot && this.renderer.setAttribute(ariaRoot, 'aria-expanded', 'true');
104
+ }
105
+ }
106
+ else {
107
+ this.focusRoot();
108
+ }
49
109
  return false;
50
110
  }
51
111
  close() {
112
+ this.cleanUp();
113
+ this.focusRoot();
114
+ }
115
+ updateAria(ariaRoot) {
116
+ ariaRoot && this.renderer.removeAttribute(ariaRoot, 'aria-controls');
117
+ ariaRoot && this.renderer.setAttribute(ariaRoot, 'aria-expanded', 'false');
118
+ }
119
+ cleanUp() {
52
120
  this.popupService.destroy();
121
+ this.popupRef = null;
122
+ this.popupSubs?.unsubscribe();
123
+ this.popupSubs = null;
124
+ this.cdr.markForCheck();
53
125
  }
54
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FilterMenuComponent, deps: [{ token: i1.FilterService }, { token: i2.SinglePopupService }, { token: i3.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
55
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FilterMenuComponent, isStandalone: true, selector: "kendo-treelist-filter-menu", inputs: { column: "column", filter: "filter" }, ngImport: i0, template: `
126
+ focusRoot() {
127
+ this.isNavigable ? this.navigationService.focusCell(0, this.column.leafIndex) : this.anchor.nativeElement.focus();
128
+ }
129
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FilterMenuComponent, deps: [{ token: i1.FilterService }, { token: i2.SinglePopupService }, { token: i3.ContextService }, { token: i4.NavigationService }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i5.IdService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
130
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FilterMenuComponent, isStandalone: true, selector: "kendo-treelist-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: `
56
131
  <a #anchor
57
132
  class="k-grid-filter-menu k-grid-header-menu"
58
133
  [class.k-active]="hasFilters"
134
+ [tabindex]="tabIndex"
59
135
  (click)="toggle(anchor, template)"
136
+ (keydown.enter)="$event.stopImmediatePropagation()"
60
137
  href="#"
61
- [attr.title]="filterLabel">
138
+ [attr.title]="filterLabel"
139
+ [attr.aria-haspopup]="isNavigable ? undefined : 'dialog'"
140
+ [attr.aria-expanded]="isNavigable ? undefined : false">
62
141
  <kendo-icon-wrapper
63
142
  name="filter"
64
143
  [svgIcon]="filterIcon"></kendo-icon-wrapper>
@@ -68,10 +147,11 @@ export class FilterMenuComponent {
68
147
  [column]="column"
69
148
  [filter]="filter"
70
149
  (close)="close()"
71
- >
150
+ (keydown.escape)="close()"
151
+ (keydown.enter)="$event.stopImmediatePropagation()">
72
152
  </kendo-treelist-filter-menu-container>
73
153
  </ng-template>
74
- `, isInline: true, dependencies: [{ kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }, { kind: "component", type: FilterMenuContainerComponent, selector: "kendo-treelist-filter-menu-container", inputs: ["column", "filter", "actionsClass"], outputs: ["close"] }] });
154
+ `, isInline: true, dependencies: [{ kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }, { kind: "component", type: FilterMenuContainerComponent, selector: "kendo-treelist-filter-menu-container", inputs: ["column", "isLast", "isExpanded", "menuTabbingService", "filter", "actionsClass"], outputs: ["close"] }] });
75
155
  }
76
156
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FilterMenuComponent, decorators: [{
77
157
  type: Component,
@@ -81,9 +161,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
81
161
  <a #anchor
82
162
  class="k-grid-filter-menu k-grid-header-menu"
83
163
  [class.k-active]="hasFilters"
164
+ [tabindex]="tabIndex"
84
165
  (click)="toggle(anchor, template)"
166
+ (keydown.enter)="$event.stopImmediatePropagation()"
85
167
  href="#"
86
- [attr.title]="filterLabel">
168
+ [attr.title]="filterLabel"
169
+ [attr.aria-haspopup]="isNavigable ? undefined : 'dialog'"
170
+ [attr.aria-expanded]="isNavigable ? undefined : false">
87
171
  <kendo-icon-wrapper
88
172
  name="filter"
89
173
  [svgIcon]="filterIcon"></kendo-icon-wrapper>
@@ -93,15 +177,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
93
177
  [column]="column"
94
178
  [filter]="filter"
95
179
  (close)="close()"
96
- >
180
+ (keydown.escape)="close()"
181
+ (keydown.enter)="$event.stopImmediatePropagation()">
97
182
  </kendo-treelist-filter-menu-container>
98
183
  </ng-template>
99
184
  `,
100
185
  standalone: true,
101
186
  imports: [IconWrapperComponent, FilterMenuContainerComponent]
102
187
  }]
103
- }], ctorParameters: function () { return [{ type: i1.FilterService }, { type: i2.SinglePopupService }, { type: i3.LocalizationService }]; }, propDecorators: { column: [{
188
+ }], ctorParameters: function () { return [{ type: i1.FilterService }, { type: i2.SinglePopupService }, { type: i3.ContextService }, { type: i4.NavigationService }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i5.IdService, decorators: [{
189
+ type: Optional
190
+ }] }]; }, propDecorators: { column: [{
104
191
  type: Input
105
192
  }], filter: [{
106
193
  type: Input
194
+ }], anchor: [{
195
+ type: ViewChild,
196
+ args: ['anchor', { static: true }]
197
+ }], template: [{
198
+ type: ViewChild,
199
+ args: ['template', { static: true, read: TemplateRef }]
200
+ }], tabIndex: [{
201
+ type: Input
107
202
  }] } });