@progress/kendo-angular-grid 19.3.1-develop.3 → 20.0.0-develop.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/codemods/template-transformer/index.js +94 -0
  2. package/codemods/utils.js +553 -0
  3. package/codemods/v20/grid-kendogridgroupbinding.js +51 -0
  4. package/common/provider.service.d.ts +3 -2
  5. package/databinding.directive.d.ts +0 -3
  6. package/directives.d.ts +3 -4
  7. package/esm2022/common/error-messages.mjs +0 -6
  8. package/esm2022/common/provider.service.mjs +1 -0
  9. package/esm2022/data/data.iterators.mjs +0 -7
  10. package/esm2022/databinding.directive.mjs +4 -4
  11. package/esm2022/directives.mjs +0 -3
  12. package/esm2022/grid.component.mjs +63 -31
  13. package/esm2022/grid.module.mjs +15 -16
  14. package/esm2022/grouping/group-header.component.mjs +6 -3
  15. package/esm2022/index.mjs +0 -1
  16. package/esm2022/navigation/navigation-metadata.mjs +4 -2
  17. package/esm2022/navigation/navigation.service.mjs +4 -2
  18. package/esm2022/package-metadata.mjs +2 -2
  19. package/esm2022/pdf/pdf.component.mjs +16 -0
  20. package/esm2022/pdf/pdf.service.mjs +1 -0
  21. package/esm2022/rendering/list.component.mjs +188 -92
  22. package/esm2022/rendering/table-body.component.mjs +19 -5
  23. package/esm2022/scrolling/row-height.service.mjs +23 -65
  24. package/esm2022/scrolling/scroller.service.mjs +175 -35
  25. package/fesm2022/progress-kendo-angular-grid.mjs +508 -588
  26. package/grid.component.d.ts +6 -6
  27. package/grid.module.d.ts +14 -15
  28. package/grouping/group-header.component.d.ts +1 -1
  29. package/index.d.ts +0 -2
  30. package/navigation/navigation-metadata.d.ts +2 -1
  31. package/package.json +36 -21
  32. package/pdf/pdf.component.d.ts +1 -0
  33. package/pdf/pdf.service.d.ts +1 -0
  34. package/rendering/list.component.d.ts +11 -5
  35. package/rendering/table-body.component.d.ts +3 -2
  36. package/schematics/ngAdd/index.js +4 -4
  37. package/scrolling/row-height.service.d.ts +3 -8
  38. package/scrolling/scroller.service.d.ts +35 -9
  39. package/esm2022/grouping/group-scroll-binding.directive.mjs +0 -347
  40. package/esm2022/grouping/virtual-group-result.interface.mjs +0 -5
  41. package/grouping/group-scroll-binding.directive.d.ts +0 -85
  42. package/grouping/virtual-group-result.interface.d.ts +0 -18
@@ -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, closest as closest$1, hasObservers, ResizeSensorComponent, 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, 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';
@@ -16,7 +16,7 @@ import * as i1$2 from '@progress/kendo-angular-l10n';
16
16
  import { ComponentMessages, LocalizationService, L10N_PREFIX } from '@progress/kendo-angular-l10n';
17
17
  import * as i53 from '@progress/kendo-angular-pager';
18
18
  import { PagerContextService, PagerNavigationService, PagerTemplateDirective, KENDO_PAGER } from '@progress/kendo-angular-pager';
19
- import { orderBy, isCompositeFilterDescriptor, groupBy, process, filterBy } from '@progress/kendo-data-query';
19
+ import { orderBy, isCompositeFilterDescriptor, groupBy, process } from '@progress/kendo-data-query';
20
20
  import { NgFor, NgIf, NgTemplateOutlet, NgSwitch, NgSwitchCase, NgClass, NgStyle, NgSwitchDefault, KeyValuePipe } from '@angular/common';
21
21
  import { getter } from '@progress/kendo-common';
22
22
  import * as i1$4 from '@progress/kendo-angular-intl';
@@ -867,6 +867,7 @@ class ContextService {
867
867
  topToolbarNavigation;
868
868
  bottomToolbarNavigation;
869
869
  navigable;
870
+ scroller;
870
871
  dataBindingDirective;
871
872
  highlightDirective;
872
873
  constructor(renderer, localization) {
@@ -2170,9 +2171,6 @@ const GridConfigurationErrorMessages = {
2170
2171
  functionType: (propName, fn) => `${propName} must be a function, but received ${JSON.stringify(fn)}.`,
2171
2172
  incompatibleFeatures: (feat1Name, feat2Name) => `'Having both ${feat1Name} and ${feat2Name} is not supported.'`,
2172
2173
  nonLockedColumnPresent: 'There should be at least one non-locked column. See https://www.telerik.com/kendo-angular-ui/components/grid/columns/locked/#toc-known-limitations',
2173
- rowHeightVirtual: `The virtual scrolling functionality requires setting the rowHeight (and detailRowHeight when there are detail rows).
2174
- Row height and detail row height settings should be set only when virtual scrolling mode is enabled.
2175
- See https://www.telerik.com/kendo-angular-ui/components/grid/scroll-modes/virtual/#toc-getting-started.`,
2176
2174
  focusNavigable: 'The Grid should be configured as navigable to control focus. See https://www.telerik.com/kendo-angular-ui/components/grid/keyboard-navigation/.',
2177
2175
  expandCollapseMethods: (expandMethodName, collapseMethodName, directiveName, callbackName) => `The ${expandMethodName} and ${collapseMethodName} methods should not be called
2178
2176
  when using the ${directiveName} directive or the ${callbackName} callback.
@@ -2180,9 +2178,6 @@ const GridConfigurationErrorMessages = {
2180
2178
  requiredEditService: `The default edit service of the editing directives works only when binding to plain array.
2181
2179
  Please provide an editService. See https://www.telerik.com/kendo-angular-ui/components/grid/editing/editing-directives/#toc-custom-editing-service.`,
2182
2180
  requiredModule: (exportedType, moduleName, componentSelector) => `Creating ${exportedType} requires including the ${moduleName} and adding the ${componentSelector} component.`,
2183
- groupBindingDirectives: `Using the "kendoGridGroupBinding" directive in combination with the "kendoGridExpandGroupBy" directive
2184
- or the "isGroupExpanded" callback is not supported. To use grouping with the "kendoGridGroupBinding" directive,
2185
- set the Grid "groupable" property to "true".`,
2186
2181
  unsupportedMethod: (methodName, suggestedMethodName) => `Using ${methodName} in this context is not supported. Use ${suggestedMethodName} instead.`,
2187
2182
  unsupportedToolbarConfig: `
2188
2183
  Defining both a toolbar template and a ToolBarComponent within the Grid is not supported.
@@ -3522,7 +3517,7 @@ class NavigationService {
3522
3517
  isShiftPressed = false;
3523
3518
  currentSelection = [];
3524
3519
  get activeDataRow() {
3525
- return Math.max(0, this.activeRowIndex - this.meta.headerRows);
3520
+ return Math.min(Math.max(0, this.activeRowIndex - this.meta.headerRows), this.meta.maxLogicalRowIndex);
3526
3521
  }
3527
3522
  constructor(zone, domEvents, pagerContextService, scrollRequestService, groupsService, detailsService, focusRoot, editService, cd, ctx, resizeService, focusableParent) {
3528
3523
  this.zone = zone;
@@ -4084,8 +4079,10 @@ class NavigationService {
4084
4079
  const dataRowIndex = this.activeDataRow;
4085
4080
  if (this.meta && (this.meta.isVirtual &&
4086
4081
  args.rowIndex >= this.meta.headerRows &&
4082
+ args.rowIndex <= this.meta.maxLogicalRowIndex - this.meta.footerRow &&
4087
4083
  this.viewport &&
4088
- !this.viewport.containsRow(dataRowIndex) && dataRowIndex > -1)) {
4084
+ !this.viewport.containsRow(dataRowIndex) &&
4085
+ dataRowIndex > -1)) {
4089
4086
  this.scrollRequestService.scrollTo({ row: dataRowIndex });
4090
4087
  }
4091
4088
  if (this.meta.virtualColumns && args.colIndex >= this.meta.columns.lockedLeafColumns.length) {
@@ -5716,8 +5713,11 @@ class GroupHeaderComponent {
5716
5713
  prefixGroupCell(item) {
5717
5714
  return new Array(item.level);
5718
5715
  }
5719
- toggleGroup(item) {
5716
+ toggleGroup(item, event) {
5720
5717
  this.groupsService.toggleRow(item);
5718
+ if (this.ctx.navigable) {
5719
+ this.ctx.grid.navigationService.focusCellByElement(event.target.closest('td'));
5720
+ }
5721
5721
  return false;
5722
5722
  }
5723
5723
  groupSpan(item) {
@@ -5793,7 +5793,7 @@ class GroupHeaderComponent {
5793
5793
  [colSpan]="logicalColSpan()">
5794
5794
  <p class="k-reset">
5795
5795
  <ng-container *ngIf="!skipGroupDecoration">
5796
- <a href="#" tabindex="-1" (click)="toggleGroup(item)"
5796
+ <a href="#" tabindex="-1" (click)="toggleGroup(item, $event)"
5797
5797
  role="presentation"
5798
5798
  [attr.title]="groupButtonTitle"
5799
5799
  [attr.aria-label]="groupButtonTitle">
@@ -5884,7 +5884,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
5884
5884
  [colSpan]="logicalColSpan()">
5885
5885
  <p class="k-reset">
5886
5886
  <ng-container *ngIf="!skipGroupDecoration">
5887
- <a href="#" tabindex="-1" (click)="toggleGroup(item)"
5887
+ <a href="#" tabindex="-1" (click)="toggleGroup(item, $event)"
5888
5888
  role="presentation"
5889
5889
  [attr.title]="groupButtonTitle"
5890
5890
  [attr.aria-label]="groupButtonTitle">
@@ -15735,6 +15735,7 @@ class PDFService {
15735
15735
  exportClick = new EventEmitter();
15736
15736
  dataChanged = new EventEmitter();
15737
15737
  exporting;
15738
+ restoreDOMVirtualization = new EventEmitter();
15738
15739
  save(component) {
15739
15740
  this.emitEvent(this.savePDF, component);
15740
15741
  }
@@ -16061,6 +16062,7 @@ class PDFComponent extends PDFExportComponent {
16061
16062
  drawSubscription;
16062
16063
  renderAllPages;
16063
16064
  originalColumns;
16065
+ restoreDOMVirtualization;
16064
16066
  constructor(pdfService, suspendService, ngZone, element, ctx) {
16065
16067
  super(element);
16066
16068
  this.pdfService = pdfService;
@@ -16109,6 +16111,16 @@ class PDFComponent extends PDFExportComponent {
16109
16111
  this.pdfService.exporting = true;
16110
16112
  this.initProgress();
16111
16113
  this.renderAllPages = this.allPages && pageSize < total;
16114
+ if (component.isVirtual && component.pageable) {
16115
+ component.scrollable = 'scrollable';
16116
+ this.restoreDOMVirtualization = true;
16117
+ if (!this.renderAllPages) {
16118
+ this.changePage(component.skip, pageSize, callback, columns);
16119
+ if (!(columns.length || component.virtualColumns)) {
16120
+ return;
16121
+ }
16122
+ }
16123
+ }
16112
16124
  if (this.renderAllPages) {
16113
16125
  this.skip = component.skip;
16114
16126
  this.pageSize = pageSize;
@@ -16191,6 +16203,11 @@ class PDFComponent extends PDFExportComponent {
16191
16203
  if (this.component) {
16192
16204
  const originalColumns = this.originalColumns;
16193
16205
  delete this.originalColumns;
16206
+ if (this.restoreDOMVirtualization) {
16207
+ this.component.scrollable = 'virtual';
16208
+ this.pdfService.restoreDOMVirtualization.emit();
16209
+ this.restoreDOMVirtualization = false;
16210
+ }
16194
16211
  if (this.renderAllPages) {
16195
16212
  this.changePage(this.skip, this.pageSize, this.reset, originalColumns);
16196
16213
  }
@@ -20240,6 +20257,8 @@ class TableBodyComponent {
20240
20257
  rowSticky;
20241
20258
  totalColumns;
20242
20259
  rowClass = () => null;
20260
+ rowHeight;
20261
+ detailRowHeight;
20243
20262
  hostClass = true;
20244
20263
  groupHeaderSlaveCellsCount;
20245
20264
  groupHeaderColumns;
@@ -20352,7 +20371,8 @@ class TableBodyComponent {
20352
20371
  }
20353
20372
  }
20354
20373
  logicalRowIndex(rowIndex) {
20355
- let pos = this.skip + rowIndex;
20374
+ const skip = this.skip + (this.ctx.scroller?.virtualSkip ?? 0);
20375
+ let pos = rowIndex + skip;
20356
20376
  if (this.hasDetailTemplate && !this.isStackedMode) {
20357
20377
  pos *= 2;
20358
20378
  }
@@ -20444,9 +20464,6 @@ class TableBodyComponent {
20444
20464
  }, []);
20445
20465
  return colsToRender;
20446
20466
  }
20447
- showGroupHeader(item) {
20448
- return !item.data.skipHeader;
20449
- }
20450
20467
  addStickyColumnStyles(column) {
20451
20468
  const stickyStyles = this.columnInfoService.stickyColumnsStyles(column);
20452
20469
  return { ...column.style, ...stickyStyles };
@@ -20610,9 +20627,10 @@ class TableBodyComponent {
20610
20627
  }
20611
20628
  }
20612
20629
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TableBodyComponent, deps: [{ token: DetailsService }, { token: GroupsService }, { token: ChangeNotificationService }, { token: EditService }, { token: ContextService }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: DomEventsService }, { token: SelectionService }, { token: CellSelectionService }, { token: ColumnInfoService }, { token: NavigationService }], target: i0.ɵɵFactoryTarget.Component });
20613
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TableBodyComponent, isStandalone: true, selector: "[kendoGridTableBody]", inputs: { columns: "columns", allColumns: "allColumns", groups: "groups", detailTemplate: "detailTemplate", noRecordsTemplate: "noRecordsTemplate", rowsToRender: "rowsToRender", skip: "skip", selectable: "selectable", filterable: "filterable", noRecordsText: "noRecordsText", isLocked: "isLocked", isLoading: "isLoading", isVirtual: "isVirtual", cellLoadingTemplate: "cellLoadingTemplate", skipGroupDecoration: "skipGroupDecoration", lockedColumnsCount: "lockedColumnsCount", totalColumnsCount: "totalColumnsCount", virtualColumns: "virtualColumns", trackBy: "trackBy", rowSticky: "rowSticky", totalColumns: "totalColumns", rowClass: "rowClass" }, host: { properties: { "class.k-table-tbody": "this.hostClass" } }, usesOnChanges: true, ngImport: i0, template: `
20630
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TableBodyComponent, isStandalone: true, selector: "[kendoGridTableBody]", inputs: { columns: "columns", allColumns: "allColumns", groups: "groups", detailTemplate: "detailTemplate", noRecordsTemplate: "noRecordsTemplate", rowsToRender: "rowsToRender", skip: "skip", selectable: "selectable", filterable: "filterable", noRecordsText: "noRecordsText", isLocked: "isLocked", isLoading: "isLoading", isVirtual: "isVirtual", cellLoadingTemplate: "cellLoadingTemplate", skipGroupDecoration: "skipGroupDecoration", lockedColumnsCount: "lockedColumnsCount", totalColumnsCount: "totalColumnsCount", virtualColumns: "virtualColumns", trackBy: "trackBy", rowSticky: "rowSticky", totalColumns: "totalColumns", rowClass: "rowClass", rowHeight: "rowHeight", detailRowHeight: "detailRowHeight" }, host: { properties: { "class.k-table-tbody": "this.hostClass" } }, usesOnChanges: true, ngImport: i0, template: `
20614
20631
  <ng-container *ngIf="editService.hasNewItem">
20615
20632
  <tr class="k-grid-add-row k-grid-edit-row k-master-row"
20633
+ [style.height.px]="rowHeight"
20616
20634
  kendoGridLogicalRow
20617
20635
  [logicalRowIndex]="addRowLogicalIndex()"
20618
20636
  [logicalSlaveRow]="lockedColumnsCount > 0 && !isStackedMode"
@@ -20682,6 +20700,7 @@ class TableBodyComponent {
20682
20700
  </tr>
20683
20701
  <ng-container *ngFor="let item of rowsToRender; trackBy: trackByWrapper; let rowIndex = index;">
20684
20702
  <tr *ngIf="item.type === 'group'"
20703
+ [style.height.px]="rowHeight"
20685
20704
  kendoGridGroupHeader
20686
20705
  [columns]="columns"
20687
20706
  [groups]="groups"
@@ -20700,6 +20719,7 @@ class TableBodyComponent {
20700
20719
  [logicalSlaveCellsCount]="groupHeaderSlaveCellsCount">
20701
20720
  </tr>
20702
20721
  <tr *ngIf="item.showDataItem"
20722
+ [style.height.px]="rowHeight"
20703
20723
  kendoGridLogicalRow
20704
20724
  [dataRowIndex]="$any(item).index"
20705
20725
  [dataItem]="item.data"
@@ -20801,6 +20821,7 @@ class TableBodyComponent {
20801
20821
  </tr>
20802
20822
  <tr *ngIf="item.showDetailRow"
20803
20823
  class="k-detail-row"
20824
+ [style.height.px]="detailRowHeight"
20804
20825
  kendoGridLogicalRow
20805
20826
  [dataRowIndex]="$any(item).index"
20806
20827
  [dataItem]="item.data"
@@ -20855,6 +20876,7 @@ class TableBodyComponent {
20855
20876
  </tr>
20856
20877
  <tr *ngIf="item.type === 'footer'"
20857
20878
  class="k-group-footer"
20879
+ [style.height.px]="rowHeight"
20858
20880
  kendoGridLogicalRow
20859
20881
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
20860
20882
  [logicalSlaveRow]="lockedColumnsCount > 0 && !isStackedMode"
@@ -20928,6 +20950,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
20928
20950
  template: `
20929
20951
  <ng-container *ngIf="editService.hasNewItem">
20930
20952
  <tr class="k-grid-add-row k-grid-edit-row k-master-row"
20953
+ [style.height.px]="rowHeight"
20931
20954
  kendoGridLogicalRow
20932
20955
  [logicalRowIndex]="addRowLogicalIndex()"
20933
20956
  [logicalSlaveRow]="lockedColumnsCount > 0 && !isStackedMode"
@@ -20997,6 +21020,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
20997
21020
  </tr>
20998
21021
  <ng-container *ngFor="let item of rowsToRender; trackBy: trackByWrapper; let rowIndex = index;">
20999
21022
  <tr *ngIf="item.type === 'group'"
21023
+ [style.height.px]="rowHeight"
21000
21024
  kendoGridGroupHeader
21001
21025
  [columns]="columns"
21002
21026
  [groups]="groups"
@@ -21015,6 +21039,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
21015
21039
  [logicalSlaveCellsCount]="groupHeaderSlaveCellsCount">
21016
21040
  </tr>
21017
21041
  <tr *ngIf="item.showDataItem"
21042
+ [style.height.px]="rowHeight"
21018
21043
  kendoGridLogicalRow
21019
21044
  [dataRowIndex]="$any(item).index"
21020
21045
  [dataItem]="item.data"
@@ -21116,6 +21141,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
21116
21141
  </tr>
21117
21142
  <tr *ngIf="item.showDetailRow"
21118
21143
  class="k-detail-row"
21144
+ [style.height.px]="detailRowHeight"
21119
21145
  kendoGridLogicalRow
21120
21146
  [dataRowIndex]="$any(item).index"
21121
21147
  [dataItem]="item.data"
@@ -21170,6 +21196,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
21170
21196
  </tr>
21171
21197
  <tr *ngIf="item.type === 'footer'"
21172
21198
  class="k-group-footer"
21199
+ [style.height.px]="rowHeight"
21173
21200
  kendoGridLogicalRow
21174
21201
  [logicalRowIndex]="logicalRowIndex(rowIndex)"
21175
21202
  [logicalSlaveRow]="lockedColumnsCount > 0 && !isStackedMode"
@@ -21285,6 +21312,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
21285
21312
  type: Input
21286
21313
  }], rowClass: [{
21287
21314
  type: Input
21315
+ }], rowHeight: [{
21316
+ type: Input
21317
+ }], detailRowHeight: [{
21318
+ type: Input
21288
21319
  }], hostClass: [{
21289
21320
  type: HostBinding,
21290
21321
  args: ['class.k-table-tbody']
@@ -22025,8 +22056,8 @@ const packageMetadata = {
22025
22056
  productName: 'Kendo UI for Angular',
22026
22057
  productCode: 'KENDOUIANGULAR',
22027
22058
  productCodes: ['KENDOUIANGULAR'],
22028
- publishDate: 1755524728,
22029
- version: '19.3.1-develop.3',
22059
+ publishDate: 1755704951,
22060
+ version: '20.0.0-develop.1',
22030
22061
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/'
22031
22062
  };
22032
22063
 
@@ -22137,10 +22168,6 @@ const isGroupItem = (source) => {
22137
22168
  return source.items !== undefined &&
22138
22169
  source.field !== undefined;
22139
22170
  };
22140
- const isVirtualGroupItem = (source) => {
22141
- return source.offset !== undefined &&
22142
- source.skipHeader !== undefined;
22143
- };
22144
22171
  const flattenGroups = (groups) => (groups.reduce((acc, curr) => {
22145
22172
  if (isGroupItem(curr)) {
22146
22173
  return acc.concat(flattenGroups(curr.items));
@@ -22163,9 +22190,6 @@ const itemAt = (data, index) => {
22163
22190
  const getIterator = (data, { footers, level, dataIndex, parentGroupIndex, groupIndex, parentGroup }) => {
22164
22191
  const first = data[0];
22165
22192
  if (isPresent(first) && isGroupItem(first)) {
22166
- if (isVirtualGroupItem(first)) {
22167
- groupIndex = isPresent(first.offset) ? first.offset : groupIndex;
22168
- }
22169
22193
  return new GroupIterator(data, footers, level, dataIndex, parentGroupIndex, groupIndex, parentGroup);
22170
22194
  }
22171
22195
  return new ItemIterator(data, dataIndex, parentGroupIndex, parentGroup);
@@ -22938,12 +22962,13 @@ class NavigationMetadata {
22938
22962
  gridElement;
22939
22963
  virtualColumns;
22940
22964
  columns;
22965
+ footerRow;
22941
22966
  isStacked;
22942
22967
  get maxLogicalRowIndex() {
22943
22968
  const dataRows = this.hasDetailTemplate ? this.dataRows * 2 : this.dataRows;
22944
- return this.headerRows + dataRows - 1;
22969
+ return this.headerRows + dataRows + this.footerRow - 1;
22945
22970
  }
22946
- constructor(dataRows, headerRows, isVirtual, hasPager, hasDetailTemplate, gridElement, virtualColumns, columns, isStacked) {
22971
+ constructor(dataRows, headerRows, isVirtual, hasPager, hasDetailTemplate, gridElement, virtualColumns, columns, footerRow, isStacked) {
22947
22972
  this.dataRows = dataRows;
22948
22973
  this.headerRows = headerRows;
22949
22974
  this.isVirtual = isVirtual;
@@ -22952,6 +22977,7 @@ class NavigationMetadata {
22952
22977
  this.gridElement = gridElement;
22953
22978
  this.virtualColumns = virtualColumns;
22954
22979
  this.columns = columns;
22980
+ this.footerRow = footerRow;
22955
22981
  this.isStacked = isStacked;
22956
22982
  }
22957
22983
  }
@@ -23811,26 +23837,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
23811
23837
  }]
23812
23838
  }], ctorParameters: function () { return [{ type: i1$3.DraggableDirective }, { type: SelectionService }, { type: CellSelectionService }, { type: DomEventsService }, { type: i0.ElementRef }, { type: i0.Renderer2 }]; } });
23813
23839
 
23814
- /**
23815
- * @hidden
23816
- */
23817
- const update = (arr, idx, value) => ([
23818
- ...arr.slice(0, idx + 1),
23819
- ...(arr.slice(idx + 1).map(x => x + value))
23820
- ]);
23821
23840
  /**
23822
23841
  * @hidden
23823
23842
  */
23824
23843
  class RowHeightService {
23825
23844
  total;
23826
- rowHeight;
23827
- detailRowHeight;
23828
23845
  offsets = [];
23829
23846
  heights = [];
23830
- constructor(total = 0, rowHeight, detailRowHeight) {
23847
+ constructor(total = 0, rowHeight) {
23831
23848
  this.total = total;
23832
- this.rowHeight = rowHeight;
23833
- this.detailRowHeight = detailRowHeight;
23834
23849
  let agg = 0;
23835
23850
  for (let idx = 0; idx < total; idx++) {
23836
23851
  this.offsets.push(agg);
@@ -23841,66 +23856,35 @@ class RowHeightService {
23841
23856
  height(rowIndex) {
23842
23857
  return this.heights[rowIndex];
23843
23858
  }
23844
- expandDetail(rowIndex) {
23845
- if (this.height(rowIndex) === this.rowHeight) {
23846
- this.updateRowHeight(rowIndex, this.detailRowHeight);
23847
- }
23848
- }
23849
- collapseDetail(rowIndex) {
23850
- if (this.height(rowIndex) > this.rowHeight) {
23851
- this.updateRowHeight(rowIndex, this.detailRowHeight * -1);
23852
- }
23853
- }
23854
- isExpanded(rowIndex) {
23855
- return this.height(rowIndex) > this.rowHeight;
23856
- }
23857
23859
  index(position) {
23858
- if (position < 0) {
23859
- return undefined;
23860
- }
23861
- const result = this.offsets.reduce((prev, current, idx) => {
23862
- if (prev !== undefined) {
23863
- return prev;
23864
- }
23865
- else if (current === position) {
23866
- return idx;
23860
+ for (let i = 0; i < this.offsets.length; i++) {
23861
+ if (position === this.offsets[i]) {
23862
+ return i;
23867
23863
  }
23868
- else if (current > position) {
23869
- return idx - 1;
23864
+ if (position < this.offsets[i]) {
23865
+ return i - 1;
23870
23866
  }
23871
- return undefined;
23872
- }, undefined);
23873
- return result === undefined ? this.total - 1 : result;
23874
- }
23875
- offset(rowIndex, adjustIndex = false) {
23876
- if (adjustIndex) {
23877
- let targetOffset = 0;
23878
- let targetIndex = 0;
23879
- for (let i = 0; i < rowIndex; i++) {
23880
- targetOffset += this.rowHeight;
23881
- targetIndex++;
23882
- if (targetIndex === rowIndex) {
23883
- return targetOffset;
23884
- }
23885
- if (this.isExpanded(i)) {
23886
- targetOffset += this.detailRowHeight;
23887
- targetIndex++;
23888
- if (targetIndex === rowIndex) {
23889
- return targetOffset;
23890
- }
23891
- }
23892
- }
23893
- return targetOffset;
23894
23867
  }
23868
+ return this.total - 1;
23869
+ }
23870
+ offset(rowIndex) {
23895
23871
  return this.offsets[rowIndex];
23896
23872
  }
23897
23873
  totalHeight() {
23898
- return this.heights.reduce((prev, curr) => prev + curr, 0);
23874
+ if (!this.offsets.length) {
23875
+ return 0;
23876
+ }
23877
+ const lastOffset = this.offsets[this.offsets.length - 1];
23878
+ const lastHeight = this.heights[this.heights.length - 1];
23879
+ return lastOffset + lastHeight;
23899
23880
  }
23900
- updateRowHeight(rowIndex, value) {
23901
- if (this.total > 0) {
23902
- this.heights[rowIndex] += value;
23903
- this.offsets = update(this.offsets, rowIndex, value);
23881
+ update(startIndex, rowHeights) {
23882
+ let agg = this.offsets[startIndex];
23883
+ for (let i = startIndex; i < this.heights.length; i++) {
23884
+ this.offsets[i] = agg;
23885
+ const currHeight = rowHeights[i - startIndex] || this.heights[i];
23886
+ agg += currHeight;
23887
+ this.heights[i] = currHeight;
23904
23888
  }
23905
23889
  }
23906
23890
  }
@@ -23910,8 +23894,10 @@ class RowHeightService {
23910
23894
  */
23911
23895
  class ScrollAction {
23912
23896
  offset;
23913
- constructor(offset) {
23897
+ changeVirtualData;
23898
+ constructor(offset, changeVirtualData) {
23914
23899
  this.offset = offset;
23900
+ this.changeVirtualData = changeVirtualData;
23915
23901
  }
23916
23902
  }
23917
23903
  /**
@@ -23936,16 +23922,29 @@ const SCROLL_BOTTOM_THRESHOLD = 2;
23936
23922
  */
23937
23923
  class ScrollerService {
23938
23924
  scrollObservable;
23939
- firstLoaded = 0;
23940
- lastLoaded;
23941
- lastScrollTop;
23942
- take;
23943
- total;
23925
+ ctx;
23926
+ total = 0;
23944
23927
  rowHeightService;
23928
+ table = null;
23929
+ tableBody = null;
23930
+ container = null;
23931
+ scrollHeightContainer = null;
23932
+ scrollableVirtual = false;
23933
+ tableTransformOffset = 0;
23934
+ virtualSkip = 0;
23935
+ virtualPageSize = 0;
23936
+ firstToLoad = 0;
23937
+ lastLoaded = 0;
23938
+ scrollSyncing = false;
23939
+ take;
23945
23940
  scrollSubscription;
23946
23941
  subscription;
23947
- constructor(scrollObservable) {
23942
+ lastScrollTop = 0;
23943
+ firstLoaded = 0;
23944
+ expandedRows = {};
23945
+ constructor(scrollObservable, ctx) {
23948
23946
  this.scrollObservable = scrollObservable;
23947
+ this.ctx = ctx;
23949
23948
  }
23950
23949
  create(rowHeightService, skip, take, total) {
23951
23950
  this.rowHeightService = rowHeightService;
@@ -23954,13 +23953,50 @@ class ScrollerService {
23954
23953
  this.take = take;
23955
23954
  this.total = total;
23956
23955
  this.lastScrollTop = 0;
23957
- const subject = new BehaviorSubject(new ScrollAction(this.rowHeightService.offset(skip)));
23956
+ const offset = this.rowHeightService.offset(skip);
23957
+ const subject = new BehaviorSubject(new ScrollAction(offset, this.scrollableVirtual && (Boolean(this.ctx.grid?.pageable) || Boolean(this.ctx.grid?.group?.length))));
23958
23958
  this.subscription = Observable.create(observer => {
23959
23959
  this.unsubscribe();
23960
23960
  this.scrollSubscription = this.scrollObservable.subscribe(x => this.onScroll(x, observer));
23961
23961
  }).subscribe(x => subject.next(x));
23962
23962
  return subject;
23963
23963
  }
23964
+ reset(skipScroll = false) {
23965
+ if (!skipScroll) {
23966
+ this.firstToLoad = 0;
23967
+ this.firstLoaded = 0;
23968
+ this.lastLoaded = 0;
23969
+ this.virtualSkip = 0;
23970
+ }
23971
+ this.rowHeightService = undefined;
23972
+ if (skipScroll) {
23973
+ this.scrollSyncing = true;
23974
+ }
23975
+ if (!skipScroll && this.container && this.container.scrollTop !== 0) {
23976
+ this.scrollSyncing = true;
23977
+ this.container.scrollTop = 0;
23978
+ this.lastScrollTop = 0;
23979
+ this.translate(0, true);
23980
+ this.tableTransformOffset = 0;
23981
+ }
23982
+ }
23983
+ update(skipAdjust = false) {
23984
+ const itemHeights = this.getItemHeights();
23985
+ if (this.firstLoaded > this.firstToLoad) {
23986
+ // Scrolled up
23987
+ const count = Math.min(this.firstLoaded - this.firstToLoad, this.take);
23988
+ const newItemsHeight = this.getTotalHeight(count, itemHeights);
23989
+ const newItemsExpectedHeight = this.getExpectedTotalHeight(count);
23990
+ const diff = newItemsHeight - newItemsExpectedHeight;
23991
+ if (!skipAdjust && diff !== 0) {
23992
+ this.adjustScroll(diff);
23993
+ }
23994
+ }
23995
+ this.rowHeightService?.update(this.firstToLoad, itemHeights);
23996
+ this.scrollHeightContainer && this.setScrollHeightContainerHeight();
23997
+ this.firstLoaded = this.firstToLoad;
23998
+ this.lastLoaded = this.firstLoaded + itemHeights.length - 1;
23999
+ }
23964
24000
  destroy() {
23965
24001
  this.unsubscribe();
23966
24002
  if (this.subscription) {
@@ -23968,42 +24004,49 @@ class ScrollerService {
23968
24004
  }
23969
24005
  }
23970
24006
  onScroll({ scrollTop, offsetHeight, scrollHeight, clientHeight }, observer) {
24007
+ if (this.scrollSyncing) {
24008
+ this.scrollSyncing = false;
24009
+ return;
24010
+ }
23971
24011
  if (!isDocumentAvailable() || (this.lastScrollTop === scrollTop)) {
23972
24012
  return;
23973
24013
  }
23974
24014
  const up = this.lastScrollTop >= scrollTop;
24015
+ const down = !up;
23975
24016
  this.lastScrollTop = scrollTop;
23976
24017
  let firstItemIndex = this.rowHeightService.index(scrollTop);
23977
- let firstItemOffset = this.rowHeightService.offset(firstItemIndex);
23978
24018
  const lastItemIndex = this.rowHeightService.index(scrollTop + offsetHeight);
23979
- if (!up) {
23980
- if (lastItemIndex >= this.lastLoaded && this.lastLoaded < this.total) {
23981
- const overflow = (firstItemIndex + this.take) - this.total;
23982
- if (overflow > 0) {
23983
- firstItemIndex = firstItemIndex - overflow;
23984
- firstItemOffset = this.rowHeightService.offset(firstItemIndex);
23985
- }
23986
- this.firstLoaded = firstItemIndex;
23987
- observer.next(new ScrollAction(firstItemOffset));
23988
- let nextTake = this.firstLoaded + this.take;
23989
- this.lastLoaded = Math.min(nextTake, this.total);
23990
- nextTake = nextTake > this.total ? this.total - this.firstLoaded : this.take;
23991
- observer.next(new PageAction(this.firstLoaded, this.take));
23992
- }
23993
- else {
23994
- const atBottom = scrollHeight - clientHeight - scrollTop < SCROLL_BOTTOM_THRESHOLD;
23995
- if (atBottom) {
23996
- observer.next(new ScrollBottomAction());
23997
- }
24019
+ const overflow = Math.max(firstItemIndex + (this.virtualPageSize || this.take) - this.total, 0);
24020
+ firstItemIndex = Math.max(firstItemIndex - overflow, 0);
24021
+ if (lastItemIndex < this.lastLoaded) {
24022
+ this.lastLoaded = lastItemIndex;
24023
+ }
24024
+ if (down) {
24025
+ const atBottom = scrollHeight - clientHeight - scrollTop < SCROLL_BOTTOM_THRESHOLD;
24026
+ if (atBottom) {
24027
+ observer.next(new ScrollBottomAction());
23998
24028
  }
23999
24029
  }
24000
- if (up && firstItemIndex < this.firstLoaded) {
24001
- const nonVisibleBuffer = Math.floor(this.take * 0.3);
24002
- this.firstLoaded = Math.max(firstItemIndex - nonVisibleBuffer, 0);
24003
- observer.next(new ScrollAction(this.rowHeightService.offset(this.firstLoaded)));
24004
- this.lastLoaded = Math.min(this.firstLoaded + this.take, this.total);
24005
- observer.next(new PageAction(this.firstLoaded, this.take));
24030
+ if (!this.scrollableVirtual) {
24031
+ return;
24032
+ }
24033
+ if (down && lastItemIndex >= this.lastLoaded && this.lastLoaded < this.total - 1) {
24034
+ this.firstToLoad = firstItemIndex;
24035
+ this.loadPage(observer);
24036
+ }
24037
+ else if (up && firstItemIndex < this.firstLoaded) {
24038
+ const nonVisibleBuffer = Math.max(Math.floor((this.virtualPageSize || this.take) * 0.3) - overflow, 0);
24039
+ this.firstToLoad = Math.max(firstItemIndex - nonVisibleBuffer, 0);
24040
+ this.loadPage(observer);
24041
+ }
24042
+ }
24043
+ loadPage(observer) {
24044
+ if (!this.rowHeightService) {
24045
+ return;
24006
24046
  }
24047
+ this.translate(this.rowHeightService.offset(this.firstToLoad));
24048
+ observer.next(new ScrollAction(this.rowHeightService.offset(this.firstToLoad)));
24049
+ this.virtualPageChange(this.firstToLoad, observer);
24007
24050
  }
24008
24051
  unsubscribe() {
24009
24052
  if (this.scrollSubscription) {
@@ -24011,6 +24054,87 @@ class ScrollerService {
24011
24054
  this.scrollSubscription = undefined;
24012
24055
  }
24013
24056
  }
24057
+ translate(dY, forceSet) {
24058
+ if (this.scrollableVirtual && this.table) {
24059
+ if (forceSet) {
24060
+ this.table.style.transform = 'translateY(' + dY + 'px)';
24061
+ }
24062
+ else {
24063
+ this.tableTransformOffset = dY;
24064
+ }
24065
+ }
24066
+ }
24067
+ adjustScroll(scrollOffset, initialAdjust = false) {
24068
+ if (Number.isNaN(scrollOffset)) {
24069
+ return;
24070
+ }
24071
+ this.scrollSyncing = true;
24072
+ if (this.container) {
24073
+ if (initialAdjust) {
24074
+ this.container.scrollTop = scrollOffset;
24075
+ this.translate(scrollOffset, true);
24076
+ this.tableTransformOffset = scrollOffset;
24077
+ this.firstToLoad = this.rowHeightService.index(scrollOffset);
24078
+ }
24079
+ else {
24080
+ this.container.scrollTop += scrollOffset;
24081
+ }
24082
+ }
24083
+ }
24084
+ isExpanded(rowIndex) {
24085
+ return this.expandedRows[rowIndex] || false;
24086
+ }
24087
+ resetVirtualSkip = () => {
24088
+ if (this.scrollableVirtual && this.virtualSkip) {
24089
+ this.virtualSkip = 0;
24090
+ }
24091
+ };
24092
+ setScrollHeightContainerHeight() {
24093
+ if (this.scrollableVirtual) {
24094
+ let containerHeight = this.rowHeightService?.totalHeight() || 0;
24095
+ containerHeight = isFirefox ? Math.min(firefoxMaxHeight, containerHeight) : containerHeight;
24096
+ this.scrollHeightContainer.style.height = containerHeight + 'px';
24097
+ }
24098
+ else {
24099
+ this.scrollHeightContainer.style.height = '0';
24100
+ }
24101
+ }
24102
+ getItemHeights() {
24103
+ const result = [];
24104
+ if (this.tableBody) {
24105
+ Array.from(this.tableBody.children).forEach((item, index) => {
24106
+ const itemHeight = item.getBoundingClientRect().height;
24107
+ if (item.classList.contains('k-detail-row')) {
24108
+ result[result.length - 1] += itemHeight;
24109
+ this.expandedRows[index] = true;
24110
+ }
24111
+ else {
24112
+ result.push(itemHeight);
24113
+ }
24114
+ });
24115
+ }
24116
+ return result;
24117
+ }
24118
+ getTotalHeight(count, itemHeights) {
24119
+ return itemHeights.slice(0, count).reduce((sum, current) => sum + current, 0);
24120
+ }
24121
+ getExpectedTotalHeight(count) {
24122
+ const service = this.rowHeightService;
24123
+ if (!service) {
24124
+ return 0;
24125
+ }
24126
+ const lastItemIndex = this.firstToLoad + (count - 1);
24127
+ return service.offset(lastItemIndex) + service.height(lastItemIndex) - service.offset(this.firstToLoad);
24128
+ }
24129
+ virtualPageChange = (skip, observer) => {
24130
+ if (this.ctx.grid.pageable || this.ctx.grid.group?.length) {
24131
+ this.virtualSkip = skip;
24132
+ observer.next(new ScrollAction(this.rowHeightService?.offset(skip) || 0, true));
24133
+ }
24134
+ else if (skip !== this.ctx.grid.skip) {
24135
+ observer.next(new PageAction(Math.max(0, skip), this.take));
24136
+ }
24137
+ };
24014
24138
  }
24015
24139
 
24016
24140
  /**
@@ -24304,8 +24428,8 @@ const SCROLLER_FACTORY_TOKEN = new InjectionToken('grid-scroll-service-factory')
24304
24428
  /**
24305
24429
  * @hidden
24306
24430
  */
24307
- function DEFAULT_SCROLLER_FACTORY(observable) {
24308
- return new ScrollerService(observable);
24431
+ function DEFAULT_SCROLLER_FACTORY(observable, ctx) {
24432
+ return new ScrollerService(observable, ctx);
24309
24433
  }
24310
24434
  const wheelDeltaY = (e) => {
24311
24435
  const deltaY = e.wheelDeltaY;
@@ -24322,7 +24446,7 @@ const preventLockedScroll = (args, element) => {
24322
24446
  const scrollTop = element.scrollTop;
24323
24447
  const allowScroll = (scrollTop === 0 && 0 < delta) || (element.scrollHeight <= element.offsetHeight + scrollTop && delta < 0);
24324
24448
  if (!allowScroll) {
24325
- event.preventDefault();
24449
+ args.preventDefault();
24326
24450
  }
24327
24451
  };
24328
24452
  const translateY = (renderer, value) => el => renderer.setStyle(el, "transform", `translateY(${value}px)`);
@@ -24378,9 +24502,9 @@ class ListComponent {
24378
24502
  contentScroll = new EventEmitter();
24379
24503
  pageChange = new EventEmitter();
24380
24504
  scrollBottom = new EventEmitter();
24381
- totalHeight;
24382
24505
  columnsStartIdx = 0;
24383
24506
  allItems = [];
24507
+ itemsToRender = [];
24384
24508
  get showFooter() {
24385
24509
  return this.groupable && this.groupable.showFooter;
24386
24510
  }
@@ -24406,6 +24530,7 @@ class ListComponent {
24406
24530
  columnsEndIdx;
24407
24531
  viewportColumnsWidth;
24408
24532
  scrollLeft = 0;
24533
+ virtualPageSize;
24409
24534
  observer;
24410
24535
  get lockedLeafColumns() {
24411
24536
  return this.columns.lockedLeafColumns;
@@ -24439,6 +24564,8 @@ class ListComponent {
24439
24564
  columnUpdateFrame;
24440
24565
  hasLockedContainer;
24441
24566
  minRowHeight;
24567
+ handleSkipOnData = false;
24568
+ scrollToIndex = null;
24442
24569
  constructor(scrollerFactory, detailsService, changeNotification, suspendService, groupsService, ngZone, renderer, scrollSyncService, resizeService, editService, supportService, navigationService, scrollRequestService, ctx, columnResizingService, changeDetector, pdfService, columnInfo, dataMappingService) {
24443
24570
  this.changeNotification = changeNotification;
24444
24571
  this.suspendService = suspendService;
@@ -24456,14 +24583,24 @@ class ListComponent {
24456
24583
  this.pdfService = pdfService;
24457
24584
  this.columnInfo = columnInfo;
24458
24585
  this.dataMappingService = dataMappingService;
24459
- this.scroller = scrollerFactory(this.dispatcher);
24460
- this.subscriptions = detailsService.changes.subscribe(x => this.detailExpand(x));
24586
+ this.scroller = this.ctx.scroller = scrollerFactory(this.dispatcher, this.ctx);
24587
+ this.subscriptions = detailsService.changes.subscribe(() => this.detailExpand());
24461
24588
  this.subscriptions.add(scrollRequestService.requests.subscribe(req => isPresent(req.adjustIndex) ? this.scrollTo(req.request, req.adjustIndex) : this.scrollToItem(req.request)));
24589
+ this.subscriptions.add(this.pdfService.restoreDOMVirtualization.subscribe(() => {
24590
+ this.ngZone.onStable.pipe(take(1)).subscribe(() => {
24591
+ this.init();
24592
+ this.setScrollerOptions();
24593
+ this.scroller.update();
24594
+ });
24595
+ }));
24462
24596
  }
24463
24597
  ngOnInit() {
24464
24598
  this.minRowHeight = this.isVirtual ? this.rowHeight || calcRowHeight(this.table.nativeElement) : this.rowHeight;
24465
24599
  this.init();
24466
24600
  this.subscriptions.add(this.ngZone.runOutsideAngular(this.handleRowSync.bind(this)));
24601
+ this.subscriptions.add(this.groupsService.changes.subscribe(() => {
24602
+ this.skipScroll = this.isVirtual;
24603
+ }));
24467
24604
  this.subscriptions.add(this.ngZone.runOutsideAngular(this.handleRowNavigationLocked.bind(this)));
24468
24605
  this.subscriptions.add(merge(this.columns.changes, this.resizeService.changes).subscribe(() => {
24469
24606
  if (this.virtualColumns) {
@@ -24482,48 +24619,110 @@ class ListComponent {
24482
24619
  const changesInSkip = changes['skip'];
24483
24620
  const hasInitialSkip = changesInSkip && changesInSkip.firstChange && changesInSkip.currentValue > 0;
24484
24621
  if (hasInitialSkip) {
24485
- this.handleInitialScrollToSkip();
24622
+ this.handleSkipOnData = true;
24623
+ }
24624
+ if (isChanged$1('isVirtual', changes)) {
24625
+ this.ngZone.onStable.pipe(take(1)).subscribe(() => {
24626
+ this.scroller.reset();
24627
+ this.rowHeightService = this.scroller.rowHeightService = new RowHeightService(this.total, this.rowHeight || this.minRowHeight);
24628
+ this.setScrollerOptions();
24629
+ this.scroller.update();
24630
+ });
24486
24631
  }
24487
24632
  if (isChanged$1("skip", changes) && !this.rebind) {
24488
24633
  this.skipScroll = true;
24489
- this.container.nativeElement.scrollTop = this.rowHeightService.offset(this.skip);
24634
+ this.container.nativeElement.scrollTop = (this.isVirtual && this.ctx.grid?.pageable) ? 0 : this.rowHeightService.offset(this.skip);
24490
24635
  }
24491
24636
  if (anyChanged(['total', 'take'], changes)) {
24492
24637
  this.init();
24493
24638
  }
24494
24639
  this.rebind = false;
24495
24640
  }
24641
+ zoneSub;
24642
+ get totalIsAllItems() {
24643
+ return this.isVirtual && (Boolean(this.ctx.grid?.pageable || this.ctx.grid?.group?.length));
24644
+ }
24496
24645
  ngDoCheck() {
24497
24646
  if (this.virtualColumns && (!this.viewportColumns || this.viewportWidthChange())) {
24498
24647
  this.updateViewportColumns();
24499
24648
  }
24500
- const shouldCalculatePageSize = isDocumentAvailable() && this.isVirtual && this.ctx.grid && !isPresent(this.ctx.grid.pageSize);
24501
- if (shouldCalculatePageSize) {
24502
- const calculatedPageSize = this.calcVirtualPageSize();
24649
+ if (!isPresent(this.virtualPageSize) && !this.ctx.grid?.pageable && isPresent(this.ctx.grid?.pageSize)) {
24650
+ this.virtualPageSize = this.ctx.grid.pageSize;
24651
+ }
24652
+ const shouldCalculatePageSize = isDocumentAvailable() && this.isVirtual && !isPresent(this.virtualPageSize) && (!isPresent(this.ctx.grid?.pageSize) || this.ctx.grid?.pageable);
24653
+ const previousTotal = this.allItems.length;
24654
+ this.allItems = this.dataMappingService.dataMapper(this.data, this.nonLockedColumnsToRender, this.lockedLeafColumns, this.detailTemplate, this.showFooter);
24655
+ if (!this.isVirtual || (this.isVirtual && !this.ctx.grid?.pageable && !this.ctx.grid?.group?.length)) {
24656
+ this.itemsToRender = this.allItems;
24657
+ }
24658
+ const totalChanged = previousTotal !== this.allItems.length;
24659
+ if (this.totalIsAllItems && totalChanged) {
24660
+ this.scroller.reset(this.skipScroll);
24661
+ this.scroller.total = this.allItems.length;
24662
+ }
24663
+ if (shouldCalculatePageSize || !isPresent(this.scroller.rowHeightService)) {
24664
+ const calculatedPageSize = this.virtualPageSize ?? this.calcVirtualPageSize();
24503
24665
  if (calculatedPageSize > 0) {
24504
24666
  this.ngZone.onStable.pipe(take(1)).subscribe(() => {
24505
- this.ctx.grid.pageSize = calculatedPageSize;
24506
- this.ngZone.run(() => {
24507
- this.pageChange.emit({
24508
- skip: this.skip || 0,
24509
- take: calculatedPageSize
24667
+ if (!isPresent(this.ctx.grid?.pageSize)) {
24668
+ this.ctx.grid.pageSize = calculatedPageSize;
24669
+ this.ngZone.run(() => {
24670
+ this.pageChange.emit({
24671
+ skip: this.skip || 0,
24672
+ take: calculatedPageSize
24673
+ });
24510
24674
  });
24511
- });
24675
+ }
24676
+ if (this.ctx.grid?.pageable || this.ctx.grid?.group?.length) {
24677
+ this.virtualPageSize = this.scroller.virtualPageSize = calculatedPageSize;
24678
+ this.ngZone.run(() => this.itemsToRender = this.allItems.slice(this.scroller.virtualSkip, this.scroller.virtualSkip + this.virtualPageSize));
24679
+ }
24512
24680
  });
24513
24681
  }
24514
24682
  }
24515
- this.allItems = this.dataMappingService.dataMapper(this.data, this.nonLockedColumnsToRender, this.lockedLeafColumns, this.detailTemplate, this.showFooter);
24683
+ if (!this.zoneSub) {
24684
+ this.zoneSub = this.ngZone.onStable.subscribe(() => {
24685
+ if (!this.scroller.rowHeightService) {
24686
+ const total = this.isVirtual && (this.ctx.grid?.pageable || this.ctx.grid?.group?.length) ? this.allItems.length : this.total;
24687
+ this.scroller.rowHeightService = this.rowHeightService = new RowHeightService(total, this.rowHeight || this.minRowHeight);
24688
+ }
24689
+ if (this.allItems.length && this.handleSkipOnData && this.isVirtual && this.skip > 0 && this.total > 0) {
24690
+ this.ngZone.onStable.pipe(take(1)).subscribe(() => {
24691
+ this.scroller.adjustScroll(this.scroller.rowHeightService.offset(this.skip), true);
24692
+ this.handleSkipOnData = false;
24693
+ });
24694
+ }
24695
+ if (this.isVirtual && this.ctx.grid?.group?.length && this.scroller.total !== this.allItems.length) {
24696
+ this.scroller.total = this.allItems.length;
24697
+ this.rowHeightService = this.scroller.rowHeightService = new RowHeightService(this.scroller.total, this.rowHeight || this.minRowHeight);
24698
+ }
24699
+ this.isVirtual && this.scroller.update();
24700
+ // Item outside of the viewport is scrolled to programmatically.
24701
+ // RowHeightService offset for given index still may not match the current scrollTop
24702
+ // depending on the varying row heights, so we need to adjust the scroll position.
24703
+ if (isPresent(this.scrollToIndex)) {
24704
+ const offset = this.scroller.rowHeightService.offset(this.scrollToIndex);
24705
+ if (offset > this.container.nativeElement.scrollTop) {
24706
+ this.scroller.adjustScroll(offset - this.container.nativeElement.scrollTop);
24707
+ }
24708
+ this.scrollToIndex = null;
24709
+ }
24710
+ if (this.isVirtual) {
24711
+ this.ctx.grid?.updateNavigationMetadata();
24712
+ this.resetNavigationViewport();
24713
+ }
24714
+ this.zoneSub.unsubscribe();
24715
+ this.zoneSub = null;
24716
+ });
24717
+ }
24516
24718
  }
24517
24719
  ngAfterViewInit() {
24518
24720
  if (!isDocumentAvailable()) {
24519
24721
  return;
24520
24722
  }
24521
- if (this.skip && this.isVirtual) {
24522
- this.container.nativeElement.scrollTop = this.rowHeightService.offset(this.skip);
24523
- }
24524
- this.resetNavigationViewport();
24525
24723
  this.attachContainerScroll();
24526
24724
  this.initResizeService();
24725
+ this.setScrollerOptions();
24527
24726
  }
24528
24727
  ngAfterViewChecked() {
24529
24728
  const isLocked = this.isLocked;
@@ -24541,6 +24740,10 @@ class ListComponent {
24541
24740
  if (this.subscriptions) {
24542
24741
  this.subscriptions.unsubscribe();
24543
24742
  }
24743
+ if (this.zoneSub) {
24744
+ this.zoneSub.unsubscribe();
24745
+ this.zoneSub = null;
24746
+ }
24544
24747
  if (this.resizeService) {
24545
24748
  this.resizeService.destroy();
24546
24749
  }
@@ -24551,10 +24754,16 @@ class ListComponent {
24551
24754
  if (this.suspendService.scroll) {
24552
24755
  return;
24553
24756
  }
24554
- this.rowHeightService = new RowHeightService(this.total, this.rowHeight || this.minRowHeight, this.detailRowHeight);
24555
- this.totalHeight = this.rowHeightService.totalHeight();
24757
+ const total = this.isVirtual && this.ctx.grid?.pageable ? this.ctx.grid.pageSize : this.total;
24758
+ this.rowHeightService = this.scroller.rowHeightService = new RowHeightService(total, this.rowHeight || this.minRowHeight);
24556
24759
  if (!isUniversal()) {
24557
- this.ngZone.runOutsideAngular(this.createScroller.bind(this));
24760
+ if (this.skipScroll) {
24761
+ this.setScrollerOptions();
24762
+ this.scroller.update();
24763
+ }
24764
+ else {
24765
+ this.ngZone.runOutsideAngular(this.createScroller.bind(this));
24766
+ }
24558
24767
  }
24559
24768
  }
24560
24769
  lockedScroll() {
@@ -24618,14 +24827,47 @@ class ListComponent {
24618
24827
  get isStacked() {
24619
24828
  return this.ctx.grid?.isStacked;
24620
24829
  }
24621
- detailExpand({ index, expand }) {
24622
- if (expand) {
24623
- this.rowHeightService.expandDetail(index);
24830
+ resetNavigationViewport() {
24831
+ if (!isDocumentAvailable) {
24832
+ return;
24624
24833
  }
24625
- else {
24626
- this.rowHeightService.collapseDetail(index);
24834
+ if (this.skipScroll || this.scroller.scrollSyncing) {
24835
+ this.ngZone.runOutsideAngular(() => {
24836
+ setTimeout(() => {
24837
+ this.skipScroll = this.scroller.scrollSyncing = false;
24838
+ });
24839
+ });
24840
+ return;
24841
+ }
24842
+ if (!this.container || !this.navigationService.tableEnabled ||
24843
+ !this.navigationService.needsViewport() || this.allItems.length === 0) {
24844
+ return;
24845
+ }
24846
+ const { scrollTop, offsetHeight } = this.container.nativeElement;
24847
+ const scrollBottom = scrollTop + offsetHeight;
24848
+ const firstItemIndex = this.rowHeightService.index(scrollTop);
24849
+ const lastItemIndex = this.rowHeightService.index(scrollBottom);
24850
+ const lastItemOffset = this.rowHeightService.offset(lastItemIndex);
24851
+ let viewportStart = firstItemIndex;
24852
+ let viewportEnd = lastItemIndex;
24853
+ if (isPresent(this.detailTemplate)) {
24854
+ viewportStart *= 2;
24855
+ viewportEnd *= 2;
24856
+ const firstItemHeight = this.rowHeightService.offset(firstItemIndex);
24857
+ if (firstItemHeight + this.rowHeight < scrollTop) {
24858
+ viewportStart++;
24859
+ }
24860
+ const lastItemHeight = this.rowHeightService.height(lastItemIndex);
24861
+ const lastItemExpanded = this.scroller.isExpanded(lastItemIndex);
24862
+ const lastItemDetailOverflows = lastItemOffset + lastItemHeight > scrollBottom;
24863
+ if (lastItemExpanded && !lastItemDetailOverflows) {
24864
+ viewportEnd++;
24865
+ }
24627
24866
  }
24628
- this.totalHeight = this.rowHeightService.totalHeight();
24867
+ const offset = this.isVirtual && this.ctx.grid?.pageable ? this.skip : 0;
24868
+ this.navigationService.setViewport(viewportStart + offset, viewportEnd + offset);
24869
+ }
24870
+ detailExpand() {
24629
24871
  this.resetNavigationViewport();
24630
24872
  }
24631
24873
  attachContainerScroll() {
@@ -24669,12 +24911,16 @@ class ListComponent {
24669
24911
  this.scrollerSubscription.add(observable.pipe(filter((x) => x instanceof ScrollBottomAction))
24670
24912
  .subscribe(() => this.scrollBottom.emit()));
24671
24913
  }
24672
- scroll({ offset = 0 }) {
24914
+ scroll(scrollActionArgs) {
24915
+ this.skipScroll = false;
24673
24916
  if (this.isVirtual) {
24674
24917
  [
24675
24918
  maybeNativeElement(this.table),
24676
24919
  maybeNativeElement(this.lockedTable)
24677
- ].filter(isPresent).forEach(translateY(this.renderer, offset));
24920
+ ].filter(isPresent).forEach(translateY(this.renderer, scrollActionArgs.offset));
24921
+ if (this.virtualPageSize && scrollActionArgs.changeVirtualData && (this.ctx.grid.pageable || this.ctx.grid.group?.length)) {
24922
+ this.ngZone.run(() => this.itemsToRender = this.allItems.slice(this.scroller.virtualSkip, this.scroller.virtualSkip + this.virtualPageSize));
24923
+ }
24678
24924
  }
24679
24925
  this.resetNavigationViewport();
24680
24926
  }
@@ -24684,24 +24930,13 @@ class ListComponent {
24684
24930
  this.lockedContainer.nativeElement.scrollTop = scrollTop;
24685
24931
  }
24686
24932
  }
24687
- handleInitialScrollToSkip() {
24688
- const shouldScroll = () => this.isVirtual && this.skip > 0 && this.total > 0;
24689
- const sub = this.changeNotification.changes
24690
- .pipe(filter(shouldScroll))
24691
- .subscribe(() => {
24692
- this.scrollTo({ row: this.skip });
24693
- sub.unsubscribe();
24694
- });
24695
- }
24696
24933
  handleRowSync() {
24697
24934
  const isLocked = () => isPresent(this.lockedContainer);
24698
24935
  const onStable = () => this.ngZone.onStable.asObservable().pipe(take(1));
24699
24936
  return merge(this.changeNotification.changes, this.groupsService.changes
24700
24937
  .pipe(filter(isLocked), switchMapTo(onStable())), this.editService.changed, this.resizeService.changes, this.columnResizingService.changes
24701
24938
  .pipe(filter(change => change.type === 'end')), this.supportService.changes)
24702
- .pipe(tap(() => {
24703
- this.resetNavigationViewport();
24704
- }), filter(isLocked))
24939
+ .pipe(filter(isLocked))
24705
24940
  .subscribe(() => {
24706
24941
  const scrollTop = this.container.nativeElement.scrollTop;
24707
24942
  const scrollLeft = this.container.nativeElement.scrollLeft;
@@ -24730,9 +24965,9 @@ class ListComponent {
24730
24965
  if (isPresent(this.detailTemplate) && adjustIndexForDetailTemplate) {
24731
24966
  itemIndex = Math.floor(itemIndex / 2);
24732
24967
  }
24733
- const offset = this.rowHeightService.offset(itemIndex, !adjustIndexForDetailTemplate);
24968
+ const offset = this.rowHeightService.offset(itemIndex);
24734
24969
  this.container.nativeElement.scrollTop = offset;
24735
- this.resetNavigationViewport();
24970
+ this.scrollToIndex = itemIndex;
24736
24971
  }
24737
24972
  scrollTo({ row, column }, adjustIndex = false) {
24738
24973
  if (isNumber(row)) {
@@ -24785,39 +25020,8 @@ class ListComponent {
24785
25020
  return dataAttribute && +dataAttribute === this.ctx.grid.skip + dataItemIndex;
24786
25021
  });
24787
25022
  row && row.scrollIntoView();
24788
- this.isVirtual && this.resetNavigationViewport();
24789
- }
24790
- }
24791
- resetNavigationViewport() {
24792
- if (!isDocumentAvailable) {
24793
- return;
24794
- }
24795
- if (!this.container || !this.navigationService.tableEnabled ||
24796
- !this.navigationService.needsViewport() || this.data.length === 0) {
24797
- return;
24798
- }
24799
- const { scrollTop, offsetHeight } = this.container.nativeElement;
24800
- const scrollBottom = scrollTop + offsetHeight;
24801
- const firstItemIndex = this.rowHeightService.index(scrollTop);
24802
- const lastItemIndex = this.rowHeightService.index(scrollBottom);
24803
- const lastItemOffset = this.rowHeightService.offset(lastItemIndex);
24804
- let viewportStart = firstItemIndex;
24805
- let viewportEnd = lastItemIndex;
24806
- if (isPresent(this.detailTemplate)) {
24807
- viewportStart *= 2;
24808
- viewportEnd *= 2;
24809
- const firstItemHeight = this.rowHeightService.offset(firstItemIndex);
24810
- if (firstItemHeight + this.rowHeight < scrollTop) {
24811
- viewportStart++;
24812
- }
24813
- const lastItemHeight = this.rowHeightService.height(lastItemIndex);
24814
- const lastItemExpanded = this.rowHeightService.isExpanded(lastItemIndex);
24815
- const lastItemDetailOverflows = lastItemOffset + lastItemHeight > scrollBottom;
24816
- if (lastItemExpanded && !lastItemDetailOverflows) {
24817
- viewportEnd++;
24818
- }
25023
+ this.resetNavigationViewport();
24819
25024
  }
24820
- this.navigationService.setViewport(viewportStart, viewportEnd);
24821
25025
  }
24822
25026
  cleanupScroller() {
24823
25027
  if (this.scrollerSubscription) {
@@ -24921,6 +25125,14 @@ class ListComponent {
24921
25125
  }
24922
25126
  return 0;
24923
25127
  };
25128
+ setScrollerOptions() {
25129
+ this.scroller.scrollableVirtual = this.isVirtual;
25130
+ this.scroller.table = this.table.nativeElement;
25131
+ this.scroller.tableBody = this.table.nativeElement.tBodies[0];
25132
+ this.scroller.container = this.container.nativeElement;
25133
+ this.scroller.scrollHeightContainer = this.container.nativeElement.querySelector('.k-height-container');
25134
+ this.scroller.total = this.isVirtual && !this.ctx.grid?.pageable ? this.total : this.allItems.length;
25135
+ }
24924
25136
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ListComponent, deps: [{ token: SCROLLER_FACTORY_TOKEN }, { token: DetailsService }, { token: ChangeNotificationService }, { token: SuspendService }, { token: GroupsService }, { token: i0.NgZone }, { token: i0.Renderer2 }, { token: ScrollSyncService }, { token: ResizeService }, { token: EditService }, { token: BrowserSupportService }, { token: NavigationService }, { token: ScrollRequestService }, { token: ContextService }, { token: ColumnResizingService }, { token: i0.ChangeDetectorRef }, { token: PDFService }, { token: ColumnInfoService }, { token: DataMappingService }], target: i0.ɵɵFactoryTarget.Component });
24925
25137
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ListComponent, isStandalone: true, selector: "kendo-grid-list", inputs: { data: "data", groups: "groups", total: "total", rowHeight: "rowHeight", detailRowHeight: "detailRowHeight", take: "take", skip: "skip", columns: "columns", detailTemplate: "detailTemplate", noRecordsTemplate: "noRecordsTemplate", selectable: "selectable", groupable: "groupable", filterable: "filterable", rowClass: "rowClass", rowSticky: "rowSticky", loading: "loading", trackBy: "trackBy", virtualColumns: "virtualColumns", isVirtual: "isVirtual", cellLoadingTemplate: "cellLoadingTemplate", loadingTemplate: "loadingTemplate", sort: "sort", size: "size" }, outputs: { contentScroll: "contentScroll", pageChange: "pageChange", scrollBottom: "scrollBottom" }, host: { properties: { "class.k-grid-container": "this.hostClass", "attr.role": "this.hostRole" } }, providers: [
24926
25138
  {
@@ -24958,7 +25170,9 @@ class ListComponent {
24958
25170
  role="presentation"
24959
25171
  [groups]="groups"
24960
25172
  [isLocked]="true"
24961
- [rowsToRender]="allItems"
25173
+ [rowsToRender]="itemsToRender"
25174
+ [rowHeight]="rowHeight"
25175
+ [detailRowHeight]="detailRowHeight"
24962
25176
  [noRecordsText]="''"
24963
25177
  [columns]="$any(lockedLeafColumns)"
24964
25178
  [totalColumnsCount]="leafColumns.length"
@@ -24976,8 +25190,8 @@ class ListComponent {
24976
25190
  </table>
24977
25191
  <kendo-resize-sensor></kendo-resize-sensor>
24978
25192
  </div>
24979
- <div *ngIf="isVirtual" class="k-height-container" role="presentation">
24980
- <div [style.height.px]="totalHeight"></div>
25193
+ <div class="k-height-container" *ngIf="isVirtual" role="presentation">
25194
+ <div></div>
24981
25195
  </div>
24982
25196
  </div>
24983
25197
  <div
@@ -25005,7 +25219,7 @@ class ListComponent {
25005
25219
  <tbody kendoGridTableBody
25006
25220
  role="rowgroup"
25007
25221
  [skipGroupDecoration]="isLocked"
25008
- [rowsToRender]="allItems"
25222
+ [rowsToRender]="itemsToRender"
25009
25223
  [groups]="groups"
25010
25224
  [columns]="$any(nonLockedColumnsToRender)"
25011
25225
  [allColumns]="$any(nonLockedLeafColumns)"
@@ -25023,20 +25237,22 @@ class ListComponent {
25023
25237
  [virtualColumns]="virtualColumns"
25024
25238
  [isLoading]="loading"
25025
25239
  [isVirtual]="isVirtual"
25026
- [cellLoadingTemplate]="cellLoadingTemplate">
25240
+ [cellLoadingTemplate]="cellLoadingTemplate"
25241
+ [rowHeight]="rowHeight"
25242
+ [detailRowHeight]="detailRowHeight">
25027
25243
  </tbody>
25028
25244
  </table>
25029
25245
  <kendo-resize-sensor *ngIf="isLocked"></kendo-resize-sensor>
25030
25246
  </div>
25031
25247
  <kendo-resize-sensor *ngIf="isLocked || virtualColumns"></kendo-resize-sensor>
25032
25248
  <div *ngIf="isVirtual" class="k-height-container" role="presentation">
25033
- <div [style.height.px]="totalHeight"></div>
25249
+ <div></div>
25034
25250
  </div>
25035
25251
  <div *ngIf="virtualColumns && !isStacked" class="k-width-container" role="presentation">
25036
25252
  <div [style.width.px]="totalWidth"></div>
25037
25253
  </div>
25038
25254
  </div>
25039
- `, isInline: true, dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }, { kind: "directive", type: TableDirective, selector: "[kendoGridResizableTable]", inputs: ["locked", "virtualColumns"] }, { kind: "directive", type: GridTableDirective, selector: "[kendoGridTable]", inputs: ["size"] }, { kind: "component", type: ColGroupComponent, selector: "[kendoGridColGroup]", inputs: ["columns", "groups", "detailTemplate", "sort"] }, { kind: "component", type: TableBodyComponent, selector: "[kendoGridTableBody]", inputs: ["columns", "allColumns", "groups", "detailTemplate", "noRecordsTemplate", "rowsToRender", "skip", "selectable", "filterable", "noRecordsText", "isLocked", "isLoading", "isVirtual", "cellLoadingTemplate", "skipGroupDecoration", "lockedColumnsCount", "totalColumnsCount", "virtualColumns", "trackBy", "rowSticky", "totalColumns", "rowClass"] }, { kind: "component", type: ResizeSensorComponent, selector: "kendo-resize-sensor", inputs: ["rateLimit"], outputs: ["resize"] }, { kind: "directive", type: ResizableContainerDirective, selector: "[kendoGridResizableContainer]", inputs: ["lockedWidth", "kendoGridResizableContainer"] }] });
25255
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }, { kind: "directive", type: TableDirective, selector: "[kendoGridResizableTable]", inputs: ["locked", "virtualColumns"] }, { kind: "directive", type: GridTableDirective, selector: "[kendoGridTable]", inputs: ["size"] }, { kind: "component", type: ColGroupComponent, selector: "[kendoGridColGroup]", inputs: ["columns", "groups", "detailTemplate", "sort"] }, { kind: "component", type: TableBodyComponent, selector: "[kendoGridTableBody]", inputs: ["columns", "allColumns", "groups", "detailTemplate", "noRecordsTemplate", "rowsToRender", "skip", "selectable", "filterable", "noRecordsText", "isLocked", "isLoading", "isVirtual", "cellLoadingTemplate", "skipGroupDecoration", "lockedColumnsCount", "totalColumnsCount", "virtualColumns", "trackBy", "rowSticky", "totalColumns", "rowClass", "rowHeight", "detailRowHeight"] }, { kind: "component", type: ResizeSensorComponent, selector: "kendo-resize-sensor", inputs: ["rateLimit"], outputs: ["resize"] }, { kind: "directive", type: ResizableContainerDirective, selector: "[kendoGridResizableContainer]", inputs: ["lockedWidth", "kendoGridResizableContainer"] }] });
25040
25256
  }
25041
25257
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ListComponent, decorators: [{
25042
25258
  type: Component,
@@ -25079,7 +25295,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
25079
25295
  role="presentation"
25080
25296
  [groups]="groups"
25081
25297
  [isLocked]="true"
25082
- [rowsToRender]="allItems"
25298
+ [rowsToRender]="itemsToRender"
25299
+ [rowHeight]="rowHeight"
25300
+ [detailRowHeight]="detailRowHeight"
25083
25301
  [noRecordsText]="''"
25084
25302
  [columns]="$any(lockedLeafColumns)"
25085
25303
  [totalColumnsCount]="leafColumns.length"
@@ -25097,8 +25315,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
25097
25315
  </table>
25098
25316
  <kendo-resize-sensor></kendo-resize-sensor>
25099
25317
  </div>
25100
- <div *ngIf="isVirtual" class="k-height-container" role="presentation">
25101
- <div [style.height.px]="totalHeight"></div>
25318
+ <div class="k-height-container" *ngIf="isVirtual" role="presentation">
25319
+ <div></div>
25102
25320
  </div>
25103
25321
  </div>
25104
25322
  <div
@@ -25126,7 +25344,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
25126
25344
  <tbody kendoGridTableBody
25127
25345
  role="rowgroup"
25128
25346
  [skipGroupDecoration]="isLocked"
25129
- [rowsToRender]="allItems"
25347
+ [rowsToRender]="itemsToRender"
25130
25348
  [groups]="groups"
25131
25349
  [columns]="$any(nonLockedColumnsToRender)"
25132
25350
  [allColumns]="$any(nonLockedLeafColumns)"
@@ -25144,14 +25362,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
25144
25362
  [virtualColumns]="virtualColumns"
25145
25363
  [isLoading]="loading"
25146
25364
  [isVirtual]="isVirtual"
25147
- [cellLoadingTemplate]="cellLoadingTemplate">
25365
+ [cellLoadingTemplate]="cellLoadingTemplate"
25366
+ [rowHeight]="rowHeight"
25367
+ [detailRowHeight]="detailRowHeight">
25148
25368
  </tbody>
25149
25369
  </table>
25150
25370
  <kendo-resize-sensor *ngIf="isLocked"></kendo-resize-sensor>
25151
25371
  </div>
25152
25372
  <kendo-resize-sensor *ngIf="isLocked || virtualColumns"></kendo-resize-sensor>
25153
25373
  <div *ngIf="isVirtual" class="k-height-container" role="presentation">
25154
- <div [style.height.px]="totalHeight"></div>
25374
+ <div></div>
25155
25375
  </div>
25156
25376
  <div *ngIf="virtualColumns && !isStacked" class="k-width-container" role="presentation">
25157
25377
  <div [style.width.px]="totalWidth"></div>
@@ -29365,9 +29585,7 @@ class GridComponent {
29365
29585
  */
29366
29586
  height;
29367
29587
  /**
29368
- * Represents the row height in pixels for each Grid row (`tr`) element.
29369
- * Required for [virtual scrolling]({% slug scrollmmodes_grid %}).
29370
- * Set `rowHeight` to match the actual DOM row height. The property does not change the height of the rows in the UI.
29588
+ * Sets the `style.height` attribute of each Grid data or group header/footer row (`tr`) element in the DOM in pixels.
29371
29589
  */
29372
29590
  rowHeight;
29373
29591
  /**
@@ -29377,9 +29595,7 @@ class GridComponent {
29377
29595
  */
29378
29596
  adaptiveMode = 'none';
29379
29597
  /**
29380
- * Represents the height in pixels for each Grid detail row (`tr`) element.
29381
- * Required for [virtual scrolling]({% slug scrollmmodes_grid %}).
29382
- * Set `detailRowHeight` to match the actual DOM detail row height. The property does not change the height of the rows in the UI.
29598
+ * Sets the `style.height` attribute of each Grid detail row (`tr.k-detail-row`) element in the DOM in pixels.
29383
29599
  */
29384
29600
  detailRowHeight;
29385
29601
  /**
@@ -29490,14 +29706,14 @@ class GridComponent {
29490
29706
  */
29491
29707
  get showTopPager() {
29492
29708
  const position = this.pageable.position;
29493
- return !this.isVirtual && this.pageable !== false && ['top', 'both'].indexOf(position) > -1;
29709
+ return this.pageable !== false && ['top', 'both'].indexOf(position) > -1;
29494
29710
  }
29495
29711
  /**
29496
29712
  * @hidden
29497
29713
  */
29498
29714
  get showBottomPager() {
29499
29715
  const position = this.pageable.position;
29500
- return !this.isVirtual && this.pageable !== false && position !== 'top';
29716
+ return this.pageable !== false && position !== 'top';
29501
29717
  }
29502
29718
  /**
29503
29719
  * @hidden
@@ -29962,7 +30178,7 @@ class GridComponent {
29962
30178
  cellLoadingTemplateChildren;
29963
30179
  get cellLoadingTemplate() {
29964
30180
  if (this._cellLoadingTemplate) {
29965
- return this._customDetailTemplate;
30181
+ return this._cellLoadingTemplate;
29966
30182
  }
29967
30183
  return this.cellLoadingTemplateChildren ? this.cellLoadingTemplateChildren.first : undefined;
29968
30184
  }
@@ -30492,6 +30708,7 @@ class GridComponent {
30492
30708
  }
30493
30709
  ngOnInit() {
30494
30710
  if (this.navigable.length) {
30711
+ this.ctx.navigable = this.navigable.includes('table');
30495
30712
  this.navigationService.init(this.navigationMetadata(), this.navigable);
30496
30713
  }
30497
30714
  this.isStacked && this.generateStackedColumns();
@@ -30578,6 +30795,15 @@ class GridComponent {
30578
30795
  }
30579
30796
  this.columnRangeChangeSubscription.unsubscribe();
30580
30797
  }
30798
+ /**
30799
+ * @hidden
30800
+ */
30801
+ onResize() {
30802
+ if (this.isVirtual) {
30803
+ this.ctx.scroller.update();
30804
+ this.listComponent.resetNavigationViewport();
30805
+ }
30806
+ }
30581
30807
  /**
30582
30808
  * @hidden
30583
30809
  */
@@ -31120,12 +31346,6 @@ class GridComponent {
31120
31346
  if (this.columnList.filter(x => x.locked && x.parent && !x.parent.isLocked).length) {
31121
31347
  throw new Error(ColumnConfigurationErrorMessages.lockedParent);
31122
31348
  }
31123
- if (this.detailRowHeight && !this.isVirtual) {
31124
- console.warn(GridConfigurationErrorMessages.rowHeightVirtual);
31125
- }
31126
- if (!this.detailRowHeight && this.isVirtual && this.detailTemplate) {
31127
- console.warn(GridConfigurationErrorMessages.rowHeightVirtual);
31128
- }
31129
31349
  if (!this.isStacked && stickyColumns && expandColumns(this.columnList.toArray()).filter(column => !column.width && !isColumnGroupComponent(column)).length) {
31130
31350
  console.warn(ColumnConfigurationErrorMessages.requiredWidth('Sticky'));
31131
31351
  }
@@ -31193,11 +31413,21 @@ class GridComponent {
31193
31413
  }
31194
31414
  attachStateChangesEmitter() {
31195
31415
  this.stateChangeSubscription =
31196
- merge(this.pageChange.pipe(map(x => ({
31416
+ merge(this.pageChange.pipe(tap(() => {
31417
+ if (this.pageable) {
31418
+ this.ctx.scroller?.reset();
31419
+ }
31420
+ }), map(x => ({
31197
31421
  filter: this.filter, group: this.group, skip: x.skip, sort: this.sort, take: x.take
31198
- }))), this.sortChange.pipe(map(sort => ({ filter: this.filter, group: this.group, skip: this.skip, sort: sort, take: this.pageSize }))), this.groupChange.pipe(map(group => ({
31199
- filter: this.filter, group: group, skip: this.skip, sort: this.sort, take: this.pageSize
31200
- }))), this.filterChange.pipe(map(filter => ({
31422
+ }))), this.sortChange.pipe(tap(() => {
31423
+ this.ctx.scroller?.reset();
31424
+ }), map(sort => ({ filter: this.filter, group: this.group, skip: this.isVirtual && !this.pageable ? 0 : this.skip, sort: sort, take: this.pageSize }))), this.groupChange.pipe(tap(() => {
31425
+ this.ctx.scroller?.reset();
31426
+ }), map(group => ({
31427
+ filter: this.filter, group: group, skip: this.pageable ? this.skip : 0, sort: this.sort, take: (this.pageable || !group?.length) ? this.pageSize : undefined
31428
+ }))), this.filterChange.pipe(tap(() => {
31429
+ this.ctx.scroller?.reset();
31430
+ }), map(filter => ({
31201
31431
  filter: filter, group: this.group, skip: 0, sort: this.sort, take: this.pageSize
31202
31432
  }))))
31203
31433
  .subscribe(x => {
@@ -31206,11 +31436,18 @@ class GridComponent {
31206
31436
  if (this.selectable && this.selectableSettings?.enabled && this.isVirtual) {
31207
31437
  this.blockArrowSelection = true;
31208
31438
  }
31439
+ this.isVirtual && this.ctx.scroller?.resetVirtualSkip();
31209
31440
  this.dataStateChange.emit(x);
31210
31441
  hasObservers(this.gridStateChange) && this.gridStateChange.emit({ ...this.currentState, ...x });
31211
31442
  });
31212
31443
  this.stateChangeSubscription.add(merge(this.columnReorder, this.columnResize, this.columnVisibilityChange, this.columnLockedChange, this.columnStickyChange).pipe(flatMap(() => this.ngZone.onStable.pipe(take(1))))
31213
- .subscribe(() => this.ngZone.run(() => hasObservers(this.gridStateChange) && this.gridStateChange.emit(this.currentState))));
31444
+ .subscribe(() => this.ngZone.run(() => {
31445
+ hasObservers(this.gridStateChange) && this.gridStateChange.emit(this.currentState);
31446
+ if (this.isVirtual) {
31447
+ this.ctx.scroller?.update();
31448
+ this.listComponent?.resetNavigationViewport();
31449
+ }
31450
+ })));
31214
31451
  }
31215
31452
  attachEditHandlers() {
31216
31453
  if (!this.editService) {
@@ -31395,12 +31632,25 @@ class GridComponent {
31395
31632
  _rowClass = () => null;
31396
31633
  navigationMetadata() {
31397
31634
  const isVirtual = this.isVirtual;
31398
- const pageSize = this.pageSize;
31399
- const dataRows = isVirtual ? this.view.total : pageSize;
31635
+ const dataVirtualization = isVirtual && !this.pageable && !this.group?.length;
31636
+ const groupedVirtual = isVirtual && this.group?.length > 0;
31637
+ let dataRows;
31638
+ if (this.pageable) {
31639
+ dataRows = this.skip + Math.min(this.pageSize, this.view.length); // last page might have less rows than the rest
31640
+ }
31641
+ else {
31642
+ dataRows = this.view.total;
31643
+ }
31644
+ if (groupedVirtual) {
31645
+ dataRows = this.ctx.scroller?.total ?? 0;
31646
+ if (!dataVirtualization) {
31647
+ dataRows += this.skip;
31648
+ }
31649
+ }
31400
31650
  const addRowOffset = this.editService.hasNewItem ? 1 : 0;
31401
31651
  const filterRowOffset = hasFilterRow(this.filterable) ? 1 : 0;
31402
31652
  const headerRows = this.isStacked ? 0 : this.totalColumnLevels + 1 + filterRowOffset + addRowOffset;
31403
- return new NavigationMetadata(dataRows, headerRows, isVirtual, this.hasPager, isPresent(this.detailTemplate), this.wrapper, this.virtualColumns, this.columnsContainer, this.isStacked);
31653
+ return new NavigationMetadata(dataRows, headerRows, isVirtual, this.hasPager, isPresent(this.detailTemplate), this.wrapper, this.virtualColumns, this.columnsContainer, this.showFooter ? 1 : 0, this.isStacked);
31404
31654
  }
31405
31655
  applyAutoSize() {
31406
31656
  const cols = this.columns.filter((c) => this.autoSize ? c.autoSize !== false : c.autoSize);
@@ -31482,10 +31732,8 @@ class GridComponent {
31482
31732
  }
31483
31733
  if (this.groupsService.isExpanded({ groupIndex: index }) !== expand) {
31484
31734
  this.groupsService.toggleRow({ index }, false);
31485
- if (this.ctx.dataBindingDirective && isPresent(this.ctx.dataBindingDirective.groupExpand)) {
31486
- this.ctx.dataBindingDirective[`group${expand ? 'Expand' : 'Collapse'}`]({ groupIndex: index });
31487
- }
31488
31735
  }
31736
+ this.changeDetectorRef.markForCheck();
31489
31737
  }
31490
31738
  shouldResetSelection(selectableChanges) {
31491
31739
  const previousValue = selectableChanges.previousValue;
@@ -32233,6 +32481,8 @@ class GridComponent {
32233
32481
  </thead>
32234
32482
  <tbody kendoGridTableBody
32235
32483
  [isLoading]="loading"
32484
+ [rowHeight]="rowHeight"
32485
+ [detailRowHeight]="detailRowHeight"
32236
32486
  [groups]="group"
32237
32487
  [rowsToRender]="rowsToRender"
32238
32488
  [skip]="skip"
@@ -32347,11 +32597,11 @@ class GridComponent {
32347
32597
  <div #dialogContainer></div>
32348
32598
 
32349
32599
  <kendo-grid-adaptive-renderer *ngIf="isAdaptiveModeEnabled"></kendo-grid-adaptive-renderer>
32350
-
32600
+ <kendo-resize-sensor *ngIf="isVirtual" (resize)="onResize()"></kendo-resize-sensor>
32351
32601
  <div *ngIf="aiAssistantToolbarTool" #windowContainer></div>
32352
32602
 
32353
32603
  <div kendoWatermarkOverlay *ngIf="showLicenseWatermark" [licenseMessage]="licenseMessage"></div>
32354
- `, isInline: true, dependencies: [{ kind: "directive", type: LocalizedMessagesDirective, selector: "[kendoGridLocalizedMessages]" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ToolbarComponent, selector: "kendo-grid-toolbar", inputs: ["position", "size", "navigable"] }, { kind: "component", type: GroupPanelComponent, selector: "kendo-grid-group-panel", inputs: ["text", "navigable", "groups"], outputs: ["change"] }, { kind: "directive", type: TableDirective, selector: "[kendoGridResizableTable]", inputs: ["locked", "virtualColumns"] }, { kind: "directive", type: GridTableDirective, selector: "[kendoGridTable]", inputs: ["size"] }, { kind: "component", type: ColGroupComponent, selector: "[kendoGridColGroup]", inputs: ["columns", "groups", "detailTemplate", "sort"] }, { kind: "component", type: HeaderComponent, selector: "[kendoGridHeader]", inputs: ["totalColumnLevels", "columns", "groups", "detailTemplate", "scrollable", "filterable", "sort", "filter", "sortable", "groupable", "lockedColumnsCount", "resizable", "reorderable", "columnMenu", "columnMenuTemplate", "totalColumnsCount", "totalColumns", "tabIndex", "size"] }, { kind: "directive", type: ResizableContainerDirective, selector: "[kendoGridResizableContainer]", inputs: ["lockedWidth", "kendoGridResizableContainer"] }, { kind: "component", type: ListComponent, selector: "kendo-grid-list", inputs: ["data", "groups", "total", "rowHeight", "detailRowHeight", "take", "skip", "columns", "detailTemplate", "noRecordsTemplate", "selectable", "groupable", "filterable", "rowClass", "rowSticky", "loading", "trackBy", "virtualColumns", "isVirtual", "cellLoadingTemplate", "loadingTemplate", "sort", "size"], outputs: ["contentScroll", "pageChange", "scrollBottom"] }, { kind: "directive", type: DragTargetContainerDirective, selector: "[kendoDragTargetContainer]", inputs: ["hint", "dragTargetFilter", "dragHandle", "dragDelay", "threshold", "dragTargetId", "dragData", "dragDisabled", "mode", "cursorStyle", "hintContext"], outputs: ["onDragReady", "onPress", "onDragStart", "onDrag", "onRelease", "onDragEnd"], exportAs: ["kendoDragTargetContainer"] }, { kind: "directive", type: DropTargetContainerDirective, selector: "[kendoDropTargetContainer]", inputs: ["dropTargetFilter", "dropDisabled"], outputs: ["onDragEnter", "onDragOver", "onDragLeave", "onDrop"], exportAs: ["kendoDropTargetContainer"] }, { kind: "directive", type: DraggableDirective, selector: "[kendoDraggable]", inputs: ["enableDrag"], outputs: ["kendoPress", "kendoDrag", "kendoRelease"] }, { kind: "directive", type: GridMarqueeDirective, selector: "[kendoGridSelectionMarquee]" }, { kind: "component", type: FooterComponent, selector: "[kendoGridFooter]", inputs: ["columns", "groups", "detailTemplate", "scrollable", "lockedColumnsCount", "logicalRowIndex", "totalColumns", "totalColumnsCount"] }, { kind: "component", type: TableBodyComponent, selector: "[kendoGridTableBody]", inputs: ["columns", "allColumns", "groups", "detailTemplate", "noRecordsTemplate", "rowsToRender", "skip", "selectable", "filterable", "noRecordsText", "isLocked", "isLoading", "isVirtual", "cellLoadingTemplate", "skipGroupDecoration", "lockedColumnsCount", "totalColumnsCount", "virtualColumns", "trackBy", "rowSticky", "totalColumns", "rowClass"] }, { kind: "component", type: LoadingComponent, selector: "[kendoGridLoading]", inputs: ["loadingTemplate"] }, { kind: "component", type: StatusBarComponent, selector: "kendo-grid-status-bar", inputs: ["statusBarTemplate"] }, { kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }, { kind: "component", type: WatermarkOverlayComponent, selector: "div[kendoWatermarkOverlay]", inputs: ["licenseMessage"] }, { kind: "component", type: i53.CustomMessagesComponent, selector: "kendo-datapager-messages, kendo-pager-messages" }, { kind: "component", type: i53.PagerInfoComponent, selector: "kendo-datapager-info, kendo-pager-info" }, { kind: "component", type: i53.PagerInputComponent, selector: "kendo-datapager-input, kendo-pager-input", inputs: ["showPageText", "size"] }, { kind: "component", type: i53.PagerNextButtonsComponent, selector: "kendo-datapager-next-buttons, kendo-pager-next-buttons", inputs: ["size"] }, { kind: "component", type: i53.PagerNumericButtonsComponent, selector: "kendo-datapager-numeric-buttons, kendo-pager-numeric-buttons", inputs: ["buttonCount", "size"] }, { kind: "component", type: i53.PagerPageSizesComponent, selector: "kendo-datapager-page-sizes, kendo-pager-page-sizes", inputs: ["showItemsText", "pageSizes", "size", "adaptiveMode"] }, { kind: "component", type: i53.PagerPrevButtonsComponent, selector: "kendo-datapager-prev-buttons, kendo-pager-prev-buttons", inputs: ["size"] }, { kind: "directive", type: i53.PagerTemplateDirective, selector: "[kendoDataPagerTemplate], [kendoPagerTemplate]" }, { kind: "component", type: i53.PagerComponent, selector: "kendo-datapager, kendo-pager", inputs: ["externalTemplate", "total", "skip", "pageSize", "buttonCount", "info", "type", "pageSizeValues", "previousNext", "navigable", "size", "responsive", "adaptiveMode"], outputs: ["pageChange", "pageSizeChange", "pagerInputVisibilityChange", "pageTextVisibilityChange", "itemsTextVisibilityChange"], exportAs: ["kendoDataPager", "kendoPager"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: AdaptiveRendererComponent, selector: "kendo-grid-adaptive-renderer" }], encapsulation: i0.ViewEncapsulation.None });
32604
+ `, isInline: true, dependencies: [{ kind: "directive", type: LocalizedMessagesDirective, selector: "[kendoGridLocalizedMessages]" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ToolbarComponent, selector: "kendo-grid-toolbar", inputs: ["position", "size", "navigable"] }, { kind: "component", type: GroupPanelComponent, selector: "kendo-grid-group-panel", inputs: ["text", "navigable", "groups"], outputs: ["change"] }, { kind: "directive", type: TableDirective, selector: "[kendoGridResizableTable]", inputs: ["locked", "virtualColumns"] }, { kind: "directive", type: GridTableDirective, selector: "[kendoGridTable]", inputs: ["size"] }, { kind: "component", type: ColGroupComponent, selector: "[kendoGridColGroup]", inputs: ["columns", "groups", "detailTemplate", "sort"] }, { kind: "component", type: HeaderComponent, selector: "[kendoGridHeader]", inputs: ["totalColumnLevels", "columns", "groups", "detailTemplate", "scrollable", "filterable", "sort", "filter", "sortable", "groupable", "lockedColumnsCount", "resizable", "reorderable", "columnMenu", "columnMenuTemplate", "totalColumnsCount", "totalColumns", "tabIndex", "size"] }, { kind: "directive", type: ResizableContainerDirective, selector: "[kendoGridResizableContainer]", inputs: ["lockedWidth", "kendoGridResizableContainer"] }, { kind: "component", type: ListComponent, selector: "kendo-grid-list", inputs: ["data", "groups", "total", "rowHeight", "detailRowHeight", "take", "skip", "columns", "detailTemplate", "noRecordsTemplate", "selectable", "groupable", "filterable", "rowClass", "rowSticky", "loading", "trackBy", "virtualColumns", "isVirtual", "cellLoadingTemplate", "loadingTemplate", "sort", "size"], outputs: ["contentScroll", "pageChange", "scrollBottom"] }, { kind: "directive", type: DragTargetContainerDirective, selector: "[kendoDragTargetContainer]", inputs: ["hint", "dragTargetFilter", "dragHandle", "dragDelay", "threshold", "dragTargetId", "dragData", "dragDisabled", "mode", "cursorStyle", "hintContext"], outputs: ["onDragReady", "onPress", "onDragStart", "onDrag", "onRelease", "onDragEnd"], exportAs: ["kendoDragTargetContainer"] }, { kind: "directive", type: DropTargetContainerDirective, selector: "[kendoDropTargetContainer]", inputs: ["dropTargetFilter", "dropDisabled"], outputs: ["onDragEnter", "onDragOver", "onDragLeave", "onDrop"], exportAs: ["kendoDropTargetContainer"] }, { kind: "directive", type: DraggableDirective, selector: "[kendoDraggable]", inputs: ["enableDrag"], outputs: ["kendoPress", "kendoDrag", "kendoRelease"] }, { kind: "directive", type: GridMarqueeDirective, selector: "[kendoGridSelectionMarquee]" }, { kind: "component", type: FooterComponent, selector: "[kendoGridFooter]", inputs: ["columns", "groups", "detailTemplate", "scrollable", "lockedColumnsCount", "logicalRowIndex", "totalColumns", "totalColumnsCount"] }, { kind: "component", type: TableBodyComponent, selector: "[kendoGridTableBody]", inputs: ["columns", "allColumns", "groups", "detailTemplate", "noRecordsTemplate", "rowsToRender", "skip", "selectable", "filterable", "noRecordsText", "isLocked", "isLoading", "isVirtual", "cellLoadingTemplate", "skipGroupDecoration", "lockedColumnsCount", "totalColumnsCount", "virtualColumns", "trackBy", "rowSticky", "totalColumns", "rowClass", "rowHeight", "detailRowHeight"] }, { kind: "component", type: LoadingComponent, selector: "[kendoGridLoading]", inputs: ["loadingTemplate"] }, { kind: "component", type: StatusBarComponent, selector: "kendo-grid-status-bar", inputs: ["statusBarTemplate"] }, { kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }, { kind: "component", type: WatermarkOverlayComponent, selector: "div[kendoWatermarkOverlay]", inputs: ["licenseMessage"] }, { kind: "component", type: i53.CustomMessagesComponent, selector: "kendo-datapager-messages, kendo-pager-messages" }, { kind: "component", type: i53.PagerInfoComponent, selector: "kendo-datapager-info, kendo-pager-info" }, { kind: "component", type: i53.PagerInputComponent, selector: "kendo-datapager-input, kendo-pager-input", inputs: ["showPageText", "size"] }, { kind: "component", type: i53.PagerNextButtonsComponent, selector: "kendo-datapager-next-buttons, kendo-pager-next-buttons", inputs: ["size"] }, { kind: "component", type: i53.PagerNumericButtonsComponent, selector: "kendo-datapager-numeric-buttons, kendo-pager-numeric-buttons", inputs: ["buttonCount", "size"] }, { kind: "component", type: i53.PagerPageSizesComponent, selector: "kendo-datapager-page-sizes, kendo-pager-page-sizes", inputs: ["showItemsText", "pageSizes", "size", "adaptiveMode"] }, { kind: "component", type: i53.PagerPrevButtonsComponent, selector: "kendo-datapager-prev-buttons, kendo-pager-prev-buttons", inputs: ["size"] }, { kind: "directive", type: i53.PagerTemplateDirective, selector: "[kendoDataPagerTemplate], [kendoPagerTemplate]" }, { kind: "component", type: i53.PagerComponent, selector: "kendo-datapager, kendo-pager", inputs: ["externalTemplate", "total", "skip", "pageSize", "buttonCount", "info", "type", "pageSizeValues", "previousNext", "navigable", "size", "responsive", "adaptiveMode"], outputs: ["pageChange", "pageSizeChange", "pagerInputVisibilityChange", "pageTextVisibilityChange", "itemsTextVisibilityChange"], exportAs: ["kendoDataPager", "kendoPager"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: AdaptiveRendererComponent, selector: "kendo-grid-adaptive-renderer" }, { kind: "component", type: ResizeSensorComponent, selector: "kendo-resize-sensor", inputs: ["rateLimit"], outputs: ["resize"] }], encapsulation: i0.ViewEncapsulation.None });
32355
32605
  }
32356
32606
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GridComponent, decorators: [{
32357
32607
  type: Component,
@@ -33088,6 +33338,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
33088
33338
  </thead>
33089
33339
  <tbody kendoGridTableBody
33090
33340
  [isLoading]="loading"
33341
+ [rowHeight]="rowHeight"
33342
+ [detailRowHeight]="detailRowHeight"
33091
33343
  [groups]="group"
33092
33344
  [rowsToRender]="rowsToRender"
33093
33345
  [skip]="skip"
@@ -33202,7 +33454,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
33202
33454
  <div #dialogContainer></div>
33203
33455
 
33204
33456
  <kendo-grid-adaptive-renderer *ngIf="isAdaptiveModeEnabled"></kendo-grid-adaptive-renderer>
33205
-
33457
+ <kendo-resize-sensor *ngIf="isVirtual" (resize)="onResize()"></kendo-resize-sensor>
33206
33458
  <div *ngIf="aiAssistantToolbarTool" #windowContainer></div>
33207
33459
 
33208
33460
  <div kendoWatermarkOverlay *ngIf="showLicenseWatermark" [licenseMessage]="licenseMessage"></div>
@@ -33213,7 +33465,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
33213
33465
  TableDirective, GridTableDirective, ColGroupComponent, HeaderComponent, ResizableContainerDirective,
33214
33466
  ListComponent, DragTargetContainerDirective, DropTargetContainerDirective, DraggableDirective,
33215
33467
  GridMarqueeDirective, FooterComponent, TableBodyComponent, LoadingComponent, StatusBarComponent,
33216
- IconWrapperComponent, WatermarkOverlayComponent, ...KENDO_PAGER, NgTemplateOutlet, AdaptiveRendererComponent
33468
+ IconWrapperComponent, WatermarkOverlayComponent, ...KENDO_PAGER, NgTemplateOutlet, AdaptiveRendererComponent, ResizeSensorComponent
33217
33469
  ]
33218
33470
  }]
33219
33471
  }], ctorParameters: function () { return [{ type: BrowserSupportService }, { type: SelectionService }, { type: CellSelectionService }, { type: i0.ElementRef }, { type: GroupInfoService }, { type: GroupsService }, { type: ChangeNotificationService }, { type: DetailsService }, { type: EditService }, { type: FilterService }, { type: PDFService }, { type: ResponsiveService }, { type: i0.Renderer2 }, { type: ExcelService }, { type: i0.NgZone }, { type: ScrollSyncService }, { type: DomEventsService }, { type: ColumnResizingService }, { type: i0.ChangeDetectorRef }, { type: ColumnReorderService }, { type: ColumnInfoService }, { type: NavigationService }, { type: SortService }, { type: ScrollRequestService }, { type: i1$2.LocalizationService }, { type: ContextService }, { type: SizingOptionsService }, { type: AdaptiveGridService }, { type: RowReorderService }, { type: DataMappingService }]; }, propDecorators: { data: [{
@@ -33611,9 +33863,6 @@ class DataBindingDirective {
33611
33863
  this.rowReorderSubscription.unsubscribe();
33612
33864
  }
33613
33865
  }
33614
- /**
33615
- * @hidden
33616
- */
33617
33866
  ngOnChanges(changes) {
33618
33867
  if (anyChanged(["pageSize", "skip", "sort", "group", "filter"], changes)) {
33619
33868
  this.rebind();
@@ -33656,7 +33905,7 @@ class DataBindingDirective {
33656
33905
  }
33657
33906
  }
33658
33907
  process(state) {
33659
- if (this.grid.isVirtual && (!isPresent(state.take) || state.take === 0)) {
33908
+ if (this.grid.isVirtual && ((!isPresent(state.take) || state.take === 0) && !state.group?.length)) {
33660
33909
  return {
33661
33910
  data: [],
33662
33911
  total: this.originalData?.length || 0
@@ -33672,6 +33921,9 @@ class DataBindingDirective {
33672
33921
  this.filter = filter;
33673
33922
  }
33674
33923
  updateGridData() {
33924
+ if (this.grid.isVirtual && !this.grid.pageable && this.state.group?.length) {
33925
+ this.state.take = undefined;
33926
+ }
33675
33927
  this.grid.data = this.process(this.state);
33676
33928
  this.grid.updateNavigationMetadata();
33677
33929
  this.dataChanged = false;
@@ -34622,336 +34874,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
34622
34874
  type: Input
34623
34875
  }] } });
34624
34876
 
34625
- const hasGroups = (items) => items && items.length && items[0].field && items[0].items;
34626
- const groupDescriptorsPresent = (descriptors) => isPresent(descriptors) && descriptors.length > 0;
34627
- const processGroups = (data, state) => process(data, state).data;
34628
- const removeParentDescriptors = (parents, owner) => g => g.field !== owner.field && !parents.some(y => y.field === g.field);
34629
- const findGroup = (groupIndex, groups) => {
34630
- const parents = [];
34631
- return {
34632
- group: groupIndex.split("_").reduce((acc, x) => {
34633
- const idx = parseInt(x, 10);
34634
- if (acc.items) {
34635
- parents.push(acc);
34636
- return acc.items[idx];
34637
- }
34638
- return isArray(acc) ? acc[idx] : acc;
34639
- }, groups),
34640
- parents
34641
- };
34642
- };
34643
- const findChildren = (data, parents) => {
34644
- const filters = parents.map(p => ({ field: p.field, operator: "eq", value: p.value }));
34645
- return filterBy(data, {
34646
- filters: filters,
34647
- logic: "and"
34648
- });
34649
- };
34650
- /**
34651
- * @hidden
34652
- */
34653
- const count = (groups, includeFooters = false) => (groups.reduce((acc, group) => {
34654
- if (!group.skipHeader) {
34655
- acc++;
34656
- }
34657
- if (group.items) {
34658
- const children = count(group.items, includeFooters);
34659
- if (includeFooters && children && !group.hideFooter) {
34660
- acc++;
34661
- }
34662
- acc += children;
34663
- }
34664
- return acc;
34665
- }, 0));
34666
- /**
34667
- * @hidden
34668
- */
34669
- const noDescriptors = (descriptors) => !isPresent(descriptors) || !descriptors.length;
34670
- /**
34671
- * @hidden
34672
- */
34673
- const slice = (groups, skip, take, includeFooters = false) => {
34674
- if (!isPresent(take)) {
34675
- return groups;
34676
- }
34677
- const result = [];
34678
- for (let idx = 0, length = groups.length; idx < length; idx++) {
34679
- if (take <= 0) {
34680
- break;
34681
- }
34682
- const group = groups[idx];
34683
- const groupItems = group.items;
34684
- let itemCount = count(groupItems, includeFooters);
34685
- if (includeFooters && groupItems.length) {
34686
- itemCount++;
34687
- }
34688
- const skipHeader = skip > 0;
34689
- if (skip) {
34690
- skip--;
34691
- if (itemCount && skip >= itemCount) {
34692
- skip -= itemCount;
34693
- continue;
34694
- }
34695
- }
34696
- if (!skipHeader || itemCount) {
34697
- const items = [];
34698
- let hideFooter = true;
34699
- if (!skipHeader) {
34700
- take--;
34701
- }
34702
- if (take) {
34703
- if (hasGroups(groupItems)) {
34704
- const children = slice(groupItems, skip, take, includeFooters);
34705
- items.push(...children);
34706
- take -= count(children, includeFooters);
34707
- }
34708
- else {
34709
- items.push(...groupItems.slice(skip, Math.min(skip + take, groupItems.length)));
34710
- take -= items.length;
34711
- }
34712
- if (take && includeFooters) {
34713
- hideFooter = false;
34714
- take--;
34715
- }
34716
- skip = 0;
34717
- }
34718
- result.push({
34719
- aggregates: group.aggregates,
34720
- field: group.field,
34721
- hideFooter,
34722
- items,
34723
- offset: idx,
34724
- skipHeader,
34725
- value: group.value
34726
- });
34727
- }
34728
- }
34729
- return result;
34730
- };
34731
- const skippedHeaders = (groupItem) => {
34732
- let total = 0;
34733
- while (groupItem) {
34734
- if (groupItem.skipHeader) {
34735
- total++;
34736
- }
34737
- groupItem = groupItem.items && groupItem.items[0] || null;
34738
- }
34739
- return total;
34740
- };
34741
- /**
34742
- * A directive which encapsulates the in-memory handling of grouping with virtual scrolling.
34743
- * @remarks
34744
- * Applied to: {@link GridComponent}.
34745
- */
34746
- class GroupBindingDirective extends DataBindingDirective {
34747
- groupsService;
34748
- /**
34749
- * The array of data which will be used to populate the Grid.
34750
- */
34751
- set kendoGridGroupBinding(value) {
34752
- this.groups = null;
34753
- this.grid.resetGroupsState();
34754
- this.data = value;
34755
- }
34756
- /**
34757
- * @hidden
34758
- */
34759
- set data(value) {
34760
- this.originalData = value || [];
34761
- this.dataChanged = true;
34762
- }
34763
- /**
34764
- * Defines the descriptors by which the data will be sorted.
34765
- */
34766
- set sort(value) {
34767
- const noCurrentDescriptors = noDescriptors(this.state.sort);
34768
- const noIncomingDescriptors = noDescriptors(value);
34769
- const clear = this.state.sort !== value && !(noCurrentDescriptors && noIncomingDescriptors);
34770
- this.grid.sort = this.state.sort = value;
34771
- if (clear) {
34772
- this.groups = null;
34773
- this.grid.resetGroupsState();
34774
- }
34775
- }
34776
- /**
34777
- * Defines the descriptor by which the data will be filtered.
34778
- */
34779
- set filter(value) {
34780
- const clear = diffFilters(this.state.filter, value);
34781
- if (clear) {
34782
- this.state.filter = value;
34783
- this.grid.filter = cloneFilters(value);
34784
- this.groups = null;
34785
- this.grid.resetGroupsState();
34786
- }
34787
- }
34788
- /**
34789
- * Defines the descriptors by which the data will be grouped.
34790
- */
34791
- set group(value) {
34792
- // don't clear if no groups are present in previous and current value
34793
- const groupsPresent = groupDescriptorsPresent(this.state.group) || groupDescriptorsPresent(value);
34794
- const clear = this.state.group !== value && groupsPresent;
34795
- this.grid.group = this.state.group = value;
34796
- if (clear) {
34797
- this.groups = null;
34798
- this.grid.resetGroupsState();
34799
- this.skip = 0;
34800
- }
34801
- }
34802
- groups;
34803
- gridSubs = new Subscription();
34804
- constructor(changeDetector, localDataChangesService, ctxService, groupsService) {
34805
- super(ctxService.grid, changeDetector, localDataChangesService, null, ctxService);
34806
- this.groupsService = groupsService;
34807
- ctxService.dataBindingDirective = this;
34808
- }
34809
- ngOnInit() {
34810
- super.ngOnInit();
34811
- this.gridSubs.add(this.grid.groupExpand.subscribe(this.groupExpand.bind(this)));
34812
- this.gridSubs.add(this.grid.groupCollapse.subscribe(this.groupCollapse.bind(this)));
34813
- }
34814
- ngAfterContentInit() {
34815
- if (isDevMode() && this.grid.isGroupExpanded) {
34816
- throw new Error(GridConfigurationErrorMessages.groupBindingDirectives);
34817
- }
34818
- }
34819
- ngOnDestroy() {
34820
- this.gridSubs.unsubscribe();
34821
- }
34822
- /**
34823
- * @hidden
34824
- */
34825
- toggleAll(expand) {
34826
- this.skip = 0;
34827
- this.grid.scrollTo({ row: 0, column: 0 });
34828
- this.groups.forEach((gr, idx) => {
34829
- const expanded = this.groupsService.isExpanded({
34830
- group: gr,
34831
- groupIndex: idx.toString(),
34832
- parentGroup: undefined
34833
- });
34834
- const performToggle = (expand && !expanded) || (!expand && expanded);
34835
- if (performToggle) {
34836
- this.grid.groupsService.toggleRow({
34837
- type: 'group',
34838
- data: gr,
34839
- index: idx.toString(),
34840
- level: 0,
34841
- parentGroup: undefined
34842
- });
34843
- this[expand ? 'groupExpand' : 'groupCollapse']({ groupIndex: idx.toString() });
34844
- }
34845
- });
34846
- }
34847
- /**
34848
- * Collapses all expanded root level groups.
34849
- */
34850
- collapseAll() {
34851
- this.toggleAll(false);
34852
- }
34853
- /**
34854
- * Expands all expanded root level groups.
34855
- */
34856
- expandAll() {
34857
- this.toggleAll(true);
34858
- }
34859
- /**
34860
- * @hidden
34861
- */
34862
- groupExpand({ groupIndex }) {
34863
- const { group, parents } = findGroup(groupIndex, this.groups);
34864
- if (!group) {
34865
- return;
34866
- }
34867
- this.groupsService.expandChildren(groupIndex);
34868
- if (!group.items.length) {
34869
- const descriptors = this.state.group.filter(removeParentDescriptors(parents, group));
34870
- const children = findChildren(this.originalData, parents.concat(group));
34871
- group.items = processGroups(children, {
34872
- filter: this.state.filter,
34873
- group: descriptors,
34874
- sort: this.state.sort
34875
- });
34876
- }
34877
- this.grid.data = this.dataResult(this.state.skip, this.state.take);
34878
- }
34879
- /**
34880
- * @hidden
34881
- */
34882
- groupCollapse({ groupIndex }) {
34883
- const { group } = findGroup(groupIndex, this.groups);
34884
- if (group) {
34885
- group.items = [];
34886
- }
34887
- else {
34888
- return;
34889
- }
34890
- this.grid.data = this.dataResult(this.state.skip, this.state.take);
34891
- }
34892
- process(state) {
34893
- if (this.grid.isVirtual && (!isPresent(state.take) || state.take === 0)) {
34894
- return {
34895
- data: [],
34896
- total: this.originalData?.length || 0
34897
- };
34898
- }
34899
- if (state.group && state.group.length) {
34900
- const groups = this.processGroups(state);
34901
- this.grid.skip -= skippedHeaders(groups.data[0]);
34902
- return groups;
34903
- }
34904
- else {
34905
- this.groups = null;
34906
- }
34907
- return super.process(state);
34908
- }
34909
- processGroups(state) {
34910
- if (!this.groups || !this.groups.length) {
34911
- this.groups = processGroups(this.originalData, {
34912
- filter: state.filter,
34913
- group: state.group,
34914
- sort: state.sort
34915
- });
34916
- }
34917
- return this.dataResult(state.skip, state.take);
34918
- }
34919
- dataResult(skip, take) {
34920
- const includeFooters = this.grid.showGroupFooters;
34921
- return {
34922
- data: slice(this.groups, skip, take, includeFooters),
34923
- total: count(this.groups, includeFooters)
34924
- };
34925
- }
34926
- applyState({ skip, take, sort, group, filter }) {
34927
- this.skip = skip;
34928
- this.state.take = take;
34929
- // this.pageSize = take; // do need to update take as the process with slice correctly
34930
- this.sort = sort;
34931
- this.group = group;
34932
- this.filter = filter;
34933
- }
34934
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GroupBindingDirective, deps: [{ token: i0.ChangeDetectorRef }, { token: LocalDataChangesService }, { token: ContextService }, { token: GroupsService }], target: i0.ɵɵFactoryTarget.Directive });
34935
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: GroupBindingDirective, isStandalone: true, selector: "[kendoGridGroupBinding]", inputs: { kendoGridGroupBinding: "kendoGridGroupBinding", sort: "sort", filter: "filter", group: "group" }, exportAs: ["kendoGridGroupBinding"], usesInheritance: true, ngImport: i0 });
34936
- }
34937
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GroupBindingDirective, decorators: [{
34938
- type: Directive,
34939
- args: [{
34940
- selector: '[kendoGridGroupBinding]',
34941
- exportAs: 'kendoGridGroupBinding',
34942
- standalone: true
34943
- }]
34944
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: LocalDataChangesService }, { type: ContextService }, { type: GroupsService }]; }, propDecorators: { kendoGridGroupBinding: [{
34945
- type: Input,
34946
- args: ["kendoGridGroupBinding"]
34947
- }], sort: [{
34948
- type: Input
34949
- }], filter: [{
34950
- type: Input
34951
- }], group: [{
34952
- type: Input
34953
- }] } });
34954
-
34955
34877
  /**
34956
34878
  * Represents the Kendo UI GridSpacer component for Angular.
34957
34879
  * Used to give additional white space between the Pager inner elements,
@@ -37473,7 +37395,6 @@ const KENDO_GRID_DECLARATIONS = [
37473
37395
  ExternalEditingDirective,
37474
37396
  ExpandDetailsDirective,
37475
37397
  ExpandGroupDirective,
37476
- GroupBindingDirective,
37477
37398
  GridMarqueeDirective,
37478
37399
  GridSpacerComponent,
37479
37400
  GridToolbarFocusableDirective,
@@ -37500,7 +37421,6 @@ const KENDO_GRID_EXPORTS = [
37500
37421
  SelectionDirective,
37501
37422
  HighlightDirective,
37502
37423
  CustomMessagesComponent,
37503
- GroupBindingDirective,
37504
37424
  TemplateEditingDirective,
37505
37425
  ReactiveEditingDirective,
37506
37426
  InCellEditingDirective,
@@ -37592,9 +37512,9 @@ const KENDO_GRID = [
37592
37512
  */
37593
37513
  class GridModule {
37594
37514
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GridModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
37595
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: GridModule, imports: [GroupHeaderTemplateDirective, GroupHeaderColumnTemplateDirective, GroupFooterTemplateDirective, GroupHeaderComponent, GroupPanelComponent, ColumnComponent, ColumnGroupComponent, LogicalCellDirective, LogicalRowDirective, FocusableDirective, FooterTemplateDirective, ColGroupComponent, ResizableContainerDirective, i1$3.TemplateContextDirective, FieldAccessorPipe, DetailTemplateDirective, SpanColumnComponent, LoadingComponent, GridTableDirective, CommandColumnComponent, CheckboxColumnComponent, SelectionCheckboxDirective, CellTemplateDirective, EditTemplateDirective, RowDragHandleTemplateDirective, RowDragHintTemplateDirective, TableBodyComponent, NoRecordsTemplateDirective, CellComponent, EditCommandDirective, CancelCommandDirective, SaveCommandDirective, RemoveCommandDirective, AddCommandDirective, AddCommandToolbarDirective, EditCommandToolbarDirective, SaveCommandToolbarDirective, RemoveCommandToolbarDirective, CancelCommandToolbarDirective, CellLoadingTemplateDirective, LoadingTemplateDirective, RowReorderColumnComponent, SortCommandToolbarDirective, FilterCommandToolbarDirective, AIAssistantToolbarDirective, GroupCommandToolbarDirective, SelectAllToolbarToolComponent, HeaderComponent, HeaderTemplateDirective, ColumnHandleDirective, SelectAllCheckboxDirective, FooterComponent, i53.CustomMessagesComponent, i53.PagerFocusableDirective, i53.PagerInfoComponent, i53.PagerInputComponent, i53.PagerNextButtonsComponent, i53.PagerNumericButtonsComponent, i53.PagerPageSizesComponent, i53.PagerPrevButtonsComponent, i53.PagerTemplateDirective, i53.PagerComponent, i53.PagerSpacerComponent, i54.ToolBarComponent, i54.ToolbarCustomMessagesComponent, i54.ToolBarButtonComponent, i54.ToolBarButtonGroupComponent, i54.ToolBarDropDownButtonComponent, i54.ToolBarSeparatorComponent, i54.ToolBarSpacerComponent, i54.ToolBarSplitButtonComponent, i54.ToolBarToolComponent, FilterRowComponent, FilterCellComponent, FilterCellTemplateDirective, StringFilterCellComponent, NumericFilterCellComponent, AutoCompleteFilterCellComponent, BooleanFilterCellComponent, FilterCellHostDirective, FilterCellWrapperComponent, DateFilterCellComponent, ColumnComponent, ColumnGroupComponent, LogicalCellDirective, LogicalRowDirective, FocusableDirective, FooterTemplateDirective, ColGroupComponent, ResizableContainerDirective, i1$3.TemplateContextDirective, FieldAccessorPipe, DetailTemplateDirective, SpanColumnComponent, LoadingComponent, GridTableDirective, FilterCellOperatorsComponent, ContainsFilterOperatorComponent, DoesNotContainFilterOperatorComponent, EndsWithFilterOperatorComponent, EqualFilterOperatorComponent, IsEmptyFilterOperatorComponent, IsNotEmptyFilterOperatorComponent, IsNotNullFilterOperatorComponent, IsNullFilterOperatorComponent, NotEqualFilterOperatorComponent, StartsWithFilterOperatorComponent, GreaterFilterOperatorComponent, GreaterOrEqualToFilterOperatorComponent, LessFilterOperatorComponent, LessOrEqualToFilterOperatorComponent, AfterFilterOperatorComponent, AfterEqFilterOperatorComponent, BeforeEqFilterOperatorComponent, BeforeFilterOperatorComponent, FilterInputDirective, ColumnComponent, ColumnGroupComponent, LogicalCellDirective, LogicalRowDirective, FocusableDirective, FooterTemplateDirective, ColGroupComponent, ResizableContainerDirective, i1$3.TemplateContextDirective, FieldAccessorPipe, DetailTemplateDirective, SpanColumnComponent, LoadingComponent, GridTableDirective, FilterCellOperatorsComponent, ContainsFilterOperatorComponent, DoesNotContainFilterOperatorComponent, EndsWithFilterOperatorComponent, EqualFilterOperatorComponent, IsEmptyFilterOperatorComponent, IsNotEmptyFilterOperatorComponent, IsNotNullFilterOperatorComponent, IsNullFilterOperatorComponent, NotEqualFilterOperatorComponent, StartsWithFilterOperatorComponent, GreaterFilterOperatorComponent, GreaterOrEqualToFilterOperatorComponent, LessFilterOperatorComponent, LessOrEqualToFilterOperatorComponent, AfterFilterOperatorComponent, AfterEqFilterOperatorComponent, BeforeEqFilterOperatorComponent, BeforeFilterOperatorComponent, FilterInputDirective, FilterMenuComponent, FilterMenuContainerComponent, FilterMenuInputWrapperComponent, StringFilterMenuInputComponent, StringFilterMenuComponent, FilterMenuTemplateDirective, NumericFilterMenuComponent, NumericFilterMenuInputComponent, DateFilterMenuInputComponent, DateFilterMenuComponent, FilterMenuHostDirective, BooleanFilterMenuComponent, FilterMenuDropDownListDirective, BooleanFilterRadioButtonDirective, ColumnMenuChooserItemCheckedDirective, ColumnListComponent, ColumnChooserComponent, ColumnChooserToolbarDirective, ColumnMenuChooserComponent, ColumnMenuFilterComponent, ColumnMenuItemComponent, ColumnMenuItemContentTemplateDirective, ColumnMenuSortComponent, ColumnMenuComponent, ColumnMenuLockComponent, ColumnMenuTemplateDirective, ColumnMenuContainerComponent, ColumnMenuItemDirective, ColumnMenuStickComponent, ColumnMenuPositionComponent, ColumnMenuAutoSizeColumnComponent, ColumnMenuAutoSizeAllColumnsComponent, GridComponent, ListComponent, ToolbarComponent, LocalizedMessagesDirective, CustomMessagesComponent, DataBindingDirective, ToolbarTemplateDirective, SelectionDirective, HighlightDirective, TemplateEditingDirective, ReactiveEditingDirective, InCellEditingDirective, ExternalEditingDirective, ExpandDetailsDirective, ExpandGroupDirective, GroupBindingDirective, GridMarqueeDirective, GridSpacerComponent, GridToolbarFocusableDirective, StatusBarComponent, StatusBarTemplateDirective, GridClipboardDirective, FormComponent, DialogFormComponent, FormFormFieldComponent, UndoRedoDirective, i54.ToolBarComponent, i54.ToolbarCustomMessagesComponent, i54.ToolBarButtonComponent, i54.ToolBarButtonGroupComponent, i54.ToolBarDropDownButtonComponent, i54.ToolBarSeparatorComponent, i54.ToolBarSpacerComponent, i54.ToolBarSplitButtonComponent, i54.ToolBarToolComponent, TableDirective,
37515
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: GridModule, imports: [GroupHeaderTemplateDirective, GroupHeaderColumnTemplateDirective, GroupFooterTemplateDirective, GroupHeaderComponent, GroupPanelComponent, ColumnComponent, ColumnGroupComponent, LogicalCellDirective, LogicalRowDirective, FocusableDirective, FooterTemplateDirective, ColGroupComponent, ResizableContainerDirective, i1$3.TemplateContextDirective, FieldAccessorPipe, DetailTemplateDirective, SpanColumnComponent, LoadingComponent, GridTableDirective, CommandColumnComponent, CheckboxColumnComponent, SelectionCheckboxDirective, CellTemplateDirective, EditTemplateDirective, RowDragHandleTemplateDirective, RowDragHintTemplateDirective, TableBodyComponent, NoRecordsTemplateDirective, CellComponent, EditCommandDirective, CancelCommandDirective, SaveCommandDirective, RemoveCommandDirective, AddCommandDirective, AddCommandToolbarDirective, EditCommandToolbarDirective, SaveCommandToolbarDirective, RemoveCommandToolbarDirective, CancelCommandToolbarDirective, CellLoadingTemplateDirective, LoadingTemplateDirective, RowReorderColumnComponent, SortCommandToolbarDirective, FilterCommandToolbarDirective, AIAssistantToolbarDirective, GroupCommandToolbarDirective, SelectAllToolbarToolComponent, HeaderComponent, HeaderTemplateDirective, ColumnHandleDirective, SelectAllCheckboxDirective, FooterComponent, i53.CustomMessagesComponent, i53.PagerFocusableDirective, i53.PagerInfoComponent, i53.PagerInputComponent, i53.PagerNextButtonsComponent, i53.PagerNumericButtonsComponent, i53.PagerPageSizesComponent, i53.PagerPrevButtonsComponent, i53.PagerTemplateDirective, i53.PagerComponent, i53.PagerSpacerComponent, i54.ToolBarComponent, i54.ToolbarCustomMessagesComponent, i54.ToolBarButtonComponent, i54.ToolBarButtonGroupComponent, i54.ToolBarDropDownButtonComponent, i54.ToolBarSeparatorComponent, i54.ToolBarSpacerComponent, i54.ToolBarSplitButtonComponent, i54.ToolBarToolComponent, FilterRowComponent, FilterCellComponent, FilterCellTemplateDirective, StringFilterCellComponent, NumericFilterCellComponent, AutoCompleteFilterCellComponent, BooleanFilterCellComponent, FilterCellHostDirective, FilterCellWrapperComponent, DateFilterCellComponent, ColumnComponent, ColumnGroupComponent, LogicalCellDirective, LogicalRowDirective, FocusableDirective, FooterTemplateDirective, ColGroupComponent, ResizableContainerDirective, i1$3.TemplateContextDirective, FieldAccessorPipe, DetailTemplateDirective, SpanColumnComponent, LoadingComponent, GridTableDirective, FilterCellOperatorsComponent, ContainsFilterOperatorComponent, DoesNotContainFilterOperatorComponent, EndsWithFilterOperatorComponent, EqualFilterOperatorComponent, IsEmptyFilterOperatorComponent, IsNotEmptyFilterOperatorComponent, IsNotNullFilterOperatorComponent, IsNullFilterOperatorComponent, NotEqualFilterOperatorComponent, StartsWithFilterOperatorComponent, GreaterFilterOperatorComponent, GreaterOrEqualToFilterOperatorComponent, LessFilterOperatorComponent, LessOrEqualToFilterOperatorComponent, AfterFilterOperatorComponent, AfterEqFilterOperatorComponent, BeforeEqFilterOperatorComponent, BeforeFilterOperatorComponent, FilterInputDirective, ColumnComponent, ColumnGroupComponent, LogicalCellDirective, LogicalRowDirective, FocusableDirective, FooterTemplateDirective, ColGroupComponent, ResizableContainerDirective, i1$3.TemplateContextDirective, FieldAccessorPipe, DetailTemplateDirective, SpanColumnComponent, LoadingComponent, GridTableDirective, FilterCellOperatorsComponent, ContainsFilterOperatorComponent, DoesNotContainFilterOperatorComponent, EndsWithFilterOperatorComponent, EqualFilterOperatorComponent, IsEmptyFilterOperatorComponent, IsNotEmptyFilterOperatorComponent, IsNotNullFilterOperatorComponent, IsNullFilterOperatorComponent, NotEqualFilterOperatorComponent, StartsWithFilterOperatorComponent, GreaterFilterOperatorComponent, GreaterOrEqualToFilterOperatorComponent, LessFilterOperatorComponent, LessOrEqualToFilterOperatorComponent, AfterFilterOperatorComponent, AfterEqFilterOperatorComponent, BeforeEqFilterOperatorComponent, BeforeFilterOperatorComponent, FilterInputDirective, FilterMenuComponent, FilterMenuContainerComponent, FilterMenuInputWrapperComponent, StringFilterMenuInputComponent, StringFilterMenuComponent, FilterMenuTemplateDirective, NumericFilterMenuComponent, NumericFilterMenuInputComponent, DateFilterMenuInputComponent, DateFilterMenuComponent, FilterMenuHostDirective, BooleanFilterMenuComponent, FilterMenuDropDownListDirective, BooleanFilterRadioButtonDirective, ColumnMenuChooserItemCheckedDirective, ColumnListComponent, ColumnChooserComponent, ColumnChooserToolbarDirective, ColumnMenuChooserComponent, ColumnMenuFilterComponent, ColumnMenuItemComponent, ColumnMenuItemContentTemplateDirective, ColumnMenuSortComponent, ColumnMenuComponent, ColumnMenuLockComponent, ColumnMenuTemplateDirective, ColumnMenuContainerComponent, ColumnMenuItemDirective, ColumnMenuStickComponent, ColumnMenuPositionComponent, ColumnMenuAutoSizeColumnComponent, ColumnMenuAutoSizeAllColumnsComponent, GridComponent, ListComponent, ToolbarComponent, LocalizedMessagesDirective, CustomMessagesComponent, DataBindingDirective, ToolbarTemplateDirective, SelectionDirective, HighlightDirective, TemplateEditingDirective, ReactiveEditingDirective, InCellEditingDirective, ExternalEditingDirective, ExpandDetailsDirective, ExpandGroupDirective, GridMarqueeDirective, GridSpacerComponent, GridToolbarFocusableDirective, StatusBarComponent, StatusBarTemplateDirective, GridClipboardDirective, FormComponent, DialogFormComponent, FormFormFieldComponent, UndoRedoDirective, i54.ToolBarComponent, i54.ToolbarCustomMessagesComponent, i54.ToolBarButtonComponent, i54.ToolBarButtonGroupComponent, i54.ToolBarDropDownButtonComponent, i54.ToolBarSeparatorComponent, i54.ToolBarSpacerComponent, i54.ToolBarSplitButtonComponent, i54.ToolBarToolComponent, TableDirective,
37596
37516
  UndoCommandToolbarDirective,
37597
- RedoCommandToolbarDirective], exports: [GridComponent, ToolbarTemplateDirective, ToolbarComponent, GridSpacerComponent, StatusBarTemplateDirective, DataBindingDirective, SelectionDirective, HighlightDirective, CustomMessagesComponent, GroupBindingDirective, TemplateEditingDirective, ReactiveEditingDirective, InCellEditingDirective, ExternalEditingDirective, ExpandDetailsDirective, ExpandGroupDirective, GridToolbarFocusableDirective, GroupHeaderTemplateDirective, GroupHeaderColumnTemplateDirective, GroupFooterTemplateDirective, GroupHeaderComponent, GroupPanelComponent, ColumnComponent, ColumnGroupComponent, LogicalCellDirective, LogicalRowDirective, FocusableDirective, FooterTemplateDirective, ColGroupComponent, ResizableContainerDirective, i1$3.TemplateContextDirective, FieldAccessorPipe, DetailTemplateDirective, SpanColumnComponent, LoadingComponent, GridTableDirective, CommandColumnComponent, CheckboxColumnComponent, SelectionCheckboxDirective, CellTemplateDirective, EditTemplateDirective, RowDragHandleTemplateDirective, RowDragHintTemplateDirective, TableBodyComponent, NoRecordsTemplateDirective, CellComponent, EditCommandDirective, CancelCommandDirective, SaveCommandDirective, RemoveCommandDirective, AddCommandDirective, AddCommandToolbarDirective, EditCommandToolbarDirective, SaveCommandToolbarDirective, RemoveCommandToolbarDirective, CancelCommandToolbarDirective, CellLoadingTemplateDirective, LoadingTemplateDirective, RowReorderColumnComponent, SortCommandToolbarDirective, FilterCommandToolbarDirective, AIAssistantToolbarDirective, GroupCommandToolbarDirective, SelectAllToolbarToolComponent, HeaderComponent, HeaderTemplateDirective, ColumnHandleDirective, SelectAllCheckboxDirective, FilterRowComponent, FilterCellComponent, FilterCellTemplateDirective, StringFilterCellComponent, NumericFilterCellComponent, AutoCompleteFilterCellComponent, BooleanFilterCellComponent, FilterCellHostDirective, FilterCellWrapperComponent, DateFilterCellComponent, FilterCellOperatorsComponent, ContainsFilterOperatorComponent, DoesNotContainFilterOperatorComponent, EndsWithFilterOperatorComponent, EqualFilterOperatorComponent, IsEmptyFilterOperatorComponent, IsNotEmptyFilterOperatorComponent, IsNotNullFilterOperatorComponent, IsNullFilterOperatorComponent, NotEqualFilterOperatorComponent, StartsWithFilterOperatorComponent, GreaterFilterOperatorComponent, GreaterOrEqualToFilterOperatorComponent, LessFilterOperatorComponent, LessOrEqualToFilterOperatorComponent, AfterFilterOperatorComponent, AfterEqFilterOperatorComponent, BeforeEqFilterOperatorComponent, BeforeFilterOperatorComponent, FilterMenuComponent, FilterMenuContainerComponent, FilterMenuInputWrapperComponent, StringFilterMenuInputComponent, StringFilterMenuComponent, FilterMenuTemplateDirective, NumericFilterMenuComponent, NumericFilterMenuInputComponent, DateFilterMenuInputComponent, DateFilterMenuComponent, FilterMenuHostDirective, BooleanFilterMenuComponent, FilterMenuDropDownListDirective, BooleanFilterRadioButtonDirective, ColumnChooserComponent, ColumnChooserToolbarDirective, ColumnMenuFilterComponent, ColumnMenuItemComponent, ColumnMenuItemContentTemplateDirective, ColumnMenuSortComponent, ColumnMenuLockComponent, ColumnMenuStickComponent, ColumnMenuPositionComponent, ColumnMenuChooserComponent, ColumnMenuTemplateDirective, ColumnMenuContainerComponent, ColumnMenuItemDirective, ColumnMenuComponent, ColumnMenuAutoSizeColumnComponent, ColumnMenuAutoSizeAllColumnsComponent, GridClipboardDirective, UndoRedoDirective, UndoCommandToolbarDirective, RedoCommandToolbarDirective, i54.ToolBarComponent, i54.ToolbarCustomMessagesComponent, i54.ToolBarButtonComponent, i54.ToolBarButtonGroupComponent, i54.ToolBarDropDownButtonComponent, i54.ToolBarSeparatorComponent, i54.ToolBarSpacerComponent, i54.ToolBarSplitButtonComponent, i54.ToolBarToolComponent, i53.CustomMessagesComponent, i53.PagerFocusableDirective, i53.PagerInfoComponent, i53.PagerInputComponent, i53.PagerNextButtonsComponent, i53.PagerNumericButtonsComponent, i53.PagerPageSizesComponent, i53.PagerPrevButtonsComponent, i53.PagerTemplateDirective, i53.PagerComponent, i53.PagerSpacerComponent] });
37517
+ RedoCommandToolbarDirective], exports: [GridComponent, ToolbarTemplateDirective, ToolbarComponent, GridSpacerComponent, StatusBarTemplateDirective, DataBindingDirective, SelectionDirective, HighlightDirective, CustomMessagesComponent, TemplateEditingDirective, ReactiveEditingDirective, InCellEditingDirective, ExternalEditingDirective, ExpandDetailsDirective, ExpandGroupDirective, GridToolbarFocusableDirective, GroupHeaderTemplateDirective, GroupHeaderColumnTemplateDirective, GroupFooterTemplateDirective, GroupHeaderComponent, GroupPanelComponent, ColumnComponent, ColumnGroupComponent, LogicalCellDirective, LogicalRowDirective, FocusableDirective, FooterTemplateDirective, ColGroupComponent, ResizableContainerDirective, i1$3.TemplateContextDirective, FieldAccessorPipe, DetailTemplateDirective, SpanColumnComponent, LoadingComponent, GridTableDirective, CommandColumnComponent, CheckboxColumnComponent, SelectionCheckboxDirective, CellTemplateDirective, EditTemplateDirective, RowDragHandleTemplateDirective, RowDragHintTemplateDirective, TableBodyComponent, NoRecordsTemplateDirective, CellComponent, EditCommandDirective, CancelCommandDirective, SaveCommandDirective, RemoveCommandDirective, AddCommandDirective, AddCommandToolbarDirective, EditCommandToolbarDirective, SaveCommandToolbarDirective, RemoveCommandToolbarDirective, CancelCommandToolbarDirective, CellLoadingTemplateDirective, LoadingTemplateDirective, RowReorderColumnComponent, SortCommandToolbarDirective, FilterCommandToolbarDirective, AIAssistantToolbarDirective, GroupCommandToolbarDirective, SelectAllToolbarToolComponent, HeaderComponent, HeaderTemplateDirective, ColumnHandleDirective, SelectAllCheckboxDirective, FilterRowComponent, FilterCellComponent, FilterCellTemplateDirective, StringFilterCellComponent, NumericFilterCellComponent, AutoCompleteFilterCellComponent, BooleanFilterCellComponent, FilterCellHostDirective, FilterCellWrapperComponent, DateFilterCellComponent, FilterCellOperatorsComponent, ContainsFilterOperatorComponent, DoesNotContainFilterOperatorComponent, EndsWithFilterOperatorComponent, EqualFilterOperatorComponent, IsEmptyFilterOperatorComponent, IsNotEmptyFilterOperatorComponent, IsNotNullFilterOperatorComponent, IsNullFilterOperatorComponent, NotEqualFilterOperatorComponent, StartsWithFilterOperatorComponent, GreaterFilterOperatorComponent, GreaterOrEqualToFilterOperatorComponent, LessFilterOperatorComponent, LessOrEqualToFilterOperatorComponent, AfterFilterOperatorComponent, AfterEqFilterOperatorComponent, BeforeEqFilterOperatorComponent, BeforeFilterOperatorComponent, FilterMenuComponent, FilterMenuContainerComponent, FilterMenuInputWrapperComponent, StringFilterMenuInputComponent, StringFilterMenuComponent, FilterMenuTemplateDirective, NumericFilterMenuComponent, NumericFilterMenuInputComponent, DateFilterMenuInputComponent, DateFilterMenuComponent, FilterMenuHostDirective, BooleanFilterMenuComponent, FilterMenuDropDownListDirective, BooleanFilterRadioButtonDirective, ColumnChooserComponent, ColumnChooserToolbarDirective, ColumnMenuFilterComponent, ColumnMenuItemComponent, ColumnMenuItemContentTemplateDirective, ColumnMenuSortComponent, ColumnMenuLockComponent, ColumnMenuStickComponent, ColumnMenuPositionComponent, ColumnMenuChooserComponent, ColumnMenuTemplateDirective, ColumnMenuContainerComponent, ColumnMenuItemDirective, ColumnMenuComponent, ColumnMenuAutoSizeColumnComponent, ColumnMenuAutoSizeAllColumnsComponent, GridClipboardDirective, UndoRedoDirective, UndoCommandToolbarDirective, RedoCommandToolbarDirective, i54.ToolBarComponent, i54.ToolbarCustomMessagesComponent, i54.ToolBarButtonComponent, i54.ToolBarButtonGroupComponent, i54.ToolBarDropDownButtonComponent, i54.ToolBarSeparatorComponent, i54.ToolBarSpacerComponent, i54.ToolBarSplitButtonComponent, i54.ToolBarToolComponent, i53.CustomMessagesComponent, i53.PagerFocusableDirective, i53.PagerInfoComponent, i53.PagerInputComponent, i53.PagerNextButtonsComponent, i53.PagerNumericButtonsComponent, i53.PagerPageSizesComponent, i53.PagerPrevButtonsComponent, i53.PagerTemplateDirective, i53.PagerComponent, i53.PagerSpacerComponent] });
37598
37518
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GridModule, providers: [
37599
37519
  PopupService,
37600
37520
  ResizeBatchService,
@@ -37721,5 +37641,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
37721
37641
  * Generated bundle index. Do not edit.
37722
37642
  */
37723
37643
 
37724
- 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, GroupBindingDirective, 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, convertDateStringsInFilter, count, defaultTrackBy, hasFilterMenu, hasFilterRow, isDateField, isFilterable, slice };
37644
+ 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, convertDateStringsInFilter, defaultTrackBy, hasFilterMenu, hasFilterRow, isDateField, isFilterable };
37725
37645