@progress/kendo-angular-grid 21.3.0-develop.1 → 21.3.0-develop.10

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.
@@ -54,6 +54,7 @@ export declare class ColumnListComponent implements OnInit, OnDestroy {
54
54
  private _columns;
55
55
  private domSubscriptions;
56
56
  private lastDisabledCheckbox;
57
+ private handledKeys;
57
58
  constructor(element: ElementRef, ngZone: NgZone, renderer: Renderer2, listNavigationService: ColumnListKeyboardNavigation, cdr: ChangeDetectorRef, columnInfoService: ColumnInfoService, adaptiveGridService: AdaptiveGridService, ctx: ContextService);
58
59
  ngOnInit(): void;
59
60
  ngAfterViewInit(): void;
@@ -2,14 +2,17 @@
2
2
  * Copyright © 2025 Progress Software Corporation. All rights reserved.
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
+ import { OnDestroy } from "@angular/core";
5
6
  import * as i0 from "@angular/core";
6
7
  /**
7
8
  * @hidden
8
9
  */
9
- export declare class IdService {
10
+ export declare class IdService implements OnDestroy {
10
11
  private prefix;
12
+ private gridIndex;
11
13
  private columnCounter;
12
14
  constructor();
15
+ ngOnDestroy(): void;
13
16
  gridId(): string;
14
17
  cellId(rowIndex: number, colIndex: number): string;
15
18
  selectionCheckboxId(itemIndex: any): string;
@@ -86,6 +86,7 @@ export class ColumnListComponent {
86
86
  _columns;
87
87
  domSubscriptions = new Subscription();
88
88
  lastDisabledCheckbox;
89
+ handledKeys = [Keys.ArrowDown, Keys.ArrowUp, Keys.Space];
89
90
  constructor(element, ngZone, renderer, listNavigationService, cdr, columnInfoService, adaptiveGridService, ctx) {
90
91
  this.element = element;
91
92
  this.ngZone = ngZone;
@@ -228,7 +229,7 @@ export class ColumnListComponent {
228
229
  }
229
230
  onKeydown = (e) => {
230
231
  const code = normalizeKeys(e);
231
- if (code !== Keys.Tab) {
232
+ if (this.handledKeys.includes(code)) {
232
233
  e.preventDefault();
233
234
  }
234
235
  if (code === 'Tab' && e.shiftKey) {
@@ -7,7 +7,6 @@ import { ColumnInfoService } from '../common/column-info.service';
7
7
  import { ColumnMenuItemBase } from './column-menu-item-base';
8
8
  import { columnsIcon } from '@progress/kendo-svg-icons';
9
9
  import { ContextService } from '../common/provider.service';
10
- import { ColumnListComponent } from './column-list.component';
11
10
  import { ColumnMenuItemContentTemplateDirective } from './column-menu-item-content-template.directive';
12
11
  import { ColumnMenuItemComponent } from './column-menu-item.component';
13
12
  import { ColumnChooserContentComponent } from './column-chooser-content.component';
@@ -139,7 +138,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
139
138
  </kendo-grid-columnmenu-item>
140
139
  `,
141
140
  standalone: true,
142
- imports: [ColumnMenuItemComponent, ColumnMenuItemContentTemplateDirective, ColumnListComponent, ColumnChooserContentComponent]
141
+ imports: [ColumnMenuItemComponent, ColumnMenuItemContentTemplateDirective, ColumnChooserContentComponent]
143
142
  }]
144
143
  }], ctorParameters: () => [{ type: i1.ContextService }, { type: i2.ColumnInfoService }, { type: i0.ElementRef }], propDecorators: { expand: [{
145
144
  type: Output
@@ -15,7 +15,6 @@ import { moreVerticalIcon, columnsIcon, filterIcon, slidersIcon } from '@progres
15
15
  import { TabContentDirective, TabStripComponent, TabStripTabComponent, TabTitleDirective } from '@progress/kendo-angular-layout';
16
16
  import { ColumnInfoService } from '../common/column-info.service';
17
17
  import { IdService } from '../common/id.service';
18
- import { ColumnListComponent } from './column-list.component';
19
18
  import { FilterMenuContainerComponent } from '../filtering/menu/filter-menu-container.component';
20
19
  import { ColumnMenuFilterComponent } from './column-menu-filter.component';
21
20
  import { ColumnMenuAutoSizeAllColumnsComponent } from './column-menu-autosize-all.component';
@@ -437,7 +436,7 @@ export class ColumnMenuComponent {
437
436
  >
438
437
  </kendo-grid-columnmenu-autosize-column>
439
438
  }
440
-
439
+
441
440
  @if (hasAutoSizeAllColumns) {
442
441
  <kendo-grid-columnmenu-autosize-all-columns
443
442
  #autoSizeAllColumnsItem
@@ -565,7 +564,7 @@ export class ColumnMenuComponent {
565
564
  }
566
565
  </kendo-tabstrip>
567
566
  </ng-template>
568
-
567
+
569
568
  `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }, { kind: "component", type: ColumnMenuContainerComponent, selector: "kendo-grid-columnmenu-container" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ColumnMenuSortComponent, selector: "kendo-grid-columnmenu-sort" }, { kind: "directive", type: ColumnMenuItemDirective, selector: "[kendoGridColumnMenuItem]", inputs: ["kendoGridColumnMenuItem"] }, { kind: "component", type: ColumnMenuLockComponent, selector: "kendo-grid-columnmenu-lock" }, { kind: "component", type: ColumnMenuStickComponent, selector: "kendo-grid-columnmenu-stick" }, { kind: "component", type: ColumnMenuPositionComponent, selector: "kendo-grid-columnmenu-position", inputs: ["expanded", "showLock", "showStick", "isLast"], outputs: ["expand", "collapse"] }, { kind: "component", type: ColumnMenuChooserComponent, selector: "kendo-grid-columnmenu-chooser", inputs: ["expanded", "isLast"], outputs: ["expand", "collapse"] }, { kind: "component", type: ColumnMenuAutoSizeColumnComponent, selector: "kendo-grid-columnmenu-autosize-column", inputs: ["column"] }, { kind: "component", type: ColumnMenuAutoSizeAllColumnsComponent, selector: "kendo-grid-columnmenu-autosize-all-columns" }, { kind: "component", type: ColumnMenuFilterComponent, selector: "kendo-grid-columnmenu-filter", inputs: ["expanded", "isLast"], outputs: ["expand", "collapse"] }, { kind: "component", type: TabStripComponent, selector: "kendo-tabstrip", inputs: ["height", "animate", "tabAlignment", "tabPosition", "keepTabContent", "closable", "scrollable", "size", "closeIcon", "closeIconClass", "closeSVGIcon", "showContentArea"], outputs: ["tabSelect", "tabClose", "tabScroll"], exportAs: ["kendoTabStrip"] }, { kind: "component", type: TabStripTabComponent, selector: "kendo-tabstrip-tab", inputs: ["title", "disabled", "cssClass", "cssStyle", "selected", "closable", "closeIcon", "closeIconClass", "closeSVGIcon"], exportAs: ["kendoTabStripTab"] }, { kind: "directive", type: TabTitleDirective, selector: "[kendoTabTitle]" }, { kind: "directive", type: TabContentDirective, selector: "[kendoTabContent]" }, { kind: "component", type: FilterMenuContainerComponent, selector: "kendo-grid-filter-menu-container", inputs: ["column", "isLast", "isExpanded", "menuTabbingService", "filter", "actionsClass"], outputs: ["close"] }, { kind: "component", type: ColumnChooserContentComponent, selector: "kendo-grid-column-chooser-content", inputs: ["filterable", "showSelectAll", "showCheckedCount", "allowHideAll", "autoSync", "actionsClass", "closeOnReset", "columns", "isLast", "isExpanded", "service"], outputs: ["close"] }] });
570
569
  }
571
570
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ColumnMenuComponent, decorators: [{
@@ -648,7 +647,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
648
647
  >
649
648
  </kendo-grid-columnmenu-autosize-column>
650
649
  }
651
-
650
+
652
651
  @if (hasAutoSizeAllColumns) {
653
652
  <kendo-grid-columnmenu-autosize-all-columns
654
653
  #autoSizeAllColumnsItem
@@ -776,7 +775,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
776
775
  }
777
776
  </kendo-tabstrip>
778
777
  </ng-template>
779
-
778
+
780
779
  `,
781
780
  standalone: true,
782
781
  imports: [
@@ -798,7 +797,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
798
797
  TabTitleDirective,
799
798
  TabContentDirective,
800
799
  FilterMenuContainerComponent,
801
- ColumnListComponent,
802
800
  ColumnChooserContentComponent
803
801
  ]
804
802
  }]
@@ -4,16 +4,34 @@
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import { Injectable } from "@angular/core";
6
6
  import * as i0 from "@angular/core";
7
- // Incremented each time the service is instantiated.
8
- let sequence = 0;
7
+ // Registry to track active Grid instances and their indices
8
+ const activeGridIndices = new Set();
9
+ // Get the next available grid index (reuses freed indices)
10
+ function getNextGridIndex() {
11
+ let index = 0;
12
+ while (activeGridIndices.has(index)) {
13
+ index++;
14
+ }
15
+ activeGridIndices.add(index);
16
+ return index;
17
+ }
18
+ // Release a grid index when the Grid is destroyed
19
+ function releaseGridIndex(index) {
20
+ activeGridIndices.delete(index);
21
+ }
9
22
  /**
10
23
  * @hidden
11
24
  */
12
25
  export class IdService {
13
26
  prefix;
27
+ gridIndex;
14
28
  columnCounter = 0;
15
29
  constructor() {
16
- this.prefix = `k-grid${sequence++}`;
30
+ this.gridIndex = getNextGridIndex();
31
+ this.prefix = `k-grid${this.gridIndex}`;
32
+ }
33
+ ngOnDestroy() {
34
+ releaseGridIndex(this.gridIndex);
17
35
  }
18
36
  gridId() {
19
37
  return this.prefix;
@@ -7,7 +7,7 @@ import { Component, Input } from '@angular/core';
7
7
  import { ColumnComponent } from "../../columns/column.component";
8
8
  import { FilterService } from '../filter.service';
9
9
  import { SinglePopupService } from '../../common/single-popup.service';
10
- import { take } from 'rxjs/operators';
10
+ import { filter } from 'rxjs/operators';
11
11
  import { DatePickerComponent, DatePickerCustomMessagesComponent } from '@progress/kendo-angular-dateinputs';
12
12
  import { ContextService } from '../../common/provider.service';
13
13
  import { FilterInputDirective } from '../filter-input.directive';
@@ -49,12 +49,12 @@ export class DateFilterMenuInputComponent {
49
49
  this.subscription.unsubscribe();
50
50
  }
51
51
  }
52
- open() {
52
+ open(picker) {
53
53
  if (this.subscription) {
54
54
  this.subscription.unsubscribe();
55
55
  }
56
56
  this.subscription = this.popupService.onClose
57
- .pipe(take(1))
57
+ .pipe(filter(() => picker.isActive))
58
58
  .subscribe(e => e.preventDefault());
59
59
  }
60
60
  messageFor(key) {
@@ -76,13 +76,13 @@ export class DateFilterMenuInputComponent {
76
76
  [filterService]="filterService"
77
77
  [isFirstDropDown]="isFirstDropDown"
78
78
  [menuTabbingService]="menuTabbingService">
79
- <kendo-datepicker
79
+ <kendo-datepicker #picker
80
80
  kendoFilterInput
81
81
  [adaptiveMode]="ctx.grid?.adaptiveMode"
82
82
  [size]="ctx.grid?.isActionSheetExpanded ? 'large' : null"
83
83
  [columnLabel]="columnLabel"
84
84
  [filterDelay]="0"
85
- (open)="open()"
85
+ (open)="open(picker)"
86
86
  [value]="currentFilter?.value"
87
87
  [placeholder]="placeholder"
88
88
  [formatPlaceholder]="formatPlaceholder"
@@ -115,13 +115,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
115
115
  [filterService]="filterService"
116
116
  [isFirstDropDown]="isFirstDropDown"
117
117
  [menuTabbingService]="menuTabbingService">
118
- <kendo-datepicker
118
+ <kendo-datepicker #picker
119
119
  kendoFilterInput
120
120
  [adaptiveMode]="ctx.grid?.adaptiveMode"
121
121
  [size]="ctx.grid?.isActionSheetExpanded ? 'large' : null"
122
122
  [columnLabel]="columnLabel"
123
123
  [filterDelay]="0"
124
- (open)="open()"
124
+ (open)="open(picker)"
125
125
  [value]="currentFilter?.value"
126
126
  [placeholder]="placeholder"
127
127
  [formatPlaceholder]="formatPlaceholder"
@@ -10,7 +10,7 @@ export const packageMetadata = {
10
10
  productName: 'Kendo UI for Angular',
11
11
  productCode: 'KENDOUIANGULAR',
12
12
  productCodes: ['KENDOUIANGULAR'],
13
- publishDate: 1764778815,
14
- version: '21.3.0-develop.1',
13
+ publishDate: 1765273123,
14
+ version: '21.3.0-develop.10',
15
15
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/'
16
16
  };
@@ -284,6 +284,12 @@ export class ListComponent {
284
284
  this.container.nativeElement.scrollTop = (this.isVirtual && this.ctx.grid?.pageable) ? 0 : this.rowHeightService.offset(this.skip);
285
285
  }
286
286
  if (anyChanged(['total', 'take'], changes)) {
287
+ // For virtual scrolling without paging, preserve scroll position when only take/pageSize changes
288
+ const isVirtualOnly = this.isVirtual && !this.ctx.grid?.pageable;
289
+ const onlyTakeChanged = isChanged('take', changes) && !isChanged('total', changes);
290
+ if (isVirtualOnly && onlyTakeChanged) {
291
+ this.skipScroll = true;
292
+ }
287
293
  this.init();
288
294
  }
289
295
  this.rebind = false;
@@ -438,6 +444,9 @@ export class ListComponent {
438
444
  this.rowHeightService = this.scroller.rowHeightService = new RowHeightService(total, this.rowHeight || this.minRowHeight);
439
445
  if (!isUniversal()) {
440
446
  if (this.skipScroll) {
447
+ // Update scroller's take value when preserving scroll position
448
+ this.scroller.take = this.take;
449
+ this.scroller.total = this.total;
441
450
  this.setScrollerOptions();
442
451
  this.scroller.update();
443
452
  }
@@ -808,6 +817,7 @@ export class ListComponent {
808
817
  setScrollerOptions() {
809
818
  this.scroller.scrollableVirtual = this.isVirtual;
810
819
  this.scroller.table = this.table.nativeElement;
820
+ this.scroller.lockedTable = this.lockedTable?.nativeElement || null;
811
821
  this.scroller.tableBody = this.table.nativeElement.tBodies[0];
812
822
  this.scroller.container = this.container.nativeElement;
813
823
  this.scroller.scrollHeightContainer = this.container.nativeElement.querySelector('.k-height-container');
@@ -41,6 +41,7 @@ export class ScrollerService {
41
41
  total = 0;
42
42
  rowHeightService;
43
43
  table = null;
44
+ lockedTable = null;
44
45
  tableBody = null;
45
46
  container = null;
46
47
  scrollHeightContainer = null;
@@ -51,12 +52,12 @@ export class ScrollerService {
51
52
  firstToLoad = 0;
52
53
  lastLoaded = 0;
53
54
  scrollSyncing = false;
54
- take;
55
55
  scrollSubscription;
56
56
  subscription;
57
57
  lastScrollTop = 0;
58
58
  firstLoaded = 0;
59
59
  expandedRows = {};
60
+ take;
60
61
  constructor(scrollObservable, ctx) {
61
62
  this.scrollObservable = scrollObservable;
62
63
  this.ctx = ctx;
@@ -170,6 +171,9 @@ export class ScrollerService {
170
171
  if (this.scrollableVirtual && this.table) {
171
172
  if (forceSet) {
172
173
  this.table.style.transform = 'translateY(' + dY + 'px)';
174
+ if (this.lockedTable) {
175
+ this.lockedTable.style.transform = 'translateY(' + dY + 'px)';
176
+ }
173
177
  }
174
178
  else {
175
179
  this.tableTransformOffset = dY;
@@ -2102,16 +2102,34 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
2102
2102
  type: Optional
2103
2103
  }] }] });
2104
2104
 
2105
- // Incremented each time the service is instantiated.
2106
- let sequence = 0;
2105
+ // Registry to track active Grid instances and their indices
2106
+ const activeGridIndices = new Set();
2107
+ // Get the next available grid index (reuses freed indices)
2108
+ function getNextGridIndex() {
2109
+ let index = 0;
2110
+ while (activeGridIndices.has(index)) {
2111
+ index++;
2112
+ }
2113
+ activeGridIndices.add(index);
2114
+ return index;
2115
+ }
2116
+ // Release a grid index when the Grid is destroyed
2117
+ function releaseGridIndex(index) {
2118
+ activeGridIndices.delete(index);
2119
+ }
2107
2120
  /**
2108
2121
  * @hidden
2109
2122
  */
2110
2123
  class IdService {
2111
2124
  prefix;
2125
+ gridIndex;
2112
2126
  columnCounter = 0;
2113
2127
  constructor() {
2114
- this.prefix = `k-grid${sequence++}`;
2128
+ this.gridIndex = getNextGridIndex();
2129
+ this.prefix = `k-grid${this.gridIndex}`;
2130
+ }
2131
+ ngOnDestroy() {
2132
+ releaseGridIndex(this.gridIndex);
2115
2133
  }
2116
2134
  gridId() {
2117
2135
  return this.prefix;
@@ -10240,12 +10258,12 @@ class DateFilterMenuInputComponent {
10240
10258
  this.subscription.unsubscribe();
10241
10259
  }
10242
10260
  }
10243
- open() {
10261
+ open(picker) {
10244
10262
  if (this.subscription) {
10245
10263
  this.subscription.unsubscribe();
10246
10264
  }
10247
10265
  this.subscription = this.popupService.onClose
10248
- .pipe(take(1))
10266
+ .pipe(filter(() => picker.isActive))
10249
10267
  .subscribe(e => e.preventDefault());
10250
10268
  }
10251
10269
  messageFor(key) {
@@ -10267,13 +10285,13 @@ class DateFilterMenuInputComponent {
10267
10285
  [filterService]="filterService"
10268
10286
  [isFirstDropDown]="isFirstDropDown"
10269
10287
  [menuTabbingService]="menuTabbingService">
10270
- <kendo-datepicker
10288
+ <kendo-datepicker #picker
10271
10289
  kendoFilterInput
10272
10290
  [adaptiveMode]="ctx.grid?.adaptiveMode"
10273
10291
  [size]="ctx.grid?.isActionSheetExpanded ? 'large' : null"
10274
10292
  [columnLabel]="columnLabel"
10275
10293
  [filterDelay]="0"
10276
- (open)="open()"
10294
+ (open)="open(picker)"
10277
10295
  [value]="currentFilter?.value"
10278
10296
  [placeholder]="placeholder"
10279
10297
  [formatPlaceholder]="formatPlaceholder"
@@ -10306,13 +10324,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
10306
10324
  [filterService]="filterService"
10307
10325
  [isFirstDropDown]="isFirstDropDown"
10308
10326
  [menuTabbingService]="menuTabbingService">
10309
- <kendo-datepicker
10327
+ <kendo-datepicker #picker
10310
10328
  kendoFilterInput
10311
10329
  [adaptiveMode]="ctx.grid?.adaptiveMode"
10312
10330
  [size]="ctx.grid?.isActionSheetExpanded ? 'large' : null"
10313
10331
  [columnLabel]="columnLabel"
10314
10332
  [filterDelay]="0"
10315
- (open)="open()"
10333
+ (open)="open(picker)"
10316
10334
  [value]="currentFilter?.value"
10317
10335
  [placeholder]="placeholder"
10318
10336
  [formatPlaceholder]="formatPlaceholder"
@@ -12837,6 +12855,7 @@ class ColumnListComponent {
12837
12855
  _columns;
12838
12856
  domSubscriptions = new Subscription();
12839
12857
  lastDisabledCheckbox;
12858
+ handledKeys = [Keys.ArrowDown, Keys.ArrowUp, Keys.Space];
12840
12859
  constructor(element, ngZone, renderer, listNavigationService, cdr, columnInfoService, adaptiveGridService, ctx) {
12841
12860
  this.element = element;
12842
12861
  this.ngZone = ngZone;
@@ -12979,7 +12998,7 @@ class ColumnListComponent {
12979
12998
  }
12980
12999
  onKeydown = (e) => {
12981
13000
  const code = normalizeKeys(e);
12982
- if (code !== Keys.Tab) {
13001
+ if (this.handledKeys.includes(code)) {
12983
13002
  e.preventDefault();
12984
13003
  }
12985
13004
  if (code === 'Tab' && e.shiftKey) {
@@ -14960,7 +14979,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
14960
14979
  </kendo-grid-columnmenu-item>
14961
14980
  `,
14962
14981
  standalone: true,
14963
- imports: [ColumnMenuItemComponent, ColumnMenuItemContentTemplateDirective, ColumnListComponent, ColumnChooserContentComponent]
14982
+ imports: [ColumnMenuItemComponent, ColumnMenuItemContentTemplateDirective, ColumnChooserContentComponent]
14964
14983
  }]
14965
14984
  }], ctorParameters: () => [{ type: ContextService }, { type: ColumnInfoService }, { type: i0.ElementRef }], propDecorators: { expand: [{
14966
14985
  type: Output
@@ -16233,7 +16252,7 @@ class ColumnMenuComponent {
16233
16252
  >
16234
16253
  </kendo-grid-columnmenu-autosize-column>
16235
16254
  }
16236
-
16255
+
16237
16256
  @if (hasAutoSizeAllColumns) {
16238
16257
  <kendo-grid-columnmenu-autosize-all-columns
16239
16258
  #autoSizeAllColumnsItem
@@ -16361,7 +16380,7 @@ class ColumnMenuComponent {
16361
16380
  }
16362
16381
  </kendo-tabstrip>
16363
16382
  </ng-template>
16364
-
16383
+
16365
16384
  `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }, { kind: "component", type: ColumnMenuContainerComponent, selector: "kendo-grid-columnmenu-container" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ColumnMenuSortComponent, selector: "kendo-grid-columnmenu-sort" }, { kind: "directive", type: ColumnMenuItemDirective, selector: "[kendoGridColumnMenuItem]", inputs: ["kendoGridColumnMenuItem"] }, { kind: "component", type: ColumnMenuLockComponent, selector: "kendo-grid-columnmenu-lock" }, { kind: "component", type: ColumnMenuStickComponent, selector: "kendo-grid-columnmenu-stick" }, { kind: "component", type: ColumnMenuPositionComponent, selector: "kendo-grid-columnmenu-position", inputs: ["expanded", "showLock", "showStick", "isLast"], outputs: ["expand", "collapse"] }, { kind: "component", type: ColumnMenuChooserComponent, selector: "kendo-grid-columnmenu-chooser", inputs: ["expanded", "isLast"], outputs: ["expand", "collapse"] }, { kind: "component", type: ColumnMenuAutoSizeColumnComponent, selector: "kendo-grid-columnmenu-autosize-column", inputs: ["column"] }, { kind: "component", type: ColumnMenuAutoSizeAllColumnsComponent, selector: "kendo-grid-columnmenu-autosize-all-columns" }, { kind: "component", type: ColumnMenuFilterComponent, selector: "kendo-grid-columnmenu-filter", inputs: ["expanded", "isLast"], outputs: ["expand", "collapse"] }, { kind: "component", type: TabStripComponent, selector: "kendo-tabstrip", inputs: ["height", "animate", "tabAlignment", "tabPosition", "keepTabContent", "closable", "scrollable", "size", "closeIcon", "closeIconClass", "closeSVGIcon", "showContentArea"], outputs: ["tabSelect", "tabClose", "tabScroll"], exportAs: ["kendoTabStrip"] }, { kind: "component", type: TabStripTabComponent, selector: "kendo-tabstrip-tab", inputs: ["title", "disabled", "cssClass", "cssStyle", "selected", "closable", "closeIcon", "closeIconClass", "closeSVGIcon"], exportAs: ["kendoTabStripTab"] }, { kind: "directive", type: TabTitleDirective, selector: "[kendoTabTitle]" }, { kind: "directive", type: TabContentDirective, selector: "[kendoTabContent]" }, { kind: "component", type: FilterMenuContainerComponent, selector: "kendo-grid-filter-menu-container", inputs: ["column", "isLast", "isExpanded", "menuTabbingService", "filter", "actionsClass"], outputs: ["close"] }, { kind: "component", type: ColumnChooserContentComponent, selector: "kendo-grid-column-chooser-content", inputs: ["filterable", "showSelectAll", "showCheckedCount", "allowHideAll", "autoSync", "actionsClass", "closeOnReset", "columns", "isLast", "isExpanded", "service"], outputs: ["close"] }] });
16366
16385
  }
16367
16386
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ColumnMenuComponent, decorators: [{
@@ -16444,7 +16463,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
16444
16463
  >
16445
16464
  </kendo-grid-columnmenu-autosize-column>
16446
16465
  }
16447
-
16466
+
16448
16467
  @if (hasAutoSizeAllColumns) {
16449
16468
  <kendo-grid-columnmenu-autosize-all-columns
16450
16469
  #autoSizeAllColumnsItem
@@ -16572,7 +16591,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
16572
16591
  }
16573
16592
  </kendo-tabstrip>
16574
16593
  </ng-template>
16575
-
16594
+
16576
16595
  `,
16577
16596
  standalone: true,
16578
16597
  imports: [
@@ -16594,7 +16613,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
16594
16613
  TabTitleDirective,
16595
16614
  TabContentDirective,
16596
16615
  FilterMenuContainerComponent,
16597
- ColumnListComponent,
16598
16616
  ColumnChooserContentComponent
16599
16617
  ]
16600
16618
  }]
@@ -23578,8 +23596,8 @@ const packageMetadata = {
23578
23596
  productName: 'Kendo UI for Angular',
23579
23597
  productCode: 'KENDOUIANGULAR',
23580
23598
  productCodes: ['KENDOUIANGULAR'],
23581
- publishDate: 1764778815,
23582
- version: '21.3.0-develop.1',
23599
+ publishDate: 1765273123,
23600
+ version: '21.3.0-develop.10',
23583
23601
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/'
23584
23602
  };
23585
23603
 
@@ -26178,6 +26196,7 @@ class ScrollerService {
26178
26196
  total = 0;
26179
26197
  rowHeightService;
26180
26198
  table = null;
26199
+ lockedTable = null;
26181
26200
  tableBody = null;
26182
26201
  container = null;
26183
26202
  scrollHeightContainer = null;
@@ -26188,12 +26207,12 @@ class ScrollerService {
26188
26207
  firstToLoad = 0;
26189
26208
  lastLoaded = 0;
26190
26209
  scrollSyncing = false;
26191
- take;
26192
26210
  scrollSubscription;
26193
26211
  subscription;
26194
26212
  lastScrollTop = 0;
26195
26213
  firstLoaded = 0;
26196
26214
  expandedRows = {};
26215
+ take;
26197
26216
  constructor(scrollObservable, ctx) {
26198
26217
  this.scrollObservable = scrollObservable;
26199
26218
  this.ctx = ctx;
@@ -26307,6 +26326,9 @@ class ScrollerService {
26307
26326
  if (this.scrollableVirtual && this.table) {
26308
26327
  if (forceSet) {
26309
26328
  this.table.style.transform = 'translateY(' + dY + 'px)';
26329
+ if (this.lockedTable) {
26330
+ this.lockedTable.style.transform = 'translateY(' + dY + 'px)';
26331
+ }
26310
26332
  }
26311
26333
  else {
26312
26334
  this.tableTransformOffset = dY;
@@ -26886,6 +26908,12 @@ class ListComponent {
26886
26908
  this.container.nativeElement.scrollTop = (this.isVirtual && this.ctx.grid?.pageable) ? 0 : this.rowHeightService.offset(this.skip);
26887
26909
  }
26888
26910
  if (anyChanged(['total', 'take'], changes)) {
26911
+ // For virtual scrolling without paging, preserve scroll position when only take/pageSize changes
26912
+ const isVirtualOnly = this.isVirtual && !this.ctx.grid?.pageable;
26913
+ const onlyTakeChanged = isChanged$1('take', changes) && !isChanged$1('total', changes);
26914
+ if (isVirtualOnly && onlyTakeChanged) {
26915
+ this.skipScroll = true;
26916
+ }
26889
26917
  this.init();
26890
26918
  }
26891
26919
  this.rebind = false;
@@ -27040,6 +27068,9 @@ class ListComponent {
27040
27068
  this.rowHeightService = this.scroller.rowHeightService = new RowHeightService(total, this.rowHeight || this.minRowHeight);
27041
27069
  if (!isUniversal()) {
27042
27070
  if (this.skipScroll) {
27071
+ // Update scroller's take value when preserving scroll position
27072
+ this.scroller.take = this.take;
27073
+ this.scroller.total = this.total;
27043
27074
  this.setScrollerOptions();
27044
27075
  this.scroller.update();
27045
27076
  }
@@ -27410,6 +27441,7 @@ class ListComponent {
27410
27441
  setScrollerOptions() {
27411
27442
  this.scroller.scrollableVirtual = this.isVirtual;
27412
27443
  this.scroller.table = this.table.nativeElement;
27444
+ this.scroller.lockedTable = this.lockedTable?.nativeElement || null;
27413
27445
  this.scroller.tableBody = this.table.nativeElement.tBodies[0];
27414
27446
  this.scroller.container = this.container.nativeElement;
27415
27447
  this.scroller.scrollHeightContainer = this.container.nativeElement.querySelector('.k-height-container');
@@ -8,7 +8,7 @@ import { FilterDescriptor, CompositeFilterDescriptor } from '@progress/kendo-dat
8
8
  import { ColumnComponent } from "../../columns/column.component";
9
9
  import { FilterService } from '../filter.service';
10
10
  import { SinglePopupService } from '../../common/single-popup.service';
11
- import { CalendarView, DateInputFormatPlaceholder } from '@progress/kendo-angular-dateinputs';
11
+ import { DatePickerComponent, CalendarView, DateInputFormatPlaceholder } from '@progress/kendo-angular-dateinputs';
12
12
  import { ContextService } from '../../common/provider.service';
13
13
  import * as i0 from "@angular/core";
14
14
  /**
@@ -40,7 +40,7 @@ export declare class DateFilterMenuInputComponent implements OnDestroy {
40
40
  private subscription;
41
41
  constructor(popupService: SinglePopupService, ctx: ContextService);
42
42
  ngOnDestroy(): void;
43
- open(): void;
43
+ open(picker: DatePickerComponent): void;
44
44
  messageFor(key: string): string;
45
45
  get columnLabel(): string;
46
46
  static ɵfac: i0.ɵɵFactoryDeclaration<DateFilterMenuInputComponent, never>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@progress/kendo-angular-grid",
3
- "version": "21.3.0-develop.1",
3
+ "version": "21.3.0-develop.10",
4
4
  "description": "Kendo UI Grid for Angular - high performance data grid with paging, filtering, virtualization, CRUD, and more.",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "author": "Progress",
@@ -73,7 +73,7 @@
73
73
  "package": {
74
74
  "productName": "Kendo UI for Angular",
75
75
  "productCode": "KENDOUIANGULAR",
76
- "publishDate": 1764778815,
76
+ "publishDate": 1765273123,
77
77
  "licensingDocsUrl": "https://www.telerik.com/kendo-angular-ui/my-license/"
78
78
  }
79
79
  },
@@ -84,34 +84,34 @@
84
84
  "@angular/forms": "18 - 21",
85
85
  "@angular/platform-browser": "18 - 21",
86
86
  "@progress/kendo-data-query": "^1.0.0",
87
- "@progress/kendo-drawing": "^1.21.0",
87
+ "@progress/kendo-drawing": "^1.23.1",
88
88
  "@progress/kendo-licensing": "^1.7.0",
89
- "@progress/kendo-angular-buttons": "21.3.0-develop.1",
90
- "@progress/kendo-angular-common": "21.3.0-develop.1",
91
- "@progress/kendo-angular-dateinputs": "21.3.0-develop.1",
92
- "@progress/kendo-angular-layout": "21.3.0-develop.1",
93
- "@progress/kendo-angular-navigation": "21.3.0-develop.1",
94
- "@progress/kendo-angular-dropdowns": "21.3.0-develop.1",
95
- "@progress/kendo-angular-excel-export": "21.3.0-develop.1",
96
- "@progress/kendo-angular-icons": "21.3.0-develop.1",
97
- "@progress/kendo-angular-indicators": "21.3.0-develop.1",
98
- "@progress/kendo-angular-inputs": "21.3.0-develop.1",
99
- "@progress/kendo-angular-conversational-ui": "21.3.0-develop.1",
100
- "@progress/kendo-angular-intl": "21.3.0-develop.1",
101
- "@progress/kendo-angular-l10n": "21.3.0-develop.1",
102
- "@progress/kendo-angular-label": "21.3.0-develop.1",
103
- "@progress/kendo-angular-menu": "21.3.0-develop.1",
104
- "@progress/kendo-angular-pager": "21.3.0-develop.1",
105
- "@progress/kendo-angular-pdf-export": "21.3.0-develop.1",
106
- "@progress/kendo-angular-popup": "21.3.0-develop.1",
107
- "@progress/kendo-angular-toolbar": "21.3.0-develop.1",
108
- "@progress/kendo-angular-upload": "21.3.0-develop.1",
109
- "@progress/kendo-angular-utils": "21.3.0-develop.1",
89
+ "@progress/kendo-angular-buttons": "21.3.0-develop.10",
90
+ "@progress/kendo-angular-common": "21.3.0-develop.10",
91
+ "@progress/kendo-angular-dateinputs": "21.3.0-develop.10",
92
+ "@progress/kendo-angular-layout": "21.3.0-develop.10",
93
+ "@progress/kendo-angular-navigation": "21.3.0-develop.10",
94
+ "@progress/kendo-angular-dropdowns": "21.3.0-develop.10",
95
+ "@progress/kendo-angular-excel-export": "21.3.0-develop.10",
96
+ "@progress/kendo-angular-icons": "21.3.0-develop.10",
97
+ "@progress/kendo-angular-indicators": "21.3.0-develop.10",
98
+ "@progress/kendo-angular-inputs": "21.3.0-develop.10",
99
+ "@progress/kendo-angular-conversational-ui": "21.3.0-develop.10",
100
+ "@progress/kendo-angular-intl": "21.3.0-develop.10",
101
+ "@progress/kendo-angular-l10n": "21.3.0-develop.10",
102
+ "@progress/kendo-angular-label": "21.3.0-develop.10",
103
+ "@progress/kendo-angular-menu": "21.3.0-develop.10",
104
+ "@progress/kendo-angular-pager": "21.3.0-develop.10",
105
+ "@progress/kendo-angular-pdf-export": "21.3.0-develop.10",
106
+ "@progress/kendo-angular-popup": "21.3.0-develop.10",
107
+ "@progress/kendo-angular-toolbar": "21.3.0-develop.10",
108
+ "@progress/kendo-angular-upload": "21.3.0-develop.10",
109
+ "@progress/kendo-angular-utils": "21.3.0-develop.10",
110
110
  "rxjs": "^6.5.3 || ^7.0.0"
111
111
  },
112
112
  "dependencies": {
113
113
  "tslib": "^2.3.1",
114
- "@progress/kendo-angular-schematics": "21.3.0-develop.1",
114
+ "@progress/kendo-angular-schematics": "21.3.0-develop.10",
115
115
  "@progress/kendo-common": "^1.0.1",
116
116
  "@progress/kendo-file-saver": "^1.0.0"
117
117
  },
@@ -9,19 +9,19 @@ const schematics_1 = require("@angular-devkit/schematics");
9
9
  function default_1(options) {
10
10
  const finalOptions = Object.assign(Object.assign({}, options), { mainNgModule: 'GridModule', package: 'grid', peerDependencies: {
11
11
  // peer deps of the dropdowns
12
- '@progress/kendo-angular-treeview': '21.3.0-develop.1',
13
- '@progress/kendo-angular-navigation': '21.3.0-develop.1',
12
+ '@progress/kendo-angular-treeview': '21.3.0-develop.10',
13
+ '@progress/kendo-angular-navigation': '21.3.0-develop.10',
14
14
  // peer dependency of kendo-angular-inputs
15
- '@progress/kendo-angular-dialog': '21.3.0-develop.1',
15
+ '@progress/kendo-angular-dialog': '21.3.0-develop.10',
16
16
  // peer dependency of kendo-angular-icons
17
17
  '@progress/kendo-svg-icons': '^4.0.0',
18
18
  // peer dependency of kendo-angular-layout
19
- '@progress/kendo-angular-progressbar': '21.3.0-develop.1',
19
+ '@progress/kendo-angular-progressbar': '21.3.0-develop.10',
20
20
  // transitive peer dependencies from toolbar
21
- '@progress/kendo-angular-indicators': '21.3.0-develop.1',
21
+ '@progress/kendo-angular-indicators': '21.3.0-develop.10',
22
22
  // transitive peer dependencies from conversational-ui
23
- '@progress/kendo-angular-menu': '21.3.0-develop.1',
24
- '@progress/kendo-angular-upload': '21.3.0-develop.1'
23
+ '@progress/kendo-angular-menu': '21.3.0-develop.10',
24
+ '@progress/kendo-angular-upload': '21.3.0-develop.10'
25
25
  } });
26
26
  return (0, schematics_1.externalSchematic)('@progress/kendo-angular-schematics', 'ng-add', finalOptions);
27
27
  }
@@ -39,6 +39,7 @@ export declare class ScrollerService {
39
39
  total: number;
40
40
  rowHeightService: RowHeightService;
41
41
  table: HTMLTableElement | null;
42
+ lockedTable: HTMLTableElement | null;
42
43
  tableBody: HTMLTableSectionElement | null;
43
44
  container: HTMLDivElement | null;
44
45
  scrollHeightContainer: HTMLDivElement | null;
@@ -49,12 +50,12 @@ export declare class ScrollerService {
49
50
  firstToLoad: number;
50
51
  lastLoaded: number;
51
52
  scrollSyncing: boolean;
52
- private take;
53
53
  private scrollSubscription;
54
54
  private subscription;
55
55
  private lastScrollTop;
56
56
  private firstLoaded;
57
57
  private expandedRows;
58
+ take: number;
58
59
  constructor(scrollObservable: Observable<any>, ctx: ContextService);
59
60
  create(rowHeightService: RowHeightService, skip: number, take: number, total: number): BehaviorSubject<Action>;
60
61
  reset(skipScroll?: boolean): void;