@progress/kendo-angular-filter 25.1.0-develop.3 → 25.1.0-develop.5

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.
@@ -3,7 +3,7 @@
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import * as i0 from '@angular/core';
6
- import { Injectable, Directive, ContentChild, Input, Component, EventEmitter, Output, isDevMode, forwardRef, ViewChildren, ContentChildren, HostBinding, HostListener, NgModule } from '@angular/core';
6
+ import { signal, Injectable, Directive, ContentChild, Input, Component, EventEmitter, Output, afterNextRender, ChangeDetectionStrategy, isDevMode, forwardRef, ViewChildren, ContentChildren, HostBinding, HostListener, NgModule } from '@angular/core';
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';
@@ -22,9 +22,15 @@ import { DialogContainerService, DialogService, WindowService, WindowContainerSe
22
22
  * @hidden
23
23
  */
24
24
  class FilterService {
25
- normalizedValue = { logic: 'and', filters: [] };
26
- filters = [];
27
- fieldTemplate = null;
25
+ _normalizedValue = signal({ logic: 'and', filters: [] }, ...(ngDevMode ? [{ debugName: "_normalizedValue" }] : []));
26
+ _filters = signal([], ...(ngDevMode ? [{ debugName: "_filters" }] : []));
27
+ _fieldTemplate = signal(null, ...(ngDevMode ? [{ debugName: "_fieldTemplate" }] : []));
28
+ set normalizedValue(value) { this._normalizedValue.set(value); }
29
+ get normalizedValue() { return this._normalizedValue(); }
30
+ set filters(value) { this._filters.set(value); }
31
+ get filters() { return this._filters(); }
32
+ set fieldTemplate(value) { this._fieldTemplate.set(value); }
33
+ get fieldTemplate() { return this._fieldTemplate(); }
28
34
  addFilterGroup(item) {
29
35
  const filterGroup = { logic: 'and', filters: [] };
30
36
  item.filters.push(filterGroup);
@@ -232,8 +238,8 @@ const packageMetadata = {
232
238
  productName: 'Kendo UI for Angular',
233
239
  productCode: 'KENDOUIANGULAR',
234
240
  productCodes: ['KENDOUIANGULAR'],
235
- publishDate: 1787037087,
236
- version: '25.1.0-develop.3',
241
+ publishDate: 1787151369,
242
+ version: '25.1.0-develop.5',
237
243
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/'
238
244
  };
239
245
 
@@ -324,28 +330,37 @@ class FilterFieldComponent {
324
330
  /**
325
331
  * Specifies the `field` that will be used by the user-defined filter.
326
332
  */
327
- field;
333
+ set field(value) {
334
+ this._field.set(value);
335
+ }
336
+ get field() {
337
+ return this._field();
338
+ }
328
339
  /**
329
340
  * Specifies the `title` text that will be displayed by the user-defined filter.
330
341
  * If the `title` isn't set, the value passed to `field` is used.
331
342
  */
332
343
  set title(_title) {
333
344
  if (_title) {
334
- this._title = _title;
345
+ this._title.set(_title);
335
346
  }
336
347
  else {
337
- this._title = this.field;
348
+ this._title.set(this.field);
338
349
  }
339
350
  }
340
351
  get title() {
341
- return this._title;
352
+ return this._title();
342
353
  }
343
- _title;
344
354
  /**
345
355
  * Specifies the user-defined filter `editor` type that will be used.
346
356
  * The available options are 'string', 'number', 'boolean', and 'date'.
347
357
  */
348
- editor;
358
+ set editor(value) {
359
+ this._editor.set(value);
360
+ }
361
+ get editor() {
362
+ return this._editor();
363
+ }
349
364
  /**
350
365
  * Specifies the operators that will be available in the order of providing them.
351
366
  * If no operators are provided, default operators are used for each filter type.
@@ -374,11 +389,26 @@ class FilterFieldComponent {
374
389
  *
375
390
  * The boolean operator is always set to `eq`
376
391
  */
377
- operators;
392
+ set operators(value) {
393
+ this._operators.set(value);
394
+ }
395
+ get operators() {
396
+ return this._operators();
397
+ }
378
398
  /**
379
399
  * Specifies the user-defined filter `editor` format that will be used. ([see example](https://www.telerik.com/kendo-angular-ui/components/filter/filter-editors-format))
380
400
  */
381
- editorFormat;
401
+ set editorFormat(value) {
402
+ this._editorFormat.set(value);
403
+ }
404
+ get editorFormat() {
405
+ return this._editorFormat();
406
+ }
407
+ _field = signal(undefined, ...(ngDevMode ? [{ debugName: "_field" }] : []));
408
+ _title = signal(undefined, ...(ngDevMode ? [{ debugName: "_title" }] : []));
409
+ _editor = signal(undefined, ...(ngDevMode ? [{ debugName: "_editor" }] : []));
410
+ _operators = signal(undefined, ...(ngDevMode ? [{ debugName: "_operators" }] : []));
411
+ _editorFormat = signal(undefined, ...(ngDevMode ? [{ debugName: "_editorFormat" }] : []));
382
412
  /**
383
413
  * @hidden
384
414
  */
@@ -591,7 +621,13 @@ class BaseFilterRowComponent {
591
621
  navigationService;
592
622
  localization;
593
623
  renderer;
594
- index;
624
+ set index(value) {
625
+ this._index.set(value);
626
+ }
627
+ get index() {
628
+ return this._index();
629
+ }
630
+ _index = signal(undefined, ...(ngDevMode ? [{ debugName: "_index" }] : []));
595
631
  valueChange = new EventEmitter();
596
632
  constructor(element, navigationService, localization, renderer) {
597
633
  this.element = element;
@@ -654,16 +690,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.27", ngImpo
654
690
  class AriaLabelValueDirective {
655
691
  hostElement;
656
692
  renderer;
657
- ariaLabel;
658
- constructor(hostElement, renderer) {
693
+ injector;
694
+ set ariaLabel(value) {
695
+ this._ariaLabel.set(value);
696
+ }
697
+ get ariaLabel() {
698
+ return this._ariaLabel();
699
+ }
700
+ _ariaLabel = signal(undefined, ...(ngDevMode ? [{ debugName: "_ariaLabel" }] : []));
701
+ constructor(hostElement, renderer, injector) {
659
702
  this.hostElement = hostElement;
660
703
  this.renderer = renderer;
704
+ this.injector = injector;
661
705
  }
662
706
  ngOnInit() {
663
- const target = this.hostElement.nativeElement.querySelector('input') || this.hostElement.nativeElement;
664
- this.renderer.setAttribute(target, 'aria-label', this.ariaLabel);
707
+ afterNextRender(() => {
708
+ const target = this.hostElement.nativeElement.querySelector('input') || this.hostElement.nativeElement;
709
+ this.renderer.setAttribute(target, 'aria-label', this.ariaLabel);
710
+ }, { injector: this.injector });
665
711
  }
666
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.27", ngImport: i0, type: AriaLabelValueDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
712
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.27", ngImport: i0, type: AriaLabelValueDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Directive });
667
713
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.27", type: AriaLabelValueDirective, isStandalone: true, selector: "[kendoAriaLabelValue]", inputs: { ariaLabel: ["kendoAriaLabelValue", "ariaLabel"] }, ngImport: i0 });
668
714
  }
669
715
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.27", ngImport: i0, type: AriaLabelValueDirective, decorators: [{
@@ -672,7 +718,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.27", ngImpo
672
718
  selector: '[kendoAriaLabelValue]',
673
719
  standalone: true
674
720
  }]
675
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { ariaLabel: [{
721
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.Injector }], propDecorators: { ariaLabel: [{
676
722
  type: Input,
677
723
  args: ['kendoAriaLabelValue']
678
724
  }] } });
@@ -682,10 +728,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.27", ngImpo
682
728
  */
683
729
  class FilterDateEditorComponent {
684
730
  localization;
685
- currentItem;
686
- isDisabled;
687
- format;
731
+ set currentItem(value) {
732
+ this._currentItem.set(value);
733
+ }
734
+ get currentItem() {
735
+ return this._currentItem();
736
+ }
737
+ set isDisabled(value) {
738
+ this._isDisabled.set(value);
739
+ }
740
+ get isDisabled() {
741
+ return this._isDisabled();
742
+ }
743
+ set format(value) {
744
+ this._format.set(value);
745
+ }
746
+ get format() {
747
+ return this._format();
748
+ }
688
749
  valueChange = new EventEmitter();
750
+ _currentItem = signal(undefined, ...(ngDevMode ? [{ debugName: "_currentItem" }] : []));
751
+ _isDisabled = signal(undefined, ...(ngDevMode ? [{ debugName: "_isDisabled" }] : []));
752
+ _format = signal(undefined, ...(ngDevMode ? [{ debugName: "_format" }] : []));
689
753
  constructor(localization) {
690
754
  this.localization = localization;
691
755
  }
@@ -710,12 +774,13 @@ class FilterDateEditorComponent {
710
774
  [today]="messageFor('editorDateTodayText')">
711
775
  </kendo-datepicker-messages>
712
776
  </kendo-datepicker>
713
- `, isInline: true, dependencies: [{ kind: "component", type: DatePickerComponent, selector: "kendo-datepicker", inputs: ["focusableId", "cellTemplate", "clearButton", "inputAttributes", "monthCellTemplate", "yearCellTemplate", "decadeCellTemplate", "centuryCellTemplate", "weekNumberTemplate", "headerTitleTemplate", "headerTemplate", "footerTemplate", "footer", "navigationItemTemplate", "weekDaysFormat", "showOtherMonthDays", "activeView", "bottomView", "topView", "calendarType", "animateCalendarNavigation", "disabled", "readonly", "readOnlyInput", "popupSettings", "navigation", "min", "max", "incompleteDateValidation", "autoCorrectParts", "autoSwitchParts", "autoSwitchKeys", "enableMouseWheel", "allowCaretMode", "autoFill", "focusedDate", "value", "format", "twoDigitYearMax", "formatPlaceholder", "placeholder", "tabindex", "tabIndex", "disabledDates", "adaptiveTitle", "adaptiveSubtitle", "rangeValidation", "disabledDatesValidation", "weekNumber", "size", "rounded", "fillMode", "adaptiveMode"], outputs: ["valueChange", "focus", "blur", "open", "close", "escape"], exportAs: ["kendo-datepicker"] }, { kind: "directive", type: AriaLabelValueDirective, selector: "[kendoAriaLabelValue]", inputs: ["kendoAriaLabelValue"] }, { kind: "component", type: DatePickerCustomMessagesComponent, selector: "kendo-datepicker-messages" }] });
777
+ `, isInline: true, dependencies: [{ kind: "component", type: DatePickerComponent, selector: "kendo-datepicker", inputs: ["focusableId", "cellTemplate", "clearButton", "inputAttributes", "monthCellTemplate", "yearCellTemplate", "decadeCellTemplate", "centuryCellTemplate", "weekNumberTemplate", "headerTitleTemplate", "headerTemplate", "footerTemplate", "footer", "navigationItemTemplate", "weekDaysFormat", "showOtherMonthDays", "activeView", "bottomView", "topView", "calendarType", "animateCalendarNavigation", "disabled", "readonly", "readOnlyInput", "popupSettings", "navigation", "min", "max", "incompleteDateValidation", "autoCorrectParts", "autoSwitchParts", "autoSwitchKeys", "enableMouseWheel", "allowCaretMode", "autoFill", "focusedDate", "value", "format", "twoDigitYearMax", "formatPlaceholder", "placeholder", "tabindex", "tabIndex", "disabledDates", "adaptiveTitle", "adaptiveSubtitle", "rangeValidation", "disabledDatesValidation", "weekNumber", "size", "rounded", "fillMode", "adaptiveMode"], outputs: ["valueChange", "focus", "blur", "open", "close", "escape"], exportAs: ["kendo-datepicker"] }, { kind: "directive", type: AriaLabelValueDirective, selector: "[kendoAriaLabelValue]", inputs: ["kendoAriaLabelValue"] }, { kind: "component", type: DatePickerCustomMessagesComponent, selector: "kendo-datepicker-messages" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
714
778
  }
715
779
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.27", ngImport: i0, type: FilterDateEditorComponent, decorators: [{
716
780
  type: Component,
717
781
  args: [{
718
782
  selector: 'kendo-filter-date-editor',
783
+ changeDetection: ChangeDetectionStrategy.OnPush,
719
784
  template: `
720
785
  <kendo-datepicker
721
786
  [tabindex]="-1"
@@ -748,8 +813,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.27", ngImpo
748
813
  */
749
814
  class FilterBooleanEditorComponent {
750
815
  localization;
751
- currentItem;
816
+ cdr;
817
+ set currentItem(value) {
818
+ this._currentItem.set(value);
819
+ }
820
+ get currentItem() {
821
+ return this._currentItem();
822
+ }
752
823
  valueChange = new EventEmitter();
824
+ _currentItem = signal(undefined, ...(ngDevMode ? [{ debugName: "_currentItem" }] : []));
753
825
  get items() {
754
826
  return [
755
827
  { text: this.getBooleanText(true), value: true },
@@ -759,8 +831,9 @@ class FilterBooleanEditorComponent {
759
831
  get defaultItem() {
760
832
  return { text: this.getBooleanText(null), value: null };
761
833
  }
762
- constructor(localization) {
834
+ constructor(localization, cdr) {
763
835
  this.localization = localization;
836
+ this.cdr = cdr;
764
837
  }
765
838
  messageFor(key) {
766
839
  return this.localization.get(key);
@@ -778,7 +851,7 @@ class FilterBooleanEditorComponent {
778
851
  this.currentItem.value = value;
779
852
  this.valueChange.emit();
780
853
  }
781
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.27", ngImport: i0, type: FilterBooleanEditorComponent, deps: [{ token: i1.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
854
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.27", ngImport: i0, type: FilterBooleanEditorComponent, deps: [{ token: i1.LocalizationService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
782
855
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.27", type: FilterBooleanEditorComponent, isStandalone: true, selector: "kendo-filter-boolean-editor", inputs: { currentItem: "currentItem" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: `
783
856
  <kendo-dropdownlist
784
857
  [tabindex]="-1"
@@ -793,12 +866,13 @@ class FilterBooleanEditorComponent {
793
866
  <ng-template kendoDropDownListValueTemplate let-dataItem>{{ getBooleanText(dataItem.value) }}</ng-template>
794
867
  <ng-template kendoDropDownListItemTemplate let-dataItem>{{ getBooleanText(dataItem.value) }}</ng-template>
795
868
  </kendo-dropdownlist>
796
- `, 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]" }] });
869
+ `, 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]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
797
870
  }
798
871
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.27", ngImport: i0, type: FilterBooleanEditorComponent, decorators: [{
799
872
  type: Component,
800
873
  args: [{
801
874
  selector: 'kendo-filter-boolean-editor',
875
+ changeDetection: ChangeDetectionStrategy.OnPush,
802
876
  template: `
803
877
  <kendo-dropdownlist
804
878
  [tabindex]="-1"
@@ -817,7 +891,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.27", ngImpo
817
891
  standalone: true,
818
892
  imports: [DropDownListComponent, AriaLabelValueDirective, ValueTemplateDirective, ItemTemplateDirective]
819
893
  }]
820
- }], ctorParameters: () => [{ type: i1.LocalizationService }], propDecorators: { currentItem: [{
894
+ }], ctorParameters: () => [{ type: i1.LocalizationService }, { type: i0.ChangeDetectorRef }], propDecorators: { currentItem: [{
821
895
  type: Input
822
896
  }], valueChange: [{
823
897
  type: Output
@@ -828,10 +902,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.27", ngImpo
828
902
  */
829
903
  class FilterNumericEditorComponent {
830
904
  localization;
831
- currentItem;
832
- isDisabled;
833
- format;
905
+ set currentItem(value) {
906
+ this._currentItem.set(value);
907
+ }
908
+ get currentItem() {
909
+ return this._currentItem();
910
+ }
911
+ set isDisabled(value) {
912
+ this._isDisabled.set(value);
913
+ }
914
+ get isDisabled() {
915
+ return this._isDisabled();
916
+ }
917
+ set format(value) {
918
+ this._format.set(value);
919
+ }
920
+ get format() {
921
+ return this._format();
922
+ }
834
923
  valueChange = new EventEmitter();
924
+ _currentItem = signal(undefined, ...(ngDevMode ? [{ debugName: "_currentItem" }] : []));
925
+ _isDisabled = signal(undefined, ...(ngDevMode ? [{ debugName: "_isDisabled" }] : []));
926
+ _format = signal(undefined, ...(ngDevMode ? [{ debugName: "_format" }] : []));
835
927
  constructor(localization) {
836
928
  this.localization = localization;
837
929
  }
@@ -856,12 +948,13 @@ class FilterNumericEditorComponent {
856
948
  [decrement]="messageFor('editorNumericDecrement')">
857
949
  </kendo-numerictextbox-messages>
858
950
  </kendo-numerictextbox>
859
- `, isInline: true, dependencies: [{ kind: "component", type: NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode", "inputAttributes"], outputs: ["valueChange", "focus", "blur", "inputFocus", "inputBlur"], exportAs: ["kendoNumericTextBox"] }, { kind: "directive", type: AriaLabelValueDirective, selector: "[kendoAriaLabelValue]", inputs: ["kendoAriaLabelValue"] }, { kind: "component", type: NumericTextBoxCustomMessagesComponent, selector: "kendo-numerictextbox-messages" }] });
951
+ `, isInline: true, dependencies: [{ kind: "component", type: NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode", "inputAttributes"], outputs: ["valueChange", "focus", "blur", "inputFocus", "inputBlur"], exportAs: ["kendoNumericTextBox"] }, { kind: "directive", type: AriaLabelValueDirective, selector: "[kendoAriaLabelValue]", inputs: ["kendoAriaLabelValue"] }, { kind: "component", type: NumericTextBoxCustomMessagesComponent, selector: "kendo-numerictextbox-messages" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
860
952
  }
861
953
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.27", ngImport: i0, type: FilterNumericEditorComponent, decorators: [{
862
954
  type: Component,
863
955
  args: [{
864
956
  selector: 'kendo-filter-numeric-editor',
957
+ changeDetection: ChangeDetectionStrategy.OnPush,
865
958
  template: `
866
959
  <kendo-numerictextbox
867
960
  [tabindex]="-1"
@@ -894,9 +987,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.27", ngImpo
894
987
  */
895
988
  class FilterTextEditorComponent {
896
989
  localization;
897
- currentItem;
898
- isDisabled;
990
+ set currentItem(value) {
991
+ this._currentItem.set(value);
992
+ }
993
+ get currentItem() {
994
+ return this._currentItem();
995
+ }
996
+ set isDisabled(value) {
997
+ this._isDisabled.set(value);
998
+ }
999
+ get isDisabled() {
1000
+ return this._isDisabled();
1001
+ }
899
1002
  valueChange = new EventEmitter();
1003
+ _currentItem = signal(undefined, ...(ngDevMode ? [{ debugName: "_currentItem" }] : []));
1004
+ _isDisabled = signal(undefined, ...(ngDevMode ? [{ debugName: "_isDisabled" }] : []));
900
1005
  constructor(localization) {
901
1006
  this.localization = localization;
902
1007
  }
@@ -916,12 +1021,13 @@ class FilterTextEditorComponent {
916
1021
  (valueChange)="onValueChange($event)"
917
1022
  [disabled]="isDisabled">
918
1023
  </kendo-textbox>
919
- `, isInline: true, dependencies: [{ kind: "component", type: TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "type", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "successSvgIcon", "errorIcon", "errorSvgIcon", "clearButtonIcon", "clearButtonSvgIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength", "inputAttributes"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { kind: "directive", type: AriaLabelValueDirective, selector: "[kendoAriaLabelValue]", inputs: ["kendoAriaLabelValue"] }] });
1024
+ `, isInline: true, dependencies: [{ kind: "component", type: TextBoxComponent, selector: "kendo-textbox", inputs: ["focusableId", "title", "type", "disabled", "readonly", "tabindex", "value", "selectOnFocus", "showSuccessIcon", "showErrorIcon", "clearButton", "successIcon", "successSvgIcon", "errorIcon", "errorSvgIcon", "clearButtonIcon", "clearButtonSvgIcon", "size", "rounded", "fillMode", "tabIndex", "placeholder", "maxlength", "inputAttributes"], outputs: ["valueChange", "inputFocus", "inputBlur", "focus", "blur"], exportAs: ["kendoTextBox"] }, { kind: "directive", type: AriaLabelValueDirective, selector: "[kendoAriaLabelValue]", inputs: ["kendoAriaLabelValue"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
920
1025
  }
921
1026
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.27", ngImport: i0, type: FilterTextEditorComponent, decorators: [{
922
1027
  type: Component,
923
1028
  args: [{
924
1029
  selector: 'kendo-filter-text-editor',
1030
+ changeDetection: ChangeDetectionStrategy.OnPush,
925
1031
  template: `
926
1032
  <kendo-textbox
927
1033
  [tabindex]="-1"
@@ -947,11 +1053,35 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.27", ngImpo
947
1053
  */
948
1054
  class FilterExpressionOperatorsComponent {
949
1055
  localization;
950
- currentItem;
951
- editorType;
1056
+ set currentItem(value) {
1057
+ this._currentItem.set(value);
1058
+ }
1059
+ get currentItem() {
1060
+ return this._currentItem();
1061
+ }
1062
+ set editorType(value) {
1063
+ this._editorType.set(value);
1064
+ }
1065
+ get editorType() {
1066
+ return this._editorType();
1067
+ }
952
1068
  valueChange = new EventEmitter();
953
- operators = [];
954
- operatorTemplate;
1069
+ set operators(value) {
1070
+ this._operators.set(value);
1071
+ }
1072
+ get operators() {
1073
+ return this._operators();
1074
+ }
1075
+ set operatorTemplate(value) {
1076
+ this._operatorTemplate.set(value);
1077
+ }
1078
+ get operatorTemplate() {
1079
+ return this._operatorTemplate();
1080
+ }
1081
+ _currentItem = signal(undefined, ...(ngDevMode ? [{ debugName: "_currentItem" }] : []));
1082
+ _editorType = signal(undefined, ...(ngDevMode ? [{ debugName: "_editorType" }] : []));
1083
+ _operators = signal([], ...(ngDevMode ? [{ debugName: "_operators" }] : []));
1084
+ _operatorTemplate = signal(undefined, ...(ngDevMode ? [{ debugName: "_operatorTemplate" }] : []));
955
1085
  constructor(localization) {
956
1086
  this.localization = localization;
957
1087
  }
@@ -991,12 +1121,13 @@ class FilterExpressionOperatorsComponent {
991
1121
  </ng-template>
992
1122
  </kendo-dropdownlist>
993
1123
  }
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"] }] });
1124
+ `, 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
995
1125
  }
996
1126
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.27", ngImport: i0, type: FilterExpressionOperatorsComponent, decorators: [{
997
1127
  type: Component,
998
1128
  args: [{
999
1129
  selector: "kendo-filter-expression-operators",
1130
+ changeDetection: ChangeDetectionStrategy.OnPush,
1000
1131
  template: `
1001
1132
  @if (operatorTemplate) {
1002
1133
  <ng-container
@@ -1044,23 +1175,65 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.27", ngImpo
1044
1175
  */
1045
1176
  class FilterExpressionComponent extends BaseFilterRowComponent {
1046
1177
  filterService;
1178
+ cdr;
1047
1179
  /**
1048
1180
  * @hidden
1049
1181
  */
1050
1182
  xIcon = xIcon;
1051
1183
  static ngAcceptInputType_currentItem;
1052
- currentItem;
1053
- operators = [];
1054
- isBoolean = false;
1184
+ set currentItem(value) {
1185
+ const previousField = this._currentItem()?.field;
1186
+ this._currentItem.set(value);
1187
+ if (value) {
1188
+ this._previousField = value.field;
1189
+ if (this._initialized && value.field && value.field !== previousField) {
1190
+ this.applyFieldChange(value.field);
1191
+ }
1192
+ }
1193
+ }
1194
+ get currentItem() {
1195
+ return this._currentItem();
1196
+ }
1197
+ set operators(v) {
1198
+ this._operators.set(v);
1199
+ }
1200
+ get operators() {
1201
+ return this._operators();
1202
+ }
1203
+ set isBoolean(v) {
1204
+ this._isBoolean.set(v);
1205
+ }
1206
+ get isBoolean() {
1207
+ return this._isBoolean();
1208
+ }
1055
1209
  editorType;
1056
- isEditorDisabled = false;
1057
- editorTemplate;
1058
- operatorTemplate;
1059
- editorFormat;
1210
+ set isEditorDisabled(v) {
1211
+ this._isEditorDisabled.set(v);
1212
+ }
1213
+ get isEditorDisabled() {
1214
+ return this._isEditorDisabled();
1215
+ }
1216
+ set editorTemplate(v) {
1217
+ this._editorTemplate.set(v);
1218
+ }
1219
+ get editorTemplate() {
1220
+ return this._editorTemplate();
1221
+ }
1222
+ set operatorTemplate(v) {
1223
+ this._operatorTemplate.set(v);
1224
+ }
1225
+ get operatorTemplate() {
1226
+ return this._operatorTemplate();
1227
+ }
1228
+ set editorFormat(v) {
1229
+ this._editorFormat.set(v);
1230
+ }
1231
+ get editorFormat() {
1232
+ return this._editorFormat();
1233
+ }
1060
1234
  get availableFilters() {
1061
1235
  return this.filterService.filters || [];
1062
1236
  }
1063
- _previousField;
1064
1237
  get fieldTemplate() {
1065
1238
  return this.filterService.fieldTemplate;
1066
1239
  }
@@ -1081,6 +1254,15 @@ class FilterExpressionComponent extends BaseFilterRowComponent {
1081
1254
  }
1082
1255
  return this.editorFormat;
1083
1256
  }
1257
+ _previousField;
1258
+ _initialized = false;
1259
+ _currentItem = signal(undefined, ...(ngDevMode ? [{ debugName: "_currentItem" }] : []));
1260
+ _operators = signal([], ...(ngDevMode ? [{ debugName: "_operators" }] : []));
1261
+ _isBoolean = signal(false, ...(ngDevMode ? [{ debugName: "_isBoolean" }] : []));
1262
+ _isEditorDisabled = signal(false, ...(ngDevMode ? [{ debugName: "_isEditorDisabled" }] : []));
1263
+ _editorTemplate = signal(undefined, ...(ngDevMode ? [{ debugName: "_editorTemplate" }] : []));
1264
+ _operatorTemplate = signal(undefined, ...(ngDevMode ? [{ debugName: "_operatorTemplate" }] : []));
1265
+ _editorFormat = signal(undefined, ...(ngDevMode ? [{ debugName: "_editorFormat" }] : []));
1084
1266
  isNumberFormat(obj) {
1085
1267
  if (isDevMode() && obj &&
1086
1268
  (obj['currency'] ||
@@ -1103,20 +1285,17 @@ class FilterExpressionComponent extends BaseFilterRowComponent {
1103
1285
  return false;
1104
1286
  }
1105
1287
  }
1106
- constructor(filterService, element, navigationService, localization, renderer) {
1288
+ constructor(filterService, element, navigationService, localization, renderer, cdr) {
1107
1289
  super(element, navigationService, localization, renderer);
1108
1290
  this.filterService = filterService;
1291
+ this.cdr = cdr;
1109
1292
  }
1110
1293
  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);
1294
+ if (this.fieldTemplate && this.currentItem) {
1295
+ const currentField = this.currentItem.field;
1296
+ if (currentField && currentField !== this._previousField) {
1297
+ this._previousField = currentField;
1298
+ this.filterValueChange(currentField);
1120
1299
  }
1121
1300
  }
1122
1301
  }
@@ -1139,6 +1318,7 @@ class FilterExpressionComponent extends BaseFilterRowComponent {
1139
1318
  this.setOperators(defaultFilter);
1140
1319
  }
1141
1320
  this.setTemplates();
1321
+ this._initialized = true;
1142
1322
  }
1143
1323
  normalizeOperators(filterEditor, operators) {
1144
1324
  const result = [];
@@ -1162,13 +1342,20 @@ class FilterExpressionComponent extends BaseFilterRowComponent {
1162
1342
  filterValueChange(value) {
1163
1343
  this.navigationService.currentToolbarItemIndex = this.itemNumber;
1164
1344
  this.navigationService.currentToolbarItemChildrenIndex = 0;
1165
- this.currentItem.value = null;
1166
1345
  this.currentItem.field = value;
1346
+ this.applyFieldChange(value);
1347
+ this.valueChange.emit();
1348
+ }
1349
+ applyFieldChange(field) {
1350
+ const current = this._currentItem();
1351
+ current.value = null;
1352
+ this._currentItem.set({ ...current });
1353
+ this._previousField = field;
1167
1354
  this.setTemplates();
1168
- const foundFilter = this.getFilterExpressionByField(this.currentItem.field);
1355
+ const foundFilter = this.getFilterExpressionByField(field);
1169
1356
  this.setOperators(foundFilter);
1170
- this.editorFormat = foundFilter.editorFormat;
1171
- this.valueChange.emit();
1357
+ this.editorFormat = foundFilter?.editorFormat;
1358
+ this.cdr.markForCheck();
1172
1359
  }
1173
1360
  getDefaultOperators(operatorsType) {
1174
1361
  switch (operatorsType) {
@@ -1230,7 +1417,7 @@ class FilterExpressionComponent extends BaseFilterRowComponent {
1230
1417
  this.editorTemplate = filterExpression?.editorTemplate;
1231
1418
  this.operatorTemplate = filterExpression?.operatorTemplate;
1232
1419
  }
1233
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.27", ngImport: i0, type: FilterExpressionComponent, deps: [{ token: FilterService }, { token: i0.ElementRef }, { token: NavigationService }, { token: i1.LocalizationService }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
1420
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.27", ngImport: i0, type: FilterExpressionComponent, deps: [{ token: FilterService }, { token: i0.ElementRef }, { token: NavigationService }, { token: i1.LocalizationService }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1234
1421
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.27", type: FilterExpressionComponent, isStandalone: true, selector: "kendo-filter-expression", inputs: { currentItem: "currentItem" }, providers: [{
1235
1422
  provide: FilterItem,
1236
1423
  useExisting: forwardRef(() => FilterExpressionComponent)
@@ -1307,7 +1494,7 @@ class FilterExpressionComponent extends BaseFilterRowComponent {
1307
1494
  </button>
1308
1495
  </div>
1309
1496
  </div>
1310
- `, 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"] }] });
1497
+ `, 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1311
1498
  }
1312
1499
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.27", ngImport: i0, type: FilterExpressionComponent, decorators: [{
1313
1500
  type: Component,
@@ -1317,6 +1504,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.27", ngImpo
1317
1504
  useExisting: forwardRef(() => FilterExpressionComponent)
1318
1505
  }],
1319
1506
  selector: 'kendo-filter-expression',
1507
+ changeDetection: ChangeDetectionStrategy.OnPush,
1320
1508
  template: `
1321
1509
  <div class="k-filter-toolbar">
1322
1510
  <div class="k-toolbar" role="toolbar" [attr.aria-label]="messageFor('filterToolbarAriaLabel')" (mousedown)="onMouseDown($event)">
@@ -1394,7 +1582,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.27", ngImpo
1394
1582
  standalone: true,
1395
1583
  imports: [DropDownListComponent, AriaLabelValueDirective, FilterExpressionOperatorsComponent, FilterTextEditorComponent, FilterNumericEditorComponent, FilterBooleanEditorComponent, FilterDateEditorComponent, NgTemplateOutlet, ButtonComponent]
1396
1584
  }]
1397
- }], ctorParameters: () => [{ type: FilterService }, { type: i0.ElementRef }, { type: NavigationService }, { type: i1.LocalizationService }, { type: i0.Renderer2 }], propDecorators: { currentItem: [{
1585
+ }], ctorParameters: () => [{ type: FilterService }, { type: i0.ElementRef }, { type: NavigationService }, { type: i1.LocalizationService }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }], propDecorators: { currentItem: [{
1398
1586
  type: Input
1399
1587
  }] } });
1400
1588
 
@@ -1429,15 +1617,21 @@ class FilterGroupComponent extends BaseFilterRowComponent {
1429
1617
  // due to tracking by index, the filters should first be set to [] so that all rerender afterwards
1430
1618
  const filtersCopy = this.currentItem.filters;
1431
1619
  this.currentItem.filters = [];
1432
- this.cdr.detectChanges();
1620
+ this.cdr.detectChanges(); // Needed: forces @for track-by-index reset before restoring filters
1433
1621
  this.currentItem.filters = filtersCopy;
1434
1622
  }
1435
1623
  this.valueChange.emit(isRemoveOperation);
1436
1624
  }
1437
- currentItem = {
1625
+ set currentItem(value) {
1626
+ this._currentItem.set(value);
1627
+ }
1628
+ get currentItem() {
1629
+ return this._currentItem();
1630
+ }
1631
+ _currentItem = signal({
1438
1632
  logic: 'or',
1439
1633
  filters: []
1440
- };
1634
+ }, ...(ngDevMode ? [{ debugName: "_currentItem" }] : []));
1441
1635
  /**
1442
1636
  * @hidden
1443
1637
  */
@@ -1472,7 +1666,7 @@ class FilterGroupComponent extends BaseFilterRowComponent {
1472
1666
  }
1473
1667
  removeFilterGroup() {
1474
1668
  this.filterService.remove(this.currentItem, this.index);
1475
- this.cdr.detectChanges();
1669
+ this.cdr.detectChanges(); // Needed: re-renders template after filter structure mutation before emitting valueChange
1476
1670
  this.valueChange.emit(true);
1477
1671
  }
1478
1672
  onMouseDown(event) {
@@ -1573,7 +1767,7 @@ class FilterGroupComponent extends BaseFilterRowComponent {
1573
1767
  }
1574
1768
  </ul>
1575
1769
  }
1576
- `, 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"] }] });
1770
+ `, 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1577
1771
  }
1578
1772
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.27", ngImport: i0, type: FilterGroupComponent, decorators: [{
1579
1773
  type: Component,
@@ -1583,6 +1777,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.27", ngImpo
1583
1777
  useExisting: forwardRef(() => FilterGroupComponent)
1584
1778
  }],
1585
1779
  selector: 'kendo-filter-group',
1780
+ changeDetection: ChangeDetectionStrategy.OnPush,
1586
1781
  template: `
1587
1782
  <div class="k-filter-toolbar">
1588
1783
  <div class="k-toolbar" role="toolbar" [attr.aria-label]="messageFor('filterToolbarAriaLabel')" (mousedown)="onMouseDown($event)">
@@ -1678,147 +1873,327 @@ class Messages extends ComponentMessages {
1678
1873
  /**
1679
1874
  * The text of the Filter Expression `operators` drop down title.
1680
1875
  */
1681
- filterExpressionOperators;
1876
+ set filterExpressionOperators(value) {
1877
+ this._filterExpressionOperators.set(value);
1878
+ }
1879
+ get filterExpressionOperators() {
1880
+ return this._filterExpressionOperators();
1881
+ }
1682
1882
  /**
1683
1883
  * The text of the Filter Expression 'fields' drop down title.
1684
1884
  */
1685
- filterExpressionFilters;
1885
+ set filterExpressionFilters(value) {
1886
+ this._filterExpressionFilters.set(value);
1887
+ }
1888
+ get filterExpressionFilters() {
1889
+ return this._filterExpressionFilters();
1890
+ }
1686
1891
  /**
1687
1892
  * The text of the `Remove Expression` button.
1688
1893
  */
1689
- remove;
1894
+ set remove(value) {
1895
+ this._remove.set(value);
1896
+ }
1897
+ get remove() {
1898
+ return this._remove();
1899
+ }
1690
1900
  /**
1691
1901
  * The text of the Filter Group `Add Group` button.
1692
1902
  */
1693
- addGroup;
1903
+ set addGroup(value) {
1904
+ this._addGroup.set(value);
1905
+ }
1906
+ get addGroup() {
1907
+ return this._addGroup();
1908
+ }
1694
1909
  /**
1695
1910
  * The text of the Filter Group `Add Filter` button.
1696
1911
  */
1697
- addFilter;
1912
+ set addFilter(value) {
1913
+ this._addFilter.set(value);
1914
+ }
1915
+ get addFilter() {
1916
+ return this._addFilter();
1917
+ }
1698
1918
  /**
1699
1919
  * The text of the `And` Filter Group logic.
1700
1920
  */
1701
- filterAndLogic;
1921
+ set filterAndLogic(value) {
1922
+ this._filterAndLogic.set(value);
1923
+ }
1924
+ get filterAndLogic() {
1925
+ return this._filterAndLogic();
1926
+ }
1702
1927
  /**
1703
1928
  * The text of the `Or` Filter Group logic.
1704
1929
  */
1705
- filterOrLogic;
1930
+ set filterOrLogic(value) {
1931
+ this._filterOrLogic.set(value);
1932
+ }
1933
+ get filterOrLogic() {
1934
+ return this._filterOrLogic();
1935
+ }
1706
1936
  /**
1707
1937
  * The text of the `Equal` (**Is equal to**) Filter Expression operator.
1708
1938
  */
1709
- filterEqOperator;
1939
+ set filterEqOperator(value) {
1940
+ this._filterEqOperator.set(value);
1941
+ }
1942
+ get filterEqOperator() {
1943
+ return this._filterEqOperator();
1944
+ }
1710
1945
  /**
1711
1946
  * The text of the `NotEqual` (**Is not equal to**) Filter Expression operator.
1712
1947
  */
1713
- filterNotEqOperator;
1948
+ set filterNotEqOperator(value) {
1949
+ this._filterNotEqOperator.set(value);
1950
+ }
1951
+ get filterNotEqOperator() {
1952
+ return this._filterNotEqOperator();
1953
+ }
1714
1954
  /**
1715
1955
  * The text of the `IsNull` (**Is null**) Filter Expression operator.
1716
1956
  */
1717
- filterIsNullOperator;
1957
+ set filterIsNullOperator(value) {
1958
+ this._filterIsNullOperator.set(value);
1959
+ }
1960
+ get filterIsNullOperator() {
1961
+ return this._filterIsNullOperator();
1962
+ }
1718
1963
  /**
1719
1964
  * The text of the `IsNotNull` (**Is not null**) Filter Expression operator.
1720
1965
  */
1721
- filterIsNotNullOperator;
1966
+ set filterIsNotNullOperator(value) {
1967
+ this._filterIsNotNullOperator.set(value);
1968
+ }
1969
+ get filterIsNotNullOperator() {
1970
+ return this._filterIsNotNullOperator();
1971
+ }
1722
1972
  /**
1723
1973
  * The text of the `IsEmpty` (**Is empty**) Filter Expression operator.
1724
1974
  */
1725
- filterIsEmptyOperator;
1975
+ set filterIsEmptyOperator(value) {
1976
+ this._filterIsEmptyOperator.set(value);
1977
+ }
1978
+ get filterIsEmptyOperator() {
1979
+ return this._filterIsEmptyOperator();
1980
+ }
1726
1981
  /**
1727
1982
  * The text of the `IsNotEmpty` (**Is not empty**) Filter Expression operator.
1728
1983
  */
1729
- filterIsNotEmptyOperator;
1984
+ set filterIsNotEmptyOperator(value) {
1985
+ this._filterIsNotEmptyOperator.set(value);
1986
+ }
1987
+ get filterIsNotEmptyOperator() {
1988
+ return this._filterIsNotEmptyOperator();
1989
+ }
1730
1990
  /**
1731
1991
  * The text of the `StartsWith` (**Starts with**) Filter Expression operator.
1732
1992
  */
1733
- filterStartsWithOperator;
1993
+ set filterStartsWithOperator(value) {
1994
+ this._filterStartsWithOperator.set(value);
1995
+ }
1996
+ get filterStartsWithOperator() {
1997
+ return this._filterStartsWithOperator();
1998
+ }
1734
1999
  /**
1735
2000
  * The text of the `Contains` (**Contains**) Filter Expression operator.
1736
2001
  */
1737
- filterContainsOperator;
2002
+ set filterContainsOperator(value) {
2003
+ this._filterContainsOperator.set(value);
2004
+ }
2005
+ get filterContainsOperator() {
2006
+ return this._filterContainsOperator();
2007
+ }
1738
2008
  /**
1739
2009
  * The text of the `DoesNotContain` (**Does not contain**) Filter Expression operator.
1740
2010
  */
1741
- filterNotContainsOperator;
2011
+ set filterNotContainsOperator(value) {
2012
+ this._filterNotContainsOperator.set(value);
2013
+ }
2014
+ get filterNotContainsOperator() {
2015
+ return this._filterNotContainsOperator();
2016
+ }
1742
2017
  /**
1743
2018
  * The text of the `EndsWith` (**Ends with**) string Filter Expression operator.
1744
2019
  */
1745
- filterEndsWithOperator;
2020
+ set filterEndsWithOperator(value) {
2021
+ this._filterEndsWithOperator.set(value);
2022
+ }
2023
+ get filterEndsWithOperator() {
2024
+ return this._filterEndsWithOperator();
2025
+ }
1746
2026
  /**
1747
2027
  * The text of the `GreaterOrEqualTo` (**Is greater than or equal to**) numeric Filter Expression operator.
1748
2028
  */
1749
- filterGteOperator;
2029
+ set filterGteOperator(value) {
2030
+ this._filterGteOperator.set(value);
2031
+ }
2032
+ get filterGteOperator() {
2033
+ return this._filterGteOperator();
2034
+ }
1750
2035
  /**
1751
2036
  * The text of the `Greater` (**Is greater than**) numeric Filter Expression operator.
1752
2037
  */
1753
- filterGtOperator;
2038
+ set filterGtOperator(value) {
2039
+ this._filterGtOperator.set(value);
2040
+ }
2041
+ get filterGtOperator() {
2042
+ return this._filterGtOperator();
2043
+ }
1754
2044
  /**
1755
2045
  * The text of the `LessOrEqualTo` (**Is less than or equal to**) numeric Filter Expression operator.
1756
2046
  */
1757
- filterLteOperator;
2047
+ set filterLteOperator(value) {
2048
+ this._filterLteOperator.set(value);
2049
+ }
2050
+ get filterLteOperator() {
2051
+ return this._filterLteOperator();
2052
+ }
1758
2053
  /**
1759
2054
  * The text of the `Less` (**Is less than**) numeric Filter Expression operator.
1760
2055
  */
1761
- filterLtOperator;
2056
+ set filterLtOperator(value) {
2057
+ this._filterLtOperator.set(value);
2058
+ }
2059
+ get filterLtOperator() {
2060
+ return this._filterLtOperator();
2061
+ }
1762
2062
  /**
1763
2063
  * The text of the `IsTrue` boolean Filter Expression option.
1764
2064
  */
1765
- filterIsTrue;
2065
+ set filterIsTrue(value) {
2066
+ this._filterIsTrue.set(value);
2067
+ }
2068
+ get filterIsTrue() {
2069
+ return this._filterIsTrue();
2070
+ }
1766
2071
  /**
1767
2072
  * The text of the `IsFalse` boolean Filter Expression option.
1768
2073
  */
1769
- filterIsFalse;
2074
+ set filterIsFalse(value) {
2075
+ this._filterIsFalse.set(value);
2076
+ }
2077
+ get filterIsFalse() {
2078
+ return this._filterIsFalse();
2079
+ }
1770
2080
  /**
1771
2081
  * The text of the `(All)` boolean Filter Expression option.
1772
2082
  */
1773
- filterBooleanAll;
2083
+ set filterBooleanAll(value) {
2084
+ this._filterBooleanAll.set(value);
2085
+ }
2086
+ get filterBooleanAll() {
2087
+ return this._filterBooleanAll();
2088
+ }
1774
2089
  /**
1775
2090
  * The text of the `AfterOrEqualTo` (**Is after or equal to**) date Filter Expression operator.
1776
2091
  */
1777
- filterAfterOrEqualOperator;
2092
+ set filterAfterOrEqualOperator(value) {
2093
+ this._filterAfterOrEqualOperator.set(value);
2094
+ }
2095
+ get filterAfterOrEqualOperator() {
2096
+ return this._filterAfterOrEqualOperator();
2097
+ }
1778
2098
  /**
1779
2099
  * The text of the `After` (**Is after**) date Filter Expression operator.
1780
2100
  */
1781
- filterAfterOperator;
2101
+ set filterAfterOperator(value) {
2102
+ this._filterAfterOperator.set(value);
2103
+ }
2104
+ get filterAfterOperator() {
2105
+ return this._filterAfterOperator();
2106
+ }
1782
2107
  /**
1783
2108
  * The text of the `Before` (**Is before**) date Filter Expression operator.
1784
2109
  */
1785
- filterBeforeOperator;
2110
+ set filterBeforeOperator(value) {
2111
+ this._filterBeforeOperator.set(value);
2112
+ }
2113
+ get filterBeforeOperator() {
2114
+ return this._filterBeforeOperator();
2115
+ }
1786
2116
  /**
1787
2117
  * The text of the `BeforeOrEqualTo` (**Is before or equal to**) date Filter Expression operator.
1788
2118
  */
1789
- filterBeforeOrEqualOperator;
2119
+ set filterBeforeOrEqualOperator(value) {
2120
+ this._filterBeforeOrEqualOperator.set(value);
2121
+ }
2122
+ get filterBeforeOrEqualOperator() {
2123
+ return this._filterBeforeOrEqualOperator();
2124
+ }
1790
2125
  /**
1791
2126
  * The title of the Decrement button of the Filter Expression numeric editor.
1792
2127
  */
1793
- editorNumericDecrement;
2128
+ set editorNumericDecrement(value) {
2129
+ this._editorNumericDecrement.set(value);
2130
+ }
2131
+ get editorNumericDecrement() {
2132
+ return this._editorNumericDecrement();
2133
+ }
1794
2134
  /**
1795
2135
  * The title of the Increment button of the Filter Expression numeric editor.
1796
2136
  */
1797
- editorNumericIncrement;
2137
+ set editorNumericIncrement(value) {
2138
+ this._editorNumericIncrement.set(value);
2139
+ }
2140
+ get editorNumericIncrement() {
2141
+ return this._editorNumericIncrement();
2142
+ }
1798
2143
  /**
1799
2144
  * The text of the Today button of the Filter Expression date editor.
1800
2145
  */
1801
- editorDateTodayText;
2146
+ set editorDateTodayText(value) {
2147
+ this._editorDateTodayText.set(value);
2148
+ }
2149
+ get editorDateTodayText() {
2150
+ return this._editorDateTodayText();
2151
+ }
1802
2152
  /**
1803
2153
  * The title of the Toggle button of the Filter Expression date editor.
1804
2154
  */
1805
- editorDateToggleText;
2155
+ set editorDateToggleText(value) {
2156
+ this._editorDateToggleText.set(value);
2157
+ }
2158
+ get editorDateToggleText() {
2159
+ return this._editorDateToggleText();
2160
+ }
1806
2161
  /**
1807
2162
  * The text of the filter field aria label.
1808
2163
  */
1809
- filterFieldAriaLabel;
2164
+ set filterFieldAriaLabel(value) {
2165
+ this._filterFieldAriaLabel.set(value);
2166
+ }
2167
+ get filterFieldAriaLabel() {
2168
+ return this._filterFieldAriaLabel();
2169
+ }
1810
2170
  /**
1811
2171
  * The text of the filter operator aria label.
1812
2172
  */
1813
- filterOperatorAriaLabel;
2173
+ set filterOperatorAriaLabel(value) {
2174
+ this._filterOperatorAriaLabel.set(value);
2175
+ }
2176
+ get filterOperatorAriaLabel() {
2177
+ return this._filterOperatorAriaLabel();
2178
+ }
1814
2179
  /**
1815
2180
  * The text of the filter value aria label.
1816
2181
  */
1817
- filterValueAriaLabel;
2182
+ set filterValueAriaLabel(value) {
2183
+ this._filterValueAriaLabel.set(value);
2184
+ }
2185
+ get filterValueAriaLabel() {
2186
+ return this._filterValueAriaLabel();
2187
+ }
1818
2188
  /**
1819
2189
  * The text of the filter row aria label.
1820
2190
  */
1821
- filterToolbarAriaLabel;
2191
+ set filterToolbarAriaLabel(value) {
2192
+ this._filterToolbarAriaLabel.set(value);
2193
+ }
2194
+ get filterToolbarAriaLabel() {
2195
+ return this._filterToolbarAriaLabel();
2196
+ }
1822
2197
  /**
1823
2198
  * The text of the Remove Group button.
1824
2199
  */
@@ -1826,7 +2201,49 @@ class Messages extends ComponentMessages {
1826
2201
  /**
1827
2202
  * The text of the filter toolbar aria label.
1828
2203
  */
1829
- filterComponentAriaLabel;
2204
+ set filterComponentAriaLabel(value) {
2205
+ this._filterComponentAriaLabel.set(value);
2206
+ }
2207
+ get filterComponentAriaLabel() {
2208
+ return this._filterComponentAriaLabel();
2209
+ }
2210
+ _filterExpressionOperators = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterExpressionOperators" }] : []));
2211
+ _filterExpressionFilters = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterExpressionFilters" }] : []));
2212
+ _remove = signal(undefined, ...(ngDevMode ? [{ debugName: "_remove" }] : []));
2213
+ _addGroup = signal(undefined, ...(ngDevMode ? [{ debugName: "_addGroup" }] : []));
2214
+ _addFilter = signal(undefined, ...(ngDevMode ? [{ debugName: "_addFilter" }] : []));
2215
+ _filterAndLogic = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterAndLogic" }] : []));
2216
+ _filterOrLogic = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterOrLogic" }] : []));
2217
+ _filterEqOperator = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterEqOperator" }] : []));
2218
+ _filterNotEqOperator = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterNotEqOperator" }] : []));
2219
+ _filterIsNullOperator = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterIsNullOperator" }] : []));
2220
+ _filterIsNotNullOperator = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterIsNotNullOperator" }] : []));
2221
+ _filterIsEmptyOperator = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterIsEmptyOperator" }] : []));
2222
+ _filterIsNotEmptyOperator = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterIsNotEmptyOperator" }] : []));
2223
+ _filterStartsWithOperator = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterStartsWithOperator" }] : []));
2224
+ _filterContainsOperator = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterContainsOperator" }] : []));
2225
+ _filterNotContainsOperator = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterNotContainsOperator" }] : []));
2226
+ _filterEndsWithOperator = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterEndsWithOperator" }] : []));
2227
+ _filterGteOperator = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterGteOperator" }] : []));
2228
+ _filterGtOperator = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterGtOperator" }] : []));
2229
+ _filterLteOperator = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterLteOperator" }] : []));
2230
+ _filterLtOperator = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterLtOperator" }] : []));
2231
+ _filterIsTrue = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterIsTrue" }] : []));
2232
+ _filterIsFalse = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterIsFalse" }] : []));
2233
+ _filterBooleanAll = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterBooleanAll" }] : []));
2234
+ _filterAfterOrEqualOperator = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterAfterOrEqualOperator" }] : []));
2235
+ _filterAfterOperator = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterAfterOperator" }] : []));
2236
+ _filterBeforeOperator = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterBeforeOperator" }] : []));
2237
+ _filterBeforeOrEqualOperator = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterBeforeOrEqualOperator" }] : []));
2238
+ _editorNumericDecrement = signal(undefined, ...(ngDevMode ? [{ debugName: "_editorNumericDecrement" }] : []));
2239
+ _editorNumericIncrement = signal(undefined, ...(ngDevMode ? [{ debugName: "_editorNumericIncrement" }] : []));
2240
+ _editorDateTodayText = signal(undefined, ...(ngDevMode ? [{ debugName: "_editorDateTodayText" }] : []));
2241
+ _editorDateToggleText = signal(undefined, ...(ngDevMode ? [{ debugName: "_editorDateToggleText" }] : []));
2242
+ _filterFieldAriaLabel = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterFieldAriaLabel" }] : []));
2243
+ _filterOperatorAriaLabel = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterOperatorAriaLabel" }] : []));
2244
+ _filterValueAriaLabel = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterValueAriaLabel" }] : []));
2245
+ _filterToolbarAriaLabel = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterToolbarAriaLabel" }] : []));
2246
+ _filterComponentAriaLabel = signal(undefined, ...(ngDevMode ? [{ debugName: "_filterComponentAriaLabel" }] : []));
1830
2247
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.27", ngImport: i0, type: Messages, deps: null, target: i0.ɵɵFactoryTarget.Directive });
1831
2248
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.27", type: Messages, isStandalone: true, selector: "[kendoFilterMessages]", inputs: { filterExpressionOperators: "filterExpressionOperators", filterExpressionFilters: "filterExpressionFilters", remove: "remove", addGroup: "addGroup", addFilter: "addFilter", filterAndLogic: "filterAndLogic", filterOrLogic: "filterOrLogic", filterEqOperator: "filterEqOperator", filterNotEqOperator: "filterNotEqOperator", filterIsNullOperator: "filterIsNullOperator", filterIsNotNullOperator: "filterIsNotNullOperator", filterIsEmptyOperator: "filterIsEmptyOperator", filterIsNotEmptyOperator: "filterIsNotEmptyOperator", filterStartsWithOperator: "filterStartsWithOperator", filterContainsOperator: "filterContainsOperator", filterNotContainsOperator: "filterNotContainsOperator", filterEndsWithOperator: "filterEndsWithOperator", filterGteOperator: "filterGteOperator", filterGtOperator: "filterGtOperator", filterLteOperator: "filterLteOperator", filterLtOperator: "filterLtOperator", filterIsTrue: "filterIsTrue", filterIsFalse: "filterIsFalse", filterBooleanAll: "filterBooleanAll", filterAfterOrEqualOperator: "filterAfterOrEqualOperator", filterAfterOperator: "filterAfterOperator", filterBeforeOperator: "filterBeforeOperator", filterBeforeOrEqualOperator: "filterBeforeOrEqualOperator", editorNumericDecrement: "editorNumericDecrement", editorNumericIncrement: "editorNumericIncrement", editorDateTodayText: "editorDateTodayText", editorDateToggleText: "editorDateToggleText", filterFieldAriaLabel: "filterFieldAriaLabel", filterOperatorAriaLabel: "filterOperatorAriaLabel", filterValueAriaLabel: "filterValueAriaLabel", filterToolbarAriaLabel: "filterToolbarAriaLabel", removeGroup: "removeGroup", filterComponentAriaLabel: "filterComponentAriaLabel" }, usesInheritance: true, ngImport: i0 });
1832
2249
  }
@@ -2069,18 +2486,20 @@ class FilterComponent {
2069
2486
  */
2070
2487
  set filters(_filters) {
2071
2488
  if (_filters.length > 0) {
2072
- this.filterService.filters = _filters.map(filterExpression => {
2489
+ const mapped = _filters.map(filterExpression => {
2073
2490
  const clonedFilter = Object.assign({}, filterExpression);
2074
2491
  if (!clonedFilter.title) {
2075
2492
  clonedFilter.title = clonedFilter.field;
2076
2493
  }
2077
2494
  return clonedFilter;
2078
2495
  });
2496
+ this._filters.set(mapped);
2497
+ this.filterService.filters = this._filters();
2079
2498
  this.setValue(this.value);
2080
2499
  }
2081
2500
  }
2082
2501
  get filters() {
2083
- return this.filterService.filters;
2502
+ return this._filters();
2084
2503
  }
2085
2504
  /**
2086
2505
  * Sets the initial `value` of the Filter component.
@@ -2088,17 +2507,17 @@ class FilterComponent {
2088
2507
  set value(value) {
2089
2508
  const clonedValue = structuredClone(value);
2090
2509
  if (this.filtersTypeChanged(this.value, clonedValue)) {
2091
- // due to tracking group items by index, the filters should first be set to [] when the value is changed programmatically
2092
- this.currentFilter.filters = [];
2093
- this.cdr.detectChanges();
2510
+ // Resets @for track-by-index so Angular destroys+recreates child components before restoring filters
2511
+ this._currentFilter.set({ ...this._currentFilter(), filters: [] });
2512
+ this.cdr.detectChanges(); // Needed: forces @for track-by-index reset before restoring filters
2094
2513
  }
2095
- this._value = clonedValue;
2514
+ this._value.set(clonedValue);
2096
2515
  if (this.filters.length > 0) {
2097
- this.setValue(this.value);
2516
+ this.setValue(this._value());
2098
2517
  }
2099
2518
  }
2100
2519
  get value() {
2101
- return this._value;
2520
+ return this._value();
2102
2521
  }
2103
2522
  /**
2104
2523
  * Fires every time the Filter component value is updated.
@@ -2107,7 +2526,8 @@ class FilterComponent {
2107
2526
  valueChange = new EventEmitter();
2108
2527
  localizationSubscription;
2109
2528
  filterFieldsSubscription;
2110
- _value = { filters: [], logic: 'and' };
2529
+ _value = signal({ filters: [], logic: 'and' }, ...(ngDevMode ? [{ debugName: "_value" }] : []));
2530
+ _filters = signal([], ...(ngDevMode ? [{ debugName: "_filters" }] : []));
2111
2531
  filterFields;
2112
2532
  fieldTemplate;
2113
2533
  _filterItems;
@@ -2130,7 +2550,7 @@ class FilterComponent {
2130
2550
  ngOnInit() {
2131
2551
  this.localizationSubscription = this.localization.changes.subscribe(({ rtl }) => {
2132
2552
  this.direction = rtl ? 'rtl' : 'ltr';
2133
- this.cdr.detectChanges();
2553
+ this.cdr.markForCheck();
2134
2554
  });
2135
2555
  }
2136
2556
  ngAfterContentInit() {
@@ -2151,8 +2571,11 @@ class FilterComponent {
2151
2571
  filterFieldsChanged() {
2152
2572
  if (this.filterFields && this.filterFields.length > 0) {
2153
2573
  this.filters = this.filterFields.map((filterField) => ({
2154
- ...filterField,
2155
- title: filterField.title,
2574
+ field: filterField.field,
2575
+ title: filterField.title || filterField.field,
2576
+ editor: filterField.editor,
2577
+ operators: filterField.operators,
2578
+ editorFormat: filterField.editorFormat,
2156
2579
  editorTemplate: filterField.editorTemplate?.templateRef,
2157
2580
  operatorTemplate: filterField.operatorTemplate?.templateRef
2158
2581
  }));
@@ -2167,24 +2590,24 @@ class FilterComponent {
2167
2590
  this.renderer.setAttribute(firstElement, 'tabindex', '0');
2168
2591
  }
2169
2592
  }
2170
- _currentFilter = { logic: 'and', filters: [] };
2593
+ _currentFilter = signal({ logic: 'and', filters: [] }, ...(ngDevMode ? [{ debugName: "_currentFilter" }] : []));
2171
2594
  /**
2172
2595
  * @hidden
2173
2596
  */
2174
2597
  get currentFilter() {
2175
- return this._currentFilter;
2598
+ return this._currentFilter();
2176
2599
  }
2177
2600
  /**
2178
2601
  * @hidden
2179
2602
  */
2180
2603
  set currentFilter(value) {
2181
- this._currentFilter = value;
2604
+ this._currentFilter.set(value);
2182
2605
  }
2183
2606
  /**
2184
2607
  * @hidden
2185
2608
  */
2186
2609
  onValueChange(isRemoveOperation) {
2187
- this.cdr.detectChanges();
2610
+ this.cdr.detectChanges(); // Needed: re-renders template with mutated filter structure (plain object mutation, not signal)
2188
2611
  this.valueChange.emit(this.filterService.normalizedValue);
2189
2612
  this.navigationService.reset(this.filterItems);
2190
2613
  if (isRemoveOperation) {
@@ -2232,7 +2655,7 @@ class FilterComponent {
2232
2655
  this.normalizeValue(items);
2233
2656
  this.filterService.normalizedValue = items;
2234
2657
  this.currentFilter = items;
2235
- this.cdr.detectChanges();
2658
+ this.cdr.detectChanges(); // Needed: populates filterItems ViewChildren synchronously before reset() reads them
2236
2659
  this.navigationService.reset(this.filterItems);
2237
2660
  }
2238
2661
  normalizeValue(items) {
@@ -2415,7 +2838,7 @@ class FilterComponent {
2415
2838
  </li>
2416
2839
  </ul>
2417
2840
  </div>
2418
- `, isInline: true, dependencies: [{ kind: "directive", type: LocalizedMessagesDirective, selector: "[kendoFilterLocalizedMessages]" }, { kind: "component", type: FilterGroupComponent, selector: "kendo-filter-group", inputs: ["currentItem"] }] });
2841
+ `, isInline: true, dependencies: [{ kind: "directive", type: LocalizedMessagesDirective, selector: "[kendoFilterLocalizedMessages]" }, { kind: "component", type: FilterGroupComponent, selector: "kendo-filter-group", inputs: ["currentItem"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2419
2842
  }
2420
2843
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.27", ngImport: i0, type: FilterComponent, decorators: [{
2421
2844
  type: Component,
@@ -2560,6 +2983,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.27", ngImpo
2560
2983
  </ul>
2561
2984
  </div>
2562
2985
  `,
2986
+ changeDetection: ChangeDetectionStrategy.OnPush,
2563
2987
  standalone: true,
2564
2988
  imports: [LocalizedMessagesDirective, FilterGroupComponent]
2565
2989
  }]
@@ -2624,7 +3048,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.27", ngImpo
2624
3048
  ],
2625
3049
  selector: 'kendo-filter-messages',
2626
3050
  template: ``,
2627
- standalone: true
3051
+ standalone: true,
2628
3052
  }]
2629
3053
  }], ctorParameters: () => [{ type: i1.LocalizationService }] });
2630
3054