@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.
- package/column-menu/column-chooser-item-checked.directive.d.ts +21 -0
- package/column-menu/column-chooser.component.d.ts +14 -3
- package/column-menu/column-list-kb-nav.service.d.ts +22 -0
- package/column-menu/column-list.component.d.ts +20 -5
- package/column-menu/column-menu-autosize-all.component.d.ts +39 -0
- package/column-menu/column-menu-autosize.component.d.ts +43 -0
- package/column-menu/column-menu-chooser.component.d.ts +16 -4
- package/column-menu/column-menu-container.component.d.ts +21 -0
- package/column-menu/column-menu-expandable-item.interface.d.ts +14 -0
- package/column-menu/column-menu-filter.component.d.ts +16 -3
- package/column-menu/column-menu-item.component.d.ts +11 -3
- package/column-menu/column-menu-item.directive.d.ts +45 -0
- package/column-menu/column-menu-settings.interface.d.ts +11 -2
- package/column-menu/column-menu.component.d.ts +40 -15
- package/column-menu/column-menu.service.d.ts +14 -0
- package/column-menu/utils.d.ts +13 -0
- package/columns/sort-settings.d.ts +12 -0
- package/common/error-messages.d.ts +8 -0
- package/common/id.service.d.ts +3 -0
- package/common/provider.service.d.ts +3 -1
- package/esm2022/column-menu/column-chooser-item-checked.directive.mjs +45 -0
- package/esm2022/column-menu/column-chooser.component.mjs +69 -14
- package/esm2022/column-menu/column-list-kb-nav.service.mjs +40 -0
- package/esm2022/column-menu/column-list.component.mjs +172 -50
- package/esm2022/column-menu/column-menu-autosize-all.component.mjs +79 -0
- package/esm2022/column-menu/column-menu-autosize.component.mjs +87 -0
- package/esm2022/column-menu/column-menu-chooser.component.mjs +44 -12
- package/esm2022/column-menu/column-menu-container.component.mjs +58 -0
- package/esm2022/column-menu/column-menu-expandable-item.interface.mjs +5 -0
- package/esm2022/column-menu/column-menu-filter.component.mjs +58 -25
- package/esm2022/column-menu/column-menu-item-base.mjs +2 -1
- package/esm2022/column-menu/column-menu-item.component.mjs +34 -5
- package/esm2022/column-menu/column-menu-item.directive.mjs +125 -0
- package/esm2022/column-menu/column-menu-lock.component.mjs +1 -1
- package/esm2022/column-menu/column-menu-sort.component.mjs +1 -1
- package/esm2022/column-menu/column-menu.component.mjs +264 -67
- package/esm2022/column-menu/column-menu.service.mjs +18 -2
- package/esm2022/column-menu/utils.mjs +21 -1
- package/esm2022/common/error-messages.mjs +15 -0
- package/esm2022/common/id.service.mjs +9 -0
- package/esm2022/common/provider.service.mjs +7 -3
- package/esm2022/filtering/cell/boolean-filter-cell.component.mjs +5 -2
- package/esm2022/filtering/cell/date-filter-cell.component.mjs +20 -3
- package/esm2022/filtering/cell/numeric-filter-cell.component.mjs +17 -3
- package/esm2022/filtering/filter-row.component.mjs +1 -1
- package/esm2022/filtering/filter.service.mjs +17 -3
- package/esm2022/filtering/menu/boolean-filter-menu.component.mjs +40 -14
- package/esm2022/filtering/menu/date-filter-menu-input.component.mjs +47 -17
- package/esm2022/filtering/menu/date-filter-menu.component.mjs +27 -7
- package/esm2022/filtering/menu/filter-menu-container.component.mjs +83 -31
- package/esm2022/filtering/menu/filter-menu-dropdownlist.directive.mjs +44 -0
- package/esm2022/filtering/menu/filter-menu-host.directive.mjs +6 -1
- package/esm2022/filtering/menu/filter-menu-input-wrapper.component.mjs +52 -9
- package/esm2022/filtering/menu/filter-menu.component.mjs +111 -16
- package/esm2022/filtering/menu/menu-tabbing.service.mjs +22 -0
- package/esm2022/filtering/menu/numeric-filter-menu-input.component.mjs +49 -35
- package/esm2022/filtering/menu/numeric-filter-menu.component.mjs +37 -7
- package/esm2022/filtering/menu/string-filter-menu-input.component.mjs +13 -4
- package/esm2022/filtering/menu/string-filter-menu.component.mjs +27 -8
- package/esm2022/filtering/operators/after-eq-filter-operator.component.mjs +2 -2
- package/esm2022/filtering/operators/after-filter-operator.component.mjs +2 -2
- package/esm2022/filtering/operators/before-eq-filter-operator.component.mjs +2 -2
- package/esm2022/filtering/operators/before-filter-operator.component.mjs +2 -2
- package/esm2022/filtering/operators/contains-filter-operator.component.mjs +1 -1
- package/esm2022/filtering/operators/ends-with-filter-operator.component.mjs +1 -1
- package/esm2022/filtering/operators/eq-filter-operator.component.mjs +1 -1
- package/esm2022/filtering/operators/filter-operator.base.mjs +18 -18
- package/esm2022/filtering/operators/gt-filter-operator.component.mjs +1 -1
- package/esm2022/filtering/operators/gte-filter-operator.component.mjs +1 -1
- package/esm2022/filtering/operators/is-empty-filter-operator.component.mjs +1 -1
- package/esm2022/filtering/operators/is-not-empty-filter-operator.component.mjs +1 -1
- package/esm2022/filtering/operators/is-not-null-filter-operator.component.mjs +1 -1
- package/esm2022/filtering/operators/isnull-filter-operator.component.mjs +1 -1
- package/esm2022/filtering/operators/lt-filter-operator.component.mjs +1 -1
- package/esm2022/filtering/operators/lte-filter-operator.component.mjs +1 -1
- package/esm2022/filtering/operators/neq-filter-operator.component.mjs +1 -1
- package/esm2022/filtering/operators/not-contains-filter-operator.component.mjs +1 -1
- package/esm2022/filtering/operators/starts-with-filter-operator.component.mjs +1 -1
- package/esm2022/localization/messages.mjs +97 -3
- package/esm2022/navigation/logical-cell.directive.mjs +4 -1
- package/esm2022/navigation/navigation.service.mjs +4 -4
- package/esm2022/package-metadata.mjs +2 -2
- package/esm2022/rendering/header/header.component.mjs +336 -178
- package/esm2022/rendering/table-body.component.mjs +1 -1
- package/esm2022/selection/selection.service.mjs +2 -2
- package/esm2022/treelist.component.mjs +73 -9
- package/fesm2022/progress-kendo-angular-treelist.mjs +2231 -628
- package/filtering/cell/date-filter-cell.component.d.ts +4 -0
- package/filtering/cell/numeric-filter-cell.component.d.ts +4 -0
- package/filtering/filter.service.d.ts +10 -1
- package/filtering/menu/boolean-filter-menu.component.d.ts +19 -7
- package/filtering/menu/date-filter-menu-input.component.d.ts +10 -3
- package/filtering/menu/date-filter-menu.component.d.ts +7 -1
- package/filtering/menu/filter-menu-container.component.d.ts +23 -6
- package/filtering/menu/filter-menu-dropdownlist.directive.d.ts +19 -0
- package/filtering/menu/filter-menu-host.directive.d.ts +3 -1
- package/filtering/menu/filter-menu-input-wrapper.component.d.ts +12 -2
- package/filtering/menu/filter-menu.component.d.ts +30 -7
- package/filtering/menu/menu-tabbing.service.d.ts +18 -0
- package/filtering/menu/numeric-filter-menu-input.component.d.ts +12 -26
- package/filtering/menu/numeric-filter-menu.component.d.ts +13 -1
- package/filtering/menu/string-filter-menu-input.component.d.ts +4 -1
- package/filtering/menu/string-filter-menu.component.d.ts +7 -1
- package/index.d.ts +1 -0
- package/localization/messages.d.ts +79 -3
- package/navigation/logical-cell.directive.d.ts +2 -1
- package/package.json +18 -18
- package/rendering/header/header.component.d.ts +43 -10
- 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 "
|
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
|
-
|
61
|
-
|
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: [
|
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
|
-
|
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:
|
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: [
|
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
|
-
|
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
|
-
|
59
|
-
|
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 "
|
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
|
-
|
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
|
-
|
47
|
+
anchor;
|
48
|
+
template;
|
49
|
+
tabIndex = '-1';
|
37
50
|
popupRef;
|
38
|
-
|
51
|
+
popupSubs;
|
52
|
+
constructor(filterService, popupService, ctx, navigationService, renderer, cdr, idService) {
|
39
53
|
this.filterService = filterService;
|
40
54
|
this.popupService = popupService;
|
41
|
-
this.
|
42
|
-
this.
|
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
|
-
|
55
|
-
|
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.
|
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
|
}] } });
|