@progress/kendo-angular-grid 20.1.0-develop.2 → 20.1.0-develop.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/column-menu/column-list.component.d.ts +0 -2
  2. package/columns/column.component.d.ts +8 -1
  3. package/columns/command-column.component.d.ts +1 -1
  4. package/columns/span-column.component.d.ts +1 -1
  5. package/editing/cancel-command.directive.d.ts +1 -1
  6. package/editing/edit-row-options.interface.d.ts +1 -1
  7. package/editing/edit-template.directive.d.ts +1 -1
  8. package/editing/remove-command.directive.d.ts +1 -1
  9. package/editing/save-command.directive.d.ts +1 -1
  10. package/editing-directives/edit-service.interface.d.ts +2 -2
  11. package/editing-directives/external-editing.directive.d.ts +1 -1
  12. package/editing-directives/in-cell-editing.directive.d.ts +1 -1
  13. package/editing-directives/reactive-editing.directive.d.ts +1 -1
  14. package/editing-directives/template-editing.directive.d.ts +1 -1
  15. package/esm2022/column-menu/column-list-kb-nav.service.mjs +1 -1
  16. package/esm2022/column-menu/column-list.component.mjs +7 -43
  17. package/esm2022/column-menu/column-menu-container.component.mjs +10 -1
  18. package/esm2022/column-menu/column-menu.component.mjs +7 -1
  19. package/esm2022/columns/column.component.mjs +9 -1
  20. package/esm2022/columns/command-column.component.mjs +1 -1
  21. package/esm2022/columns/span-column.component.mjs +1 -1
  22. package/esm2022/editing/cancel-command.directive.mjs +1 -1
  23. package/esm2022/editing/edit-template.directive.mjs +1 -1
  24. package/esm2022/editing/remove-command.directive.mjs +1 -1
  25. package/esm2022/editing/save-command.directive.mjs +1 -1
  26. package/esm2022/editing-directives/external-editing.directive.mjs +1 -1
  27. package/esm2022/editing-directives/in-cell-editing.directive.mjs +1 -1
  28. package/esm2022/editing-directives/reactive-editing.directive.mjs +1 -1
  29. package/esm2022/editing-directives/template-editing.directive.mjs +1 -1
  30. package/esm2022/filtering/menu/filter-menu-container.component.mjs +120 -31
  31. package/esm2022/filtering/menu/filter-menu-input-wrapper.component.mjs +2 -2
  32. package/esm2022/filtering/menu/filter-menu.component.mjs +11 -7
  33. package/esm2022/filtering/multicheckbox-filter.component.mjs +268 -0
  34. package/esm2022/grid.component.mjs +21 -3
  35. package/esm2022/index.mjs +1 -0
  36. package/esm2022/localization/messages.mjs +28 -1
  37. package/esm2022/navigation/logical-cell.directive.mjs +8 -2
  38. package/esm2022/navigation/navigation.service.mjs +1 -0
  39. package/esm2022/package-metadata.mjs +2 -2
  40. package/esm2022/rendering/common/field-accessor.pipe.mjs +1 -1
  41. package/esm2022/rendering/common/format.pipe.mjs +37 -0
  42. package/esm2022/rendering/header/header.component.mjs +1 -1
  43. package/esm2022/rendering/list.component.mjs +18 -2
  44. package/esm2022/rendering/toolbar/tools/column-chooser-tool.directive.mjs +1 -1
  45. package/esm2022/rendering/toolbar/tools/filter-toolbar-tool.component.mjs +1 -1
  46. package/esm2022/rendering/toolbar/tools/group-toolbar-tool.component.mjs +2 -2
  47. package/esm2022/rendering/toolbar/tools/sort-toolbar-tool.component.mjs +1 -1
  48. package/esm2022/scrolling/scroller.service.mjs +0 -3
  49. package/fesm2022/progress-kendo-angular-grid.mjs +553 -132
  50. package/filtering/filterable.d.ts +23 -0
  51. package/filtering/menu/filter-menu-container.component.d.ts +5 -1
  52. package/filtering/menu/filter-menu.component.d.ts +3 -4
  53. package/filtering/multicheckbox-filter.component.d.ts +41 -0
  54. package/grid.component.d.ts +3 -3
  55. package/index.d.ts +1 -0
  56. package/localization/messages.d.ts +22 -1
  57. package/navigation/navigation.service.d.ts +1 -0
  58. package/package.json +21 -21
  59. package/rendering/common/format.pipe.d.ts +17 -0
  60. package/rendering/list.component.d.ts +1 -0
  61. package/schematics/ngAdd/index.js +4 -4
@@ -6,7 +6,7 @@ import * as i0 from '@angular/core';
6
6
  import { EventEmitter, Injectable, SecurityContext, InjectionToken, Optional, Inject, Directive, SkipSelf, Input, isDevMode, QueryList, Component, ContentChildren, ContentChild, forwardRef, Host, Output, HostBinding, Pipe, TemplateRef, ChangeDetectionStrategy, ViewChildren, ViewChild, Self, NgZone, HostListener, ElementRef, ViewContainerRef, ViewEncapsulation, inject, Injector, NgModule } from '@angular/core';
7
7
  import { merge, of, Subject, zip as zip$1, from, Subscription, interval, fromEvent, Observable, BehaviorSubject } from 'rxjs';
8
8
  import * as i1$3 from '@progress/kendo-angular-common';
9
- import { isDocumentAvailable, Keys, hasClasses as hasClasses$1, isPresent as isPresent$1, normalizeNumpadKeys, anyChanged, TemplateContextDirective, DraggableDirective, EventsOutsideAngularDirective, replaceMessagePlaceholder, isChanged as isChanged$1, KendoInput, guid, PrefixTemplateDirective, closest as closest$1, hasObservers, ResizeSensorComponent, isFirefox, firefoxMaxHeight, closestInScope as closestInScope$1, isFocusable as isFocusable$1, PreventableEvent as PreventableEvent$1, getLicenseMessage, shouldShowValidationUI, WatermarkOverlayComponent, ResizeBatchService } from '@progress/kendo-angular-common';
9
+ import { isDocumentAvailable, Keys, hasClasses as hasClasses$1, isPresent as isPresent$1, normalizeNumpadKeys, anyChanged, TemplateContextDirective, DraggableDirective, EventsOutsideAngularDirective, replaceMessagePlaceholder, isChanged as isChanged$1, KendoInput, guid, areObjectsEqual, PrefixTemplateDirective, closest as closest$1, hasObservers, ResizeSensorComponent, isFirefox, firefoxMaxHeight, closestInScope as closestInScope$1, isFocusable as isFocusable$1, PreventableEvent as PreventableEvent$1, getLicenseMessage, shouldShowValidationUI, WatermarkOverlayComponent, ResizeBatchService } from '@progress/kendo-angular-common';
10
10
  import * as i1 from '@angular/platform-browser';
11
11
  import * as i1$1 from '@progress/kendo-angular-icons';
12
12
  import { IconWrapperComponent, IconsService, KENDO_ICONS } from '@progress/kendo-angular-icons';
@@ -32,7 +32,7 @@ import { NG_VALUE_ACCESSOR, FormsModule, ReactiveFormsModule, FormControl, FormG
32
32
  import * as i2$1 from '@progress/kendo-angular-utils';
33
33
  import { DragTargetContainerDirective, DropTargetContainerDirective } from '@progress/kendo-angular-utils';
34
34
  import * as i4 from '@progress/kendo-angular-inputs';
35
- import { TextBoxComponent, NumericTextBoxComponent, NumericTextBoxCustomMessagesComponent, RadioButtonComponent, CheckBoxComponent, KENDO_FORMFIELD, KENDO_TEXTBOX, KENDO_NUMERICTEXTBOX, KENDO_CHECKBOX } from '@progress/kendo-angular-inputs';
35
+ import { TextBoxComponent, NumericTextBoxComponent, NumericTextBoxCustomMessagesComponent, RadioButtonComponent, CheckBoxComponent, TextBoxPrefixTemplateDirective, KENDO_FORMFIELD, KENDO_TEXTBOX, KENDO_NUMERICTEXTBOX, KENDO_CHECKBOX } from '@progress/kendo-angular-inputs';
36
36
  import * as i5 from '@progress/kendo-angular-dateinputs';
37
37
  import { DatePickerComponent, DatePickerCustomMessagesComponent, KENDO_DATEPICKER, CalendarDOMService, CenturyViewService, DecadeViewService, MonthViewService, YearViewService, NavigationService as NavigationService$1 } from '@progress/kendo-angular-dateinputs';
38
38
  import * as i54 from '@progress/kendo-angular-toolbar';
@@ -1933,7 +1933,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1933
1933
  }] }]; } });
1934
1934
 
1935
1935
  /**
1936
- * Lets you customize the content of edited cells by providing a column edit-cell template for the Grid ([see example](slug:custom_reactive_editing_grid#toc-setting-up-custom-inputs)).
1936
+ * Lets you customize the content of edited cells by providing a column edit-cell template for the Grid ([see example](slug:custom_editors_grid#setting-up-custom-editors)).
1937
1937
  * Place an `<ng-template>` tag with the `kendoGridEditTemplate` directive inside a `<kendo-grid-column>` tag to define the template.
1938
1938
  *
1939
1939
  * The template context includes:
@@ -2869,6 +2869,12 @@ class ColumnComponent extends ColumnBase {
2869
2869
  * @default 'text'
2870
2870
  */
2871
2871
  filter = 'text';
2872
+ /**
2873
+ * Specifies the filter type for the filter menu UI.
2874
+ *
2875
+ * @default 'default'
2876
+ */
2877
+ filterVariant = 'default';
2872
2878
  /**
2873
2879
  * Shows or hides the filter UI for this column. [See example](slug:filtering_grid).
2874
2880
  *
@@ -2916,7 +2922,7 @@ class ColumnComponent extends ColumnBase {
2916
2922
  return this.title === undefined ? this.field : this.title;
2917
2923
  }
2918
2924
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColumnComponent, deps: [{ token: ColumnBase, host: true, optional: true, skipSelf: true }, { token: IdService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
2919
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ColumnComponent, isStandalone: true, selector: "kendo-grid-column", inputs: { field: "field", format: "format", sortable: "sortable", groupable: "groupable", editor: "editor", filter: "filter", filterable: "filterable", editable: "editable" }, providers: [
2925
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ColumnComponent, isStandalone: true, selector: "kendo-grid-column", inputs: { field: "field", format: "format", sortable: "sortable", groupable: "groupable", editor: "editor", filter: "filter", filterVariant: "filterVariant", filterable: "filterable", editable: "editable" }, providers: [
2920
2926
  {
2921
2927
  provide: ColumnBase,
2922
2928
  useExisting: forwardRef(() => ColumnComponent)
@@ -2956,6 +2962,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
2956
2962
  type: Input
2957
2963
  }], filter: [{
2958
2964
  type: Input
2965
+ }], filterVariant: [{
2966
+ type: Input
2959
2967
  }], filterable: [{
2960
2968
  type: Input
2961
2969
  }], editable: [{
@@ -3045,7 +3053,7 @@ class SpanColumnComponent extends ColumnBase {
3045
3053
  includeInChooser = false;
3046
3054
  /**
3047
3055
  * Sets whether the edit template of the column is rendered.
3048
- * To enable editing for a spanned column, set an edit template for it ([see example](slug:custom_reactive_editing_grid)).
3056
+ * To enable editing for a spanned column, set an edit template for it ([see example](slug:custom_editors_grid#setting-up-custom-editors)).
3049
3057
  * @default false
3050
3058
  */
3051
3059
  set editable(value) {
@@ -3507,6 +3515,7 @@ class NavigationService {
3507
3515
  return columnIndexInsideGroup !== columnGroupChildren.length - 1;
3508
3516
  }
3509
3517
  }
3518
+ preventScroll = false;
3510
3519
  viewport;
3511
3520
  columnViewport;
3512
3521
  activeRowIndex = 0;
@@ -5264,8 +5273,14 @@ class LogicalCellDirective {
5264
5273
  this.focusGroup.focus();
5265
5274
  }
5266
5275
  else {
5267
- if (!this.logicalSlaveCell && this.navigationService.autoFocusCell(this.logicalColIndex, this.logicalColIndex + this.colSpan - 1)) {
5268
- this.microtask(() => this.isFocused() && el.focus());
5276
+ if (!this.logicalSlaveCell &&
5277
+ this.navigationService.autoFocusCell(this.logicalColIndex, this.logicalColIndex + this.colSpan - 1)) {
5278
+ this.microtask(() => {
5279
+ if (this.isFocused()) {
5280
+ el.focus({ preventScroll: this.navigationService.preventScroll });
5281
+ this.navigationService.preventScroll = false;
5282
+ }
5283
+ });
5269
5284
  }
5270
5285
  this.renderer.addClass(el, 'k-focus');
5271
5286
  }
@@ -5478,7 +5493,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
5478
5493
  args: ['attr.aria-owns']
5479
5494
  }] } });
5480
5495
 
5481
- const FORMAT_REGEX = /\{\d+:?/;
5496
+ const FORMAT_REGEX$1 = /\{\d+:?/;
5482
5497
  /**
5483
5498
  * @hidden
5484
5499
  */
@@ -5499,7 +5514,7 @@ class FieldAccessorPipe {
5499
5514
  }
5500
5515
  formatValue(format, value) {
5501
5516
  const intl = this.intlService;
5502
- if (isString(format) && format.match(FORMAT_REGEX)) {
5517
+ if (isString(format) && FORMAT_REGEX$1.exec(format)) {
5503
5518
  return intl.format(format, value);
5504
5519
  }
5505
5520
  return intl.toString(value, format);
@@ -8964,11 +8979,11 @@ class FilterMenuInputWrapperComponent extends FilterInputWrapperComponent {
8964
8979
  this.filterService.menuTabbingService.firstFocusable = this.firstOperatorDropDown;
8965
8980
  if (this.ctx.grid?.isActionSheetExpanded) {
8966
8981
  this.subs.add(this.adaptiveGridService.animationEnd.subscribe(() => {
8967
- this.firstOperatorDropDown.focus();
8982
+ this.firstOperatorDropDown.wrapper.nativeElement.focus({ preventScroll: true });
8968
8983
  }));
8969
8984
  }
8970
8985
  else {
8971
- this.firstOperatorDropDown.focus();
8986
+ this.firstOperatorDropDown.wrapper.nativeElement.focus({ preventScroll: true });
8972
8987
  }
8973
8988
  }
8974
8989
  }
@@ -10670,6 +10685,300 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
10670
10685
  type: Input
10671
10686
  }] } });
10672
10687
 
10688
+ /**
10689
+ * @hidden
10690
+ */
10691
+ class LocalDataChangesService {
10692
+ changes = new EventEmitter();
10693
+ data;
10694
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LocalDataChangesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
10695
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LocalDataChangesService });
10696
+ }
10697
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LocalDataChangesService, decorators: [{
10698
+ type: Injectable
10699
+ }] });
10700
+
10701
+ const FORMAT_REGEX = /\{\d+:?/;
10702
+ /**
10703
+ * @hidden
10704
+ */
10705
+ class FormatPipe {
10706
+ intlService;
10707
+ constructor(intlService) {
10708
+ this.intlService = intlService;
10709
+ }
10710
+ transform(value, format) {
10711
+ const intl = this.intlService;
10712
+ if (isString(format) && FORMAT_REGEX.exec(format)) {
10713
+ return intl.format(format, value);
10714
+ }
10715
+ return intl.toString(value, format);
10716
+ }
10717
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormatPipe, deps: [{ token: i1$4.IntlService }], target: i0.ɵɵFactoryTarget.Pipe });
10718
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: FormatPipe, isStandalone: true, name: "format", pure: false });
10719
+ }
10720
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FormatPipe, decorators: [{
10721
+ type: Pipe,
10722
+ args: [{
10723
+ // eslint-disable-next-line @angular-eslint/pipe-prefix
10724
+ name: 'format',
10725
+ pure: false,
10726
+ standalone: true
10727
+ }]
10728
+ }], ctorParameters: function () { return [{ type: i1$4.IntlService }]; } });
10729
+
10730
+ const DEFAULT_SEARCH_DELAY = 500;
10731
+ /**
10732
+ * @hidden
10733
+ */
10734
+ class MultiCheckboxFilterComponent {
10735
+ ctx;
10736
+ dataChangesService;
10737
+ column;
10738
+ filterChange = new EventEmitter();
10739
+ constructor(ctx, dataChangesService) {
10740
+ this.ctx = ctx;
10741
+ this.dataChangesService = dataChangesService;
10742
+ }
10743
+ listData;
10744
+ searchIcon = searchIcon;
10745
+ showSelectAll = true;
10746
+ currentlySelected = new Set();
10747
+ isSearched = false;
10748
+ currentFilter;
10749
+ typingTimeout;
10750
+ ngOnInit() {
10751
+ this.listData = [...new Set(this.gridData.map(i => i[this.column.field]))].sort((a, b) => { return a - b; });
10752
+ this.currentlySelected = new Set(this.filteredGridData.map(i => i[this.column.field]));
10753
+ this.currentFilter = this.ctx.grid?.filter;
10754
+ if (this.currentFilter) {
10755
+ this.filterChange.emit(this.currentFilter);
10756
+ }
10757
+ }
10758
+ ngOnDestroy() {
10759
+ if (this.typingTimeout) {
10760
+ clearTimeout(this.typingTimeout);
10761
+ this.typingTimeout = null;
10762
+ }
10763
+ }
10764
+ isItemSelected(item) {
10765
+ return this.currentlySelected.has(item);
10766
+ }
10767
+ onSearch(value) {
10768
+ clearTimeout(this.typingTimeout);
10769
+ this.typingTimeout = setTimeout(() => {
10770
+ this.isSearched = value.length > 0;
10771
+ this.showSelectAll = !this.isSearched;
10772
+ const field = this.column?.field;
10773
+ if (!field) {
10774
+ this.listData = [];
10775
+ return;
10776
+ }
10777
+ const base = [...new Set(this.gridData.map(i => i[field]))].sort((a, b) => { return a - b; });
10778
+ if (!value) {
10779
+ this.listData = base;
10780
+ return;
10781
+ }
10782
+ this.listData = filterBy(base, { operator: 'contains', value });
10783
+ }, DEFAULT_SEARCH_DELAY);
10784
+ }
10785
+ handleCheckBoxChange(checkedState, value, selectAllChecked) {
10786
+ const field = this.column?.field;
10787
+ if (!field) {
10788
+ return;
10789
+ }
10790
+ if (!this.currentFilter) {
10791
+ const existing = this.ctx.grid.filter;
10792
+ this.currentFilter = existing ? { ...existing } : { logic: 'and', filters: [] };
10793
+ }
10794
+ const compositeIndex = this.currentFilter.filters.findIndex((f) => f && Array.isArray(f.filters) && f.filters.some((ff) => ff.field === field));
10795
+ let fieldFilters = [];
10796
+ if (compositeIndex !== -1) {
10797
+ fieldFilters = [...this.currentFilter.filters[compositeIndex].filters];
10798
+ }
10799
+ const valueForItem = (item) => item?.[field];
10800
+ if (selectAllChecked) {
10801
+ if (checkedState) {
10802
+ fieldFilters = [];
10803
+ this.currentlySelected = new Set(this.gridData.map(i => i[this.column.field]));
10804
+ }
10805
+ else {
10806
+ fieldFilters = this.gridData.map(item => ({
10807
+ field,
10808
+ operator: 'neq',
10809
+ value: valueForItem(item)
10810
+ }));
10811
+ this.currentlySelected.clear();
10812
+ }
10813
+ }
10814
+ else {
10815
+ const exists = fieldFilters.some(f => f.value === value);
10816
+ if (checkedState) {
10817
+ if (!exists) {
10818
+ fieldFilters.push({ field, operator: 'eq', value });
10819
+ }
10820
+ else {
10821
+ fieldFilters = fieldFilters.filter(f => f.value !== value);
10822
+ }
10823
+ this.currentlySelected.add(value);
10824
+ }
10825
+ else {
10826
+ if (exists) {
10827
+ fieldFilters = fieldFilters.filter(f => f.value !== value);
10828
+ }
10829
+ else {
10830
+ fieldFilters.push({ field, operator: 'neq', value });
10831
+ }
10832
+ this.currentlySelected.delete(value);
10833
+ }
10834
+ }
10835
+ if (fieldFilters.length === 0) {
10836
+ if (compositeIndex !== -1) {
10837
+ this.currentFilter.filters.splice(compositeIndex, 1);
10838
+ }
10839
+ else {
10840
+ this.currentFilter.filters = fieldFilters;
10841
+ }
10842
+ }
10843
+ else {
10844
+ const compositeBlock = {
10845
+ logic: 'and',
10846
+ filters: fieldFilters
10847
+ };
10848
+ if (compositeIndex !== -1) {
10849
+ this.currentFilter.filters[compositeIndex] = compositeBlock;
10850
+ }
10851
+ else {
10852
+ this.currentFilter.filters.push(compositeBlock);
10853
+ }
10854
+ }
10855
+ this.filterChange.emit(this.currentFilter);
10856
+ }
10857
+ get filteredGridData() {
10858
+ return filterBy(this.gridData, this.ctx.grid?.filter);
10859
+ }
10860
+ get selectAllChecked() {
10861
+ if (!this.listData) {
10862
+ return;
10863
+ }
10864
+ if (this.currentlySelected.size === this.listData.length && this.currentlySelected.size > 0) {
10865
+ return true;
10866
+ }
10867
+ else if (this.currentlySelected.size === 0) {
10868
+ return false;
10869
+ }
10870
+ else {
10871
+ return 'indeterminate';
10872
+ }
10873
+ }
10874
+ get gridData() {
10875
+ let data = [];
10876
+ const isLocalData = isPresent$1(this.ctx?.dataBindingDirective);
10877
+ if (isPresent$1(this.normalizedFilterVariant.data)) {
10878
+ data = this.normalizedFilterVariant.data;
10879
+ }
10880
+ else if (isLocalData) {
10881
+ data = this.dataChangesService.data;
10882
+ }
10883
+ else {
10884
+ data = this.ctx.grid?.flatData;
10885
+ }
10886
+ return data || [];
10887
+ }
10888
+ get normalizedFilterVariant() {
10889
+ const defaultMultiCheckboxSettings = { variant: 'multiCheckbox', search: true };
10890
+ if (typeof this.column?.filterVariant === 'string') {
10891
+ return {
10892
+ variant: this.column.filterVariant,
10893
+ search: true
10894
+ };
10895
+ }
10896
+ return Object.assign(defaultMultiCheckboxSettings, this.column?.filterVariant);
10897
+ }
10898
+ get selectedItemsMessage() {
10899
+ const localizationMsg = this.messageFor('multiCheckboxFilterSelectedItemsCount') || '';
10900
+ return replaceMessagePlaceholder(localizationMsg, 'selectedItemsCount', this.currentlySelected.size.toString());
10901
+ }
10902
+ messageFor(key) {
10903
+ return this.ctx.localization.get(key);
10904
+ }
10905
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MultiCheckboxFilterComponent, deps: [{ token: ContextService }, { token: LocalDataChangesService }], target: i0.ɵɵFactoryTarget.Component });
10906
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MultiCheckboxFilterComponent, isStandalone: true, selector: "kendo-grid-multicheckbox-filter", inputs: { column: "column" }, outputs: { filterChange: "filterChange" }, ngImport: i0, template: `
10907
+ <kendo-textbox *ngIf="normalizedFilterVariant.search"
10908
+ class="k-searchbox"
10909
+ [placeholder]="messageFor('multiCheckboxFilterSearchPlaceholder')"
10910
+ (valueChange)="onSearch($event)">
10911
+ <ng-template kendoTextBoxPrefixTemplate>
10912
+ <kendo-icon-wrapper innerCssClass="k-input-icon" name="search" [svgIcon]="searchIcon"></kendo-icon-wrapper>
10913
+ </ng-template>
10914
+ </kendo-textbox>
10915
+ <ul class="k-reset k-multicheck-wrap">
10916
+ <li class="k-item k-check-all-wrap" *ngIf="showSelectAll">
10917
+ <label class="k-label k-checkbox-label" role="option">
10918
+ <kendo-checkbox
10919
+ [checkedState]="selectAllChecked"
10920
+ (checkedStateChange)="handleCheckBoxChange($event, null, true)">
10921
+ </kendo-checkbox>
10922
+ <span>{{ messageFor('multiCheckboxFilterSelectAllLabel') }}</span>
10923
+ </label>
10924
+ </li>
10925
+ <li class="k-item" *ngFor="let item of listData">
10926
+ <label class="k-label k-checkbox-label" role="option">
10927
+ <kendo-checkbox
10928
+ [checkedState]="isItemSelected(item)"
10929
+ (checkedStateChange)="handleCheckBoxChange($event, item)">
10930
+ </kendo-checkbox>
10931
+ <span>{{ item | format: column.format }}</span>
10932
+ </label>
10933
+ </li>
10934
+ </ul>
10935
+ <div class="k-filter-selected-items">{{selectedItemsMessage}}</div>
10936
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: CheckBoxComponent, selector: "kendo-checkbox", inputs: ["checkedState", "rounded"], outputs: ["checkedStateChange"], exportAs: ["kendoCheckBox"] }, { 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: TextBoxPrefixTemplateDirective, selector: "[kendoTextBoxPrefixTemplate]", inputs: ["showSeparator"] }, { kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }, { kind: "pipe", type: FormatPipe, name: "format" }] });
10937
+ }
10938
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MultiCheckboxFilterComponent, decorators: [{
10939
+ type: Component,
10940
+ args: [{
10941
+ selector: 'kendo-grid-multicheckbox-filter',
10942
+ template: `
10943
+ <kendo-textbox *ngIf="normalizedFilterVariant.search"
10944
+ class="k-searchbox"
10945
+ [placeholder]="messageFor('multiCheckboxFilterSearchPlaceholder')"
10946
+ (valueChange)="onSearch($event)">
10947
+ <ng-template kendoTextBoxPrefixTemplate>
10948
+ <kendo-icon-wrapper innerCssClass="k-input-icon" name="search" [svgIcon]="searchIcon"></kendo-icon-wrapper>
10949
+ </ng-template>
10950
+ </kendo-textbox>
10951
+ <ul class="k-reset k-multicheck-wrap">
10952
+ <li class="k-item k-check-all-wrap" *ngIf="showSelectAll">
10953
+ <label class="k-label k-checkbox-label" role="option">
10954
+ <kendo-checkbox
10955
+ [checkedState]="selectAllChecked"
10956
+ (checkedStateChange)="handleCheckBoxChange($event, null, true)">
10957
+ </kendo-checkbox>
10958
+ <span>{{ messageFor('multiCheckboxFilterSelectAllLabel') }}</span>
10959
+ </label>
10960
+ </li>
10961
+ <li class="k-item" *ngFor="let item of listData">
10962
+ <label class="k-label k-checkbox-label" role="option">
10963
+ <kendo-checkbox
10964
+ [checkedState]="isItemSelected(item)"
10965
+ (checkedStateChange)="handleCheckBoxChange($event, item)">
10966
+ </kendo-checkbox>
10967
+ <span>{{ item | format: column.format }}</span>
10968
+ </label>
10969
+ </li>
10970
+ </ul>
10971
+ <div class="k-filter-selected-items">{{selectedItemsMessage}}</div>
10972
+ `,
10973
+ standalone: true,
10974
+ imports: [NgFor, NgIf, CheckBoxComponent, TextBoxComponent, TextBoxPrefixTemplateDirective, IconWrapperComponent, FormatPipe]
10975
+ }]
10976
+ }], ctorParameters: function () { return [{ type: ContextService }, { type: LocalDataChangesService }]; }, propDecorators: { column: [{
10977
+ type: Input
10978
+ }], filterChange: [{
10979
+ type: Output
10980
+ }] } });
10981
+
10673
10982
  const isNoValueOperator = operator => (operator === "isnull"
10674
10983
  || operator === "isnotnull"
10675
10984
  || operator === "isempty"
@@ -10754,11 +11063,11 @@ class FilterMenuContainerComponent {
10754
11063
  return this._childFilter;
10755
11064
  }
10756
11065
  resetButton;
10757
- filterButton;
10758
11066
  _childFilter;
10759
11067
  subscription;
10760
11068
  _templateContext = {};
10761
11069
  _filter;
11070
+ checkboxFilter;
10762
11071
  constructor(parentService, childService, ctx, cd, menuTabbingService, adaptiveGridService) {
10763
11072
  this.parentService = parentService;
10764
11073
  this.childService = childService;
@@ -10784,7 +11093,7 @@ class FilterMenuContainerComponent {
10784
11093
  this.menuTabbingService.lastFocusable = undefined;
10785
11094
  }
10786
11095
  get disabled() {
10787
- return !this.childFilter.filters.some(validFilters);
11096
+ return this.isMultiFilter ? this.areFiltersEqual : !this.childFilter.filters.some(validFilters);
10788
11097
  }
10789
11098
  get templateContext() {
10790
11099
  this._templateContext.column = this.column;
@@ -10797,15 +11106,20 @@ class FilterMenuContainerComponent {
10797
11106
  return isPresent(this.column) && isPresent(this.column.filterMenuTemplateRef);
10798
11107
  }
10799
11108
  submit() {
10800
- const filter = trimFilters(this.childFilter);
10801
- if (filter.filters.length) {
10802
- const root = this.filter || {
10803
- filters: [],
10804
- logic: "and"
10805
- };
10806
- removeFilter(root, this.column.field);
10807
- root.filters.push(filter);
10808
- this.parentService.filter(root);
11109
+ if (this.isMultiFilter) {
11110
+ this.parentService.filter(this.checkboxFilter);
11111
+ }
11112
+ else {
11113
+ const filter = trimFilters(this.childFilter);
11114
+ if (filter.filters.length) {
11115
+ const root = this.filter || {
11116
+ filters: [],
11117
+ logic: "and"
11118
+ };
11119
+ removeFilter(root, this.column.field);
11120
+ root.filters.push(filter);
11121
+ this.parentService.filter(root);
11122
+ }
10809
11123
  }
10810
11124
  this.close.emit();
10811
11125
  return false;
@@ -10833,29 +11147,100 @@ class FilterMenuContainerComponent {
10833
11147
  }
10834
11148
  }
10835
11149
  }
11150
+ onCheckboxFilterChange(filter) {
11151
+ this.checkboxFilter = filter;
11152
+ }
11153
+ getButtonIcon(buttonType, iconType) {
11154
+ if (!this.isMultiFilter) {
11155
+ return;
11156
+ }
11157
+ const icons = {
11158
+ filter: {
11159
+ icon: 'filter',
11160
+ svgIcon: filterIcon
11161
+ },
11162
+ reset: {
11163
+ icon: 'filter-clear',
11164
+ svgIcon: filterClearIcon
11165
+ }
11166
+ };
11167
+ return icons[buttonType]?.[iconType];
11168
+ }
10836
11169
  get clearText() {
10837
11170
  return this.ctx.localization.get("filterClearButton");
10838
11171
  }
10839
11172
  get filterText() {
10840
11173
  return this.ctx.localization.get("filterFilterButton");
10841
11174
  }
11175
+ get isMultiFilter() {
11176
+ if (!isPresent(this.column?.filterVariant)) {
11177
+ return false;
11178
+ }
11179
+ const filterVariant = this.column?.filterVariant;
11180
+ return isPresent(filterVariant) && (filterVariant === 'multiCheckbox' || typeof filterVariant === 'object' && filterVariant.variant === 'multiCheckbox');
11181
+ }
11182
+ get areFiltersEqual() {
11183
+ const checkboxFilter = this.checkboxFilter;
11184
+ const gridFilter = this.filter;
11185
+ const isComposite = (f) => !!f && Array.isArray(f.filters);
11186
+ // Treat undefined and "empty (no inner filters)" as equivalent
11187
+ const isEmptyComposite = (f) => isComposite(f) && f.filters.length === 0;
11188
+ if (!checkboxFilter && !gridFilter) {
11189
+ return true;
11190
+ }
11191
+ if ((!checkboxFilter && isEmptyComposite(gridFilter)) || (!gridFilter && isEmptyComposite(checkboxFilter))) {
11192
+ return true;
11193
+ }
11194
+ if (!checkboxFilter || !gridFilter) {
11195
+ return false;
11196
+ }
11197
+ const eq = (x, y) => {
11198
+ const xIsComp = isComposite(x);
11199
+ const yIsComp = isComposite(y);
11200
+ if (xIsComp !== yIsComp) {
11201
+ return false;
11202
+ }
11203
+ if (xIsComp) {
11204
+ const xLogic = x.logic || 'and';
11205
+ const yLogic = y.logic || 'and';
11206
+ if (xLogic !== yLogic) {
11207
+ return false;
11208
+ }
11209
+ if (x.filters.length !== y.filters.length) {
11210
+ return false;
11211
+ }
11212
+ for (let i = 0; i < x.filters.length; i++) {
11213
+ if (!eq(x.filters[i], y.filters[i])) {
11214
+ return false;
11215
+ }
11216
+ }
11217
+ return true;
11218
+ }
11219
+ return areObjectsEqual(x, y);
11220
+ };
11221
+ return eq(checkboxFilter, gridFilter);
11222
+ }
10842
11223
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FilterMenuContainerComponent, deps: [{ token: FilterService, skipSelf: true }, { token: FilterService }, { token: ContextService }, { token: i0.ChangeDetectorRef }, { token: MenuTabbingService }, { token: AdaptiveGridService }], target: i0.ɵɵFactoryTarget.Component });
10843
11224
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FilterMenuContainerComponent, isStandalone: true, selector: "kendo-grid-filter-menu-container", inputs: { column: "column", isLast: "isLast", isExpanded: "isExpanded", menuTabbingService: "menuTabbingService", filter: "filter", actionsClass: "actionsClass" }, outputs: { close: "close" }, providers: [
10844
11225
  FilterService,
10845
11226
  MenuTabbingService
10846
- ], viewQueries: [{ propertyName: "resetButton", first: true, predicate: ["resetButton"], descendants: true }, { propertyName: "filterButton", first: true, predicate: ["filterButton"], descendants: true }], ngImport: i0, template: `
11227
+ ], viewQueries: [{ propertyName: "resetButton", first: true, predicate: ["resetButton"], descendants: true }], ngImport: i0, template: `
10847
11228
  <form (submit)="submit()" (reset)="reset()"
10848
- class="k-filter-menu">
11229
+ class="k-filter-menu"
11230
+ [ngClass]="{'k-popup k-group k-reset': isMultiFilter && !ctx.grid?.isActionSheetExpanded}">
10849
11231
  <div class="k-filter-menu-container">
10850
11232
  <ng-container [ngSwitch]="hasTemplate">
10851
11233
  <ng-container *ngSwitchCase="false">
10852
- <ng-container
11234
+ <ng-container *ngIf="!isMultiFilter; else multiFilter"
10853
11235
  kendoFilterMenuHost
10854
11236
  [filterService]="childService"
10855
11237
  [column]="column"
10856
11238
  [filter]="childFilter"
10857
11239
  [menuTabbingService]="menuTabbingService">
10858
11240
  </ng-container>
11241
+ <ng-template #multiFilter>
11242
+ <kendo-grid-multicheckbox-filter [column]="column" (filterChange)="onCheckboxFilterChange($event)"></kendo-grid-multicheckbox-filter>
11243
+ </ng-template>
10859
11244
  </ng-container>
10860
11245
  <ng-container *ngSwitchCase="true">
10861
11246
  <ng-template
@@ -10867,20 +11252,24 @@ class FilterMenuContainerComponent {
10867
11252
  </ng-container>
10868
11253
  </ng-container>
10869
11254
  <div *ngIf="!ctx.grid?.isActionSheetExpanded" [ngClass]="actionsClass">
10870
- <button #filterButton
11255
+ <button #filterButton kendoButton
11256
+ themeColor="primary"
10871
11257
  type="submit"
10872
- class="k-button k-button-solid-primary k-button-solid k-button-md k-rounded-md k-button-rectangle"
11258
+ [ngClass]="{'k-button-rectangle': !isMultiFilter}"
10873
11259
  [disabled]="disabled"
11260
+ [icon]="getButtonIcon('filter', 'icon')"
11261
+ [svgIcon]="getButtonIcon('filter', 'svgIcon')"
10874
11262
  (keydown.tab)="onTab($event, 'filter')">{{filterText}}</button>
10875
- <button
10876
- #resetButton
11263
+ <button #resetButton kendoButton
10877
11264
  type="reset"
10878
- class="k-button k-button-solid-base k-button-solid k-button-md k-rounded-md k-button-rectangle"
11265
+ [ngClass]="{'k-button-rectangle': !isMultiFilter}"
11266
+ [icon]="getButtonIcon('reset', 'icon')"
11267
+ [svgIcon]="getButtonIcon('reset', 'svgIcon')"
10879
11268
  (keydown.tab)="onTab($event, 'reset')">{{clearText}}</button>
10880
11269
  </div>
10881
11270
  </div>
10882
11271
  </form>
10883
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2$2.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: FilterMenuHostDirective, selector: "[kendoFilterMenuHost]", inputs: ["filterService", "menuTabbingService"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
11272
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2$2.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: FilterMenuHostDirective, selector: "[kendoFilterMenuHost]", inputs: ["filterService", "menuTabbingService"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: MultiCheckboxFilterComponent, selector: "kendo-grid-multicheckbox-filter", inputs: ["column"], outputs: ["filterChange"] }, { kind: "component", type: ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }] });
10884
11273
  }
10885
11274
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FilterMenuContainerComponent, decorators: [{
10886
11275
  type: Component,
@@ -10892,17 +11281,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
10892
11281
  selector: 'kendo-grid-filter-menu-container',
10893
11282
  template: `
10894
11283
  <form (submit)="submit()" (reset)="reset()"
10895
- class="k-filter-menu">
11284
+ class="k-filter-menu"
11285
+ [ngClass]="{'k-popup k-group k-reset': isMultiFilter && !ctx.grid?.isActionSheetExpanded}">
10896
11286
  <div class="k-filter-menu-container">
10897
11287
  <ng-container [ngSwitch]="hasTemplate">
10898
11288
  <ng-container *ngSwitchCase="false">
10899
- <ng-container
11289
+ <ng-container *ngIf="!isMultiFilter; else multiFilter"
10900
11290
  kendoFilterMenuHost
10901
11291
  [filterService]="childService"
10902
11292
  [column]="column"
10903
11293
  [filter]="childFilter"
10904
11294
  [menuTabbingService]="menuTabbingService">
10905
11295
  </ng-container>
11296
+ <ng-template #multiFilter>
11297
+ <kendo-grid-multicheckbox-filter [column]="column" (filterChange)="onCheckboxFilterChange($event)"></kendo-grid-multicheckbox-filter>
11298
+ </ng-template>
10906
11299
  </ng-container>
10907
11300
  <ng-container *ngSwitchCase="true">
10908
11301
  <ng-template
@@ -10914,22 +11307,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
10914
11307
  </ng-container>
10915
11308
  </ng-container>
10916
11309
  <div *ngIf="!ctx.grid?.isActionSheetExpanded" [ngClass]="actionsClass">
10917
- <button #filterButton
11310
+ <button #filterButton kendoButton
11311
+ themeColor="primary"
10918
11312
  type="submit"
10919
- class="k-button k-button-solid-primary k-button-solid k-button-md k-rounded-md k-button-rectangle"
11313
+ [ngClass]="{'k-button-rectangle': !isMultiFilter}"
10920
11314
  [disabled]="disabled"
11315
+ [icon]="getButtonIcon('filter', 'icon')"
11316
+ [svgIcon]="getButtonIcon('filter', 'svgIcon')"
10921
11317
  (keydown.tab)="onTab($event, 'filter')">{{filterText}}</button>
10922
- <button
10923
- #resetButton
11318
+ <button #resetButton kendoButton
10924
11319
  type="reset"
10925
- class="k-button k-button-solid-base k-button-solid k-button-md k-rounded-md k-button-rectangle"
11320
+ [ngClass]="{'k-button-rectangle': !isMultiFilter}"
11321
+ [icon]="getButtonIcon('reset', 'icon')"
11322
+ [svgIcon]="getButtonIcon('reset', 'svgIcon')"
10926
11323
  (keydown.tab)="onTab($event, 'reset')">{{clearText}}</button>
10927
11324
  </div>
10928
11325
  </div>
10929
11326
  </form>
10930
11327
  `,
10931
11328
  standalone: true,
10932
- imports: [FormsModule, NgSwitch, NgSwitchCase, FilterMenuHostDirective, NgIf, NgTemplateOutlet, NgClass]
11329
+ imports: [FormsModule, NgSwitch, NgSwitchCase, FilterMenuHostDirective, NgIf, NgTemplateOutlet, NgClass, MultiCheckboxFilterComponent, ButtonComponent]
10933
11330
  }]
10934
11331
  }], ctorParameters: function () { return [{ type: FilterService, decorators: [{
10935
11332
  type: SkipSelf
@@ -10950,9 +11347,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
10950
11347
  }], resetButton: [{
10951
11348
  type: ViewChild,
10952
11349
  args: ['resetButton', { static: false }]
10953
- }], filterButton: [{
10954
- type: ViewChild,
10955
- args: ['filterButton', { static: false }]
10956
11350
  }] } });
10957
11351
 
10958
11352
  let id$1 = 0;
@@ -10968,7 +11362,6 @@ class FilterMenuComponent {
10968
11362
  renderer;
10969
11363
  cdr;
10970
11364
  adaptiveGridService;
10971
- zone;
10972
11365
  idService;
10973
11366
  filterIcon = filterIcon;
10974
11367
  /**
@@ -10986,7 +11379,7 @@ class FilterMenuComponent {
10986
11379
  tabIndex = '-1';
10987
11380
  popupRef;
10988
11381
  popupSubs;
10989
- constructor(filterService, popupService, ctx, navigationService, renderer, cdr, adaptiveGridService, zone, idService) {
11382
+ constructor(filterService, popupService, ctx, navigationService, renderer, cdr, adaptiveGridService, idService) {
10990
11383
  this.filterService = filterService;
10991
11384
  this.popupService = popupService;
10992
11385
  this.ctx = ctx;
@@ -10994,7 +11387,6 @@ class FilterMenuComponent {
10994
11387
  this.renderer = renderer;
10995
11388
  this.cdr = cdr;
10996
11389
  this.adaptiveGridService = adaptiveGridService;
10997
- this.zone = zone;
10998
11390
  this.idService = idService;
10999
11391
  }
11000
11392
  ngOnDestroy() {
@@ -11072,9 +11464,15 @@ class FilterMenuComponent {
11072
11464
  this.cdr.markForCheck();
11073
11465
  }
11074
11466
  focusRoot() {
11075
- this.isNavigable ? this.navigationService.focusCell(0, this.column.leafIndex) : this.anchor.nativeElement.focus();
11467
+ if (this.isNavigable) {
11468
+ this.navigationService.preventScroll = true;
11469
+ this.navigationService.focusCell(0, this.column.leafIndex);
11470
+ }
11471
+ else {
11472
+ this.anchor.nativeElement.focus({ preventScroll: true });
11473
+ }
11076
11474
  }
11077
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FilterMenuComponent, deps: [{ token: FilterService }, { token: SinglePopupService }, { token: ContextService }, { token: NavigationService }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: AdaptiveGridService }, { token: i0.NgZone }, { token: IdService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
11475
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FilterMenuComponent, deps: [{ token: FilterService }, { token: SinglePopupService }, { token: ContextService }, { token: NavigationService }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: AdaptiveGridService }, { token: IdService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
11078
11476
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FilterMenuComponent, isStandalone: true, selector: "kendo-grid-filter-menu", inputs: { column: "column", filter: "filter", tabIndex: "tabIndex" }, viewQueries: [{ propertyName: "anchor", first: true, predicate: ["anchor"], descendants: true, static: true }, { propertyName: "template", first: true, predicate: ["template"], descendants: true, read: TemplateRef, static: true }], ngImport: i0, template: `
11079
11477
  <a #anchor
11080
11478
  class="k-grid-filter-menu k-grid-header-menu"
@@ -11133,7 +11531,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
11133
11531
  standalone: true,
11134
11532
  imports: [IconWrapperComponent, FilterMenuContainerComponent],
11135
11533
  }]
11136
- }], ctorParameters: function () { return [{ type: FilterService }, { type: SinglePopupService }, { type: ContextService }, { type: NavigationService }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: AdaptiveGridService }, { type: i0.NgZone }, { type: IdService, decorators: [{
11534
+ }], ctorParameters: function () { return [{ type: FilterService }, { type: SinglePopupService }, { type: ContextService }, { type: NavigationService }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: AdaptiveGridService }, { type: IdService, decorators: [{
11137
11535
  type: Optional
11138
11536
  }] }]; }, propDecorators: { column: [{
11139
11537
  type: Input
@@ -12087,7 +12485,7 @@ class ColumnListKeyboardNavigation {
12087
12485
  toggle(index, active) {
12088
12486
  const element = this.items[index]?.hostElement.nativeElement.closest('.k-column-list-item');
12089
12487
  element && this.renderer.setAttribute(element, 'tabindex', active ? '0' : '-1');
12090
- active && element?.focus();
12488
+ active && element?.focus({ preventScroll: true });
12091
12489
  }
12092
12490
  toggleCheckedState() {
12093
12491
  this.items[this.activeIndex].hostElement.nativeElement.closest('.k-column-list-item').firstElementChild.click();
@@ -12217,15 +12615,6 @@ class ColumnListComponent {
12217
12615
  this.service.menuTabbingService.lastFocusable = this.applyButton.nativeElement;
12218
12616
  }
12219
12617
  }
12220
- onSelectAllClick(e) {
12221
- if (e.target.classList.contains('k-checkbox')) {
12222
- return;
12223
- }
12224
- e.preventDefault();
12225
- const label = e.target.closest('.k-column-list-item');
12226
- const input = label?.querySelector('input');
12227
- input.click();
12228
- }
12229
12618
  onSelectAllCheckboxChange(checkedState) {
12230
12619
  if (!checkedState && !this.allowHideAll) {
12231
12620
  const columnsToKeep = [];
@@ -12407,25 +12796,6 @@ class ColumnListComponent {
12407
12796
  });
12408
12797
  }
12409
12798
  }
12410
- checkBoxClick(e) {
12411
- const closestItem = e.target.closest('.k-column-list-item');
12412
- if (!closestItem)
12413
- return;
12414
- const checkboxElement = closestItem.querySelector('.k-checkbox-wrap');
12415
- const input = checkboxElement?.querySelector('input');
12416
- if (e.target === input) {
12417
- return;
12418
- }
12419
- e.preventDefault();
12420
- if (input) {
12421
- const index = parseInt(input.getAttribute('data-index'), 10);
12422
- const column = this.filteredColumns[index];
12423
- const isDisabled = checkboxElement.classList.contains('k-disabled');
12424
- if (column && !isDisabled) {
12425
- input.click();
12426
- }
12427
- }
12428
- }
12429
12799
  onCheckboxChange(checkedState, column, _index) {
12430
12800
  column.currentlyChecked = checkedState;
12431
12801
  if (this.autoSync) {
@@ -12459,9 +12829,7 @@ class ColumnListComponent {
12459
12829
  <label
12460
12830
  *ngIf="showSelectAll"
12461
12831
  class='k-column-list-item'
12462
- role="option"
12463
- [kendoEventsOutsideAngular]="{click: onSelectAllClick}"
12464
- [scope]="this">
12832
+ role="option">
12465
12833
  <kendo-checkbox
12466
12834
  #checkbox
12467
12835
  [inputAttributes]="{'data-index': '0'}"
@@ -12474,9 +12842,7 @@ class ColumnListComponent {
12474
12842
  <label
12475
12843
  *ngFor="let column of filteredColumns; let index = index;"
12476
12844
  class='k-column-list-item'
12477
- role="option"
12478
- [kendoEventsOutsideAngular]="{click: checkBoxClick}"
12479
- [scope]="this">
12845
+ role="option">
12480
12846
  <kendo-checkbox
12481
12847
  #checkbox
12482
12848
  [inputAttributes]="{'data-index': index.toString()}"
@@ -12487,7 +12853,7 @@ class ColumnListComponent {
12487
12853
  <span class="k-checkbox-label">{{ column.displayTitle }}</span>
12488
12854
  </label>
12489
12855
  </div>
12490
- `, isInline: true, dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: CheckBoxComponent, selector: "kendo-checkbox", inputs: ["checkedState", "rounded"], outputs: ["checkedStateChange"], exportAs: ["kendoCheckBox"] }, { kind: "directive", type: EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }] });
12856
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: CheckBoxComponent, selector: "kendo-checkbox", inputs: ["checkedState", "rounded"], outputs: ["checkedStateChange"], exportAs: ["kendoCheckBox"] }] });
12491
12857
  }
12492
12858
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColumnListComponent, decorators: [{
12493
12859
  type: Component,
@@ -12503,9 +12869,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
12503
12869
  <label
12504
12870
  *ngIf="showSelectAll"
12505
12871
  class='k-column-list-item'
12506
- role="option"
12507
- [kendoEventsOutsideAngular]="{click: onSelectAllClick}"
12508
- [scope]="this">
12872
+ role="option">
12509
12873
  <kendo-checkbox
12510
12874
  #checkbox
12511
12875
  [inputAttributes]="{'data-index': '0'}"
@@ -12518,9 +12882,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
12518
12882
  <label
12519
12883
  *ngFor="let column of filteredColumns; let index = index;"
12520
12884
  class='k-column-list-item'
12521
- role="option"
12522
- [kendoEventsOutsideAngular]="{click: checkBoxClick}"
12523
- [scope]="this">
12885
+ role="option">
12524
12886
  <kendo-checkbox
12525
12887
  #checkbox
12526
12888
  [inputAttributes]="{'data-index': index.toString()}"
@@ -12533,7 +12895,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
12533
12895
  </div>
12534
12896
  `,
12535
12897
  standalone: true,
12536
- imports: [NgFor, NgIf, CheckBoxComponent, EventsOutsideAngularDirective]
12898
+ imports: [NgFor, NgIf, CheckBoxComponent]
12537
12899
  }]
12538
12900
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.Renderer2 }, { type: ColumnListKeyboardNavigation }, { type: i0.ChangeDetectorRef }, { type: ColumnInfoService, decorators: [{
12539
12901
  type: Optional
@@ -13375,7 +13737,7 @@ class ColumnChooserToolbarDirective extends ToolbarToolBase {
13375
13737
  this.buttonElement?.setAttribute('aria-expanded', 'false');
13376
13738
  this.buttonElement?.removeAttribute('aria-controls');
13377
13739
  this.host.selected = false;
13378
- focusAnchor && this.buttonElement?.focus();
13740
+ focusAnchor && this.buttonElement?.focus({ preventScroll: true });
13379
13741
  }
13380
13742
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColumnChooserToolbarDirective, deps: [{ token: i0.Renderer2 }, { token: i2.PopupService }, { token: i54.ToolBarButtonComponent }, { token: ContextService }, { token: i0.NgZone }, { token: i54.RefreshService }, { token: AdaptiveGridService }, { token: ColumnInfoService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
13381
13743
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: ColumnChooserToolbarDirective, isStandalone: true, selector: "[kendoGridColumnChooserTool]", inputs: { autoSync: "autoSync", allowHideAll: "allowHideAll", filterable: "filterable", showSelectAll: "showSelectAll" }, usesInheritance: true, ngImport: i0 });
@@ -14899,7 +15261,15 @@ class ColumnMenuContainerComponent {
14899
15261
  else {
14900
15262
  return;
14901
15263
  }
14902
- this.ngZone.onStable.pipe(take(1)).subscribe(() => this.service.menuTabbingService.firstFocusable?.focus());
15264
+ this.ngZone.onStable.pipe(take(1)).subscribe(() => {
15265
+ const firstFocusable = this.service.menuTabbingService.firstFocusable;
15266
+ if (firstFocusable instanceof DropDownListComponent) {
15267
+ firstFocusable.wrapper.nativeElement.focus({ preventScroll: true });
15268
+ }
15269
+ else {
15270
+ firstFocusable?.focus({ preventScroll: true });
15271
+ }
15272
+ });
14903
15273
  }
14904
15274
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColumnMenuContainerComponent, deps: [{ token: ColumnMenuService }, { token: NgZone }], target: i0.ɵɵFactoryTarget.Component });
14905
15275
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ColumnMenuContainerComponent, isStandalone: true, selector: "kendo-grid-columnmenu-container", queries: [{ propertyName: "columnMenuItems", predicate: ColumnMenuItemDirective, descendants: true }], ngImport: i0, template: `
@@ -15354,7 +15724,13 @@ class ColumnMenuComponent {
15354
15724
  ariaRoot && this.renderer.setAttribute(ariaRoot, 'aria-expanded', 'false');
15355
15725
  }
15356
15726
  focusRoot() {
15357
- this.isNavigable ? this.navigationService.focusCell(0, this.column.leafIndex) : this.anchor.nativeElement.focus();
15727
+ if (this.isNavigable) {
15728
+ this.navigationService.preventScroll = true;
15729
+ this.navigationService.focusCell(0, this.column.leafIndex);
15730
+ }
15731
+ else {
15732
+ this.anchor.nativeElement.focus({ preventScroll: true });
15733
+ }
15358
15734
  }
15359
15735
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColumnMenuComponent, deps: [{ token: NavigationService }, { token: SinglePopupService }, { token: ColumnMenuService }, { token: ContextService }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: ColumnInfoService }, { token: IdService, optional: true }, { token: AdaptiveGridService }], target: i0.ɵɵFactoryTarget.Component });
15360
15736
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ColumnMenuComponent, isStandalone: true, selector: "kendo-grid-column-menu", inputs: { standalone: "standalone", column: "column", settings: "settings", sort: "sort", filter: "filter", sortable: "sortable", columnMenuTemplate: "columnMenuTemplate", tabIndex: "tabIndex" }, host: { properties: { "class.k-grid-column-menu-standalone": "this.standalone" } }, providers: [
@@ -17258,19 +17634,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
17258
17634
  args: ['dblclick']
17259
17635
  }] } });
17260
17636
 
17261
- /**
17262
- * @hidden
17263
- */
17264
- class LocalDataChangesService {
17265
- changes = new EventEmitter();
17266
- data;
17267
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LocalDataChangesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
17268
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LocalDataChangesService });
17269
- }
17270
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LocalDataChangesService, decorators: [{
17271
- type: Injectable
17272
- }] });
17273
-
17274
17637
  /**
17275
17638
  * @hidden
17276
17639
  */
@@ -18491,7 +18854,7 @@ class HeaderComponent {
18491
18854
  }
18492
18855
  onHeaderKeydown(column, args) {
18493
18856
  const code = normalizeNumpadKeys(args);
18494
- if (code === Keys.ArrowDown && args.altKey && this.showFilterMenu) {
18857
+ if (code === Keys.ArrowDown && args.altKey && this.showFilterMenu && this.isFilterable(column)) {
18495
18858
  args.preventDefault();
18496
18859
  args.stopImmediatePropagation();
18497
18860
  const filterMenu = this.filterMenus.find(fm => fm.column === column);
@@ -19549,7 +19912,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
19549
19912
 
19550
19913
  /**
19551
19914
  * Represents the command columns of the Grid. Define the content of the column inside an `<ng-template>` tag.
19552
- * For more information and examples, see the [Command Column Directives](slug:editing_directives_grid#toc-command-column-directives) article.
19915
+ * For more information and examples, see the [Editing Action Buttons](slug:basics_editing_grid#editing-action-buttons) article.
19553
19916
  *
19554
19917
  * @example
19555
19918
  * ```html
@@ -21796,7 +22159,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
21796
22159
  /**
21797
22160
  * Represents the `cancel` command of the Grid. Apply this directive to any `button`
21798
22161
  * element inside a [CommandColumnComponent]({% slug api_grid_commandcolumncomponent %})
21799
- * ([see example](slug:editing_directives_grid#toc-command-column-directives)).
22162
+ * ([see example](slug:basics_editing_grid#editing-action-buttons)).
21800
22163
  *
21801
22164
  * When a button with this directive is clicked, the
21802
22165
  * [`cancel`]({% slug api_grid_gridcomponent %}#toc-cancel) event
@@ -21900,7 +22263,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
21900
22263
  /**
21901
22264
  * Represents the `save` command of the Grid. Apply this directive to any `button`
21902
22265
  * element inside a [CommandColumnComponent]({% slug api_grid_commandcolumncomponent %})
21903
- * ([see example](slug:editing_directives_grid#toc-command-column-directives)).
22266
+ * ([see example](slug:basics_editing_grid#editing-action-buttons)).
21904
22267
  * When you click the button with this directive, the
21905
22268
  * [`save`]({% slug api_grid_gridcomponent %}#toc-save) event fires.
21906
22269
  * The button with `kendoGridSaveCommand` is automatically hidden when the row is not in edit mode.
@@ -22003,7 +22366,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
22003
22366
  /**
22004
22367
  * Represents the `remove` command of the Grid. Apply this directive to any `button` element
22005
22368
  * inside a [CommandColumnComponent]({% slug api_grid_commandcolumncomponent %})
22006
- * ([see example](slug:editing_directives_grid#toc-command-column-directives)).
22369
+ * ([see example](slug:basics_editing_grid#editing-action-buttons)).
22007
22370
  * When you click the button with this directive, the
22008
22371
  * [`remove`]({% slug api_grid_gridcomponent %}#toc-remove) event fires.
22009
22372
  * The button with `kendoGridRemoveCommand` is automatically hidden when the row is in edit mode.
@@ -22427,8 +22790,8 @@ const packageMetadata = {
22427
22790
  productName: 'Kendo UI for Angular',
22428
22791
  productCode: 'KENDOUIANGULAR',
22429
22792
  productCodes: ['KENDOUIANGULAR'],
22430
- publishDate: 1758187632,
22431
- version: '20.1.0-develop.2',
22793
+ publishDate: 1760010088,
22794
+ version: '20.1.0-develop.20',
22432
22795
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/'
22433
22796
  };
22434
22797
 
@@ -24389,9 +24752,6 @@ class ScrollerService {
24389
24752
  const lastItemIndex = this.rowHeightService.index(scrollTop + offsetHeight);
24390
24753
  const overflow = Math.max(firstItemIndex + (this.virtualPageSize || this.take) - this.total, 0);
24391
24754
  firstItemIndex = Math.max(firstItemIndex - overflow, 0);
24392
- if (lastItemIndex < this.lastLoaded) {
24393
- this.lastLoaded = lastItemIndex;
24394
- }
24395
24755
  if (down) {
24396
24756
  const atBottom = scrollHeight - clientHeight - scrollTop < SCROLL_BOTTOM_THRESHOLD;
24397
24757
  if (atBottom) {
@@ -24993,6 +25353,9 @@ class ListComponent {
24993
25353
  this.handleSkipOnData = true;
24994
25354
  }
24995
25355
  if (isChanged$1('isVirtual', changes)) {
25356
+ if (this.isVirtual && !(this.minRowHeight || this.rowHeight)) {
25357
+ this.minRowHeight = calcRowHeight(this.table.nativeElement);
25358
+ }
24996
25359
  this.ngZone.onStable.pipe(take(1)).subscribe(() => {
24997
25360
  this.scroller.reset();
24998
25361
  this.rowHeightService = this.scroller.rowHeightService = new RowHeightService(this.total, this.rowHeight || this.minRowHeight);
@@ -25013,6 +25376,7 @@ class ListComponent {
25013
25376
  get totalIsAllItems() {
25014
25377
  return this.isVirtual && (Boolean(this.ctx.grid?.pageable || this.ctx.grid?.group?.length));
25015
25378
  }
25379
+ rebindGroupedDataFlag = false;
25016
25380
  ngDoCheck() {
25017
25381
  if (this.virtualColumns && (!this.viewportColumns || this.viewportWidthChange())) {
25018
25382
  this.updateViewportColumns();
@@ -25031,6 +25395,14 @@ class ListComponent {
25031
25395
  this.scroller.reset(this.skipScroll);
25032
25396
  this.scroller.total = this.allItems.length;
25033
25397
  }
25398
+ else if (totalChanged && !this.ctx.grid?.group?.length) {
25399
+ this.scroller.reset(this.skipScroll);
25400
+ this.scroller.total = this.total;
25401
+ }
25402
+ const rebindGroupedData = this.isVirtual && !totalChanged && this.ctx.grid?.group?.length && !this.rebindGroupedDataFlag;
25403
+ if (rebindGroupedData) {
25404
+ this.rebindGroupedDataFlag = true;
25405
+ }
25034
25406
  if (shouldCalculatePageSize || !isPresent(this.scroller.rowHeightService)) {
25035
25407
  const calculatedPageSize = this.virtualPageSize ?? this.calcVirtualPageSize();
25036
25408
  if (calculatedPageSize > 0) {
@@ -25051,6 +25423,10 @@ class ListComponent {
25051
25423
  });
25052
25424
  }
25053
25425
  }
25426
+ else if (this.rebindGroupedDataFlag) {
25427
+ this.ngZone.run(() => this.itemsToRender = this.allItems.slice(this.scroller.virtualSkip, this.scroller.virtualSkip + this.virtualPageSize));
25428
+ this.rebindGroupedDataFlag = false;
25429
+ }
25054
25430
  if (!this.zoneSub) {
25055
25431
  this.zoneSub = this.ngZone.onStable.subscribe(() => {
25056
25432
  if (!this.scroller.rowHeightService) {
@@ -25571,7 +25947,7 @@ class ListComponent {
25571
25947
  <div></div>
25572
25948
  </div>
25573
25949
  </div>
25574
- <div
25950
+ <div
25575
25951
  #container
25576
25952
  class="k-grid-content k-virtual-content"
25577
25953
  [kendoGridResizableContainer]="lockedLeafColumns.length > 0"
@@ -25696,7 +26072,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
25696
26072
  <div></div>
25697
26073
  </div>
25698
26074
  </div>
25699
- <div
26075
+ <div
25700
26076
  #container
25701
26077
  class="k-grid-content k-virtual-content"
25702
26078
  [kendoGridResizableContainer]="lockedLeafColumns.length > 0"
@@ -26561,8 +26937,29 @@ class GridMessages extends ComponentMessages {
26561
26937
  * Sets the text for the external editing Dialog <b>Cancel</b> button.
26562
26938
  */
26563
26939
  externalEditingCancelText;
26940
+ /**
26941
+ * The placeholder text for the multi-checkbox filter search input
26942
+ */
26943
+ multiCheckboxFilterSearchPlaceholder;
26944
+ /**
26945
+ * The label for the multi-checkbox filter select all option
26946
+ */
26947
+ multiCheckboxFilterSelectAllLabel;
26948
+ /**
26949
+ * The text for the multi-checkbox filter selected items count
26950
+ *
26951
+ * The text includes the selected items count and a localizable string.
26952
+ * For 3 selected items the default text is `3 selected items`.
26953
+ *
26954
+ * To customize the text, use the `{selectedItemsCount}` placeholder and a custom localizable string.
26955
+ * For example, `{selectedItemsCount} items are selected`.
26956
+ *
26957
+ * The `{selectedItemsCount}` placeholder is replaced with the count of selected items,
26958
+ * and the message is rendered as `3 items are selected`.
26959
+ */
26960
+ multiCheckboxFilterSelectedItemsCount;
26564
26961
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GridMessages, deps: null, target: i0.ɵɵFactoryTarget.Directive });
26565
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: GridMessages, selector: "kendo-grid-messages-base", inputs: { groupPanelEmpty: "groupPanelEmpty", noRecords: "noRecords", pagerLabel: "pagerLabel", pagerFirstPage: "pagerFirstPage", pagerLastPage: "pagerLastPage", pagerPreviousPage: "pagerPreviousPage", pagerNextPage: "pagerNextPage", pagerPage: "pagerPage", pagerItemsPerPage: "pagerItemsPerPage", pagerOf: "pagerOf", pagerItems: "pagerItems", pagerPageNumberInputTitle: "pagerPageNumberInputTitle", pagerInputLabel: "pagerInputLabel", pagerSelectPage: "pagerSelectPage", filter: "filter", filterInputLabel: "filterInputLabel", filterMenuTitle: "filterMenuTitle", filterMenuOperatorsDropDownLabel: "filterMenuOperatorsDropDownLabel", filterMenuLogicDropDownLabel: "filterMenuLogicDropDownLabel", filterCellOperatorLabel: "filterCellOperatorLabel", booleanFilterCellLabel: "booleanFilterCellLabel", aiAssistantApplyButtonText: "aiAssistantApplyButtonText", aiAssistantToolbarToolText: "aiAssistantToolbarToolText", aiAssistantWindowTitle: "aiAssistantWindowTitle", aiAssistantWindowCloseTitle: "aiAssistantWindowCloseTitle", aiAssistantOutputCardTitle: "aiAssistantOutputCardTitle", aiAssistantOutputCardBodyContent: "aiAssistantOutputCardBodyContent", aiAssistantWindowMaximizeTitle: "aiAssistantWindowMaximizeTitle", aiAssistantWindowMinimizeTitle: "aiAssistantWindowMinimizeTitle", aiAssistantWindowRestoreTitle: "aiAssistantWindowRestoreTitle", 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", adaptiveFilterOperatorsTitle: "adaptiveFilterOperatorsTitle", filterAfterOrEqualOperator: "filterAfterOrEqualOperator", filterAfterOperator: "filterAfterOperator", filterBeforeOperator: "filterBeforeOperator", filterBeforeOrEqualOperator: "filterBeforeOrEqualOperator", filterFilterButton: "filterFilterButton", filterClearButton: "filterClearButton", adaptiveCloseButtonTitle: "adaptiveCloseButtonTitle", adaptiveBackButtonTitle: "adaptiveBackButtonTitle", filterAndLogic: "filterAndLogic", filterOrLogic: "filterOrLogic", filterToolbarToolText: "filterToolbarToolText", loading: "loading", gridLabel: "gridLabel", columnMenu: "columnMenu", setColumnPosition: "setColumnPosition", columns: "columns", columnChooserSelectedColumnsCount: "columnChooserSelectedColumnsCount", columnsSubtitle: "columnsSubtitle", adaptiveFilterTitle: "adaptiveFilterTitle", adaptiveSortTitle: "adaptiveSortTitle", adaptiveGroupTitle: "adaptiveGroupTitle", filterClearAllButton: "filterClearAllButton", groupClearButton: "groupClearButton", sortClearButton: "sortClearButton", sortDoneButton: "sortDoneButton", groupDoneButton: "groupDoneButton", lock: "lock", unlock: "unlock", stick: "stick", unstick: "unstick", sortable: "sortable", sortAscending: "sortAscending", sortDescending: "sortDescending", autosizeThisColumn: "autosizeThisColumn", autosizeAllColumns: "autosizeAllColumns", sortedAscending: "sortedAscending", sortedDescending: "sortedDescending", sortedDefault: "sortedDefault", sortToolbarToolText: "sortToolbarToolText", columnsApply: "columnsApply", columnsReset: "columnsReset", detailExpand: "detailExpand", detailCollapse: "detailCollapse", filterDateToday: "filterDateToday", filterDateToggle: "filterDateToggle", filterNumericDecrement: "filterNumericDecrement", filterNumericIncrement: "filterNumericIncrement", selectionCheckboxLabel: "selectionCheckboxLabel", selectAllCheckboxLabel: "selectAllCheckboxLabel", groupCollapse: "groupCollapse", groupExpand: "groupExpand", topToolbarLabel: "topToolbarLabel", bottomToolbarLabel: "bottomToolbarLabel", editToolbarToolText: "editToolbarToolText", saveToolbarToolText: "saveToolbarToolText", addToolbarToolText: "addToolbarToolText", cancelToolbarToolText: "cancelToolbarToolText", removeToolbarToolText: "removeToolbarToolText", excelExportToolbarToolText: "excelExportToolbarToolText", pdfExportToolbarToolText: "pdfExportToolbarToolText", groupPanelLabel: "groupPanelLabel", dragRowHandleLabel: "dragRowHandleLabel", columnMenuFilterTabTitle: "columnMenuFilterTabTitle", columnMenuGeneralTabTitle: "columnMenuGeneralTabTitle", columnMenuColumnsTabTitle: "columnMenuColumnsTabTitle", groupChipMenuPrevious: "groupChipMenuPrevious", groupChipMenuNext: "groupChipMenuNext", groupToolbarToolText: "groupToolbarToolText", formValidationErrorText: "formValidationErrorText", removeConfirmationDialogTitle: "removeConfirmationDialogTitle", removeConfirmationDialogContent: "removeConfirmationDialogContent", removeConfirmationDialogConfirmText: "removeConfirmationDialogConfirmText", removeConfirmationDialogRejectText: "removeConfirmationDialogRejectText", externalEditingTitle: "externalEditingTitle", externalEditingAddTitle: "externalEditingAddTitle", externalEditingSaveText: "externalEditingSaveText", externalEditingCancelText: "externalEditingCancelText" }, usesInheritance: true, ngImport: i0 });
26962
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: GridMessages, selector: "kendo-grid-messages-base", inputs: { groupPanelEmpty: "groupPanelEmpty", noRecords: "noRecords", pagerLabel: "pagerLabel", pagerFirstPage: "pagerFirstPage", pagerLastPage: "pagerLastPage", pagerPreviousPage: "pagerPreviousPage", pagerNextPage: "pagerNextPage", pagerPage: "pagerPage", pagerItemsPerPage: "pagerItemsPerPage", pagerOf: "pagerOf", pagerItems: "pagerItems", pagerPageNumberInputTitle: "pagerPageNumberInputTitle", pagerInputLabel: "pagerInputLabel", pagerSelectPage: "pagerSelectPage", filter: "filter", filterInputLabel: "filterInputLabel", filterMenuTitle: "filterMenuTitle", filterMenuOperatorsDropDownLabel: "filterMenuOperatorsDropDownLabel", filterMenuLogicDropDownLabel: "filterMenuLogicDropDownLabel", filterCellOperatorLabel: "filterCellOperatorLabel", booleanFilterCellLabel: "booleanFilterCellLabel", aiAssistantApplyButtonText: "aiAssistantApplyButtonText", aiAssistantToolbarToolText: "aiAssistantToolbarToolText", aiAssistantWindowTitle: "aiAssistantWindowTitle", aiAssistantWindowCloseTitle: "aiAssistantWindowCloseTitle", aiAssistantOutputCardTitle: "aiAssistantOutputCardTitle", aiAssistantOutputCardBodyContent: "aiAssistantOutputCardBodyContent", aiAssistantWindowMaximizeTitle: "aiAssistantWindowMaximizeTitle", aiAssistantWindowMinimizeTitle: "aiAssistantWindowMinimizeTitle", aiAssistantWindowRestoreTitle: "aiAssistantWindowRestoreTitle", 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", adaptiveFilterOperatorsTitle: "adaptiveFilterOperatorsTitle", filterAfterOrEqualOperator: "filterAfterOrEqualOperator", filterAfterOperator: "filterAfterOperator", filterBeforeOperator: "filterBeforeOperator", filterBeforeOrEqualOperator: "filterBeforeOrEqualOperator", filterFilterButton: "filterFilterButton", filterClearButton: "filterClearButton", adaptiveCloseButtonTitle: "adaptiveCloseButtonTitle", adaptiveBackButtonTitle: "adaptiveBackButtonTitle", filterAndLogic: "filterAndLogic", filterOrLogic: "filterOrLogic", filterToolbarToolText: "filterToolbarToolText", loading: "loading", gridLabel: "gridLabel", columnMenu: "columnMenu", setColumnPosition: "setColumnPosition", columns: "columns", columnChooserSelectedColumnsCount: "columnChooserSelectedColumnsCount", columnsSubtitle: "columnsSubtitle", adaptiveFilterTitle: "adaptiveFilterTitle", adaptiveSortTitle: "adaptiveSortTitle", adaptiveGroupTitle: "adaptiveGroupTitle", filterClearAllButton: "filterClearAllButton", groupClearButton: "groupClearButton", sortClearButton: "sortClearButton", sortDoneButton: "sortDoneButton", groupDoneButton: "groupDoneButton", lock: "lock", unlock: "unlock", stick: "stick", unstick: "unstick", sortable: "sortable", sortAscending: "sortAscending", sortDescending: "sortDescending", autosizeThisColumn: "autosizeThisColumn", autosizeAllColumns: "autosizeAllColumns", sortedAscending: "sortedAscending", sortedDescending: "sortedDescending", sortedDefault: "sortedDefault", sortToolbarToolText: "sortToolbarToolText", columnsApply: "columnsApply", columnsReset: "columnsReset", detailExpand: "detailExpand", detailCollapse: "detailCollapse", filterDateToday: "filterDateToday", filterDateToggle: "filterDateToggle", filterNumericDecrement: "filterNumericDecrement", filterNumericIncrement: "filterNumericIncrement", selectionCheckboxLabel: "selectionCheckboxLabel", selectAllCheckboxLabel: "selectAllCheckboxLabel", groupCollapse: "groupCollapse", groupExpand: "groupExpand", topToolbarLabel: "topToolbarLabel", bottomToolbarLabel: "bottomToolbarLabel", editToolbarToolText: "editToolbarToolText", saveToolbarToolText: "saveToolbarToolText", addToolbarToolText: "addToolbarToolText", cancelToolbarToolText: "cancelToolbarToolText", removeToolbarToolText: "removeToolbarToolText", excelExportToolbarToolText: "excelExportToolbarToolText", pdfExportToolbarToolText: "pdfExportToolbarToolText", groupPanelLabel: "groupPanelLabel", dragRowHandleLabel: "dragRowHandleLabel", columnMenuFilterTabTitle: "columnMenuFilterTabTitle", columnMenuGeneralTabTitle: "columnMenuGeneralTabTitle", columnMenuColumnsTabTitle: "columnMenuColumnsTabTitle", groupChipMenuPrevious: "groupChipMenuPrevious", groupChipMenuNext: "groupChipMenuNext", groupToolbarToolText: "groupToolbarToolText", formValidationErrorText: "formValidationErrorText", removeConfirmationDialogTitle: "removeConfirmationDialogTitle", removeConfirmationDialogContent: "removeConfirmationDialogContent", removeConfirmationDialogConfirmText: "removeConfirmationDialogConfirmText", removeConfirmationDialogRejectText: "removeConfirmationDialogRejectText", externalEditingTitle: "externalEditingTitle", externalEditingAddTitle: "externalEditingAddTitle", externalEditingSaveText: "externalEditingSaveText", externalEditingCancelText: "externalEditingCancelText", multiCheckboxFilterSearchPlaceholder: "multiCheckboxFilterSearchPlaceholder", multiCheckboxFilterSelectAllLabel: "multiCheckboxFilterSelectAllLabel", multiCheckboxFilterSelectedItemsCount: "multiCheckboxFilterSelectedItemsCount" }, usesInheritance: true, ngImport: i0 });
26566
26963
  }
26567
26964
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GridMessages, decorators: [{
26568
26965
  type: Directive,
@@ -26820,6 +27217,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
26820
27217
  type: Input
26821
27218
  }], externalEditingCancelText: [{
26822
27219
  type: Input
27220
+ }], multiCheckboxFilterSearchPlaceholder: [{
27221
+ type: Input
27222
+ }], multiCheckboxFilterSelectAllLabel: [{
27223
+ type: Input
27224
+ }], multiCheckboxFilterSelectedItemsCount: [{
27225
+ type: Input
26823
27226
  }] } });
26824
27227
 
26825
27228
  /**
@@ -26925,7 +27328,7 @@ class FilterToolbarToolComponent {
26925
27328
  }
26926
27329
  ngAfterViewInit() {
26927
27330
  this.ngZone.onStable.pipe(take(1)).subscribe(() => {
26928
- this.filterItems?.get(0)?.nativeElement.focus();
27331
+ this.filterItems?.get(0)?.nativeElement.focus({ preventScroll: true });
26929
27332
  });
26930
27333
  }
26931
27334
  ngOnDestroy() {
@@ -27111,7 +27514,7 @@ class SortToolbarToolComponent {
27111
27514
  }
27112
27515
  ngAfterViewInit() {
27113
27516
  this.ngZone.onStable.pipe(take(1)).subscribe(() => {
27114
- this.sortItems?.get(0)?.nativeElement.focus();
27517
+ this.sortItems?.get(0)?.nativeElement.focus({ preventScroll: true });
27115
27518
  });
27116
27519
  }
27117
27520
  ngOnDestroy() {
@@ -27673,12 +28076,12 @@ class GroupToolbarToolComponent {
27673
28076
  if (items?.first && (!isPresent$1(this.currentFocusedItemIndex) || this.currentFocusedItemIndex >= items.length || this.currentFocusedItemIndex < 0)) {
27674
28077
  this.ngZone.onStable.pipe(take(1)).subscribe(() => {
27675
28078
  this.currentFocusedItemIndex = 0;
27676
- this.groupItems.first.nativeElement.focus();
28079
+ this.groupItems.first.nativeElement.focus({ preventScroll: true });
27677
28080
  });
27678
28081
  return;
27679
28082
  }
27680
28083
  if (items?.first) {
27681
- items.get(this.currentFocusedItemIndex).nativeElement.focus();
28084
+ items.get(this.currentFocusedItemIndex).nativeElement.focus({ preventScroll: true });
27682
28085
  }
27683
28086
  }
27684
28087
  get groupItems() {
@@ -30058,7 +30461,7 @@ class GridComponent {
30058
30461
  */
30059
30462
  selectable = false;
30060
30463
  /**
30061
- * Sets the descriptors for sorting the data ([see example]({% slug sorting_grid %})).
30464
+ * Sets the descriptors for sorting the data ([see example](slug:manual_sorting_grid)).
30062
30465
  */
30063
30466
  set sort(value) {
30064
30467
  if (isArray(value)) {
@@ -30091,11 +30494,11 @@ class GridComponent {
30091
30494
  */
30092
30495
  trackBy = defaultTrackBy;
30093
30496
  /**
30094
- * Sets the filter descriptor for the data ([see examples]({% slug filtering_grid %})).
30497
+ * Sets the filter descriptor for the data ([see examples](slug:manual_filtering_grid)).
30095
30498
  */
30096
30499
  filter;
30097
30500
  /**
30098
- * Sets the descriptors for grouping the data ([see example]({% slug grouping_grid %})).
30501
+ * Sets the descriptors for grouping the data ([see example](slug:manual_grouping_grid)).
30099
30502
  */
30100
30503
  set group(value) {
30101
30504
  if (isArray(value)) {
@@ -32616,6 +33019,15 @@ class GridComponent {
32616
33019
 
32617
33020
  i18n-columnChooserSelectedColumnsCount="kendo.grid.columnChooserSelectedColumnsCount|The text displayed in the Column Chooser for the number of selected columns"
32618
33021
  columnChooserSelectedColumnsCount="{{ '{selectedColumnsCount} Selected items' }}"
33022
+
33023
+ i18n-multiCheckboxFilterSearchPlaceholder="kendo.grid.multiCheckboxFilterSearchPlaceholder|The placeholder text for the multi-checkbox filter search input"
33024
+ multiCheckboxFilterSearchPlaceholder="Search..."
33025
+
33026
+ i18n-multiCheckboxFilterSelectAllLabel="kendo.grid.multiCheckboxFilterSelectAllLabel|The label for the multi-checkbox filter select all option"
33027
+ multiCheckboxFilterSelectAllLabel="Select all"
33028
+
33029
+ i18n-multiCheckboxFilterSelectedItemsCount="kendo.grid.multiCheckboxFilterSelectedItemsCount|The text for the multi-checkbox filter selected items count"
33030
+ multiCheckboxFilterSelectedItemsCount="{{ '{selectedItemsCount} selected items' }}"
32619
33031
  >
32620
33032
  </ng-container>
32621
33033
  <kendo-grid-toolbar
@@ -33476,6 +33888,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
33476
33888
 
33477
33889
  i18n-columnChooserSelectedColumnsCount="kendo.grid.columnChooserSelectedColumnsCount|The text displayed in the Column Chooser for the number of selected columns"
33478
33890
  columnChooserSelectedColumnsCount="{{ '{selectedColumnsCount} Selected items' }}"
33891
+
33892
+ i18n-multiCheckboxFilterSearchPlaceholder="kendo.grid.multiCheckboxFilterSearchPlaceholder|The placeholder text for the multi-checkbox filter search input"
33893
+ multiCheckboxFilterSearchPlaceholder="Search..."
33894
+
33895
+ i18n-multiCheckboxFilterSelectAllLabel="kendo.grid.multiCheckboxFilterSelectAllLabel|The label for the multi-checkbox filter select all option"
33896
+ multiCheckboxFilterSelectAllLabel="Select all"
33897
+
33898
+ i18n-multiCheckboxFilterSelectedItemsCount="kendo.grid.multiCheckboxFilterSelectedItemsCount|The text for the multi-checkbox filter selected items count"
33899
+ multiCheckboxFilterSelectedItemsCount="{{ '{selectedItemsCount} selected items' }}"
33479
33900
  >
33480
33901
  </ng-container>
33481
33902
  <kendo-grid-toolbar
@@ -34706,7 +35127,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
34706
35127
  }] });
34707
35128
 
34708
35129
  /**
34709
- * Represents the directive that manages editing operations in the Grid when using Template-Driven Angular Forms ([see example]({% slug editing_directives_grid %}#toc-template-editing-directive)).
35130
+ * Represents the directive that manages editing operations in the Grid when using Template-Driven Angular Forms ([see example](slug:inline_editing_grid#using-template-driven-forms)).
34710
35131
  *
34711
35132
  * @example
34712
35133
  * ```html
@@ -34783,7 +35204,7 @@ const markAllAsTouched = (control) => {
34783
35204
  };
34784
35205
 
34785
35206
  /**
34786
- * Represents the directive that manages editing operations in the Grid when using Reactive Forms ([see example](slug:editing_directives_grid#toc-reactive-editing-directive)).
35207
+ * Represents the directive that manages editing operations in the Grid when using Reactive Forms ([see example](slug:inline_editing_grid#using-reactive-forms)).
34787
35208
  *
34788
35209
  * @example
34789
35210
  * ```html
@@ -34832,7 +35253,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
34832
35253
  }] } });
34833
35254
 
34834
35255
  /**
34835
- * Represent the directive that manages in-cell editing operations in the Grid when using Reactive Forms ([see example]({% slug editing_directives_grid %}#toc-in-cell-editing)).
35256
+ * Represent the directive that manages in-cell editing operations in the Grid when using Reactive Forms ([see example](slug:editing_incell_grid#quick-setup)).
34836
35257
  *
34837
35258
  * @example
34838
35259
  * ```html
@@ -34918,7 +35339,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
34918
35339
 
34919
35340
  /**
34920
35341
  * Represents the Kendo UI Grid external editing directive. The directive manages editing operations in the Grid when using the
34921
- * External Form ([see example](slug:editing_directives_grid#external-editing)).
35342
+ * External Form ([see example](slug:external_editing_grid#quick-setup)).
34922
35343
  *
34923
35344
  * @example
34924
35345
  * ```typescript
@@ -38082,5 +38503,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
38082
38503
  * Generated bundle index. Do not edit.
38083
38504
  */
38084
38505
 
38085
- export { AIAssistantToolbarDirective, AddCommandDirective, AddCommandToolbarDirective, AfterEqFilterOperatorComponent, AfterFilterOperatorComponent, AutoCompleteFilterCellComponent, BaseFilterCellComponent, BeforeEqFilterOperatorComponent, BeforeFilterOperatorComponent, BooleanFilterCellComponent, BooleanFilterComponent, BooleanFilterMenuComponent, BooleanFilterRadioButtonDirective, BrowserSupportService, CELL_CONTEXT, CancelCommandDirective, CancelCommandToolbarDirective, CellCloseEvent, CellComponent, CellLoadingTemplateDirective, CellSelectionAggregateService, CellSelectionService, CellTemplateDirective, ChangeNotificationService, CheckboxColumnComponent, ColGroupComponent, ColumnBase, ColumnChooserComponent, ColumnChooserToolbarDirective, ColumnComponent, ColumnGroupComponent, ColumnHandleDirective, ColumnInfoService, ColumnListComponent, ColumnLockedChangeEvent, ColumnMenuAutoSizeAllColumnsComponent, ColumnMenuAutoSizeColumnComponent, ColumnMenuChooserComponent, ColumnMenuComponent, ColumnMenuContainerComponent, ColumnMenuFilterComponent, ColumnMenuItemComponent, ColumnMenuItemContentTemplateDirective, ColumnMenuItemDirective, ColumnMenuLockComponent, ColumnMenuPositionComponent, ColumnMenuService, ColumnMenuSortComponent, ColumnMenuStickComponent, ColumnMenuTemplateDirective, ColumnReorderEvent, ColumnReorderService, ColumnResizingService, ColumnStickyChangeEvent, ColumnVisibilityChangeEvent, ColumnsContainer, CommandColumnComponent, ContainsFilterOperatorComponent, ContextService, CustomMessagesComponent, DEFAULT_AI_REQUEST_OPTIONS, DEFAULT_SCROLLER_FACTORY, DataBindingDirective, DateFilterCellComponent, DateFilterComponent, DateFilterMenuComponent, DateFilterMenuInputComponent, DetailCollapseEvent, DetailExpandEvent, DetailTemplateDirective, DetailsService, DoesNotContainFilterOperatorComponent, DomEventsService, DragAndDropService, DragHintService, DropCueService, EditCommandDirective, EditCommandToolbarDirective, EditService as EditServiceClass, EditTemplateDirective, EditingDirectiveBase, EndsWithFilterOperatorComponent, EqualFilterOperatorComponent, ExcelCommandDirective, ExcelCommandToolbarDirective, ExcelComponent, ExcelExportEvent, ExcelModule, ExcelService, ExpandDetailsDirective, ExpandGroupDirective, ExternalEditingDirective, FieldAccessorPipe, FilterCellComponent, FilterCellHostDirective, FilterCellOperatorsComponent, FilterCellTemplateDirective, FilterCellWrapperComponent, FilterCommandToolbarDirective, FilterInputDirective, FilterMenuComponent, FilterMenuContainerComponent, FilterMenuDropDownListDirective, FilterMenuHostDirective, FilterMenuInputWrapperComponent, FilterMenuTemplateDirective, FilterRowComponent, FilterService, FocusRoot, FocusableDirective, FooterComponent, FooterTemplateDirective, GreaterFilterOperatorComponent, GreaterOrEqualToFilterOperatorComponent, GridClipboardDirective, GridComponent, GridModule, GridSpacerComponent, GridTableDirective, GridToolbarAIResponseErrorEvent, GridToolbarAIResponseSuccessEvent, GridToolbarFocusableDirective, GridToolbarNavigationService, GroupCommandToolbarDirective, GroupFooterTemplateDirective, GroupHeaderColumnTemplateDirective, GroupHeaderComponent, GroupHeaderTemplateDirective, GroupInfoService, GroupPanelComponent, GroupsService, HeaderComponent, HeaderTemplateDirective, HighlightDirective, IdService, InCellEditingDirective, IsEmptyFilterOperatorComponent, IsNotEmptyFilterOperatorComponent, IsNotNullFilterOperatorComponent, IsNullFilterOperatorComponent, KENDO_GRID, KENDO_GRID_BODY_EXPORTS, KENDO_GRID_COLUMN_DRAGANDDROP, KENDO_GRID_COLUMN_MENU_DECLARATIONS, KENDO_GRID_COLUMN_MENU_EXPORTS, KENDO_GRID_DECLARATIONS, KENDO_GRID_EXCEL_EXPORT, KENDO_GRID_EXPORTS, KENDO_GRID_FILTER_MENU, KENDO_GRID_FILTER_MENU_EXPORTS, KENDO_GRID_FILTER_OPERATORS, KENDO_GRID_FILTER_ROW, KENDO_GRID_FILTER_ROW_EXPORTS, KENDO_GRID_FILTER_SHARED, KENDO_GRID_FOOTER_EXPORTS, KENDO_GRID_GROUP_EXPORTS, KENDO_GRID_HEADER_EXPORTS, KENDO_GRID_PDF_EXPORT, KENDO_GRID_SHARED, LessFilterOperatorComponent, LessOrEqualToFilterOperatorComponent, ListComponent, LoadingComponent, LoadingTemplateDirective, LocalDataChangesService, LogicalCellDirective, LogicalRowDirective, MenuTabbingService, NavigationService, NoRecordsTemplateDirective, NotEqualFilterOperatorComponent, NumericFilterCellComponent, NumericFilterComponent, NumericFilterMenuComponent, NumericFilterMenuInputComponent, PDFCommandDirective, PDFCommandToolbarDirective, PDFComponent, PDFMarginComponent, PDFModule, PDFService, PDFTemplateDirective, PopupCloseEvent, ReactiveEditingDirective, RedoCommandToolbarDirective, RemoveCommandDirective, RemoveCommandToolbarDirective, ResizableContainerDirective, ResizeService, ResponsiveService, RowDragHandleTemplateDirective, RowDragHintTemplateDirective, RowEditingDirectiveBase, RowReorderColumnComponent, RowReorderService, SaveCommandDirective, SaveCommandToolbarDirective, ScrollRequestService, ScrollSyncService, SelectAllCheckboxDirective, SelectAllToolbarToolComponent, SelectionCheckboxDirective, SelectionDirective, SelectionService, SinglePopupService, SizingOptionsService, Skip, SortCommandToolbarDirective, SortService, SpanColumnComponent, StartsWithFilterOperatorComponent, StatusBarTemplateDirective, StringFilterCellComponent, StringFilterComponent, StringFilterMenuComponent, StringFilterMenuInputComponent, SuspendService, TableBodyComponent, TableDirective, TemplateEditingDirective, ToolbarComponent, ToolbarTemplateDirective, UndoCommandToolbarDirective, UndoRedoDirective, UndoRedoEvent, defaultTrackBy, hasFilterMenu, hasFilterRow, isFilterable };
38506
+ export { AIAssistantToolbarDirective, AddCommandDirective, AddCommandToolbarDirective, AfterEqFilterOperatorComponent, AfterFilterOperatorComponent, AutoCompleteFilterCellComponent, BaseFilterCellComponent, BeforeEqFilterOperatorComponent, BeforeFilterOperatorComponent, BooleanFilterCellComponent, BooleanFilterComponent, BooleanFilterMenuComponent, BooleanFilterRadioButtonDirective, BrowserSupportService, CELL_CONTEXT, CancelCommandDirective, CancelCommandToolbarDirective, CellCloseEvent, CellComponent, CellLoadingTemplateDirective, CellSelectionAggregateService, CellSelectionService, CellTemplateDirective, ChangeNotificationService, CheckboxColumnComponent, ColGroupComponent, ColumnBase, ColumnChooserComponent, ColumnChooserToolbarDirective, ColumnComponent, ColumnGroupComponent, ColumnHandleDirective, ColumnInfoService, ColumnListComponent, ColumnLockedChangeEvent, ColumnMenuAutoSizeAllColumnsComponent, ColumnMenuAutoSizeColumnComponent, ColumnMenuChooserComponent, ColumnMenuComponent, ColumnMenuContainerComponent, ColumnMenuFilterComponent, ColumnMenuItemComponent, ColumnMenuItemContentTemplateDirective, ColumnMenuItemDirective, ColumnMenuLockComponent, ColumnMenuPositionComponent, ColumnMenuService, ColumnMenuSortComponent, ColumnMenuStickComponent, ColumnMenuTemplateDirective, ColumnReorderEvent, ColumnReorderService, ColumnResizingService, ColumnStickyChangeEvent, ColumnVisibilityChangeEvent, ColumnsContainer, CommandColumnComponent, ContainsFilterOperatorComponent, ContextService, CustomMessagesComponent, DEFAULT_AI_REQUEST_OPTIONS, DEFAULT_SCROLLER_FACTORY, DataBindingDirective, DateFilterCellComponent, DateFilterComponent, DateFilterMenuComponent, DateFilterMenuInputComponent, DetailCollapseEvent, DetailExpandEvent, DetailTemplateDirective, DetailsService, DoesNotContainFilterOperatorComponent, DomEventsService, DragAndDropService, DragHintService, DropCueService, EditCommandDirective, EditCommandToolbarDirective, EditService as EditServiceClass, EditTemplateDirective, EditingDirectiveBase, EndsWithFilterOperatorComponent, EqualFilterOperatorComponent, ExcelCommandDirective, ExcelCommandToolbarDirective, ExcelComponent, ExcelExportEvent, ExcelModule, ExcelService, ExpandDetailsDirective, ExpandGroupDirective, ExternalEditingDirective, FieldAccessorPipe, FilterCellComponent, FilterCellHostDirective, FilterCellOperatorsComponent, FilterCellTemplateDirective, FilterCellWrapperComponent, FilterCommandToolbarDirective, FilterInputDirective, FilterMenuComponent, FilterMenuContainerComponent, FilterMenuDropDownListDirective, FilterMenuHostDirective, FilterMenuInputWrapperComponent, FilterMenuTemplateDirective, FilterRowComponent, FilterService, FocusRoot, FocusableDirective, FooterComponent, FooterTemplateDirective, GreaterFilterOperatorComponent, GreaterOrEqualToFilterOperatorComponent, GridClipboardDirective, GridComponent, GridModule, GridSpacerComponent, GridTableDirective, GridToolbarAIResponseErrorEvent, GridToolbarAIResponseSuccessEvent, GridToolbarFocusableDirective, GridToolbarNavigationService, GroupCommandToolbarDirective, GroupFooterTemplateDirective, GroupHeaderColumnTemplateDirective, GroupHeaderComponent, GroupHeaderTemplateDirective, GroupInfoService, GroupPanelComponent, GroupsService, HeaderComponent, HeaderTemplateDirective, HighlightDirective, IdService, InCellEditingDirective, IsEmptyFilterOperatorComponent, IsNotEmptyFilterOperatorComponent, IsNotNullFilterOperatorComponent, IsNullFilterOperatorComponent, KENDO_GRID, KENDO_GRID_BODY_EXPORTS, KENDO_GRID_COLUMN_DRAGANDDROP, KENDO_GRID_COLUMN_MENU_DECLARATIONS, KENDO_GRID_COLUMN_MENU_EXPORTS, KENDO_GRID_DECLARATIONS, KENDO_GRID_EXCEL_EXPORT, KENDO_GRID_EXPORTS, KENDO_GRID_FILTER_MENU, KENDO_GRID_FILTER_MENU_EXPORTS, KENDO_GRID_FILTER_OPERATORS, KENDO_GRID_FILTER_ROW, KENDO_GRID_FILTER_ROW_EXPORTS, KENDO_GRID_FILTER_SHARED, KENDO_GRID_FOOTER_EXPORTS, KENDO_GRID_GROUP_EXPORTS, KENDO_GRID_HEADER_EXPORTS, KENDO_GRID_PDF_EXPORT, KENDO_GRID_SHARED, LessFilterOperatorComponent, LessOrEqualToFilterOperatorComponent, ListComponent, LoadingComponent, LoadingTemplateDirective, LocalDataChangesService, LogicalCellDirective, LogicalRowDirective, MenuTabbingService, MultiCheckboxFilterComponent, NavigationService, NoRecordsTemplateDirective, NotEqualFilterOperatorComponent, NumericFilterCellComponent, NumericFilterComponent, NumericFilterMenuComponent, NumericFilterMenuInputComponent, PDFCommandDirective, PDFCommandToolbarDirective, PDFComponent, PDFMarginComponent, PDFModule, PDFService, PDFTemplateDirective, PopupCloseEvent, ReactiveEditingDirective, RedoCommandToolbarDirective, RemoveCommandDirective, RemoveCommandToolbarDirective, ResizableContainerDirective, ResizeService, ResponsiveService, RowDragHandleTemplateDirective, RowDragHintTemplateDirective, RowEditingDirectiveBase, RowReorderColumnComponent, RowReorderService, SaveCommandDirective, SaveCommandToolbarDirective, ScrollRequestService, ScrollSyncService, SelectAllCheckboxDirective, SelectAllToolbarToolComponent, SelectionCheckboxDirective, SelectionDirective, SelectionService, SinglePopupService, SizingOptionsService, Skip, SortCommandToolbarDirective, SortService, SpanColumnComponent, StartsWithFilterOperatorComponent, StatusBarTemplateDirective, StringFilterCellComponent, StringFilterComponent, StringFilterMenuComponent, StringFilterMenuInputComponent, SuspendService, TableBodyComponent, TableDirective, TemplateEditingDirective, ToolbarComponent, ToolbarTemplateDirective, UndoCommandToolbarDirective, UndoRedoDirective, UndoRedoEvent, defaultTrackBy, hasFilterMenu, hasFilterRow, isFilterable };
38086
38507