@progress/kendo-angular-filter 24.0.0-develop.9 → 24.0.1-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/directives.d.ts CHANGED
@@ -5,8 +5,10 @@
5
5
  import { FilterFieldComponent } from "./filter-field.component";
6
6
  import { FilterComponent } from "./filter.component";
7
7
  import { CustomMessagesComponent } from "./localization/custom-messages.component";
8
- import { FilterValueEditorTemplateDirective } from "./templates/value-editor.template";
8
+ import { FilterValueEditorTemplateDirective } from "./templates/value-editor-template.directive";
9
+ import { FilterOperatorTemplateDirective } from "./templates/operator-template.directive";
10
+ import { FilterFieldsTemplateDirective } from "./templates/field-template.directive";
9
11
  /**
10
12
  * Utility array that contains all `@progress/kendo-angular-filter` related components and directives
11
13
  */
12
- export declare const KENDO_FILTER: readonly [typeof FilterComponent, typeof FilterFieldComponent, typeof CustomMessagesComponent, typeof FilterValueEditorTemplateDirective];
14
+ export declare const KENDO_FILTER: readonly [typeof FilterComponent, typeof FilterFieldComponent, typeof CustomMessagesComponent, typeof FilterValueEditorTemplateDirective, typeof FilterOperatorTemplateDirective, typeof FilterFieldsTemplateDirective];
@@ -7,13 +7,13 @@ import { Injectable, Directive, ContentChild, Input, Component, EventEmitter, Ou
7
7
  import * as i1 from '@progress/kendo-angular-l10n';
8
8
  import { ComponentMessages, LocalizationService, L10N_PREFIX } from '@progress/kendo-angular-l10n';
9
9
  import { validatePackage } from '@progress/kendo-licensing';
10
- import { Keys, TemplateContextDirective, normalizeKeys, ResizeBatchService } from '@progress/kendo-angular-common';
10
+ import { Keys, normalizeKeys, ResizeBatchService } from '@progress/kendo-angular-common';
11
11
  import { xIcon, filterAddGroupIcon, filterAddExpressionIcon } from '@progress/kendo-svg-icons';
12
12
  import { ButtonComponent } from '@progress/kendo-angular-buttons';
13
13
  import { DatePickerComponent, DatePickerCustomMessagesComponent, CalendarDOMService, CenturyViewService, DecadeViewService, MonthViewService, YearViewService, TimePickerDOMService, HoursService, MinutesService, SecondsService, MillisecondsService, DayPeriodService } from '@progress/kendo-angular-dateinputs';
14
14
  import { DropDownListComponent, ValueTemplateDirective, ItemTemplateDirective } from '@progress/kendo-angular-dropdowns';
15
15
  import { NumericTextBoxComponent, NumericTextBoxCustomMessagesComponent, TextBoxComponent } from '@progress/kendo-angular-inputs';
16
- import { NgClass } from '@angular/common';
16
+ import { NgTemplateOutlet, NgClass } from '@angular/common';
17
17
  import { IconsService } from '@progress/kendo-angular-icons';
18
18
  import { PopupService } from '@progress/kendo-angular-popup';
19
19
  import { DialogContainerService, DialogService, WindowService, WindowContainerService, NavigationService as NavigationService$1 } from '@progress/kendo-angular-dialog';
@@ -24,6 +24,7 @@ import { DialogContainerService, DialogService, WindowService, WindowContainerSe
24
24
  class FilterService {
25
25
  normalizedValue = { logic: 'and', filters: [] };
26
26
  filters = [];
27
+ fieldTemplate = null;
27
28
  addFilterGroup(item) {
28
29
  const filterGroup = { logic: 'and', filters: [] };
29
30
  item.filters.push(filterGroup);
@@ -231,8 +232,8 @@ const packageMetadata = {
231
232
  productName: 'Kendo UI for Angular',
232
233
  productCode: 'KENDOUIANGULAR',
233
234
  productCodes: ['KENDOUIANGULAR'],
234
- publishDate: 1777365405,
235
- version: '24.0.0-develop.9',
235
+ publishDate: 1779368695,
236
+ version: '24.0.1-develop.1',
236
237
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/'
237
238
  };
238
239
 
@@ -263,6 +264,48 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
263
264
  }]
264
265
  }], ctorParameters: () => [{ type: i0.TemplateRef }] });
265
266
 
267
+ /**
268
+ * Replaces the default operator DropDownList in the Filter component with a custom template.
269
+ * Apply it to an `ng-template` inside a `kendo-filter-field` element.
270
+ *
271
+ * The template context provides the following field:
272
+ *
273
+ * - `let-filter`—The [filter descriptor](slug:api_kendo-data-query_filterdescriptor) for the current row. Set its `operator` property when the user selects a new operator.
274
+ *
275
+ * @example
276
+ * ```html
277
+ * <kendo-filter>
278
+ * <kendo-filter-field field="name" editor="string">
279
+ * <ng-template kendoFilterOperatorTemplate let-filter>
280
+ * <kendo-combobox
281
+ * [data]="customOperators"
282
+ * textField="text"
283
+ * valueField="value"
284
+ * [valuePrimitive]="true"
285
+ * [value]="filter.operator"
286
+ * (valueChange)="filter.operator = $event">
287
+ * </kendo-combobox>
288
+ * </ng-template>
289
+ * </kendo-filter-field>
290
+ * </kendo-filter>
291
+ * ```
292
+ */
293
+ class FilterOperatorTemplateDirective {
294
+ templateRef;
295
+ constructor(templateRef) {
296
+ this.templateRef = templateRef;
297
+ }
298
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: FilterOperatorTemplateDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
299
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.20", type: FilterOperatorTemplateDirective, isStandalone: true, selector: "[kendoFilterOperatorTemplate]", ngImport: i0 });
300
+ }
301
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: FilterOperatorTemplateDirective, decorators: [{
302
+ type: Directive,
303
+ args: [{
304
+ selector: '[kendoFilterOperatorTemplate]',
305
+ standalone: true
306
+ }]
307
+ }], ctorParameters: () => [{ type: i0.TemplateRef }] });
308
+
266
309
  /**
267
310
  * Represents the [Kendo UI Filter Field component for Angular](https://www.telerik.com/kendo-angular-ui/components/filter/api/filterfieldcomponent).
268
311
  * Used to declare filter expressions for the Filter component.
@@ -340,8 +383,12 @@ class FilterFieldComponent {
340
383
  * @hidden
341
384
  */
342
385
  editorTemplate;
386
+ /**
387
+ * @hidden
388
+ */
389
+ operatorTemplate;
343
390
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: FilterFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
344
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: FilterFieldComponent, isStandalone: true, selector: "kendo-filter-field", inputs: { field: "field", title: "title", editor: "editor", operators: "operators", editorFormat: "editorFormat" }, queries: [{ propertyName: "editorTemplate", first: true, predicate: FilterValueEditorTemplateDirective, descendants: true }], ngImport: i0, template: ``, isInline: true });
391
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: FilterFieldComponent, isStandalone: true, selector: "kendo-filter-field", inputs: { field: "field", title: "title", editor: "editor", operators: "operators", editorFormat: "editorFormat" }, queries: [{ propertyName: "editorTemplate", first: true, predicate: FilterValueEditorTemplateDirective, descendants: true }, { propertyName: "operatorTemplate", first: true, predicate: FilterOperatorTemplateDirective, descendants: true }], ngImport: i0, template: ``, isInline: true });
345
392
  }
346
393
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: FilterFieldComponent, decorators: [{
347
394
  type: Component,
@@ -363,6 +410,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
363
410
  }], editorTemplate: [{
364
411
  type: ContentChild,
365
412
  args: [FilterValueEditorTemplateDirective]
413
+ }], operatorTemplate: [{
414
+ type: ContentChild,
415
+ args: [FilterOperatorTemplateDirective]
366
416
  }] } });
367
417
 
368
418
  /**
@@ -901,6 +951,7 @@ class FilterExpressionOperatorsComponent {
901
951
  editorType;
902
952
  valueChange = new EventEmitter();
903
953
  operators = [];
954
+ operatorTemplate;
904
955
  constructor(localization) {
905
956
  this.localization = localization;
906
957
  }
@@ -914,53 +965,67 @@ class FilterExpressionOperatorsComponent {
914
965
  this.valueChange.emit(value);
915
966
  }
916
967
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: FilterExpressionOperatorsComponent, deps: [{ token: i1.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
917
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.20", type: FilterExpressionOperatorsComponent, isStandalone: true, selector: "kendo-filter-expression-operators", inputs: { currentItem: "currentItem", editorType: "editorType", operators: "operators" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: `
918
- <kendo-dropdownlist
919
- [tabindex]="-1"
920
- [kendoAriaLabelValue]="messageFor('filterOperatorAriaLabel')"
921
- [data]="operators"
922
- [title]="messageFor('filterExpressionOperators')"
923
- [(value)]="currentItem.operator"
924
- (valueChange)="operatorValueChange($event)"
925
- [valuePrimitive]="true"
926
- textField="text"
927
- valueField="value"
928
- >
929
- <ng-template kendoDropDownListValueTemplate let-dataItem>
930
- <span>{{ getOperator(dataItem.value) }}</span>
931
- </ng-template>
932
- <ng-template kendoDropDownListItemTemplate let-dataItem>
933
- <span>{{ getOperator(dataItem.value) }}</span>
934
- </ng-template>
935
- </kendo-dropdownlist>
936
- `, isInline: true, dependencies: [{ kind: "component", type: DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["customIconClass", "showStickyHeader", "icon", "svgIcon", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "adaptiveTitle", "adaptiveSubtitle", "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: AriaLabelValueDirective, selector: "[kendoAriaLabelValue]", inputs: ["kendoAriaLabelValue"] }, { kind: "directive", type: ValueTemplateDirective, selector: "[kendoDropDownListValueTemplate],[kendoDropDownTreeValueTemplate]" }, { kind: "directive", type: ItemTemplateDirective, selector: "[kendoDropDownListItemTemplate],[kendoComboBoxItemTemplate],[kendoAutoCompleteItemTemplate],[kendoMultiSelectItemTemplate]" }] });
968
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.20", type: FilterExpressionOperatorsComponent, isStandalone: true, selector: "kendo-filter-expression-operators", inputs: { currentItem: "currentItem", editorType: "editorType", operators: "operators", operatorTemplate: "operatorTemplate" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: `
969
+ @if (operatorTemplate) {
970
+ <ng-container
971
+ [ngTemplateOutlet]="operatorTemplate"
972
+ [ngTemplateOutletContext]="{$implicit: currentItem}">
973
+ </ng-container>
974
+ } @else {
975
+ <kendo-dropdownlist
976
+ [tabindex]="-1"
977
+ [kendoAriaLabelValue]="messageFor('filterOperatorAriaLabel')"
978
+ [data]="operators"
979
+ [title]="messageFor('filterExpressionOperators')"
980
+ [(value)]="currentItem.operator"
981
+ (valueChange)="operatorValueChange($event)"
982
+ [valuePrimitive]="true"
983
+ textField="text"
984
+ valueField="value"
985
+ >
986
+ <ng-template kendoDropDownListValueTemplate let-dataItem>
987
+ <span>{{ getOperator(dataItem.value) }}</span>
988
+ </ng-template>
989
+ <ng-template kendoDropDownListItemTemplate let-dataItem>
990
+ <span>{{ getOperator(dataItem.value) }}</span>
991
+ </ng-template>
992
+ </kendo-dropdownlist>
993
+ }
994
+ `, isInline: true, dependencies: [{ kind: "component", type: DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["customIconClass", "showStickyHeader", "icon", "svgIcon", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "adaptiveTitle", "adaptiveSubtitle", "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: AriaLabelValueDirective, selector: "[kendoAriaLabelValue]", inputs: ["kendoAriaLabelValue"] }, { kind: "directive", type: ValueTemplateDirective, selector: "[kendoDropDownListValueTemplate],[kendoDropDownTreeValueTemplate]" }, { kind: "directive", type: ItemTemplateDirective, selector: "[kendoDropDownListItemTemplate],[kendoComboBoxItemTemplate],[kendoAutoCompleteItemTemplate],[kendoMultiSelectItemTemplate]" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
937
995
  }
938
996
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: FilterExpressionOperatorsComponent, decorators: [{
939
997
  type: Component,
940
998
  args: [{
941
999
  selector: "kendo-filter-expression-operators",
942
1000
  template: `
943
- <kendo-dropdownlist
944
- [tabindex]="-1"
945
- [kendoAriaLabelValue]="messageFor('filterOperatorAriaLabel')"
946
- [data]="operators"
947
- [title]="messageFor('filterExpressionOperators')"
948
- [(value)]="currentItem.operator"
949
- (valueChange)="operatorValueChange($event)"
950
- [valuePrimitive]="true"
951
- textField="text"
952
- valueField="value"
953
- >
954
- <ng-template kendoDropDownListValueTemplate let-dataItem>
955
- <span>{{ getOperator(dataItem.value) }}</span>
956
- </ng-template>
957
- <ng-template kendoDropDownListItemTemplate let-dataItem>
958
- <span>{{ getOperator(dataItem.value) }}</span>
959
- </ng-template>
960
- </kendo-dropdownlist>
1001
+ @if (operatorTemplate) {
1002
+ <ng-container
1003
+ [ngTemplateOutlet]="operatorTemplate"
1004
+ [ngTemplateOutletContext]="{$implicit: currentItem}">
1005
+ </ng-container>
1006
+ } @else {
1007
+ <kendo-dropdownlist
1008
+ [tabindex]="-1"
1009
+ [kendoAriaLabelValue]="messageFor('filterOperatorAriaLabel')"
1010
+ [data]="operators"
1011
+ [title]="messageFor('filterExpressionOperators')"
1012
+ [(value)]="currentItem.operator"
1013
+ (valueChange)="operatorValueChange($event)"
1014
+ [valuePrimitive]="true"
1015
+ textField="text"
1016
+ valueField="value"
1017
+ >
1018
+ <ng-template kendoDropDownListValueTemplate let-dataItem>
1019
+ <span>{{ getOperator(dataItem.value) }}</span>
1020
+ </ng-template>
1021
+ <ng-template kendoDropDownListItemTemplate let-dataItem>
1022
+ <span>{{ getOperator(dataItem.value) }}</span>
1023
+ </ng-template>
1024
+ </kendo-dropdownlist>
1025
+ }
961
1026
  `,
962
1027
  standalone: true,
963
- imports: [DropDownListComponent, AriaLabelValueDirective, ValueTemplateDirective, ItemTemplateDirective]
1028
+ imports: [DropDownListComponent, AriaLabelValueDirective, ValueTemplateDirective, ItemTemplateDirective, NgTemplateOutlet]
964
1029
  }]
965
1030
  }], ctorParameters: () => [{ type: i1.LocalizationService }], propDecorators: { currentItem: [{
966
1031
  type: Input
@@ -970,6 +1035,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
970
1035
  type: Output
971
1036
  }], operators: [{
972
1037
  type: Input
1038
+ }], operatorTemplate: [{
1039
+ type: Input
973
1040
  }] } });
974
1041
 
975
1042
  /**
@@ -988,7 +1055,15 @@ class FilterExpressionComponent extends BaseFilterRowComponent {
988
1055
  editorType;
989
1056
  isEditorDisabled = false;
990
1057
  editorTemplate;
1058
+ operatorTemplate;
991
1059
  editorFormat;
1060
+ get availableFilters() {
1061
+ return this.filterService.filters || [];
1062
+ }
1063
+ _previousField;
1064
+ get fieldTemplate() {
1065
+ return this.filterService.fieldTemplate;
1066
+ }
992
1067
  get currentFilterExpression() {
993
1068
  return this.getFilterExpressionByField(this.currentItem.field);
994
1069
  }
@@ -1032,7 +1107,21 @@ class FilterExpressionComponent extends BaseFilterRowComponent {
1032
1107
  super(element, navigationService, localization, renderer);
1033
1108
  this.filterService = filterService;
1034
1109
  }
1110
+ ngDoCheck() {
1111
+ if (this.fieldTemplate && this.currentItem.field !== this._previousField) {
1112
+ if (!this.currentItem.field) {
1113
+ this.currentItem.field = this._previousField;
1114
+ return;
1115
+ }
1116
+ const previousField = this._previousField;
1117
+ this._previousField = this.currentItem.field;
1118
+ if (previousField !== undefined) {
1119
+ this.filterValueChange(this.currentItem.field);
1120
+ }
1121
+ }
1122
+ }
1035
1123
  ngOnInit() {
1124
+ this._previousField = this.currentItem.field;
1036
1125
  this.isEditorDisabled = nullOperators.indexOf(this.currentItem.operator) >= 0;
1037
1126
  const foundFilter = this.getFilterExpressionByField(this.currentItem.field);
1038
1127
  if (this.currentItem.field) {
@@ -1049,7 +1138,7 @@ class FilterExpressionComponent extends BaseFilterRowComponent {
1049
1138
  }
1050
1139
  this.setOperators(defaultFilter);
1051
1140
  }
1052
- this.setEditorTemplate();
1141
+ this.setTemplates();
1053
1142
  }
1054
1143
  normalizeOperators(filterEditor, operators) {
1055
1144
  const result = [];
@@ -1075,7 +1164,7 @@ class FilterExpressionComponent extends BaseFilterRowComponent {
1075
1164
  this.navigationService.currentToolbarItemChildrenIndex = 0;
1076
1165
  this.currentItem.value = null;
1077
1166
  this.currentItem.field = value;
1078
- this.setEditorTemplate();
1167
+ this.setTemplates();
1079
1168
  const foundFilter = this.getFilterExpressionByField(this.currentItem.field);
1080
1169
  this.setOperators(foundFilter);
1081
1170
  this.editorFormat = foundFilter.editorFormat;
@@ -1097,9 +1186,6 @@ class FilterExpressionComponent extends BaseFilterRowComponent {
1097
1186
  const filterExpression = this.filterService.filters.find((filterExpression) => filterExpression.field === this.currentItem.field);
1098
1187
  return filterExpression?.editor;
1099
1188
  }
1100
- getFilters() {
1101
- return this.filterService.filters || [];
1102
- }
1103
1189
  removeFilterExpression() {
1104
1190
  this.filterService.remove(this.currentItem, this.index);
1105
1191
  this.valueChange.emit(true);
@@ -1116,6 +1202,9 @@ class FilterExpressionComponent extends BaseFilterRowComponent {
1116
1202
  else {
1117
1203
  this.operators = this.getDefaultOperators(filter.editor);
1118
1204
  }
1205
+ if (filter.operatorTemplate) {
1206
+ return;
1207
+ }
1119
1208
  if (!this.currentItem.operator) {
1120
1209
  this.currentItem.operator = this.operators[0].value;
1121
1210
  }
@@ -1136,9 +1225,10 @@ class FilterExpressionComponent extends BaseFilterRowComponent {
1136
1225
  this.isEditorDisabled = false;
1137
1226
  }
1138
1227
  }
1139
- setEditorTemplate() {
1228
+ setTemplates() {
1140
1229
  const filterExpression = this.filterService.filters.find((filter) => filter.field === this.currentItem.field);
1141
1230
  this.editorTemplate = filterExpression?.editorTemplate;
1231
+ this.operatorTemplate = filterExpression?.operatorTemplate;
1142
1232
  }
1143
1233
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: FilterExpressionComponent, deps: [{ token: FilterService }, { token: i0.ElementRef }, { token: NavigationService }, { token: i1.LocalizationService }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
1144
1234
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.20", type: FilterExpressionComponent, isStandalone: true, selector: "kendo-filter-expression", inputs: { currentItem: "currentItem" }, providers: [{
@@ -1148,17 +1238,24 @@ class FilterExpressionComponent extends BaseFilterRowComponent {
1148
1238
  <div class="k-filter-toolbar">
1149
1239
  <div class="k-toolbar k-toolbar-md k-toolbar-solid" role="toolbar" [attr.aria-label]="messageFor('filterToolbarAriaLabel')" (mousedown)="onMouseDown($event)">
1150
1240
  <div class="k-filter-field k-toolbar-item" >
1151
- <kendo-dropdownlist
1152
- [tabindex]="-1"
1153
- [kendoAriaLabelValue]="messageFor('filterFieldAriaLabel')"
1154
- [title]="messageFor('filterExpressionFilters')"
1155
- [data]="getFilters()"
1156
- textField="title"
1157
- valueField="field"
1158
- [value]="currentItem.field"
1159
- [valuePrimitive]="true"
1160
- (valueChange)="filterValueChange($event)">
1161
- </kendo-dropdownlist>
1241
+ @if (fieldTemplate) {
1242
+ <ng-container
1243
+ [ngTemplateOutlet]="fieldTemplate"
1244
+ [ngTemplateOutletContext]="{$implicit: currentItem, filters: availableFilters}">
1245
+ </ng-container>
1246
+ } @else {
1247
+ <kendo-dropdownlist
1248
+ [tabindex]="-1"
1249
+ [kendoAriaLabelValue]="messageFor('filterFieldAriaLabel')"
1250
+ [title]="messageFor('filterExpressionFilters')"
1251
+ [data]="availableFilters"
1252
+ textField="title"
1253
+ valueField="field"
1254
+ [value]="currentItem.field"
1255
+ [valuePrimitive]="true"
1256
+ (valueChange)="filterValueChange($event)">
1257
+ </kendo-dropdownlist>
1258
+ }
1162
1259
  </div>
1163
1260
  @if (!isBoolean) {
1164
1261
  <div class="k-filter-operator k-toolbar-item" >
@@ -1166,6 +1263,7 @@ class FilterExpressionComponent extends BaseFilterRowComponent {
1166
1263
  [currentItem]="currentItem"
1167
1264
  [operators]="operators"
1168
1265
  [editorType]="getEditorType()"
1266
+ [operatorTemplate]="operatorTemplate"
1169
1267
  (valueChange)="onOperatorChange($event);">
1170
1268
  </kendo-filter-expression-operators>
1171
1269
  </div>
@@ -1189,9 +1287,10 @@ class FilterExpressionComponent extends BaseFilterRowComponent {
1189
1287
  }
1190
1288
  }
1191
1289
  @if (editorTemplate) {
1192
- <ng-template
1193
- [templateContext]="{templateRef: editorTemplate, $implicit: currentItem}">
1194
- </ng-template>
1290
+ <ng-container
1291
+ [ngTemplateOutlet]="editorTemplate"
1292
+ [ngTemplateOutletContext]="{$implicit: currentItem}">
1293
+ </ng-container>
1195
1294
  }
1196
1295
  </div>
1197
1296
 
@@ -1207,7 +1306,7 @@ class FilterExpressionComponent extends BaseFilterRowComponent {
1207
1306
  </button>
1208
1307
  </div>
1209
1308
  </div>
1210
- `, isInline: true, dependencies: [{ kind: "component", type: DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["customIconClass", "showStickyHeader", "icon", "svgIcon", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "adaptiveTitle", "adaptiveSubtitle", "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: AriaLabelValueDirective, selector: "[kendoAriaLabelValue]", inputs: ["kendoAriaLabelValue"] }, { kind: "component", type: FilterExpressionOperatorsComponent, selector: "kendo-filter-expression-operators", inputs: ["currentItem", "editorType", "operators"], outputs: ["valueChange"] }, { kind: "component", type: FilterTextEditorComponent, selector: "kendo-filter-text-editor", inputs: ["currentItem", "isDisabled"], outputs: ["valueChange"] }, { kind: "component", type: FilterNumericEditorComponent, selector: "kendo-filter-numeric-editor", inputs: ["currentItem", "isDisabled", "format"], outputs: ["valueChange"] }, { kind: "component", type: FilterBooleanEditorComponent, selector: "kendo-filter-boolean-editor", inputs: ["currentItem"], outputs: ["valueChange"] }, { kind: "component", type: FilterDateEditorComponent, selector: "kendo-filter-date-editor", inputs: ["currentItem", "isDisabled", "format"], outputs: ["valueChange"] }, { kind: "directive", type: TemplateContextDirective, selector: "[templateContext]", inputs: ["templateContext"] }, { kind: "component", type: ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }] });
1309
+ `, isInline: true, dependencies: [{ kind: "component", type: DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["customIconClass", "showStickyHeader", "icon", "svgIcon", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "adaptiveTitle", "adaptiveSubtitle", "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: AriaLabelValueDirective, selector: "[kendoAriaLabelValue]", inputs: ["kendoAriaLabelValue"] }, { kind: "component", type: FilterExpressionOperatorsComponent, selector: "kendo-filter-expression-operators", inputs: ["currentItem", "editorType", "operators", "operatorTemplate"], outputs: ["valueChange"] }, { kind: "component", type: FilterTextEditorComponent, selector: "kendo-filter-text-editor", inputs: ["currentItem", "isDisabled"], outputs: ["valueChange"] }, { kind: "component", type: FilterNumericEditorComponent, selector: "kendo-filter-numeric-editor", inputs: ["currentItem", "isDisabled", "format"], outputs: ["valueChange"] }, { kind: "component", type: FilterBooleanEditorComponent, selector: "kendo-filter-boolean-editor", inputs: ["currentItem"], outputs: ["valueChange"] }, { kind: "component", type: FilterDateEditorComponent, selector: "kendo-filter-date-editor", inputs: ["currentItem", "isDisabled", "format"], outputs: ["valueChange"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }] });
1211
1310
  }
1212
1311
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: FilterExpressionComponent, decorators: [{
1213
1312
  type: Component,
@@ -1221,17 +1320,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
1221
1320
  <div class="k-filter-toolbar">
1222
1321
  <div class="k-toolbar k-toolbar-md k-toolbar-solid" role="toolbar" [attr.aria-label]="messageFor('filterToolbarAriaLabel')" (mousedown)="onMouseDown($event)">
1223
1322
  <div class="k-filter-field k-toolbar-item" >
1224
- <kendo-dropdownlist
1225
- [tabindex]="-1"
1226
- [kendoAriaLabelValue]="messageFor('filterFieldAriaLabel')"
1227
- [title]="messageFor('filterExpressionFilters')"
1228
- [data]="getFilters()"
1229
- textField="title"
1230
- valueField="field"
1231
- [value]="currentItem.field"
1232
- [valuePrimitive]="true"
1233
- (valueChange)="filterValueChange($event)">
1234
- </kendo-dropdownlist>
1323
+ @if (fieldTemplate) {
1324
+ <ng-container
1325
+ [ngTemplateOutlet]="fieldTemplate"
1326
+ [ngTemplateOutletContext]="{$implicit: currentItem, filters: availableFilters}">
1327
+ </ng-container>
1328
+ } @else {
1329
+ <kendo-dropdownlist
1330
+ [tabindex]="-1"
1331
+ [kendoAriaLabelValue]="messageFor('filterFieldAriaLabel')"
1332
+ [title]="messageFor('filterExpressionFilters')"
1333
+ [data]="availableFilters"
1334
+ textField="title"
1335
+ valueField="field"
1336
+ [value]="currentItem.field"
1337
+ [valuePrimitive]="true"
1338
+ (valueChange)="filterValueChange($event)">
1339
+ </kendo-dropdownlist>
1340
+ }
1235
1341
  </div>
1236
1342
  @if (!isBoolean) {
1237
1343
  <div class="k-filter-operator k-toolbar-item" >
@@ -1239,6 +1345,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
1239
1345
  [currentItem]="currentItem"
1240
1346
  [operators]="operators"
1241
1347
  [editorType]="getEditorType()"
1348
+ [operatorTemplate]="operatorTemplate"
1242
1349
  (valueChange)="onOperatorChange($event);">
1243
1350
  </kendo-filter-expression-operators>
1244
1351
  </div>
@@ -1262,9 +1369,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
1262
1369
  }
1263
1370
  }
1264
1371
  @if (editorTemplate) {
1265
- <ng-template
1266
- [templateContext]="{templateRef: editorTemplate, $implicit: currentItem}">
1267
- </ng-template>
1372
+ <ng-container
1373
+ [ngTemplateOutlet]="editorTemplate"
1374
+ [ngTemplateOutletContext]="{$implicit: currentItem}">
1375
+ </ng-container>
1268
1376
  }
1269
1377
  </div>
1270
1378
 
@@ -1282,7 +1390,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
1282
1390
  </div>
1283
1391
  `,
1284
1392
  standalone: true,
1285
- imports: [DropDownListComponent, AriaLabelValueDirective, FilterExpressionOperatorsComponent, FilterTextEditorComponent, FilterNumericEditorComponent, FilterBooleanEditorComponent, FilterDateEditorComponent, TemplateContextDirective, ButtonComponent]
1393
+ imports: [DropDownListComponent, AriaLabelValueDirective, FilterExpressionOperatorsComponent, FilterTextEditorComponent, FilterNumericEditorComponent, FilterBooleanEditorComponent, FilterDateEditorComponent, NgTemplateOutlet, ButtonComponent]
1286
1394
  }]
1287
1395
  }], ctorParameters: () => [{ type: FilterService }, { type: i0.ElementRef }, { type: NavigationService }, { type: i1.LocalizationService }, { type: i0.Renderer2 }], propDecorators: { currentItem: [{
1288
1396
  type: Input
@@ -1463,7 +1571,7 @@ class FilterGroupComponent extends BaseFilterRowComponent {
1463
1571
  }
1464
1572
  </ul>
1465
1573
  }
1466
- `, isInline: true, dependencies: [{ kind: "component", type: FilterGroupComponent, selector: "kendo-filter-group", inputs: ["currentItem"] }, { kind: "component", type: ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: FilterExpressionComponent, selector: "kendo-filter-expression", inputs: ["currentItem"] }] });
1574
+ `, isInline: true, dependencies: [{ kind: "component", type: FilterGroupComponent, selector: "kendo-filter-group", inputs: ["currentItem"] }, { kind: "component", type: ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: FilterExpressionComponent, selector: "kendo-filter-expression", inputs: ["currentItem"] }] });
1467
1575
  }
1468
1576
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: FilterGroupComponent, decorators: [{
1469
1577
  type: Component,
@@ -1828,6 +1936,48 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
1828
1936
  }]
1829
1937
  }], ctorParameters: () => [{ type: i1.LocalizationService }] });
1830
1938
 
1939
+ /**
1940
+ * Replaces the default field selector DropDownList in the Filter component with a custom template.
1941
+ * Apply it to an `ng-template` that is a direct child of a `kendo-filter` element.
1942
+ *
1943
+ * The template context provides the following fields:
1944
+ *
1945
+ * - `let-currentItem`&mdash;The [filter descriptor](slug:api_kendo-data-query_filterdescriptor) for the current row. Set its `field` property to change the selected field. The component detects the change and updates the value, operator list, and editor type automatically.
1946
+ * - `let-filters="filters"`&mdash;The list of available [`FilterExpression`](slug:api_filter_filterexpression) items.
1947
+ *
1948
+ * @example
1949
+ * ```html
1950
+ * <kendo-filter>
1951
+ * <ng-template kendoFilterFieldsTemplate let-currentItem let-filters="filters">
1952
+ * <kendo-dropdownlist
1953
+ * [data]="filters"
1954
+ * textField="title"
1955
+ * valueField="field"
1956
+ * [valuePrimitive]="true"
1957
+ * [value]="currentItem.field"
1958
+ * (valueChange)="currentItem.field = $event">
1959
+ * </kendo-dropdownlist>
1960
+ * </ng-template>
1961
+ * <kendo-filter-field field="name" editor="string"></kendo-filter-field>
1962
+ * </kendo-filter>
1963
+ * ```
1964
+ */
1965
+ class FilterFieldsTemplateDirective {
1966
+ templateRef;
1967
+ constructor(templateRef) {
1968
+ this.templateRef = templateRef;
1969
+ }
1970
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: FilterFieldsTemplateDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
1971
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.20", type: FilterFieldsTemplateDirective, isStandalone: true, selector: "[kendoFilterFieldsTemplate]", ngImport: i0 });
1972
+ }
1973
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: FilterFieldsTemplateDirective, decorators: [{
1974
+ type: Directive,
1975
+ args: [{
1976
+ selector: '[kendoFilterFieldsTemplate]',
1977
+ standalone: true
1978
+ }]
1979
+ }], ctorParameters: () => [{ type: i0.TemplateRef }] });
1980
+
1831
1981
  /**
1832
1982
  * Represents the [Kendo UI Filter component for Angular](https://www.telerik.com/kendo-angular-ui/components/filter).
1833
1983
  * The Filter component enables users to define and apply complex filter criteria.
@@ -1951,6 +2101,7 @@ class FilterComponent {
1951
2101
  filterFieldsSubscription;
1952
2102
  _value = { filters: [], logic: 'and' };
1953
2103
  filterFields;
2104
+ fieldTemplate;
1954
2105
  _filterItems;
1955
2106
  get filterItems() {
1956
2107
  return this._filterItems.toArray();
@@ -1974,6 +2125,9 @@ class FilterComponent {
1974
2125
  this.cdr.detectChanges();
1975
2126
  });
1976
2127
  }
2128
+ ngAfterContentInit() {
2129
+ this.filterService.fieldTemplate = this.fieldTemplate?.templateRef ?? null;
2130
+ }
1977
2131
  ngAfterViewInit() {
1978
2132
  this.filterFieldsChanged();
1979
2133
  this.filterFieldsSubscription = this.filterFields.changes.subscribe(this.filterFieldsChanged.bind(this));
@@ -1991,7 +2145,8 @@ class FilterComponent {
1991
2145
  this.filters = this.filterFields.map((filterField) => ({
1992
2146
  ...filterField,
1993
2147
  title: filterField.title,
1994
- editorTemplate: filterField.editorTemplate?.templateRef
2148
+ editorTemplate: filterField.editorTemplate?.templateRef,
2149
+ operatorTemplate: filterField.operatorTemplate?.templateRef
1995
2150
  }));
1996
2151
  }
1997
2152
  if (this.filters.length === 0) {
@@ -2123,7 +2278,7 @@ class FilterComponent {
2123
2278
  },
2124
2279
  FilterService,
2125
2280
  NavigationService
2126
- ], queries: [{ propertyName: "filterFields", predicate: FilterFieldComponent }], viewQueries: [{ propertyName: "_filterItems", predicate: FilterItem, descendants: true }], ngImport: i0, template: `
2281
+ ], queries: [{ propertyName: "fieldTemplate", first: true, predicate: FilterFieldsTemplateDirective, descendants: true }, { propertyName: "filterFields", predicate: FilterFieldComponent }], viewQueries: [{ propertyName: "_filterItems", predicate: FilterItem, descendants: true }], ngImport: i0, template: `
2127
2282
  <ng-container kendoFilterLocalizedMessages
2128
2283
  i18n-editorDateTodayText="kendo.filter.editorDateTodayText|The text of the Today button of the Date editor"
2129
2284
  editorDateTodayText="Today"
@@ -2413,6 +2568,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
2413
2568
  }], filterFields: [{
2414
2569
  type: ContentChildren,
2415
2570
  args: [FilterFieldComponent]
2571
+ }], fieldTemplate: [{
2572
+ type: ContentChild,
2573
+ args: [FilterFieldsTemplateDirective]
2416
2574
  }], _filterItems: [{
2417
2575
  type: ViewChildren,
2418
2576
  args: [FilterItem]
@@ -2461,7 +2619,9 @@ const KENDO_FILTER = [
2461
2619
  FilterComponent,
2462
2620
  FilterFieldComponent,
2463
2621
  CustomMessagesComponent,
2464
- FilterValueEditorTemplateDirective
2622
+ FilterValueEditorTemplateDirective,
2623
+ FilterOperatorTemplateDirective,
2624
+ FilterFieldsTemplateDirective
2465
2625
  ];
2466
2626
 
2467
2627
  // IMPORTANT: NgModule export kept for backwards compatibility
@@ -2498,7 +2658,7 @@ const KENDO_FILTER = [
2498
2658
  */
2499
2659
  class FilterModule {
2500
2660
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: FilterModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
2501
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.20", ngImport: i0, type: FilterModule, imports: [FilterComponent, FilterFieldComponent, CustomMessagesComponent, FilterValueEditorTemplateDirective], exports: [FilterComponent, FilterFieldComponent, CustomMessagesComponent, FilterValueEditorTemplateDirective] });
2661
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.20", ngImport: i0, type: FilterModule, imports: [FilterComponent, FilterFieldComponent, CustomMessagesComponent, FilterValueEditorTemplateDirective, FilterOperatorTemplateDirective, FilterFieldsTemplateDirective], exports: [FilterComponent, FilterFieldComponent, CustomMessagesComponent, FilterValueEditorTemplateDirective, FilterOperatorTemplateDirective, FilterFieldsTemplateDirective] });
2502
2662
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: FilterModule, providers: [
2503
2663
  // InputsModule providers
2504
2664
  IconsService,
@@ -2558,5 +2718,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImpo
2558
2718
  * Generated bundle index. Do not edit.
2559
2719
  */
2560
2720
 
2561
- export { AriaLabelValueDirective, CustomMessagesComponent, FilterBooleanEditorComponent, FilterComponent, FilterDateEditorComponent, FilterExpressionComponent, FilterExpressionOperatorsComponent, FilterFieldComponent, FilterGroupComponent, FilterModule, FilterNumericEditorComponent, FilterTextEditorComponent, FilterValueEditorTemplateDirective, KENDO_FILTER, LocalizedMessagesDirective };
2721
+ export { AriaLabelValueDirective, CustomMessagesComponent, FilterBooleanEditorComponent, FilterComponent, FilterDateEditorComponent, FilterExpressionComponent, FilterExpressionOperatorsComponent, FilterFieldComponent, FilterFieldsTemplateDirective, FilterGroupComponent, FilterModule, FilterNumericEditorComponent, FilterOperatorTemplateDirective, FilterTextEditorComponent, FilterValueEditorTemplateDirective, KENDO_FILTER, LocalizedMessagesDirective };
2562
2722
 
@@ -2,7 +2,7 @@
2
2
  * Copyright © 2026 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 { EventEmitter } from '@angular/core';
5
+ import { EventEmitter, TemplateRef } from '@angular/core';
6
6
  import { LocalizationService } from '@progress/kendo-angular-l10n';
7
7
  import { FilterDescriptor } from '@progress/kendo-data-query';
8
8
  import { FilterEditor, FilterOperator } from './model/filter-expression';
@@ -19,10 +19,11 @@ export declare class FilterExpressionOperatorsComponent {
19
19
  text: string;
20
20
  value: string;
21
21
  }[];
22
+ operatorTemplate: TemplateRef<any>;
22
23
  constructor(localization: LocalizationService);
23
24
  messageFor(key: string): string;
24
25
  getOperator(operatorValue: FilterOperator): string;
25
26
  operatorValueChange(value: FilterOperator): void;
26
27
  static ɵfac: i0.ɵɵFactoryDeclaration<FilterExpressionOperatorsComponent, never>;
27
- static ɵcmp: i0.ɵɵComponentDeclaration<FilterExpressionOperatorsComponent, "kendo-filter-expression-operators", never, { "currentItem": { "alias": "currentItem"; "required": false; }; "editorType": { "alias": "editorType"; "required": false; }; "operators": { "alias": "operators"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
28
+ static ɵcmp: i0.ɵɵComponentDeclaration<FilterExpressionOperatorsComponent, "kendo-filter-expression-operators", never, { "currentItem": { "alias": "currentItem"; "required": false; }; "editorType": { "alias": "editorType"; "required": false; }; "operators": { "alias": "operators"; "required": false; }; "operatorTemplate": { "alias": "operatorTemplate"; "required": false; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
28
29
  }
@@ -2,7 +2,7 @@
2
2
  * Copyright © 2026 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 { ElementRef, OnInit, Renderer2, TemplateRef } from '@angular/core';
5
+ import { DoCheck, ElementRef, OnInit, Renderer2, TemplateRef } from '@angular/core';
6
6
  import { LocalizationService } from '@progress/kendo-angular-l10n';
7
7
  import { CompositeFilterDescriptor, FilterDescriptor } from '@progress/kendo-data-query';
8
8
  import { SVGIcon } from '@progress/kendo-svg-icons';
@@ -14,7 +14,7 @@ import * as i0 from "@angular/core";
14
14
  /**
15
15
  * @hidden
16
16
  */
17
- export declare class FilterExpressionComponent extends BaseFilterRowComponent implements OnInit {
17
+ export declare class FilterExpressionComponent extends BaseFilterRowComponent implements OnInit, DoCheck {
18
18
  private filterService;
19
19
  /**
20
20
  * @hidden
@@ -27,13 +27,18 @@ export declare class FilterExpressionComponent extends BaseFilterRowComponent im
27
27
  editorType: FilterEditor;
28
28
  isEditorDisabled: boolean;
29
29
  editorTemplate: TemplateRef<any>;
30
+ operatorTemplate: TemplateRef<any>;
30
31
  editorFormat: string | DateFormat | NumberFormat;
32
+ get availableFilters(): FilterExpression[];
33
+ private _previousField;
34
+ get fieldTemplate(): TemplateRef<any>;
31
35
  private get currentFilterExpression();
32
36
  get numericEditorFormat(): string | NumberFormat;
33
37
  get dateEditorFormat(): string | DateFormat;
34
38
  private isNumberFormat;
35
39
  private isDateFormat;
36
40
  constructor(filterService: FilterService, element: ElementRef, navigationService: NavigationService, localization: LocalizationService, renderer: Renderer2);
41
+ ngDoCheck(): void;
37
42
  ngOnInit(): void;
38
43
  normalizeOperators(filterEditor: FilterEditor, operators: FilterOperator[]): {
39
44
  text: string;
@@ -46,11 +51,10 @@ export declare class FilterExpressionComponent extends BaseFilterRowComponent im
46
51
  value: string;
47
52
  }[];
48
53
  getEditorType(): FilterEditor;
49
- getFilters(): FilterExpression[];
50
54
  removeFilterExpression(): void;
51
55
  private setOperators;
52
56
  onOperatorChange(value: string): void;
53
- setEditorTemplate(): void;
57
+ setTemplates(): void;
54
58
  static ɵfac: i0.ɵɵFactoryDeclaration<FilterExpressionComponent, never>;
55
59
  static ɵcmp: i0.ɵɵComponentDeclaration<FilterExpressionComponent, "kendo-filter-expression", never, { "currentItem": { "alias": "currentItem"; "required": false; }; }, {}, never, never, true, never>;
56
60
  }
@@ -3,7 +3,8 @@
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import { DateFormat, FilterEditor, FilterOperator, NumberFormat } from './model/filter-expression';
6
- import { FilterValueEditorTemplateDirective } from './templates/value-editor.template';
6
+ import { FilterValueEditorTemplateDirective } from './templates/value-editor-template.directive';
7
+ import { FilterOperatorTemplateDirective } from './templates/operator-template.directive';
7
8
  import * as i0 from "@angular/core";
8
9
  /**
9
10
  * Represents the [Kendo UI Filter Field component for Angular](https://www.telerik.com/kendo-angular-ui/components/filter/api/filterfieldcomponent).
@@ -73,6 +74,10 @@ export declare class FilterFieldComponent {
73
74
  * @hidden
74
75
  */
75
76
  editorTemplate: FilterValueEditorTemplateDirective;
77
+ /**
78
+ * @hidden
79
+ */
80
+ operatorTemplate: FilterOperatorTemplateDirective;
76
81
  static ɵfac: i0.ɵɵFactoryDeclaration<FilterFieldComponent, never>;
77
- static ɵcmp: i0.ɵɵComponentDeclaration<FilterFieldComponent, "kendo-filter-field", never, { "field": { "alias": "field"; "required": false; }; "title": { "alias": "title"; "required": false; }; "editor": { "alias": "editor"; "required": false; }; "operators": { "alias": "operators"; "required": false; }; "editorFormat": { "alias": "editorFormat"; "required": false; }; }, {}, ["editorTemplate"], never, true, never>;
82
+ static ɵcmp: i0.ɵɵComponentDeclaration<FilterFieldComponent, "kendo-filter-field", never, { "field": { "alias": "field"; "required": false; }; "title": { "alias": "title"; "required": false; }; "editor": { "alias": "editor"; "required": false; }; "operators": { "alias": "operators"; "required": false; }; "editorFormat": { "alias": "editorFormat"; "required": false; }; }, {}, ["editorTemplate", "operatorTemplate"], never, true, never>;
78
83
  }
@@ -2,7 +2,7 @@
2
2
  * Copyright © 2026 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 { OnInit, EventEmitter, ElementRef, Renderer2 } from '@angular/core';
5
+ import { AfterContentInit, ElementRef, EventEmitter, OnInit, Renderer2 } from '@angular/core';
6
6
  import { LocalizationService } from '@progress/kendo-angular-l10n';
7
7
  import { FilterService } from './filter.service';
8
8
  import { CompositeFilterDescriptor } from '@progress/kendo-data-query';
@@ -48,7 +48,7 @@ import * as i0 from "@angular/core";
48
48
  * @remarks
49
49
  * Supported children components are: {@link CustomMessagesComponent}, {@link FilterFieldComponent}.
50
50
  */
51
- export declare class FilterComponent implements OnInit, OnDestroy {
51
+ export declare class FilterComponent implements OnInit, AfterContentInit, OnDestroy {
52
52
  private filterService;
53
53
  private localization;
54
54
  private cdr;
@@ -87,11 +87,13 @@ export declare class FilterComponent implements OnInit, OnDestroy {
87
87
  private filterFieldsSubscription;
88
88
  private _value;
89
89
  private filterFields;
90
+ private fieldTemplate;
90
91
  private _filterItems;
91
92
  get filterItems(): FilterItem[];
92
93
  get toolbarElement(): HTMLElement;
93
94
  constructor(filterService: FilterService, localization: LocalizationService, cdr: ChangeDetectorRef, element: ElementRef, navigationService: NavigationService, renderer: Renderer2);
94
95
  ngOnInit(): void;
96
+ ngAfterContentInit(): void;
95
97
  ngAfterViewInit(): void;
96
98
  ngOnDestroy(): void;
97
99
  private filterFieldsChanged;
@@ -120,5 +122,5 @@ export declare class FilterComponent implements OnInit, OnDestroy {
120
122
  */
121
123
  private filtersTypeChanged;
122
124
  static ɵfac: i0.ɵɵFactoryDeclaration<FilterComponent, never>;
123
- static ɵcmp: i0.ɵɵComponentDeclaration<FilterComponent, "kendo-filter", never, { "filters": { "alias": "filters"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, { "valueChange": "valueChange"; }, ["filterFields"], never, true, never>;
125
+ static ɵcmp: i0.ɵɵComponentDeclaration<FilterComponent, "kendo-filter", never, { "filters": { "alias": "filters"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, { "valueChange": "valueChange"; }, ["fieldTemplate", "filterFields"], never, true, never>;
124
126
  }
@@ -6,7 +6,9 @@ import * as i0 from "@angular/core";
6
6
  import * as i1 from "./filter.component";
7
7
  import * as i2 from "./filter-field.component";
8
8
  import * as i3 from "./localization/custom-messages.component";
9
- import * as i4 from "./templates/value-editor.template";
9
+ import * as i4 from "./templates/value-editor-template.directive";
10
+ import * as i5 from "./templates/operator-template.directive";
11
+ import * as i6 from "./templates/field-template.directive";
10
12
  /**
11
13
  * Represents the [NgModule](link:site.data.urls.angular['ngmoduleapi'])
12
14
  * definition for the Filter component.
@@ -40,6 +42,6 @@ import * as i4 from "./templates/value-editor.template";
40
42
  */
41
43
  export declare class FilterModule {
42
44
  static ɵfac: i0.ɵɵFactoryDeclaration<FilterModule, never>;
43
- static ɵmod: i0.ɵɵNgModuleDeclaration<FilterModule, never, [typeof i1.FilterComponent, typeof i2.FilterFieldComponent, typeof i3.CustomMessagesComponent, typeof i4.FilterValueEditorTemplateDirective], [typeof i1.FilterComponent, typeof i2.FilterFieldComponent, typeof i3.CustomMessagesComponent, typeof i4.FilterValueEditorTemplateDirective]>;
45
+ static ɵmod: i0.ɵɵNgModuleDeclaration<FilterModule, never, [typeof i1.FilterComponent, typeof i2.FilterFieldComponent, typeof i3.CustomMessagesComponent, typeof i4.FilterValueEditorTemplateDirective, typeof i5.FilterOperatorTemplateDirective, typeof i6.FilterFieldsTemplateDirective], [typeof i1.FilterComponent, typeof i2.FilterFieldComponent, typeof i3.CustomMessagesComponent, typeof i4.FilterValueEditorTemplateDirective, typeof i5.FilterOperatorTemplateDirective, typeof i6.FilterFieldsTemplateDirective]>;
44
46
  static ɵinj: i0.ɵɵInjectorDeclaration<FilterModule>;
45
47
  }
@@ -2,6 +2,7 @@
2
2
  * Copyright © 2026 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 { TemplateRef } from '@angular/core';
5
6
  import { CompositeFilterDescriptor, FilterDescriptor } from '@progress/kendo-data-query';
6
7
  import { FilterExpression } from './model/filter-expression';
7
8
  import * as i0 from "@angular/core";
@@ -11,6 +12,7 @@ import * as i0 from "@angular/core";
11
12
  export declare class FilterService {
12
13
  normalizedValue: CompositeFilterDescriptor;
13
14
  filters: FilterExpression[];
15
+ fieldTemplate: TemplateRef<any> | null;
14
16
  addFilterGroup(item: CompositeFilterDescriptor): void;
15
17
  addFilterExpression(item: CompositeFilterDescriptor): void;
16
18
  remove(item: CompositeFilterDescriptor | FilterDescriptor, positionIndex: number, parentItem?: CompositeFilterDescriptor): void;
package/index.d.ts CHANGED
@@ -16,6 +16,8 @@ export { FilterExpressionComponent } from './filter-expression.component';
16
16
  export { CustomMessagesComponent } from './localization/custom-messages.component';
17
17
  export { LocalizedMessagesDirective } from './localization/localized-messages.directive';
18
18
  export { FilterFieldComponent } from './filter-field.component';
19
- export { FilterValueEditorTemplateDirective } from './templates/value-editor.template';
19
+ export { FilterValueEditorTemplateDirective } from './templates/value-editor-template.directive';
20
+ export { FilterOperatorTemplateDirective } from './templates/operator-template.directive';
21
+ export { FilterFieldsTemplateDirective } from './templates/field-template.directive';
20
22
  export { FilterOperator, FilterEditor } from './model/filter-expression';
21
23
  export * from './directives';
@@ -78,6 +78,12 @@ export interface FilterExpression {
78
78
  * Specifies a template for the expression value editor input.
79
79
  */
80
80
  editorTemplate?: TemplateRef<any>;
81
+ /**
82
+ * Specifies a custom template for the operator dropdown.
83
+ * When set, the default operator DropDownList is replaced with the provided template.
84
+ * The template receives the current [`FilterDescriptor`](slug:api_kendo-data-query_filterdescriptor) as implicit context.
85
+ */
86
+ operatorTemplate?: TemplateRef<any>;
81
87
  /**
82
88
  * Specifies the user-defined filter `editor` format that will be used.
83
89
  * See the [Filter editor formats documentation](https://www.telerik.com/kendo-angular-ui/components/filter/filter-editors-format).
@@ -7,7 +7,7 @@ export const packageMetadata = {
7
7
  "productCodes": [
8
8
  "KENDOUIANGULAR"
9
9
  ],
10
- "publishDate": 1777365405,
11
- "version": "24.0.0-develop.9",
10
+ "publishDate": 1779368695,
11
+ "version": "24.0.1-develop.1",
12
12
  "licensingDocsUrl": "https://www.telerik.com/kendo-angular-ui/my-license/"
13
13
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@progress/kendo-angular-filter",
3
- "version": "24.0.0-develop.9",
3
+ "version": "24.0.1-develop.1",
4
4
  "description": "Kendo UI Angular Filter",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "author": "Progress",
@@ -17,7 +17,7 @@
17
17
  "package": {
18
18
  "productName": "Kendo UI for Angular",
19
19
  "productCode": "KENDOUIANGULAR",
20
- "publishDate": 1777365405,
20
+ "publishDate": 1779368695,
21
21
  "licensingDocsUrl": "https://www.telerik.com/kendo-angular-ui/my-license/"
22
22
  }
23
23
  },
@@ -28,20 +28,20 @@
28
28
  "@angular/platform-browser": "19 - 21",
29
29
  "@progress/kendo-data-query": "^1.7.3",
30
30
  "@progress/kendo-licensing": "^1.11.0",
31
- "@progress/kendo-angular-buttons": "24.0.0-develop.9",
32
- "@progress/kendo-angular-common": "24.0.0-develop.9",
33
- "@progress/kendo-angular-dateinputs": "24.0.0-develop.9",
34
- "@progress/kendo-angular-dropdowns": "24.0.0-develop.9",
35
- "@progress/kendo-angular-inputs": "24.0.0-develop.9",
36
- "@progress/kendo-angular-intl": "24.0.0-develop.9",
37
- "@progress/kendo-angular-l10n": "24.0.0-develop.9",
38
- "@progress/kendo-angular-icons": "24.0.0-develop.9",
39
- "@progress/kendo-angular-label": "24.0.0-develop.9",
31
+ "@progress/kendo-angular-buttons": "24.0.1-develop.1",
32
+ "@progress/kendo-angular-common": "24.0.1-develop.1",
33
+ "@progress/kendo-angular-dateinputs": "24.0.1-develop.1",
34
+ "@progress/kendo-angular-dropdowns": "24.0.1-develop.1",
35
+ "@progress/kendo-angular-inputs": "24.0.1-develop.1",
36
+ "@progress/kendo-angular-intl": "24.0.1-develop.1",
37
+ "@progress/kendo-angular-l10n": "24.0.1-develop.1",
38
+ "@progress/kendo-angular-icons": "24.0.1-develop.1",
39
+ "@progress/kendo-angular-label": "24.0.1-develop.1",
40
40
  "rxjs": "^6.5.3 || ^7.0.0"
41
41
  },
42
42
  "dependencies": {
43
43
  "tslib": "^2.3.1",
44
- "@progress/kendo-angular-schematics": "24.0.0-develop.9"
44
+ "@progress/kendo-angular-schematics": "24.0.1-develop.1"
45
45
  },
46
46
  "schematics": "./schematics/collection.json",
47
47
  "module": "fesm2022/progress-kendo-angular-filter.mjs",
@@ -9,12 +9,12 @@ const schematics_1 = require("@angular-devkit/schematics");
9
9
  function default_1(options) {
10
10
  const finalOptions = Object.assign(Object.assign({}, options), { mainNgModule: 'FilterModule', package: 'filter', peerDependencies: {
11
11
  // peer deps of the dropdowns
12
- '@progress/kendo-angular-treeview': '24.0.0-develop.9',
13
- '@progress/kendo-angular-popup': '24.0.0-develop.9',
14
- '@progress/kendo-angular-navigation': '24.0.0-develop.9',
12
+ '@progress/kendo-angular-treeview': '24.0.1-develop.1',
13
+ '@progress/kendo-angular-popup': '24.0.1-develop.1',
14
+ '@progress/kendo-angular-navigation': '24.0.1-develop.1',
15
15
  // peer dependency of kendo-angular-inputs
16
16
  '@progress/kendo-drawing': '^1.16.0',
17
- '@progress/kendo-angular-dialog': '24.0.0-develop.9',
17
+ '@progress/kendo-angular-dialog': '24.0.1-develop.1',
18
18
  // Peer dependency of icons
19
19
  '@progress/kendo-svg-icons': '^4.0.0'
20
20
  } });
@@ -0,0 +1,38 @@
1
+ /**-----------------------------------------------------------------------------------------
2
+ * Copyright © 2026 Progress Software Corporation. All rights reserved.
3
+ * Licensed under commercial license. See LICENSE.md in the project root for more information
4
+ *-------------------------------------------------------------------------------------------*/
5
+ import { TemplateRef } from '@angular/core';
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * Replaces the default field selector DropDownList in the Filter component with a custom template.
9
+ * Apply it to an `ng-template` that is a direct child of a `kendo-filter` element.
10
+ *
11
+ * The template context provides the following fields:
12
+ *
13
+ * - `let-currentItem`&mdash;The [filter descriptor](slug:api_kendo-data-query_filterdescriptor) for the current row. Set its `field` property to change the selected field. The component detects the change and updates the value, operator list, and editor type automatically.
14
+ * - `let-filters="filters"`&mdash;The list of available [`FilterExpression`](slug:api_filter_filterexpression) items.
15
+ *
16
+ * @example
17
+ * ```html
18
+ * <kendo-filter>
19
+ * <ng-template kendoFilterFieldsTemplate let-currentItem let-filters="filters">
20
+ * <kendo-dropdownlist
21
+ * [data]="filters"
22
+ * textField="title"
23
+ * valueField="field"
24
+ * [valuePrimitive]="true"
25
+ * [value]="currentItem.field"
26
+ * (valueChange)="currentItem.field = $event">
27
+ * </kendo-dropdownlist>
28
+ * </ng-template>
29
+ * <kendo-filter-field field="name" editor="string"></kendo-filter-field>
30
+ * </kendo-filter>
31
+ * ```
32
+ */
33
+ export declare class FilterFieldsTemplateDirective {
34
+ templateRef: TemplateRef<any>;
35
+ constructor(templateRef: TemplateRef<any>);
36
+ static ɵfac: i0.ɵɵFactoryDeclaration<FilterFieldsTemplateDirective, never>;
37
+ static ɵdir: i0.ɵɵDirectiveDeclaration<FilterFieldsTemplateDirective, "[kendoFilterFieldsTemplate]", never, {}, {}, never, never, true, never>;
38
+ }
@@ -0,0 +1,38 @@
1
+ /**-----------------------------------------------------------------------------------------
2
+ * Copyright © 2026 Progress Software Corporation. All rights reserved.
3
+ * Licensed under commercial license. See LICENSE.md in the project root for more information
4
+ *-------------------------------------------------------------------------------------------*/
5
+ import { TemplateRef } from '@angular/core';
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * Replaces the default operator DropDownList in the Filter component with a custom template.
9
+ * Apply it to an `ng-template` inside a `kendo-filter-field` element.
10
+ *
11
+ * The template context provides the following field:
12
+ *
13
+ * - `let-filter`&mdash;The [filter descriptor](slug:api_kendo-data-query_filterdescriptor) for the current row. Set its `operator` property when the user selects a new operator.
14
+ *
15
+ * @example
16
+ * ```html
17
+ * <kendo-filter>
18
+ * <kendo-filter-field field="name" editor="string">
19
+ * <ng-template kendoFilterOperatorTemplate let-filter>
20
+ * <kendo-combobox
21
+ * [data]="customOperators"
22
+ * textField="text"
23
+ * valueField="value"
24
+ * [valuePrimitive]="true"
25
+ * [value]="filter.operator"
26
+ * (valueChange)="filter.operator = $event">
27
+ * </kendo-combobox>
28
+ * </ng-template>
29
+ * </kendo-filter-field>
30
+ * </kendo-filter>
31
+ * ```
32
+ */
33
+ export declare class FilterOperatorTemplateDirective {
34
+ templateRef: TemplateRef<any>;
35
+ constructor(templateRef: TemplateRef<any>);
36
+ static ɵfac: i0.ɵɵFactoryDeclaration<FilterOperatorTemplateDirective, never>;
37
+ static ɵdir: i0.ɵɵDirectiveDeclaration<FilterOperatorTemplateDirective, "[kendoFilterOperatorTemplate]", never, {}, {}, never, never, true, never>;
38
+ }