@progress/kendo-angular-pivotgrid 16.6.0-develop.1 → 16.6.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.
@@ -307,19 +307,21 @@ const matchAriaAttributes = (wrapper) => {
307
307
  const firstColHeaderRowCellsIds = Array.from(firstColHeadersRow === null || firstColHeadersRow === void 0 ? void 0 : firstColHeadersRow.children).map(el => el.getAttribute('id')).join(' ');
308
308
  firstColHeadersRow.setAttribute('aria-owns', `${emptyCell.getAttribute('id')} ${firstColHeaderRowCellsIds}`);
309
309
  rowHeaderRows.forEach((row, index) => {
310
- const valueCellsIds = filterAndMap(Array.from(valueTableCells), c => c.getAttribute('id').split('-')[4] === (index + 1).toString(), c => c.getAttribute('id'));
310
+ const valueCellsIds = filterAndMap(Array.from(valueTableCells), c => { var _a; return ((_a = c.getAttribute('id')) === null || _a === void 0 ? void 0 : _a.split('-')[4]) === (index + 1).toString(); }, c => c.getAttribute('id'));
311
311
  row.setAttribute('aria-owns', valueCellsIds.join(' '));
312
312
  });
313
313
  valueTableCells.forEach(cell => {
314
- const cellColIndex = +cell.getAttribute('id').split('-')[5];
314
+ var _a;
315
+ const cellColIndex = +((_a = cell.getAttribute('id')) === null || _a === void 0 ? void 0 : _a.split('-')[5]);
315
316
  const colHeaderCellsIds = filterAndMap(Array.from(colHeaderCells), c => {
316
- const headerCellColIndex = +c.getAttribute('id').split('-')[5];
317
+ var _a;
318
+ const headerCellColIndex = +((_a = c.getAttribute('id')) === null || _a === void 0 ? void 0 : _a.split('-')[5]);
317
319
  const headerCellColspan = +c.getAttribute('colspan');
318
320
  const colIndexIsEqual = cellColIndex === headerCellColIndex;
319
- const cellColIndexIsWithinHeaderCellRange = headerCellColspan > 1 && (headerCellColIndex + headerCellColspan - 1 >= cellColIndex);
321
+ const cellColIndexIsWithinHeaderCellRange = headerCellColIndex < cellColIndex && headerCellColspan > 1 && (headerCellColIndex + headerCellColspan - 1 >= cellColIndex);
320
322
  return colIndexIsEqual || cellColIndexIsWithinHeaderCellRange;
321
323
  }, c => c.getAttribute('id'));
322
- cell.setAttribute('aria-describedby', colHeaderCellsIds.join(' '));
324
+ colHeaderCellsIds.length && cell.setAttribute('aria-describedby', colHeaderCellsIds.join(' '));
323
325
  });
324
326
  };
325
327
  /**
@@ -394,6 +396,31 @@ const swapItems = (arr, i1, i2) => {
394
396
  arr[i1] = arr[i2];
395
397
  arr[i2] = temp;
396
398
  };
399
+ /**
400
+ * @hidden
401
+ */
402
+ const isVisible = (el, container, offsetY, rtl) => {
403
+ const elTop = el.offsetTop;
404
+ const elBottom = elTop + el.clientHeight;
405
+ let rect;
406
+ let containerRect;
407
+ if (rtl) {
408
+ rect = el.getBoundingClientRect();
409
+ containerRect = container.getBoundingClientRect();
410
+ }
411
+ const elLeft = rtl ? rect.left : el.offsetLeft;
412
+ const elRight = rtl ? rect.right : elLeft + el.clientWidth;
413
+ const containerTop = container.scrollTop;
414
+ const containerBottom = containerTop + container.clientHeight;
415
+ const containerLeft = rtl ? containerRect.left : container.scrollLeft;
416
+ const containerRight = rtl ? containerRect.right : containerLeft + container.clientWidth;
417
+ const visibleY = elTop >= containerTop - offsetY && elBottom <= containerBottom - offsetY;
418
+ const visibleX = rtl ? elRight <= containerRight && elLeft >= containerLeft : elLeft >= containerLeft && elRight <= containerRight;
419
+ return {
420
+ visibleX,
421
+ visibleY
422
+ };
423
+ };
397
424
 
398
425
  /**
399
426
  * @hidden
@@ -3364,8 +3391,8 @@ const packageMetadata = {
3364
3391
  name: '@progress/kendo-angular-pivotgrid',
3365
3392
  productName: 'Kendo UI for Angular',
3366
3393
  productCodes: ['KENDOUIANGULAR', 'KENDOUICOMPLETE'],
3367
- publishDate: 1721827976,
3368
- version: '16.6.0-develop.1',
3394
+ publishDate: 1722607163,
3395
+ version: '16.6.0-develop.10',
3369
3396
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/?utm_medium=product&utm_source=kendoangular&utm_campaign=kendo-ui-angular-purchase-license-keys-warning'
3370
3397
  };
3371
3398
 
@@ -3516,6 +3543,117 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
3516
3543
  }]
3517
3544
  }], ctorParameters: function () { return [{ type: i0.TemplateRef }]; } });
3518
3545
 
3546
+ /**
3547
+ * @hidden
3548
+ */
3549
+ class ScrollableTable {
3550
+ constructor(element, handlers, options) {
3551
+ this.element = element;
3552
+ this.handlers = handlers;
3553
+ this.options = options;
3554
+ this.startRow = 0;
3555
+ this.startCol = 0;
3556
+ this.lastKnownScrollPosition = { top: 0, left: 0 };
3557
+ this.offsetFirst = 0;
3558
+ this.scrollHandler = (e) => {
3559
+ const verticalDir = this.element.scrollTop - this.lastKnownScrollPosition.top;
3560
+ const horizontalDir = Math.abs(this.element.scrollLeft) - this.lastKnownScrollPosition.left;
3561
+ if (this.options.rowVirtualization) {
3562
+ if (verticalDir > 0) {
3563
+ if (this.element.scrollTop > (this.renderedRows * this.options.itemHeight + this.offsetFirst - this.rect.height)) {
3564
+ this.startRow = Math.floor(this.element.scrollTop / this.options.itemHeight);
3565
+ this.rowVirtualizationUpdate();
3566
+ }
3567
+ }
3568
+ else {
3569
+ if (this.element.scrollTop <= this.offsetFirst) {
3570
+ this.startRow = Math.max(0, Math.ceil(this.element.scrollTop / this.options.itemHeight) - Math.ceil(this.options.renderedRows / 3));
3571
+ this.rowVirtualizationUpdate();
3572
+ }
3573
+ }
3574
+ }
3575
+ if (this.options.columnVirtualization) {
3576
+ if (horizontalDir > 0) {
3577
+ if (Math.abs(this.element.scrollLeft) - (Math.max(this.startCol - 1, 0) * (this.options.colWidth || 200)) > (this.options.colWidth || 200)) {
3578
+ this.startCol = Math.min(Math.max(Math.floor(Math.abs(this.element.scrollLeft) / this.options.itemWidth) - 1, 0), this.totalCols - this.renderedCols);
3579
+ this.handlers.onScroll();
3580
+ }
3581
+ }
3582
+ else {
3583
+ if (Math.abs(this.element.scrollLeft) <= (this.startCol + 1) * (this.options.colWidth || 200)) {
3584
+ this.startCol = Math.min(Math.max(Math.floor(Math.abs(this.element.scrollLeft) / this.options.itemWidth) - 1, 0), this.totalCols - this.renderedCols);
3585
+ this.handlers.onScroll();
3586
+ }
3587
+ }
3588
+ }
3589
+ this.lastKnownScrollPosition = {
3590
+ top: this.element.scrollTop,
3591
+ left: Math.abs(this.element.scrollLeft)
3592
+ };
3593
+ };
3594
+ this.scrollEndHandler = () => {
3595
+ this.handlers.onScrollEnd();
3596
+ };
3597
+ this.initialize();
3598
+ }
3599
+ onNewData(recalculateSize = false) {
3600
+ this.offsetFirst = this.startRow * this.options.itemHeight;
3601
+ this.renderedRows = Math.min(this.options.renderedRows || Math.ceil(this.visibleRows * 3), this.total);
3602
+ this.endRow = this.startRow + this.renderedRows;
3603
+ this.renderedCols = Math.min(this.options.renderedCols || Math.ceil(this.visibleCols * 1.3), this.totalCols);
3604
+ this.element.querySelector('table').style.transform = `translateY(${this.offsetFirst}px)`;
3605
+ recalculateSize && this.recalculateSize();
3606
+ }
3607
+ destroy() {
3608
+ this.element.removeEventListener('scroll', this.scrollHandler);
3609
+ this.element.removeEventListener('scrollend', this.scrollEndHandler);
3610
+ this.element.removeChild(this.stretcher);
3611
+ }
3612
+ initialize() {
3613
+ this.rtl = this.options.rtl;
3614
+ this.rect = this.element.getBoundingClientRect();
3615
+ // visible rows and cols
3616
+ this.visibleRows = Math.ceil(this.rect.height / this.options.itemHeight);
3617
+ this.visibleCols = Math.ceil(this.rect.width / this.options.itemWidth);
3618
+ // current totals
3619
+ this.total = this.options.total;
3620
+ this.totalCols = this.options.totalCols;
3621
+ const totalHeight = this.total * this.options.itemHeight;
3622
+ const totalWidth = this.totalCols * this.options.itemWidth;
3623
+ // "page" size (rows and cols)
3624
+ this.renderedRows = Math.min(this.options.renderedRows || Math.ceil(this.visibleRows * 3), this.total);
3625
+ this.renderedCols = Math.min(this.options.renderedCols || Math.ceil(this.visibleCols * 1.3), this.totalCols);
3626
+ // start and end row/col
3627
+ this.startRow = 0;
3628
+ this.startCol = 0;
3629
+ this.endRow = this.startRow + this.renderedRows;
3630
+ this.endCol = this.startCol + this.renderedCols;
3631
+ // element that ensures correct scrolling dimensions of the container
3632
+ this.stretcher = document.createElement('DIV');
3633
+ this.stretcher.style.height = `${totalHeight}px`;
3634
+ this.stretcher.style.width = `${totalWidth}px`;
3635
+ this.element.appendChild(this.stretcher);
3636
+ this.element.addEventListener('scroll', this.scrollHandler);
3637
+ this.element.addEventListener('scrollend', this.scrollEndHandler);
3638
+ }
3639
+ recalculateSize() {
3640
+ const totalHeight = this.total * this.options.itemHeight;
3641
+ const totalWidth = this.totalCols * this.options.itemWidth;
3642
+ this.stretcher.style.height = `${totalHeight}px`;
3643
+ this.stretcher.style.width = `${totalWidth}px`;
3644
+ this.rect = this.element.getBoundingClientRect();
3645
+ // visible rows and cols
3646
+ this.visibleRows = Math.ceil(this.rect.height / this.options.itemHeight);
3647
+ this.visibleCols = Math.ceil(this.rect.width / this.options.itemWidth);
3648
+ }
3649
+ rowVirtualizationUpdate() {
3650
+ this.endRow = Math.min(this.startRow + this.renderedRows, this.total);
3651
+ this.offsetFirst = this.startRow * this.options.itemHeight;
3652
+ this.element.querySelector('table').style.transform = `translateY(${this.offsetFirst}px)`;
3653
+ this.handlers.onScroll();
3654
+ }
3655
+ }
3656
+
3519
3657
  /**
3520
3658
  * @hidden
3521
3659
  */
@@ -3716,42 +3854,205 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
3716
3854
  type: Input
3717
3855
  }] } });
3718
3856
 
3857
+ /**
3858
+ * @hidden
3859
+ */
3860
+ class PivotGridScrollService {
3861
+ constructor() {
3862
+ this.virtualScrolling = false;
3863
+ }
3864
+ }
3865
+ PivotGridScrollService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PivotGridScrollService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3866
+ PivotGridScrollService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PivotGridScrollService });
3867
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PivotGridScrollService, decorators: [{
3868
+ type: Injectable
3869
+ }] });
3870
+
3719
3871
  /**
3720
3872
  * @hidden
3721
3873
  */
3722
3874
  class PivotGridTableComponent {
3723
- constructor(dataService) {
3875
+ constructor(host, dataService, localization, zone, scrollService) {
3876
+ this.host = host;
3724
3877
  this.dataService = dataService;
3725
- this.dataChangeSubs = new Subscription();
3878
+ this.localization = localization;
3879
+ this.zone = zone;
3880
+ this.scrollService = scrollService;
3881
+ this.startRowIndex = 0;
3882
+ this.startColIndex = 0;
3883
+ this.rtl = false;
3884
+ this.subs = new Subscription();
3885
+ this.colsUpdateCallback = (cols) => {
3886
+ var _a, _b;
3887
+ this.renderedCols = Math.min(cols.length, (_a = this.scrollableSettings) === null || _a === void 0 ? void 0 : _a.columns);
3888
+ this.renderedCols && this.scrollable && (this.scrollable.totalCols = cols.length);
3889
+ (this.scrollableSettings && this.scrollableSettings.type !== 'row') && ((_b = this.scrollable) === null || _b === void 0 ? void 0 : _b.onNewData(true));
3890
+ this.headerItems = cols;
3891
+ isDocumentAvailable() && !this.scrollable && this.tableType === 'values' && (this.columnVirtualization || this.rowVirtualization) && this.initScrollable();
3892
+ };
3893
+ this.initScrollable = () => {
3894
+ this.scrollable = new ScrollableTable(this.host.nativeElement, {
3895
+ onScroll: () => {
3896
+ this.startRowIndex = this.scrollable.startRow;
3897
+ this.startColIndex = this.scrollable.startCol;
3898
+ this.renderedRows = this.rows.slice(this.startRowIndex, this.startRowIndex + this.scrollableSettings.rows);
3899
+ this.scrollable.renderedRows = this.renderedRows.length;
3900
+ this.scrollable.renderedCols = this.renderedCols;
3901
+ },
3902
+ onScrollEnd: () => {
3903
+ matchAriaAttributes(this.host.nativeElement.closest('.k-pivotgrid'));
3904
+ }
3905
+ }, {
3906
+ itemHeight: this.scrollableSettings.rowHeight,
3907
+ itemWidth: this.colWidth || 200,
3908
+ total: this.totalRows,
3909
+ totalCols: this.headerItems.length,
3910
+ renderedRows: this.scrollableSettings.rows,
3911
+ renderedCols: this.scrollableSettings.columns,
3912
+ columnVirtualization: this.columnVirtualization,
3913
+ rowVirtualization: this.rowVirtualization,
3914
+ rtl: this.rtl
3915
+ });
3916
+ };
3917
+ this.subs.add(this.localization.changes.subscribe(({ rtl }) => {
3918
+ this.rtl = rtl;
3919
+ this.scrollable && (this.scrollable.rtl = rtl);
3920
+ }));
3726
3921
  }
3727
3922
  get pivotGridId() {
3728
3923
  return `kendo-pivotgrid-${this.dataService.pivotGridId}-`;
3729
3924
  }
3925
+ get columnVirtualization() {
3926
+ var _a, _b;
3927
+ return ((_a = this.scrollableSettings) === null || _a === void 0 ? void 0 : _a.type) && ((_b = this.scrollableSettings) === null || _b === void 0 ? void 0 : _b.type) !== 'row';
3928
+ }
3929
+ get rowVirtualization() {
3930
+ var _a, _b;
3931
+ return ((_a = this.scrollableSettings) === null || _a === void 0 ? void 0 : _a.type) && ((_b = this.scrollableSettings) === null || _b === void 0 ? void 0 : _b.type) !== 'column';
3932
+ }
3730
3933
  ngOnInit() {
3731
- this.dataChangeSubs.add(this.dataService[`${this.tableType}Rows`].subscribe(rows => this.rows = rows));
3732
- this.dataChangeSubs.add(this.tableType === 'values' ?
3733
- this.dataService.columnHeaderCols.subscribe(cols => this.headerItems = cols) :
3734
- this.dataService[`${this.tableType}Cols`].subscribe(cols => this.headerItems = cols));
3934
+ this.subs.add(this.dataService[`${this.tableType}Rows`].subscribe(rows => {
3935
+ this.rows = rows;
3936
+ this.renderedRows = this.scrollableSettings ? rows.slice(this.startRowIndex, this.startRowIndex + this.scrollableSettings.rows) : rows;
3937
+ this.totalRows && this.totalRows !== rows.length && this.scrollable && (this.scrollable.total = rows.length);
3938
+ this.scrollable && this.scrollable.onNewData(this.totalRows && this.totalRows !== rows.length);
3939
+ this.totalRows = rows.length;
3940
+ }));
3941
+ this.subs.add(this.tableType === 'values' ?
3942
+ this.dataService.columnHeaderCols.subscribe(this.colsUpdateCallback) :
3943
+ this.dataService[`${this.tableType}Cols`].subscribe(this.colsUpdateCallback));
3944
+ }
3945
+ ngAfterViewInit() {
3946
+ if (isDocumentAvailable() && this.scrollService.virtualScrolling) {
3947
+ this.initScrollableKeyboardNavigation();
3948
+ }
3735
3949
  }
3736
3950
  ngOnDestroy() {
3737
- this.dataChangeSubs.unsubscribe();
3951
+ var _a;
3952
+ this.subs.unsubscribe();
3953
+ (_a = this.scrollable) === null || _a === void 0 ? void 0 : _a.destroy();
3954
+ }
3955
+ initScrollableKeyboardNavigation() {
3956
+ const pivotGrid = this.scrollService.pivotGrid;
3957
+ this.host.nativeElement.addEventListener('keydown', (e) => {
3958
+ if (this.tableType === 'values' && e.target.tagName === 'TD') {
3959
+ e.stopImmediatePropagation();
3960
+ e.preventDefault();
3961
+ if (e.keyCode === Keys.ArrowLeft) {
3962
+ const id = e.target.getAttribute('id');
3963
+ if (id.split('-')[5] === '1') {
3964
+ const target = document.querySelector(`tr[aria-owns*="${id}"]`);
3965
+ pivotGrid.navigation.focusElement(target.lastElementChild, e.target);
3966
+ }
3967
+ else {
3968
+ pivotGrid.navigation.focusElement(e.target.previousElementSibling, e.target);
3969
+ if (!isVisible(e.target.previousElementSibling, this.host.nativeElement, this.scrollable.offsetFirst, this.rtl).visibleX) {
3970
+ e.target.previousElementSibling.scrollIntoView({ behavior: 'auto', block: 'nearest', inline: 'start' });
3971
+ }
3972
+ }
3973
+ }
3974
+ else if (e.keyCode === Keys.ArrowRight) {
3975
+ const id = e.target.getAttribute('id');
3976
+ if (id.split('-')[5] !== this.headerItems.length.toString()) {
3977
+ pivotGrid.navigation.focusElement(e.target.nextElementSibling, e.target);
3978
+ if (!isVisible(e.target.nextElementSibling, this.host.nativeElement, this.scrollable.offsetFirst, this.rtl).visibleX) {
3979
+ e.target.nextElementSibling.scrollIntoView({ behavior: 'auto', block: 'nearest', inline: 'start' });
3980
+ }
3981
+ }
3982
+ }
3983
+ else if (e.keyCode === Keys.ArrowUp) {
3984
+ const id = e.target.getAttribute('id');
3985
+ if (id.split('-')[4] === '1') {
3986
+ const target = document.getElementById(e.target.getAttribute('aria-describedby').split(' ').pop());
3987
+ pivotGrid.navigation.focusElement(target, e.target);
3988
+ }
3989
+ else {
3990
+ const index = Array.from(e.target.parentElement.children).findIndex(el => el === e.target);
3991
+ const elementToFocus = e.target.parentElement.previousElementSibling.children[index];
3992
+ pivotGrid.navigation.focusElement(elementToFocus, e.target);
3993
+ if (!isVisible(elementToFocus, this.host.nativeElement, this.scrollable.offsetFirst, this.rtl).visibleY) {
3994
+ elementToFocus.scrollIntoView();
3995
+ }
3996
+ }
3997
+ }
3998
+ else if (e.keyCode === Keys.ArrowDown) {
3999
+ const id = e.target.getAttribute('id');
4000
+ if (id.split('-')[4] !== this.totalRows.toString()) {
4001
+ const index = Array.from(e.target.parentElement.children).findIndex(el => el === e.target);
4002
+ const elementToFocus = e.target.parentElement.nextElementSibling.children[index];
4003
+ pivotGrid.navigation.focusElement(elementToFocus, e.target);
4004
+ if (!isVisible(elementToFocus, this.host.nativeElement, this.scrollable.offsetFirst, this.rtl).visibleY) {
4005
+ elementToFocus.scrollIntoView(false);
4006
+ }
4007
+ }
4008
+ }
4009
+ }
4010
+ if (this.tableType === 'rowHeader' && e.target.tagName === 'TH' && e.keyCode === Keys.ArrowRight) {
4011
+ if (e.target.matches(':last-child')) {
4012
+ e.stopImmediatePropagation();
4013
+ e.preventDefault();
4014
+ const valuesContainer = this.host.nativeElement.nextElementSibling;
4015
+ valuesContainer.scrollLeft = this.rtl ? valuesContainer.scrollWidth : 0;
4016
+ this.zone.runOutsideAngular(() => setTimeout(() => {
4017
+ const elementToFocusId = e.target.parentElement.getAttribute('aria-owns').split(' ')[0];
4018
+ const elementToFocus = document.getElementById(elementToFocusId);
4019
+ pivotGrid.navigation.focusElement(elementToFocus, e.target);
4020
+ }));
4021
+ }
4022
+ }
4023
+ if (this.tableType === 'columnHeader' && e.target.tagName === 'TH' && e.keyCode === Keys.ArrowDown) {
4024
+ if (e.target.parentElement.matches(':last-child')) {
4025
+ e.stopImmediatePropagation();
4026
+ e.preventDefault();
4027
+ const valuesContainer = this.host.nativeElement.nextElementSibling.nextElementSibling;
4028
+ valuesContainer.scrollTop = 0;
4029
+ this.zone.runOutsideAngular(() => setTimeout(() => {
4030
+ const elementToFocus = valuesContainer.querySelector(`td[aria-describedby*="${e.target.getAttribute('id')}"]`);
4031
+ pivotGrid.navigation.focusElement(elementToFocus, e.target);
4032
+ }));
4033
+ }
4034
+ }
4035
+ }, true);
3738
4036
  }
3739
4037
  }
3740
- PivotGridTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PivotGridTableComponent, deps: [{ token: PivotGridDataService }], target: i0.ɵɵFactoryTarget.Component });
3741
- PivotGridTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: PivotGridTableComponent, isStandalone: true, selector: "kendo-pivotgrid-table", inputs: { tableType: "tableType", colWidth: "colWidth", customCellTemplate: "customCellTemplate", valueCellTemplate: "valueCellTemplate", rowHeaderCellTemplate: "rowHeaderCellTemplate", columnHeaderCellTemplate: "columnHeaderCellTemplate" }, ngImport: i0, template: `
4038
+ PivotGridTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PivotGridTableComponent, deps: [{ token: i0.ElementRef }, { token: PivotGridDataService }, { token: i1$2.LocalizationService }, { token: i0.NgZone }, { token: PivotGridScrollService }], target: i0.ɵɵFactoryTarget.Component });
4039
+ PivotGridTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: PivotGridTableComponent, isStandalone: true, selector: "kendo-pivotgrid-table", inputs: { tableType: "tableType", colWidth: "colWidth", customCellTemplate: "customCellTemplate", valueCellTemplate: "valueCellTemplate", rowHeaderCellTemplate: "rowHeaderCellTemplate", columnHeaderCellTemplate: "columnHeaderCellTemplate", scrollableSettings: "scrollableSettings" }, ngImport: i0, template: `
3742
4040
  <table
3743
4041
  class="k-pivotgrid-table"
3744
- role="presentation">
4042
+ role="presentation"
4043
+ [ngStyle]="{float: this.tableType === 'values' ? this.rtl ? 'right' : 'left' : 'initial'}">
3745
4044
  <colgroup>
4045
+ <col *ngIf="tableType === 'values' && columnVirtualization && startColIndex > 0" [style.width]="startColIndex * (colWidth >= 0 ? colWidth : 200) + 'px'"/>
3746
4046
  <col
3747
- *ngFor="let item of headerItems;"
4047
+ *ngFor="let item of (tableType === 'values' && columnVirtualization ? headerItems?.slice(0, renderedCols) : headerItems);"
3748
4048
  [style.width]="tableType !== 'rowHeader' ? colWidth >= 0 ? colWidth + 'px' : '200px' : undefined" />
3749
4049
  </colgroup>
3750
4050
  <tbody class="k-pivotgrid-tbody" [attr.role]="tableType === 'values' ? 'none' : 'rowgroup'">
3751
- <tr *ngFor="let row of rows; index as rowIndex"
4051
+ <tr *ngFor="let row of (tableType === 'values' && rowVirtualization ? renderedRows : rows); index as rowIndex"
3752
4052
  class="k-pivotgrid-row"
3753
4053
  [attr.role]="tableType === 'values' ? 'none' : 'row'">
3754
- <ng-container *ngFor="let cell of row.cells; index as colIndex">
4054
+ <td *ngIf="tableType === 'values' && columnVirtualization && startColIndex > 0" class="k-pivotgrid-cell"></td>
4055
+ <ng-container *ngFor="let cell of (tableType === 'values' && columnVirtualization ? row.cells.slice(startColIndex, (startColIndex + renderedCols)) : row.cells); index as colIndex">
3755
4056
  <th
3756
4057
  *ngIf="cell && tableType !== 'values'"
3757
4058
  [kendoPivotGridCell]="cell"
@@ -3759,8 +4060,8 @@ PivotGridTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0"
3759
4060
  [rowHeaderCellTemplate]="rowHeaderCellTemplate"
3760
4061
  [columnHeaderCellTemplate]="columnHeaderCellTemplate"
3761
4062
  [tableType]="tableType"
3762
- [colIndex]="colIndex"
3763
- [rowIndex]="rowIndex"
4063
+ [colIndex]="colIndex + startColIndex"
4064
+ [rowIndex]="rowIndex + startRowIndex"
3764
4065
  [attr.aria-expanded]="cell.hasChildren && cell.children.length ? 'true' : 'false'"
3765
4066
  [attr.role]="tableType === 'columnHeader' ? 'columnheader' : tableType === 'rowHeader' ? 'rowheader' : 'none'"
3766
4067
  [attr.id]="pivotGridId + (tableType === 'columnHeader' ? 'ch-' : 'rh-') + (rowIndex + 1) + '-' + (colIndex + 1)"></th>
@@ -3770,15 +4071,15 @@ PivotGridTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0"
3770
4071
  [valueCellTemplate]="valueCellTemplate"
3771
4072
  [kendoPivotGridCell]="cell"
3772
4073
  tableType="values"
3773
- [colIndex]="colIndex"
3774
- [rowIndex]="rowIndex"
4074
+ [colIndex]="colIndex + startColIndex"
4075
+ [rowIndex]="rowIndex + startRowIndex"
3775
4076
  role="gridcell"
3776
- [attr.id]="pivotGridId + 'cell-' + (rowIndex + 1) + '-' + (colIndex + 1)"></td>
4077
+ [attr.id]="pivotGridId + 'cell-' + (rowIndex + startRowIndex + 1) + '-' + (colIndex + startColIndex + 1)"></td>
3777
4078
  </ng-container>
3778
4079
  </tr>
3779
4080
  </tbody>
3780
4081
  </table>
3781
- `, isInline: true, dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: PivotGridCellDirective, selector: "[kendoPivotGridCell]", inputs: ["kendoPivotGridCell", "tableType", "rowIndex", "colIndex", "customCellTemplate", "valueCellTemplate", "rowHeaderCellTemplate", "columnHeaderCellTemplate"] }] });
4082
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: PivotGridCellDirective, selector: "[kendoPivotGridCell]", inputs: ["kendoPivotGridCell", "tableType", "rowIndex", "colIndex", "customCellTemplate", "valueCellTemplate", "rowHeaderCellTemplate", "columnHeaderCellTemplate"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
3782
4083
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PivotGridTableComponent, decorators: [{
3783
4084
  type: Component,
3784
4085
  args: [{
@@ -3786,17 +4087,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
3786
4087
  template: `
3787
4088
  <table
3788
4089
  class="k-pivotgrid-table"
3789
- role="presentation">
4090
+ role="presentation"
4091
+ [ngStyle]="{float: this.tableType === 'values' ? this.rtl ? 'right' : 'left' : 'initial'}">
3790
4092
  <colgroup>
4093
+ <col *ngIf="tableType === 'values' && columnVirtualization && startColIndex > 0" [style.width]="startColIndex * (colWidth >= 0 ? colWidth : 200) + 'px'"/>
3791
4094
  <col
3792
- *ngFor="let item of headerItems;"
4095
+ *ngFor="let item of (tableType === 'values' && columnVirtualization ? headerItems?.slice(0, renderedCols) : headerItems);"
3793
4096
  [style.width]="tableType !== 'rowHeader' ? colWidth >= 0 ? colWidth + 'px' : '200px' : undefined" />
3794
4097
  </colgroup>
3795
4098
  <tbody class="k-pivotgrid-tbody" [attr.role]="tableType === 'values' ? 'none' : 'rowgroup'">
3796
- <tr *ngFor="let row of rows; index as rowIndex"
4099
+ <tr *ngFor="let row of (tableType === 'values' && rowVirtualization ? renderedRows : rows); index as rowIndex"
3797
4100
  class="k-pivotgrid-row"
3798
4101
  [attr.role]="tableType === 'values' ? 'none' : 'row'">
3799
- <ng-container *ngFor="let cell of row.cells; index as colIndex">
4102
+ <td *ngIf="tableType === 'values' && columnVirtualization && startColIndex > 0" class="k-pivotgrid-cell"></td>
4103
+ <ng-container *ngFor="let cell of (tableType === 'values' && columnVirtualization ? row.cells.slice(startColIndex, (startColIndex + renderedCols)) : row.cells); index as colIndex">
3800
4104
  <th
3801
4105
  *ngIf="cell && tableType !== 'values'"
3802
4106
  [kendoPivotGridCell]="cell"
@@ -3804,8 +4108,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
3804
4108
  [rowHeaderCellTemplate]="rowHeaderCellTemplate"
3805
4109
  [columnHeaderCellTemplate]="columnHeaderCellTemplate"
3806
4110
  [tableType]="tableType"
3807
- [colIndex]="colIndex"
3808
- [rowIndex]="rowIndex"
4111
+ [colIndex]="colIndex + startColIndex"
4112
+ [rowIndex]="rowIndex + startRowIndex"
3809
4113
  [attr.aria-expanded]="cell.hasChildren && cell.children.length ? 'true' : 'false'"
3810
4114
  [attr.role]="tableType === 'columnHeader' ? 'columnheader' : tableType === 'rowHeader' ? 'rowheader' : 'none'"
3811
4115
  [attr.id]="pivotGridId + (tableType === 'columnHeader' ? 'ch-' : 'rh-') + (rowIndex + 1) + '-' + (colIndex + 1)"></th>
@@ -3815,19 +4119,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
3815
4119
  [valueCellTemplate]="valueCellTemplate"
3816
4120
  [kendoPivotGridCell]="cell"
3817
4121
  tableType="values"
3818
- [colIndex]="colIndex"
3819
- [rowIndex]="rowIndex"
4122
+ [colIndex]="colIndex + startColIndex"
4123
+ [rowIndex]="rowIndex + startRowIndex"
3820
4124
  role="gridcell"
3821
- [attr.id]="pivotGridId + 'cell-' + (rowIndex + 1) + '-' + (colIndex + 1)"></td>
4125
+ [attr.id]="pivotGridId + 'cell-' + (rowIndex + startRowIndex + 1) + '-' + (colIndex + startColIndex + 1)"></td>
3822
4126
  </ng-container>
3823
4127
  </tr>
3824
4128
  </tbody>
3825
4129
  </table>
3826
4130
  `,
3827
4131
  standalone: true,
3828
- imports: [NgFor, NgIf, PivotGridCellDirective]
4132
+ imports: [NgFor, NgIf, PivotGridCellDirective, NgStyle]
3829
4133
  }]
3830
- }], ctorParameters: function () { return [{ type: PivotGridDataService }]; }, propDecorators: { tableType: [{
4134
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: PivotGridDataService }, { type: i1$2.LocalizationService }, { type: i0.NgZone }, { type: PivotGridScrollService }]; }, propDecorators: { tableType: [{
3831
4135
  type: Input
3832
4136
  }], colWidth: [{
3833
4137
  type: Input
@@ -3839,8 +4143,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
3839
4143
  type: Input
3840
4144
  }], columnHeaderCellTemplate: [{
3841
4145
  type: Input
4146
+ }], scrollableSettings: [{
4147
+ type: Input
3842
4148
  }] } });
3843
4149
 
4150
+ /**
4151
+ * @hidden
4152
+ */
4153
+ const DEFAULT_VIRTUALIZATION_SETTINGS = {
4154
+ type: 'both',
4155
+ rowHeight: 37,
4156
+ rows: 50,
4157
+ columns: 10
4158
+ };
4159
+ /**
4160
+ * @hidden
4161
+ */
4162
+ const normalizeVirtualSettings = (settings) => {
4163
+ if (settings === true) {
4164
+ return Object.assign({}, DEFAULT_VIRTUALIZATION_SETTINGS);
4165
+ }
4166
+ if (!settings) {
4167
+ return null;
4168
+ }
4169
+ return Object.assign(Object.assign({}, DEFAULT_VIRTUALIZATION_SETTINGS), settings);
4170
+ };
4171
+
3844
4172
  const DEFAULT_LOADER_SETTINGS = {
3845
4173
  type: 'converging-spinner',
3846
4174
  themeColor: 'primary',
@@ -3854,12 +4182,13 @@ const DEFAULT_CONFIGURATOR_SETTINGS = {
3854
4182
  * Represents the Kendo UI PivotGrid component for Angular.
3855
4183
  */
3856
4184
  class PivotGridComponent {
3857
- constructor(hostEl, zone, dataService, localization, renderer, _scrollbarWidthService) {
4185
+ constructor(hostEl, zone, dataService, localization, renderer, _scrollbarWidthService, scrollService) {
3858
4186
  this.hostEl = hostEl;
3859
4187
  this.zone = zone;
3860
4188
  this.dataService = dataService;
3861
4189
  this.localization = localization;
3862
4190
  this.renderer = renderer;
4191
+ this.scrollService = scrollService;
3863
4192
  this.hostClass = true;
3864
4193
  /**
3865
4194
  * Specify the width of the column header and data cells. Value is treated as pixels [(see example)]({% slug appearance_pivotgrid %}#toc-column-headers-width).
@@ -3879,6 +4208,7 @@ class PivotGridComponent {
3879
4208
  this.gearSVGIcon = gearIcon;
3880
4209
  this.resizeObservers = [];
3881
4210
  this._loaderSettings = DEFAULT_LOADER_SETTINGS;
4211
+ this._virtualScrolling = normalizeVirtualSettings(false);
3882
4212
  this.subs = new Subscription();
3883
4213
  this.rtl = false;
3884
4214
  this.resizeContainer = (axis, element) => {
@@ -3908,6 +4238,7 @@ class PivotGridComponent {
3908
4238
  this.direction = this.rtl ? 'rtl' : 'ltr';
3909
4239
  }));
3910
4240
  dataService.wrapper = this.hostEl.nativeElement;
4241
+ this.scrollService.pivotGrid = this;
3911
4242
  }
3912
4243
  get rightPositionClass() {
3913
4244
  var _a;
@@ -3948,6 +4279,18 @@ class PivotGridComponent {
3948
4279
  get loadingText() {
3949
4280
  return this.localization.get('loading');
3950
4281
  }
4282
+ /**
4283
+ * Sets the virtualization options of the component. By default the virtual scrolling functionality is disabled.
4284
+ *
4285
+ * @default false
4286
+ */
4287
+ set virtualScrolling(value) {
4288
+ this._virtualScrolling = normalizeVirtualSettings(value);
4289
+ this.scrollService.virtualScrolling = !!value;
4290
+ }
4291
+ get virtualScrolling() {
4292
+ return this._virtualScrolling;
4293
+ }
3951
4294
  get configuratorSettings() {
3952
4295
  return this.configurator && Object.assign({}, DEFAULT_CONFIGURATOR_SETTINGS, this.configurator);
3953
4296
  }
@@ -4022,6 +4365,9 @@ class PivotGridComponent {
4022
4365
  }
4023
4366
  }
4024
4367
  }
4368
+ /**
4369
+ * @hidden
4370
+ */
4025
4371
  initNavigation() {
4026
4372
  this.stopNavigation();
4027
4373
  this.navigation = new PivotGridNavigation({ tabIndex: 0 });
@@ -4062,15 +4408,16 @@ class PivotGridComponent {
4062
4408
  }
4063
4409
  }
4064
4410
  }
4065
- PivotGridComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PivotGridComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: PivotGridDataService }, { token: i1$2.LocalizationService }, { token: i0.Renderer2 }, { token: i1$4.ScrollbarWidthService }], target: i0.ɵɵFactoryTarget.Component });
4066
- PivotGridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: PivotGridComponent, isStandalone: true, selector: "kendo-pivotgrid", inputs: { loaderSettings: "loaderSettings", configurator: "configurator", columnHeadersWidth: "columnHeadersWidth", navigable: "navigable" }, host: { properties: { "class.k-d-flex": "this.hostClass", "class.k-pos-relative": "this.hostClass", "class.k-flex-row": "this.rightPositionClass", "class.k-flex-row-reverse": "this.leftPositionClass", "class.k-flex-column": "this.bottomPositionClass", "class.k-flex-column-reverse": "this.topPositionClass", "attr.dir": "this.dir" } }, providers: [
4411
+ PivotGridComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PivotGridComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: PivotGridDataService }, { token: i1$2.LocalizationService }, { token: i0.Renderer2 }, { token: i1$4.ScrollbarWidthService }, { token: PivotGridScrollService }], target: i0.ɵɵFactoryTarget.Component });
4412
+ PivotGridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: PivotGridComponent, isStandalone: true, selector: "kendo-pivotgrid", inputs: { loaderSettings: "loaderSettings", configurator: "configurator", virtualScrolling: "virtualScrolling", columnHeadersWidth: "columnHeadersWidth", navigable: "navigable" }, host: { properties: { "class.k-d-flex": "this.hostClass", "class.k-pos-relative": "this.hostClass", "class.k-flex-row": "this.rightPositionClass", "class.k-flex-row-reverse": "this.leftPositionClass", "class.k-flex-column": "this.bottomPositionClass", "class.k-flex-column-reverse": "this.topPositionClass", "attr.dir": "this.dir" } }, providers: [
4067
4413
  PivotGridDataService,
4068
4414
  LocalizationService,
4069
4415
  PivotLocalizationService,
4070
4416
  {
4071
4417
  provide: L10N_PREFIX,
4072
4418
  useValue: 'kendo.pivotgrid'
4073
- }
4419
+ },
4420
+ PivotGridScrollService
4074
4421
  ], queries: [{ propertyName: "customCellTemplate", first: true, predicate: CellTemplateDirective, descendants: true }, { propertyName: "valueCellTemplate", first: true, predicate: ValueCellTemplateDirective, descendants: true }, { propertyName: "rowHeaderCellTemplate", first: true, predicate: RowHeaderCellTemplateDirective, descendants: true }, { propertyName: "columnHeaderCellTemplate", first: true, predicate: ColumnHeaderCellTemplateDirective, descendants: true }], viewQueries: [{ propertyName: "colHeadersTable", first: true, predicate: ["colHeadersTable"], descendants: true, read: ElementRef }, { propertyName: "rowHeadersTable", first: true, predicate: ["rowHeadersTable"], descendants: true, read: ElementRef }, { propertyName: "valuesTable", first: true, predicate: ["valuesTable"], descendants: true, read: ElementRef }, { propertyName: "table", first: true, predicate: ["table"], descendants: true, read: ElementRef }, { propertyName: "configuratorWrapper", first: true, predicate: ["configurator"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: `
4075
4422
  <ng-container kendoPivotGridLocalizedMessages
4076
4423
  i18n-loading="kendo.pivotgrid.loading|The loading text"
@@ -4201,6 +4548,7 @@ PivotGridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", ver
4201
4548
  [valueCellTemplate]="valueCellTemplate"
4202
4549
  [colWidth]="columnHeadersWidth"
4203
4550
  class="k-pivotgrid-values"
4551
+ [scrollableSettings]="virtualScrolling"
4204
4552
  tableType="values"></kendo-pivotgrid-table>
4205
4553
 
4206
4554
  <div *ngIf="loading" [style]="'position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);'">
@@ -4228,7 +4576,7 @@ PivotGridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", ver
4228
4576
  <span>{{messageFor('configuratorButtonText')}}<kendo-icon-wrapper name="gear" innerCssClass="k-color-inherit" [svgIcon]="gearSVGIcon"></kendo-icon-wrapper>
4229
4577
  </span>
4230
4578
  </div>
4231
- `, isInline: true, dependencies: [{ kind: "directive", type: LocalizedMessagesDirective, selector: "[kendoPivotGridLocalizedMessages]" }, { kind: "component", type: PivotGridTableComponent, selector: "kendo-pivotgrid-table", inputs: ["tableType", "colWidth", "customCellTemplate", "valueCellTemplate", "rowHeaderCellTemplate", "columnHeaderCellTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: LoaderComponent, selector: "kendo-loader", inputs: ["type", "themeColor", "size"] }, { kind: "component", type: PivotGridConfiguratorComponent, selector: "kendo-pivotgrid-configurator", inputs: ["orientation", "sort", "filter", "navigation"], outputs: ["close"] }, { kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }] });
4579
+ `, isInline: true, dependencies: [{ kind: "directive", type: LocalizedMessagesDirective, selector: "[kendoPivotGridLocalizedMessages]" }, { kind: "component", type: PivotGridTableComponent, selector: "kendo-pivotgrid-table", inputs: ["tableType", "colWidth", "customCellTemplate", "valueCellTemplate", "rowHeaderCellTemplate", "columnHeaderCellTemplate", "scrollableSettings"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: LoaderComponent, selector: "kendo-loader", inputs: ["type", "themeColor", "size"] }, { kind: "component", type: PivotGridConfiguratorComponent, selector: "kendo-pivotgrid-configurator", inputs: ["orientation", "sort", "filter", "navigation"], outputs: ["close"] }, { kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }] });
4232
4580
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: PivotGridComponent, decorators: [{
4233
4581
  type: Component,
4234
4582
  args: [{
@@ -4240,7 +4588,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
4240
4588
  {
4241
4589
  provide: L10N_PREFIX,
4242
4590
  useValue: 'kendo.pivotgrid'
4243
- }
4591
+ },
4592
+ PivotGridScrollService
4244
4593
  ],
4245
4594
  template: `
4246
4595
  <ng-container kendoPivotGridLocalizedMessages
@@ -4372,6 +4721,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
4372
4721
  [valueCellTemplate]="valueCellTemplate"
4373
4722
  [colWidth]="columnHeadersWidth"
4374
4723
  class="k-pivotgrid-values"
4724
+ [scrollableSettings]="virtualScrolling"
4375
4725
  tableType="values"></kendo-pivotgrid-table>
4376
4726
 
4377
4727
  <div *ngIf="loading" [style]="'position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);'">
@@ -4403,7 +4753,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
4403
4753
  standalone: true,
4404
4754
  imports: [LocalizedMessagesDirective, PivotGridTableComponent, NgIf, LoaderComponent, PivotGridConfiguratorComponent, IconWrapperComponent]
4405
4755
  }]
4406
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: PivotGridDataService }, { type: i1$2.LocalizationService }, { type: i0.Renderer2 }, { type: i1$4.ScrollbarWidthService }]; }, propDecorators: { hostClass: [{
4756
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: PivotGridDataService }, { type: i1$2.LocalizationService }, { type: i0.Renderer2 }, { type: i1$4.ScrollbarWidthService }, { type: PivotGridScrollService }]; }, propDecorators: { hostClass: [{
4407
4757
  type: HostBinding,
4408
4758
  args: ['class.k-d-flex']
4409
4759
  }, {
@@ -4455,6 +4805,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
4455
4805
  type: Input
4456
4806
  }], configurator: [{
4457
4807
  type: Input
4808
+ }], virtualScrolling: [{
4809
+ type: Input
4458
4810
  }], columnHeadersWidth: [{
4459
4811
  type: Input
4460
4812
  }], navigable: [{