@progress/kendo-angular-pager 19.0.0-develop.12 → 19.0.0-develop.14

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.
@@ -2,12 +2,12 @@
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 { Component, Input, EventEmitter, Output, HostBinding, ElementRef, Renderer2, NgZone, HostListener, ContentChildren, QueryList, Optional, SkipSelf, inject } from '@angular/core';
5
+ import { Component, Input, EventEmitter, Output, HostBinding, ElementRef, Renderer2, NgZone, HostListener, ContentChildren, QueryList, Optional, SkipSelf, inject, ViewChild, ChangeDetectorRef } from '@angular/core';
6
6
  import { PagerTemplateDirective } from "./pager-template.directive";
7
- import { anyChanged, Keys, ResizeSensorComponent } from "@progress/kendo-angular-common";
7
+ import { anyChanged, isDocumentAvailable, Keys, ResizeSensorComponent } from "@progress/kendo-angular-common";
8
8
  import { PagerContextService } from "./pager-context.service";
9
9
  import { Subscription } from "rxjs";
10
- import { DEFAULT_PAGE_SIZE_VALUES, getStylingClasses, DEFAULT_SIZE, replaceMessagePlaceholder } from '../util';
10
+ import { DEFAULT_PAGE_SIZE_VALUES, getStylingClasses, DEFAULT_SIZE, replaceMessagePlaceholder, calculatePadding, createMeasurementSpan, copyComputedStyles, positionOffScreen } from '../util';
11
11
  import { L10N_PREFIX, LocalizationService } from '@progress/kendo-angular-l10n';
12
12
  import { validatePackage } from '@progress/kendo-licensing';
13
13
  import { packageMetadata } from '../package-metadata';
@@ -15,12 +15,12 @@ import { PagerNavigationService } from './navigation.service';
15
15
  import { PagerNumericButtonsComponent } from './pager-numeric-buttons.component';
16
16
  import { PagerInfoComponent } from './pager-info.component';
17
17
  import { PagerPageSizesComponent } from './pager-page-sizes.component';
18
- import { RESPONSIVE_BREAKPOINT_MEDIUM, RESPONSIVE_BREAKPOINT_LARGE } from './common/constants';
19
18
  import { PagerNextButtonsComponent } from './pager-next-buttons.component';
20
19
  import { PagerInputComponent } from './pager-input.component';
21
20
  import { PagerPrevButtonsComponent } from './pager-prev-buttons.component';
22
- import { NgIf, NgTemplateOutlet } from '@angular/common';
21
+ import { NgIf, NgStyle, NgTemplateOutlet } from '@angular/common';
23
22
  import { LocalizedMessagesDirective } from './localization/localized-messages.directive';
23
+ import { take } from 'rxjs/operators';
24
24
  import * as i0 from "@angular/core";
25
25
  import * as i1 from "./pager-context.service";
26
26
  import * as i2 from "@progress/kendo-angular-l10n";
@@ -31,8 +31,29 @@ export class PagerComponent {
31
31
  localization;
32
32
  renderer;
33
33
  ngZone;
34
+ cdr;
34
35
  navigationService;
35
36
  template;
37
+ set numericButtons(buttons) {
38
+ const newWidth = buttons ? buttons.nativeElement?.offsetWidth : 0;
39
+ if (buttons && newWidth !== this.pagerDimensions.numericButtonsWidth) {
40
+ this.pagerDimensions.numericButtonsWidth = newWidth;
41
+ }
42
+ }
43
+ set pagerInput(input) {
44
+ const newWidth = input ? input.nativeElement?.offsetWidth : 0;
45
+ if (input && newWidth !== this.pagerDimensions.inputWidth) {
46
+ this.pagerDimensions.inputWidth = newWidth;
47
+ }
48
+ }
49
+ pagerInputComponent;
50
+ set pageSizes(sizes) {
51
+ const newWidth = sizes ? sizes.nativeElement?.offsetWidth : 0;
52
+ if (sizes && newWidth !== this.pagerDimensions.pageSizesWidth) {
53
+ this.pagerDimensions.pageSizesWidth = newWidth;
54
+ }
55
+ }
56
+ pageSizesComponent;
36
57
  /**
37
58
  * @hidden
38
59
  */
@@ -121,12 +142,17 @@ export class PagerComponent {
121
142
  return this._size;
122
143
  }
123
144
  /**
124
- * @hidden
125
- * Toggles the Pager responsive functionality.
145
+ * Toggles the Pager responsive functionality ([see example](slug:responsive_pager)).
126
146
  *
127
147
  * @default true
128
148
  */
129
149
  responsive = true;
150
+ /**
151
+ * Toggles the Pager adaptiveness functionality ([see example](slug:adaptive_mode_pager)).
152
+ *
153
+ * @default 'auto'
154
+ */
155
+ adaptiveMode = 'auto';
130
156
  /**
131
157
  * Fires when the current page of the Pager is changed ([see example](slug:overview_pager)).
132
158
  * You have to handle the event yourself and page the data.
@@ -170,6 +196,14 @@ export class PagerComponent {
170
196
  context.currentPage = this.currentPage;
171
197
  return context;
172
198
  }
199
+ /**
200
+ * @hidden
201
+ */
202
+ showInput = false;
203
+ /**
204
+ * @hidden
205
+ */
206
+ initialized = false;
173
207
  subscriptions = new Subscription();
174
208
  _templateContext = {};
175
209
  _pageSizeValues = DEFAULT_PAGE_SIZE_VALUES;
@@ -177,12 +211,29 @@ export class PagerComponent {
177
211
  isInnerNavigationEnabled = false;
178
212
  _navigable = false;
179
213
  _size = DEFAULT_SIZE;
180
- constructor(pagerContext, element, localization, renderer, ngZone, navigationService) {
214
+ /**
215
+ * Stores the measurements of various Pager elements.
216
+ * These dimensions are used for responsive layout calculations.
217
+ * @hidden
218
+ */
219
+ pagerDimensions = {
220
+ padding: 0,
221
+ numericButtonsWidth: 0,
222
+ inputWidth: 0,
223
+ pageSizesWidth: 0,
224
+ sizesTextWidth: 0,
225
+ pageTextWidth: 0,
226
+ infoTextWidth: 0,
227
+ gapNumbersSizes: 0,
228
+ gapSizesInfo: 0
229
+ };
230
+ constructor(pagerContext, element, localization, renderer, ngZone, cdr, navigationService) {
181
231
  this.pagerContext = pagerContext;
182
232
  this.element = element;
183
233
  this.localization = localization;
184
234
  this.renderer = renderer;
185
235
  this.ngZone = ngZone;
236
+ this.cdr = cdr;
186
237
  this.navigationService = navigationService;
187
238
  validatePackage(packageMetadata);
188
239
  this.direction = localization.rtl ? 'rtl' : 'ltr';
@@ -199,6 +250,8 @@ export class PagerComponent {
199
250
  this.subscriptions.add(this.pagerContext.pageSizeChange.subscribe(this.changePageSize.bind(this)));
200
251
  this.subscriptions.add(this.localization.changes.subscribe(({ rtl }) => {
201
252
  this.direction = rtl ? 'rtl' : 'ltr';
253
+ this.measureAllTextWidths();
254
+ this.responsive && this.resizeHandler();
202
255
  }));
203
256
  this.subscriptions.add(this.navigationService.innerNavigationChange.subscribe(this.innerNavigationChange.bind(this)));
204
257
  if (this.navigable) {
@@ -207,14 +260,34 @@ export class PagerComponent {
207
260
  this.subscriptions.add(this.renderer.listen(wrapper, 'keydown', this.keyDownHandler.bind(this)));
208
261
  });
209
262
  }
263
+ if (this.type === 'input') {
264
+ this.showInput = true;
265
+ }
266
+ }
267
+ get maxItems() {
268
+ return Math.min(this.currentPage * this.pageSize, this.total);
210
269
  }
211
270
  ngAfterViewInit() {
212
- this.responsive && this.resizeHandler();
213
271
  this.renderer.setAttribute(this.element.nativeElement, 'aria-label', this.ariaLabel);
214
272
  this.subscriptions.add(this.template.changes.subscribe(() => {
273
+ this.measureAllTextWidths();
215
274
  this.responsive && this.resizeHandler();
216
275
  }));
217
276
  this.handleClasses(this.size, 'size');
277
+ this.measureAllTextWidths();
278
+ const padding = calculatePadding(this.element.nativeElement);
279
+ this.pagerDimensions.padding = padding.padding;
280
+ this.pagerDimensions.gapNumbersSizes = padding.gapNumbersSizes;
281
+ this.pagerDimensions.gapSizesInfo = padding.gapSizesInfo;
282
+ if (!isDocumentAvailable()) {
283
+ this.initialized = true;
284
+ return;
285
+ }
286
+ this.responsive && this.resizeHandler();
287
+ setTimeout(() => {
288
+ this.initialized = true;
289
+ this.cdr.markForCheck();
290
+ }, 0);
218
291
  }
219
292
  ngOnChanges(changes) {
220
293
  if (anyChanged(["pageSize", "skip", "total"], changes, false)) {
@@ -226,7 +299,14 @@ export class PagerComponent {
226
299
  this.renderer.setAttribute(this.element.nativeElement, 'aria-label', this.ariaLabel);
227
300
  }
228
301
  if (changes['responsive']) {
302
+ this.measureAllTextWidths();
229
303
  this.responsive && this.resizeHandler();
304
+ if (!this.responsive) {
305
+ this.showInput = this.type === 'input';
306
+ }
307
+ }
308
+ if (changes['type']) {
309
+ this.showNumericButtonsResponsive();
230
310
  }
231
311
  }
232
312
  ngOnDestroy() {
@@ -268,40 +348,37 @@ export class PagerComponent {
268
348
  if (this.template?.first && !this.responsive) {
269
349
  return;
270
350
  }
271
- const width = this.element.nativeElement.offsetWidth;
351
+ if (!isDocumentAvailable() || !this.element?.nativeElement) {
352
+ this.initialized = true;
353
+ return;
354
+ }
355
+ let pagerWidth = this.element.nativeElement.offsetWidth;
356
+ if (pagerWidth <= 0) {
357
+ return;
358
+ }
272
359
  this.ngZone.runOutsideAngular(() => {
273
360
  setTimeout(() => {
274
- const numericButtonsElement = this.element.nativeElement.querySelector('kendo-datapager-numeric-buttons, kendo-pager-numeric-buttons');
361
+ if (this.template?.first || !this.responsive) {
362
+ return;
363
+ }
364
+ const numericButtonsWrapperElement = this.element.nativeElement.querySelector('.k-pager-numbers-wrap');
275
365
  const pagerInfoElement = this.element.nativeElement.querySelector('.k-pager-info');
276
366
  const pagerPageSizes = this.element.nativeElement.querySelector('.k-pager-sizes');
277
- if (numericButtonsElement) {
278
- const selectElement = numericButtonsElement.querySelector('select');
279
- const numbersElement = numericButtonsElement.querySelector('.k-pager-numbers');
280
- if (width < RESPONSIVE_BREAKPOINT_MEDIUM) {
281
- this.renderer.removeClass(selectElement, 'k-hidden');
282
- this.renderer.addClass(numbersElement, 'k-hidden');
283
- }
284
- else {
285
- this.renderer.addClass(selectElement, 'k-hidden');
286
- this.renderer.removeClass(numbersElement, 'k-hidden');
287
- }
367
+ let elementsWidths = numericButtonsWrapperElement?.offsetWidth + (pagerPageSizes?.offsetWidth || 0) + (pagerInfoElement?.offsetWidth > 0 ? Math.min(this.pagerDimensions.infoTextWidth) : 0);
368
+ if (this.isElementVisible(pagerInfoElement)) {
369
+ elementsWidths += this.pagerDimensions.gapSizesInfo;
288
370
  }
289
- if (pagerInfoElement) {
290
- if (width < RESPONSIVE_BREAKPOINT_LARGE) {
291
- this.renderer.addClass(pagerInfoElement, 'k-hidden');
292
- }
293
- else {
294
- this.renderer.removeClass(pagerInfoElement, 'k-hidden');
295
- }
371
+ pagerWidth -= this.pagerDimensions.padding;
372
+ if (this.isElementVisible(pagerPageSizes)) {
373
+ pagerWidth -= this.pagerDimensions.gapNumbersSizes;
296
374
  }
297
- if (pagerPageSizes) {
298
- if (width < RESPONSIVE_BREAKPOINT_MEDIUM) {
299
- this.renderer.addClass(pagerPageSizes, 'k-hidden');
300
- }
301
- else {
302
- this.renderer.removeClass(pagerPageSizes, 'k-hidden');
303
- }
375
+ if (Math.ceil(elementsWidths) <= pagerWidth) {
376
+ this.showElementsInOrder(pagerWidth, elementsWidths);
304
377
  }
378
+ else {
379
+ this.hideElementsInOrder(pagerWidth, elementsWidths);
380
+ }
381
+ !this.initialized && this.ngZone.onStable.pipe(take(1)).subscribe(() => this.initialized = true);
305
382
  });
306
383
  });
307
384
  };
@@ -379,8 +456,172 @@ export class PagerComponent {
379
456
  this.renderer.addClass(elem, classes.toAdd);
380
457
  }
381
458
  }
382
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PagerComponent, deps: [{ token: i1.PagerContextService, optional: true, skipSelf: true }, { token: i0.ElementRef }, { token: i2.LocalizationService }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i3.PagerNavigationService, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component });
383
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: PagerComponent, isStandalone: true, selector: "kendo-datapager, kendo-pager", inputs: { externalTemplate: "externalTemplate", total: "total", skip: "skip", pageSize: "pageSize", buttonCount: "buttonCount", info: "info", type: "type", pageSizeValues: "pageSizeValues", previousNext: "previousNext", navigable: "navigable", size: "size", responsive: "responsive" }, outputs: { pageChange: "pageChange", pageSizeChange: "pageSizeChange" }, host: { listeners: { "focusin": "focusHandler($event)" }, properties: { "class.k-pager": "this.pagerClass", "attr.role": "this.widgetRole", "attr.aria-roledescription": "this.roleDescription", "attr.aria-keyshortcuts": "this.keyShortcuts", "attr.tabindex": "this.hostTabindex", "attr.dir": "this.dir" } }, providers: [
459
+ showElementsInOrder(availableWidth, currentWidth) {
460
+ const el = this.element.nativeElement;
461
+ const numericButtonsElement = el.querySelector('kendo-datapager-numeric-buttons, kendo-pager-numeric-buttons');
462
+ const pagerInfoElement = el.querySelector('.k-pager-info');
463
+ const pagerPageSizes = el.querySelector('.k-pager-sizes');
464
+ const pagerInput = el.querySelector('kendo-pager-input');
465
+ const pagerSizesDropDown = el.querySelector('.k-pager-sizes .k-dropdownlist');
466
+ if (this.type === 'input' && this.isElementVisible(pagerInfoElement) || this.isElementVisible(numericButtonsElement)) {
467
+ return;
468
+ }
469
+ if (!this.isElementVisible(pagerPageSizes)) {
470
+ const addDropDownWidth = currentWidth + this.pagerDimensions.pageSizesWidth + this.pagerDimensions.gapNumbersSizes - this.pagerDimensions.sizesTextWidth;
471
+ if (addDropDownWidth > availableWidth)
472
+ return;
473
+ this.ngZone.run(() => this.pageSizesComponent && (this.pageSizesComponent.showItemsText = false));
474
+ this.showElement(pagerPageSizes);
475
+ currentWidth = addDropDownWidth;
476
+ if (currentWidth >= availableWidth)
477
+ return;
478
+ }
479
+ if (this.isElementVisible(pagerPageSizes) && this.pageSizesComponent && !this.pageSizesComponent.showItemsText) {
480
+ const addPageSizesText = currentWidth - pagerSizesDropDown?.offsetWidth + this.pagerDimensions.pageSizesWidth;
481
+ if (addPageSizesText > availableWidth)
482
+ return;
483
+ this.ngZone.run(() => this.pageSizesComponent.showItemsText = true);
484
+ currentWidth = addPageSizesText;
485
+ if (currentWidth >= availableWidth)
486
+ return;
487
+ }
488
+ if (this.isElementVisible(pagerPageSizes) && this.pageSizesComponent?.showItemsText && this.pagerInputComponent && !this.pagerInputComponent.showPageText) {
489
+ const addPageText = currentWidth - pagerInput?.offsetWidth + this.pagerDimensions.inputWidth;
490
+ if (addPageText > availableWidth)
491
+ return;
492
+ this.ngZone.run(() => this.pagerInputComponent.showPageText = true);
493
+ currentWidth = addPageText;
494
+ if (currentWidth >= availableWidth)
495
+ return;
496
+ }
497
+ if (this.isElementVisible(pagerPageSizes) && this.pagerInputComponent?.showPageText) {
498
+ const addInfoText = currentWidth + this.pagerDimensions.infoTextWidth + this.pagerDimensions.gapSizesInfo;
499
+ if (addInfoText > availableWidth)
500
+ return;
501
+ this.ngZone.run(() => {
502
+ this.showElement(pagerInfoElement);
503
+ });
504
+ currentWidth = addInfoText;
505
+ }
506
+ if (this.isElementVisible(pagerInfoElement) && this.type === 'numeric') {
507
+ const addNumericButtons = currentWidth - this.pagerDimensions.inputWidth + this.pagerDimensions.numericButtonsWidth;
508
+ if (addNumericButtons > availableWidth)
509
+ return;
510
+ this.showElement(numericButtonsElement);
511
+ this.ngZone.run(() => {
512
+ this.showInput = false;
513
+ this.cdr.markForCheck();
514
+ });
515
+ }
516
+ }
517
+ hideElementsInOrder(availableWidth, currentWidth) {
518
+ const el = this.element.nativeElement;
519
+ const numericButtonsElement = el.querySelector('kendo-datapager-numeric-buttons, kendo-pager-numeric-buttons');
520
+ const pagerInfoElement = el.querySelector('.k-pager-info');
521
+ const pagerPageSizes = el.querySelector('.k-pager-sizes');
522
+ const pagerSizesDropDown = el.querySelector('.k-pager-sizes .k-dropdownlist');
523
+ if (this.isElementVisible(numericButtonsElement)) {
524
+ this.hideElement(numericButtonsElement);
525
+ this.ngZone.run(() => this.showInput = true);
526
+ currentWidth += this.pagerDimensions.inputWidth - this.pagerDimensions.numericButtonsWidth;
527
+ if (currentWidth <= availableWidth)
528
+ return;
529
+ }
530
+ if (this.isElementVisible(pagerInfoElement)) {
531
+ this.hideElement(pagerInfoElement);
532
+ currentWidth -= this.pagerDimensions.infoTextWidth;
533
+ if (currentWidth <= availableWidth)
534
+ return;
535
+ }
536
+ if (this.pagerInputComponent?.showPageText) {
537
+ this.ngZone.run(() => this.pagerInputComponent.showPageText = false);
538
+ currentWidth = currentWidth - this.pagerDimensions.pageTextWidth;
539
+ if (currentWidth <= availableWidth)
540
+ return;
541
+ }
542
+ if (this.isElementVisible(pagerPageSizes) && this.pageSizesComponent?.showItemsText) {
543
+ this.ngZone.run(() => this.pageSizesComponent.showItemsText = false);
544
+ currentWidth = currentWidth - this.pagerDimensions.pageSizesWidth + pagerSizesDropDown?.offsetWidth;
545
+ if (currentWidth <= availableWidth)
546
+ return;
547
+ }
548
+ this.hideElement(pagerPageSizes);
549
+ }
550
+ isElementVisible(element) {
551
+ return element && !element?.classList.contains('k-hidden');
552
+ }
553
+ hideElement(element) {
554
+ if (element) {
555
+ this.renderer.addClass(element, 'k-hidden');
556
+ }
557
+ }
558
+ showElement(element) {
559
+ if (element) {
560
+ this.renderer.removeClass(element, 'k-hidden');
561
+ }
562
+ }
563
+ measureAllTextWidths() {
564
+ if (!isDocumentAvailable()) {
565
+ return;
566
+ }
567
+ const el = this.element.nativeElement;
568
+ const existingInfo = el.querySelector('.k-pager-info');
569
+ const existingInput = el.querySelector('.k-pager-input');
570
+ const existingSizes = el.querySelector('.k-pager-sizes');
571
+ // create a single measurement container
572
+ const measureContainer = this.renderer.createElement('div');
573
+ positionOffScreen(this.renderer, measureContainer);
574
+ this.renderer.appendChild(this.element.nativeElement, measureContainer);
575
+ const infoSpan = createMeasurementSpan(this.renderer, measureContainer, 'k-pager-info');
576
+ const pageSpan = createMeasurementSpan(this.renderer, measureContainer, 'k-pager-input');
577
+ const sizesSpan = createMeasurementSpan(this.renderer, measureContainer, 'k-pager-sizes');
578
+ const infoText = `${this.currentPage} - ${this.maxItems} ${this.localization.get('of')} ${this.total} ${this.localization.get('items')}`;
579
+ this.renderer.setProperty(infoSpan, 'textContent', infoText);
580
+ this.renderer.setProperty(pageSpan, 'textContent', this.localization.get('page'));
581
+ this.renderer.setProperty(sizesSpan, 'textContent', this.localization.get('itemsPerPage'));
582
+ // copy computed styles if available
583
+ if (existingInfo)
584
+ copyComputedStyles(this.renderer, existingInfo, infoSpan);
585
+ if (existingInput)
586
+ copyComputedStyles(this.renderer, existingInput, pageSpan);
587
+ if (existingSizes)
588
+ copyComputedStyles(this.renderer, existingSizes, sizesSpan);
589
+ // force a reflow to ensure measurements are accurate
590
+ measureContainer.getBoundingClientRect();
591
+ this.pagerDimensions.infoTextWidth = infoSpan?.offsetWidth;
592
+ if (this.pagerDimensions.inputWidth && this.pagerDimensions.pageTextWidth) {
593
+ this.pagerDimensions.inputWidth = this.pagerDimensions.inputWidth - this.pagerDimensions.pageTextWidth + pageSpan.offsetWidth;
594
+ }
595
+ this.pagerDimensions.pageTextWidth = pageSpan?.offsetWidth;
596
+ if (this.pagerDimensions.pageSizesWidth && this.pagerDimensions.sizesTextWidth) {
597
+ this.pagerDimensions.pageSizesWidth = this.pagerDimensions.pageSizesWidth - this.pagerDimensions.sizesTextWidth + sizesSpan.offsetWidth;
598
+ }
599
+ this.pagerDimensions.sizesTextWidth = sizesSpan?.offsetWidth;
600
+ this.renderer.removeChild(this.element.nativeElement, measureContainer);
601
+ }
602
+ showNumericButtonsResponsive() {
603
+ if (!this.responsive || (!this.numericButtons && !this.pagerInput) || !isDocumentAvailable()) {
604
+ this.showInput = this.type === 'input';
605
+ return;
606
+ }
607
+ const pagerInfoElement = this.element.nativeElement.querySelector('.k-pager-info');
608
+ if (this.type === 'input' || !this.isElementVisible(pagerInfoElement)) {
609
+ this.showInput = true;
610
+ return;
611
+ }
612
+ const numericButtonsElement = this.element.nativeElement.querySelector('kendo-datapager-numeric-buttons, kendo-pager-numeric-buttons');
613
+ if (this.isElementVisible(numericButtonsElement)) {
614
+ this.showInput = false;
615
+ return;
616
+ }
617
+ const pagerWidth = this.element.nativeElement?.offsetWidth;
618
+ const numericButtonsWrapperElement = this.element.nativeElement.querySelector('.k-pager-numbers-wrap');
619
+ const elementsWidths = numericButtonsWrapperElement?.offsetWidth + this.pagerDimensions.pageSizesWidth + this.pagerDimensions.infoTextWidth + this.pagerDimensions.gapSizesInfo;
620
+ const hasAvailableWidth = pagerWidth > elementsWidths - this.pagerDimensions.inputWidth + this.pagerDimensions.numericButtonsWidth;
621
+ this.showInput = !hasAvailableWidth;
622
+ }
623
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PagerComponent, deps: [{ token: i1.PagerContextService, optional: true, skipSelf: true }, { token: i0.ElementRef }, { token: i2.LocalizationService }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i3.PagerNavigationService, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component });
624
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: PagerComponent, isStandalone: true, selector: "kendo-datapager, kendo-pager", inputs: { externalTemplate: "externalTemplate", total: "total", skip: "skip", pageSize: "pageSize", buttonCount: "buttonCount", info: "info", type: "type", pageSizeValues: "pageSizeValues", previousNext: "previousNext", navigable: "navigable", size: "size", responsive: "responsive", adaptiveMode: "adaptiveMode" }, outputs: { pageChange: "pageChange", pageSizeChange: "pageSizeChange" }, host: { listeners: { "focusin": "focusHandler($event)" }, properties: { "class.k-pager": "this.pagerClass", "attr.role": "this.widgetRole", "attr.aria-roledescription": "this.roleDescription", "attr.aria-keyshortcuts": "this.keyShortcuts", "attr.tabindex": "this.hostTabindex", "attr.dir": "this.dir" } }, providers: [
384
625
  LocalizationService,
385
626
  PagerContextService,
386
627
  PagerNavigationService,
@@ -388,7 +629,7 @@ export class PagerComponent {
388
629
  provide: L10N_PREFIX,
389
630
  useValue: 'kendo.pager'
390
631
  }
391
- ], queries: [{ propertyName: "template", predicate: PagerTemplateDirective }], exportAs: ["kendoDataPager", "kendoPager"], usesOnChanges: true, ngImport: i0, template: `
632
+ ], queries: [{ propertyName: "template", predicate: PagerTemplateDirective }], viewQueries: [{ propertyName: "numericButtons", first: true, predicate: PagerNumericButtonsComponent, descendants: true, read: ElementRef }, { propertyName: "pagerInput", first: true, predicate: PagerInputComponent, descendants: true, read: ElementRef }, { propertyName: "pagerInputComponent", first: true, predicate: PagerInputComponent, descendants: true }, { propertyName: "pageSizes", first: true, predicate: PagerPageSizesComponent, descendants: true, read: ElementRef }, { propertyName: "pageSizesComponent", first: true, predicate: PagerPageSizesComponent, descendants: true }], exportAs: ["kendoDataPager", "kendoPager"], usesOnChanges: true, ngImport: i0, template: `
392
633
  <ng-container kendoPagerLocalizedMessages
393
634
  i18n-ariaLabel="kendo.pager.ariaLabel|The value of the aria-label attribute of the Pager"
394
635
  ariaLabel="{{ 'Page navigation, page {currentPage} of {totalPages}' }}"
@@ -433,25 +674,27 @@ export class PagerComponent {
433
674
  [ngTemplateOutletContext]="templateContext">
434
675
  </ng-container>
435
676
  <ng-template #default>
436
- <div class="k-pager-numbers-wrap">
677
+ <div class="k-pager-numbers-wrap" [ngStyle]="{opacity: initialized ? '1' : '0'}">
437
678
  <kendo-pager-prev-buttons [size]="size" *ngIf="previousNext"></kendo-pager-prev-buttons>
438
679
  <kendo-pager-numeric-buttons
439
680
  [size]="size"
440
681
  *ngIf="type === 'numeric' && buttonCount > 0"
441
682
  [buttonCount]="buttonCount">
442
683
  </kendo-pager-numeric-buttons>
443
- <kendo-pager-input [size]="size" *ngIf="type === 'input'"></kendo-pager-input>
684
+ <kendo-pager-input [size]="size" *ngIf="showInput"></kendo-pager-input>
444
685
  <kendo-pager-next-buttons [size]="size" *ngIf="previousNext"></kendo-pager-next-buttons>
445
686
  </div>
446
687
  <kendo-pager-page-sizes *ngIf="_pageSizeValues.length"
688
+ [ngStyle]="{opacity: initialized ? '1' : '0'}"
447
689
  [size]="size"
448
- [pageSizes]="_pageSizeValues">
690
+ [pageSizes]="_pageSizeValues"
691
+ [adaptiveMode]="adaptiveMode">
449
692
  </kendo-pager-page-sizes>
450
- <kendo-pager-info *ngIf="info">
693
+ <kendo-pager-info *ngIf="info" [ngStyle]="{opacity: initialized ? '1' : '0'}">
451
694
  </kendo-pager-info>
452
695
  </ng-template>
453
696
  <kendo-resize-sensor *ngIf="responsive" (resize)="resizeHandler()"></kendo-resize-sensor>
454
- `, isInline: true, dependencies: [{ kind: "directive", type: LocalizedMessagesDirective, selector: "[kendoPagerLocalizedMessages]" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: PagerPrevButtonsComponent, selector: "kendo-datapager-prev-buttons, kendo-pager-prev-buttons", inputs: ["size"] }, { kind: "component", type: PagerNumericButtonsComponent, selector: "kendo-datapager-numeric-buttons, kendo-pager-numeric-buttons", inputs: ["buttonCount", "size"] }, { kind: "component", type: PagerInputComponent, selector: "kendo-datapager-input, kendo-pager-input", inputs: ["size"] }, { kind: "component", type: PagerNextButtonsComponent, selector: "kendo-datapager-next-buttons, kendo-pager-next-buttons", inputs: ["size"] }, { kind: "component", type: PagerPageSizesComponent, selector: "kendo-datapager-page-sizes, kendo-pager-page-sizes", inputs: ["pageSizes", "size"] }, { kind: "component", type: PagerInfoComponent, selector: "kendo-datapager-info, kendo-pager-info" }, { kind: "component", type: ResizeSensorComponent, selector: "kendo-resize-sensor", inputs: ["rateLimit"], outputs: ["resize"] }] });
697
+ `, isInline: true, dependencies: [{ kind: "directive", type: LocalizedMessagesDirective, selector: "[kendoPagerLocalizedMessages]" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: PagerPrevButtonsComponent, selector: "kendo-datapager-prev-buttons, kendo-pager-prev-buttons", inputs: ["size"] }, { kind: "component", type: PagerNumericButtonsComponent, selector: "kendo-datapager-numeric-buttons, kendo-pager-numeric-buttons", inputs: ["buttonCount", "size"] }, { kind: "component", type: PagerInputComponent, selector: "kendo-datapager-input, kendo-pager-input", inputs: ["showPageText", "size"] }, { kind: "component", type: PagerNextButtonsComponent, selector: "kendo-datapager-next-buttons, kendo-pager-next-buttons", inputs: ["size"] }, { kind: "component", type: PagerPageSizesComponent, selector: "kendo-datapager-page-sizes, kendo-pager-page-sizes", inputs: ["showItemsText", "pageSizes", "size", "adaptiveMode"] }, { kind: "component", type: PagerInfoComponent, selector: "kendo-datapager-info, kendo-pager-info" }, { kind: "component", type: ResizeSensorComponent, selector: "kendo-resize-sensor", inputs: ["rateLimit"], outputs: ["resize"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
455
698
  }
456
699
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PagerComponent, decorators: [{
457
700
  type: Component,
@@ -512,39 +755,56 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
512
755
  [ngTemplateOutletContext]="templateContext">
513
756
  </ng-container>
514
757
  <ng-template #default>
515
- <div class="k-pager-numbers-wrap">
758
+ <div class="k-pager-numbers-wrap" [ngStyle]="{opacity: initialized ? '1' : '0'}">
516
759
  <kendo-pager-prev-buttons [size]="size" *ngIf="previousNext"></kendo-pager-prev-buttons>
517
760
  <kendo-pager-numeric-buttons
518
761
  [size]="size"
519
762
  *ngIf="type === 'numeric' && buttonCount > 0"
520
763
  [buttonCount]="buttonCount">
521
764
  </kendo-pager-numeric-buttons>
522
- <kendo-pager-input [size]="size" *ngIf="type === 'input'"></kendo-pager-input>
765
+ <kendo-pager-input [size]="size" *ngIf="showInput"></kendo-pager-input>
523
766
  <kendo-pager-next-buttons [size]="size" *ngIf="previousNext"></kendo-pager-next-buttons>
524
767
  </div>
525
768
  <kendo-pager-page-sizes *ngIf="_pageSizeValues.length"
769
+ [ngStyle]="{opacity: initialized ? '1' : '0'}"
526
770
  [size]="size"
527
- [pageSizes]="_pageSizeValues">
771
+ [pageSizes]="_pageSizeValues"
772
+ [adaptiveMode]="adaptiveMode">
528
773
  </kendo-pager-page-sizes>
529
- <kendo-pager-info *ngIf="info">
774
+ <kendo-pager-info *ngIf="info" [ngStyle]="{opacity: initialized ? '1' : '0'}">
530
775
  </kendo-pager-info>
531
776
  </ng-template>
532
777
  <kendo-resize-sensor *ngIf="responsive" (resize)="resizeHandler()"></kendo-resize-sensor>
533
778
  `,
534
779
  standalone: true,
535
- imports: [LocalizedMessagesDirective, NgIf, NgTemplateOutlet, PagerPrevButtonsComponent, PagerNumericButtonsComponent, PagerInputComponent, PagerNextButtonsComponent, PagerPageSizesComponent, PagerInfoComponent, ResizeSensorComponent]
780
+ imports: [LocalizedMessagesDirective, NgIf, NgTemplateOutlet, PagerPrevButtonsComponent, PagerNumericButtonsComponent, PagerInputComponent, PagerNextButtonsComponent, PagerPageSizesComponent, PagerInfoComponent, ResizeSensorComponent, NgStyle]
536
781
  }]
537
782
  }], ctorParameters: function () { return [{ type: i1.PagerContextService, decorators: [{
538
783
  type: Optional
539
784
  }, {
540
785
  type: SkipSelf
541
- }] }, { type: i0.ElementRef }, { type: i2.LocalizationService }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: i3.PagerNavigationService, decorators: [{
786
+ }] }, { type: i0.ElementRef }, { type: i2.LocalizationService }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: i3.PagerNavigationService, decorators: [{
542
787
  type: Optional
543
788
  }, {
544
789
  type: SkipSelf
545
790
  }] }]; }, propDecorators: { template: [{
546
791
  type: ContentChildren,
547
792
  args: [PagerTemplateDirective]
793
+ }], numericButtons: [{
794
+ type: ViewChild,
795
+ args: [PagerNumericButtonsComponent, { read: ElementRef }]
796
+ }], pagerInput: [{
797
+ type: ViewChild,
798
+ args: [PagerInputComponent, { read: ElementRef }]
799
+ }], pagerInputComponent: [{
800
+ type: ViewChild,
801
+ args: [PagerInputComponent]
802
+ }], pageSizes: [{
803
+ type: ViewChild,
804
+ args: [PagerPageSizesComponent, { read: ElementRef }]
805
+ }], pageSizesComponent: [{
806
+ type: ViewChild,
807
+ args: [PagerPageSizesComponent]
548
808
  }], externalTemplate: [{
549
809
  type: Input
550
810
  }], total: [{
@@ -569,6 +829,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
569
829
  type: Input
570
830
  }], responsive: [{
571
831
  type: Input
832
+ }], adaptiveMode: [{
833
+ type: Input
572
834
  }], pageChange: [{
573
835
  type: Output
574
836
  }], pageSizeChange: [{
package/esm2022/util.mjs CHANGED
@@ -64,3 +64,51 @@ export const getStylingClasses = (componentType, stylingOption, previousValue, n
64
64
  * @hidden
65
65
  */
66
66
  export const replaceMessagePlaceholder = (message, name, value) => message.replace(new RegExp(`\{\\s*${name}\\s*\}`, 'g'), value);
67
+ /**
68
+ * @hidden
69
+ */
70
+ export const calculatePadding = (element) => {
71
+ const computedStyle = window.getComputedStyle(element);
72
+ const paddingLeft = parseInt(computedStyle.paddingLeft, 10) || 0;
73
+ const paddingRight = parseInt(computedStyle.paddingRight, 10) || 0;
74
+ const padding = (paddingLeft + paddingRight) * 1.2; // account for rounding errors
75
+ const style = getComputedStyle(document.documentElement);
76
+ const gapNumbersSizes = 2 * (parseFloat(style.getPropertyValue('--kendo-spacing-3\\.5') || '0.875rem') * (parseFloat(getComputedStyle(document.documentElement).fontSize) || 16)); // convert rem to px
77
+ const gapSizesInfo = gapNumbersSizes;
78
+ return { padding, gapNumbersSizes, gapSizesInfo };
79
+ };
80
+ /**
81
+ * @hidden
82
+ */
83
+ export const createMeasurementSpan = (renderer, container, className) => {
84
+ const span = renderer.createElement('span');
85
+ renderer.appendChild(container, span);
86
+ renderer.addClass(span, className);
87
+ return span;
88
+ };
89
+ /**
90
+ * @hidden
91
+ */
92
+ export const copyComputedStyles = (renderer, source, destination) => {
93
+ const computedStyle = getComputedStyle(source);
94
+ const importantStyles = [
95
+ 'font-family', 'font-size', 'font-weight', 'font-style',
96
+ 'letter-spacing', 'text-transform', 'white-space', 'word-spacing',
97
+ 'padding-left', 'padding-right', 'margin-left', 'margin-right',
98
+ 'border-left-width', 'border-right-width', 'box-sizing'
99
+ ];
100
+ importantStyles.forEach(style => {
101
+ renderer.setStyle(destination, style, computedStyle.getPropertyValue(style));
102
+ });
103
+ };
104
+ /**
105
+ *
106
+ * @hidden
107
+ */
108
+ export const positionOffScreen = (renderer, element) => {
109
+ renderer.setStyle(element, 'position', 'absolute');
110
+ renderer.setStyle(element, 'visibility', 'hidden');
111
+ renderer.setStyle(element, 'left', '-9999px');
112
+ renderer.setStyle(element, 'top', '-9999px');
113
+ renderer.setStyle(element, 'display', 'flex');
114
+ };