@progress/kendo-angular-pager 19.0.0-develop.2 → 19.0.0-develop.21

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.
@@ -8,12 +8,13 @@ import * as i1 from '@progress/kendo-angular-l10n';
8
8
  import { ComponentMessages, LocalizationService, L10N_PREFIX } from '@progress/kendo-angular-l10n';
9
9
  import { Subject, Subscription } from 'rxjs';
10
10
  import { caretAltLeftIcon, caretAltToLeftIcon, caretAltRightIcon, caretAltToRightIcon } from '@progress/kendo-svg-icons';
11
- import { isFocusable, Keys, EventsOutsideAngularDirective, anyChanged, ResizeSensorComponent, isPresent, ResizeBatchService } from '@progress/kendo-angular-common';
11
+ import { isFocusable, Keys, EventsOutsideAngularDirective, isDocumentAvailable, anyChanged, ResizeSensorComponent, isPresent, ResizeBatchService } from '@progress/kendo-angular-common';
12
12
  import { ButtonComponent } from '@progress/kendo-angular-buttons';
13
13
  import { DropDownListComponent } from '@progress/kendo-angular-dropdowns';
14
- import { NgIf, NgFor, NgClass, NgTemplateOutlet } from '@angular/common';
14
+ import { NgIf, NgFor, NgClass, NgTemplateOutlet, NgStyle } from '@angular/common';
15
15
  import { NumericTextBoxComponent } from '@progress/kendo-angular-inputs';
16
16
  import { validatePackage } from '@progress/kendo-licensing';
17
+ import { take } from 'rxjs/operators';
17
18
  import { IconsService } from '@progress/kendo-angular-icons';
18
19
  import { PopupService } from '@progress/kendo-angular-popup';
19
20
 
@@ -425,12 +426,60 @@ const getStylingClasses = (componentType, stylingOption, previousValue, newValue
425
426
  * @hidden
426
427
  */
427
428
  const replaceMessagePlaceholder = (message, name, value) => message.replace(new RegExp(`\{\\s*${name}\\s*\}`, 'g'), value);
429
+ /**
430
+ * @hidden
431
+ */
432
+ const calculatePadding = (element) => {
433
+ const computedStyle = window.getComputedStyle(element);
434
+ const paddingLeft = parseInt(computedStyle.paddingLeft, 10) || 0;
435
+ const paddingRight = parseInt(computedStyle.paddingRight, 10) || 0;
436
+ const padding = (paddingLeft + paddingRight) * 1.2; // account for rounding errors
437
+ const style = getComputedStyle(document.documentElement);
438
+ const gapNumbersSizes = 2 * (parseFloat(style.getPropertyValue('--kendo-spacing-3\\.5') || '0.875rem') * (parseFloat(getComputedStyle(document.documentElement).fontSize) || 16)); // convert rem to px
439
+ const gapSizesInfo = gapNumbersSizes;
440
+ return { padding, gapNumbersSizes, gapSizesInfo };
441
+ };
442
+ /**
443
+ * @hidden
444
+ */
445
+ const createMeasurementSpan = (renderer, container, className) => {
446
+ const span = renderer.createElement('span');
447
+ renderer.appendChild(container, span);
448
+ renderer.addClass(span, className);
449
+ return span;
450
+ };
451
+ /**
452
+ * @hidden
453
+ */
454
+ const copyComputedStyles = (renderer, source, destination) => {
455
+ const computedStyle = getComputedStyle(source);
456
+ const importantStyles = [
457
+ 'font-family', 'font-size', 'font-weight', 'font-style',
458
+ 'letter-spacing', 'text-transform', 'white-space', 'word-spacing',
459
+ 'padding-left', 'padding-right', 'margin-left', 'margin-right',
460
+ 'border-left-width', 'border-right-width', 'box-sizing'
461
+ ];
462
+ importantStyles.forEach(style => {
463
+ renderer.setStyle(destination, style, computedStyle.getPropertyValue(style));
464
+ });
465
+ };
466
+ /**
467
+ *
468
+ * @hidden
469
+ */
470
+ const positionOffScreen = (renderer, element) => {
471
+ renderer.setStyle(element, 'position', 'absolute');
472
+ renderer.setStyle(element, 'visibility', 'hidden');
473
+ renderer.setStyle(element, 'left', '-9999px');
474
+ renderer.setStyle(element, 'top', '-9999px');
475
+ renderer.setStyle(element, 'display', 'flex');
476
+ };
428
477
 
429
478
  /**
430
479
  * @hidden
431
480
  */
432
481
  class PagerNavigationService {
433
- isNavigable = false;
482
+ isNavigable = true;
434
483
  innerNavigationChange = new Subject();
435
484
  toggleInnerNavigation(value) {
436
485
  this.innerNavigationChange.next(value);
@@ -537,6 +586,16 @@ class PagerPrevButtonsComponent extends PagerElementComponent {
537
586
  get disabled() {
538
587
  return this.currentPage === 1 || !this.total;
539
588
  }
589
+ /**
590
+ * @hidden
591
+ */
592
+ onClick(isFirst = false) {
593
+ if (this.disabled) {
594
+ return false;
595
+ }
596
+ const targetPage = isFirst ? 0 : this.currentPage - 2;
597
+ return this.currentPage !== 1 ? this.changePage(targetPage) : false;
598
+ }
540
599
  onChanges({ total, skip, pageSize }) {
541
600
  this.total = total;
542
601
  this.skip = skip;
@@ -558,7 +617,7 @@ class PagerPrevButtonsComponent extends PagerElementComponent {
558
617
  [size]="size"
559
618
  [title]="textFor('firstPage')"
560
619
  [attr.aria-label]="textFor('firstPage')"
561
- (click)="currentPage !== 1 ? changePage(0) : false">
620
+ (click)="onClick(true)">
562
621
  </button>
563
622
  <button
564
623
  type="button" kendoButton
@@ -573,7 +632,7 @@ class PagerPrevButtonsComponent extends PagerElementComponent {
573
632
  [size]="size"
574
633
  [title]="textFor('previousPage')"
575
634
  [attr.aria-label]="textFor('previousPage')"
576
- (click)="currentPage !== 1 ? changePage(currentPage-2) : false">
635
+ (click)="onClick()">
577
636
  </button>
578
637
  `, isInline: true, dependencies: [{ kind: "component", type: ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "directive", type: PagerFocusableDirective, selector: "[kendoPagerFocusable]", exportAs: ["kendoPagerFocusable"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
579
638
  }
@@ -596,7 +655,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
596
655
  [size]="size"
597
656
  [title]="textFor('firstPage')"
598
657
  [attr.aria-label]="textFor('firstPage')"
599
- (click)="currentPage !== 1 ? changePage(0) : false">
658
+ (click)="onClick(true)">
600
659
  </button>
601
660
  <button
602
661
  type="button" kendoButton
@@ -611,7 +670,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
611
670
  [size]="size"
612
671
  [title]="textFor('previousPage')"
613
672
  [attr.aria-label]="textFor('previousPage')"
614
- (click)="currentPage !== 1 ? changePage(currentPage-2) : false">
673
+ (click)="onClick()">
615
674
  </button>
616
675
  `,
617
676
  standalone: true,
@@ -629,6 +688,18 @@ class PagerPageSizesComponent extends PagerElementComponent {
629
688
  element;
630
689
  ngZone;
631
690
  dropDownList;
691
+ _showItemsText = true;
692
+ /**
693
+ * Controls the visibility of the page text label.
694
+ * @hidden
695
+ */
696
+ get showItemsText() {
697
+ return this._showItemsText;
698
+ }
699
+ set showItemsText(value) {
700
+ this._showItemsText = value;
701
+ this.cd.markForCheck();
702
+ }
632
703
  /**
633
704
  * The page sizes collection. Can contain numbers and [PageSizeItem]({% slug api_pager_pagesizeitem %}) objects.
634
705
  *
@@ -780,6 +851,12 @@ class PagerPageSizesComponent extends PagerElementComponent {
780
851
  * * `none`
781
852
  */
782
853
  size = DEFAULT_SIZE;
854
+ /**
855
+ * Toggles the adaptiveness of the internal DropDownList.
856
+ *
857
+ * @default 'auto'
858
+ */
859
+ adaptiveMode = 'auto';
783
860
  /**
784
861
  * @hidden
785
862
  *
@@ -826,7 +903,7 @@ class PagerPageSizesComponent extends PagerElementComponent {
826
903
  }
827
904
  }
828
905
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PagerPageSizesComponent, deps: [{ token: i1.LocalizationService }, { token: i0.ChangeDetectorRef }, { token: PagerContextService }, { token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
829
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: PagerPageSizesComponent, isStandalone: true, selector: "kendo-datapager-page-sizes, kendo-pager-page-sizes", inputs: { pageSizes: "pageSizes", size: "size" }, host: { properties: { "class.k-pager-sizes": "this.classes" } }, viewQueries: [{ propertyName: "dropDownList", first: true, predicate: ["dropdownlist"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
906
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: PagerPageSizesComponent, isStandalone: true, selector: "kendo-datapager-page-sizes, kendo-pager-page-sizes", inputs: { showItemsText: "showItemsText", pageSizes: "pageSizes", size: "size", adaptiveMode: "adaptiveMode" }, host: { properties: { "class.k-pager-sizes": "this.classes" } }, viewQueries: [{ propertyName: "dropDownList", first: true, predicate: ["dropdownlist"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
830
907
  <kendo-dropdownlist kendoPagerFocusable
831
908
  #dropdownlist
832
909
  [size]="size"
@@ -836,9 +913,10 @@ class PagerPageSizesComponent extends PagerElementComponent {
836
913
  [valuePrimitive]="true"
837
914
  [value]="pageSize"
838
915
  (valueChange)="pageSizeChange($event, dropdownlist)"
916
+ [adaptiveMode]="adaptiveMode"
839
917
  [attr.aria-label]="textFor('itemsPerPage')"></kendo-dropdownlist>
840
- {{ textFor('itemsPerPage') }}
841
- `, isInline: true, dependencies: [{ kind: "component", type: DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["customIconClass", "showStickyHeader", "icon", "svgIcon", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "title", "subtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "leftRightArrowsNavigation", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }, { kind: "directive", type: PagerFocusableDirective, selector: "[kendoPagerFocusable]", exportAs: ["kendoPagerFocusable"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
918
+ <ng-container *ngIf="showItemsText">{{ textFor('itemsPerPage') }}</ng-container>
919
+ `, isInline: true, dependencies: [{ kind: "component", type: DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["customIconClass", "showStickyHeader", "icon", "svgIcon", "loading", "data", "value", "textField", "valueField", "adaptiveMode", "adaptiveTitle", "adaptiveSubtitle", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "leftRightArrowsNavigation", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }, { kind: "directive", type: PagerFocusableDirective, selector: "[kendoPagerFocusable]", exportAs: ["kendoPagerFocusable"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
842
920
  }
843
921
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PagerPageSizesComponent, decorators: [{
844
922
  type: Component,
@@ -855,19 +933,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
855
933
  [valuePrimitive]="true"
856
934
  [value]="pageSize"
857
935
  (valueChange)="pageSizeChange($event, dropdownlist)"
936
+ [adaptiveMode]="adaptiveMode"
858
937
  [attr.aria-label]="textFor('itemsPerPage')"></kendo-dropdownlist>
859
- {{ textFor('itemsPerPage') }}
938
+ <ng-container *ngIf="showItemsText">{{ textFor('itemsPerPage') }}</ng-container>
860
939
  `,
861
940
  standalone: true,
862
- imports: [DropDownListComponent, PagerFocusableDirective]
941
+ imports: [DropDownListComponent, PagerFocusableDirective, NgIf]
863
942
  }]
864
943
  }], ctorParameters: function () { return [{ type: i1.LocalizationService }, { type: i0.ChangeDetectorRef }, { type: PagerContextService }, { type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { dropDownList: [{
865
944
  type: ViewChild,
866
945
  args: ['dropdownlist', { static: true }]
946
+ }], showItemsText: [{
947
+ type: Input
867
948
  }], pageSizes: [{
868
949
  type: Input
869
950
  }], size: [{
870
951
  type: Input
952
+ }], adaptiveMode: [{
953
+ type: Input
871
954
  }], classes: [{
872
955
  type: HostBinding,
873
956
  args: ["class.k-pager-sizes"]
@@ -1058,30 +1141,6 @@ class PagerNumericButtonsComponent extends PagerElementComponent {
1058
1141
  }
1059
1142
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PagerNumericButtonsComponent, deps: [{ token: i1.LocalizationService }, { token: i0.ChangeDetectorRef }, { token: PagerContextService }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
1060
1143
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: PagerNumericButtonsComponent, isStandalone: true, selector: "kendo-datapager-numeric-buttons, kendo-pager-numeric-buttons", inputs: { buttonCount: "buttonCount", size: "size" }, viewQueries: [{ propertyName: "selectElement", first: true, predicate: ["select"], descendants: true, read: ElementRef }, { propertyName: "numbersElement", first: true, predicate: ["numbers"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: `
1061
- <select kendoPagerFocusable #select
1062
- class="k-hidden k-dropdown-list k-dropdown k-picker k-picker-solid k-rounded-md"
1063
- [attr.title]="pageChooserLabel"
1064
- [attr.aria-label]="pageChooserLabel"
1065
- (change)="onSelectChange($event)">
1066
- <option *ngIf="start > 1"
1067
- value="previousButtons"
1068
- [selected]="false"
1069
- [attr.aria-label]="pageLabel(start - 1)">...
1070
- </option>
1071
- <option *ngFor="let num of buttons"
1072
- [value]="num.toString()"
1073
- [selected]="num === currentPage"
1074
- [attr.aria-label]="pageLabel(num)"
1075
- [attr.aria-current]="currentPage === num ? 'page' : undefined"
1076
- [ngClass]="{'k-selected':currentPage === num}">
1077
- {{num}}
1078
- </option>
1079
- <option *ngIf="end < totalPages"
1080
- value="nextButtons"
1081
- [selected]="false"
1082
- [attr.aria-label]="pageLabel(end + 1)">...
1083
- </option>
1084
- </select>
1085
1144
  <div class="k-pager-numbers" #numbers>
1086
1145
  <button *ngIf="start > 1"
1087
1146
  type="button"
@@ -1106,7 +1165,7 @@ class PagerNumericButtonsComponent extends PagerElementComponent {
1106
1165
  [attr.title]="pageLabel(num)"
1107
1166
  [attr.aria-current]="currentPage === num ? 'page' : undefined"
1108
1167
  [selected]="currentPage === num"
1109
- (click)="changePage(num - 1)">
1168
+ (click)="currentPage === num ? false : changePage(num - 1)">
1110
1169
  {{num}}
1111
1170
  </button>
1112
1171
  <button *ngIf="end < totalPages"
@@ -1121,7 +1180,7 @@ class PagerNumericButtonsComponent extends PagerElementComponent {
1121
1180
  [attr.title]="pageLabel(end + 1)"
1122
1181
  (click)="changePage(end)">...</button>
1123
1182
  </div>
1124
- `, isInline: true, dependencies: [{ kind: "directive", type: PagerFocusableDirective, selector: "[kendoPagerFocusable]", exportAs: ["kendoPagerFocusable"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1183
+ `, isInline: true, dependencies: [{ kind: "directive", type: PagerFocusableDirective, selector: "[kendoPagerFocusable]", exportAs: ["kendoPagerFocusable"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1125
1184
  }
1126
1185
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PagerNumericButtonsComponent, decorators: [{
1127
1186
  type: Component,
@@ -1129,30 +1188,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1129
1188
  changeDetection: ChangeDetectionStrategy.OnPush,
1130
1189
  selector: 'kendo-datapager-numeric-buttons, kendo-pager-numeric-buttons',
1131
1190
  template: `
1132
- <select kendoPagerFocusable #select
1133
- class="k-hidden k-dropdown-list k-dropdown k-picker k-picker-solid k-rounded-md"
1134
- [attr.title]="pageChooserLabel"
1135
- [attr.aria-label]="pageChooserLabel"
1136
- (change)="onSelectChange($event)">
1137
- <option *ngIf="start > 1"
1138
- value="previousButtons"
1139
- [selected]="false"
1140
- [attr.aria-label]="pageLabel(start - 1)">...
1141
- </option>
1142
- <option *ngFor="let num of buttons"
1143
- [value]="num.toString()"
1144
- [selected]="num === currentPage"
1145
- [attr.aria-label]="pageLabel(num)"
1146
- [attr.aria-current]="currentPage === num ? 'page' : undefined"
1147
- [ngClass]="{'k-selected':currentPage === num}">
1148
- {{num}}
1149
- </option>
1150
- <option *ngIf="end < totalPages"
1151
- value="nextButtons"
1152
- [selected]="false"
1153
- [attr.aria-label]="pageLabel(end + 1)">...
1154
- </option>
1155
- </select>
1156
1191
  <div class="k-pager-numbers" #numbers>
1157
1192
  <button *ngIf="start > 1"
1158
1193
  type="button"
@@ -1177,7 +1212,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1177
1212
  [attr.title]="pageLabel(num)"
1178
1213
  [attr.aria-current]="currentPage === num ? 'page' : undefined"
1179
1214
  [selected]="currentPage === num"
1180
- (click)="changePage(num - 1)">
1215
+ (click)="currentPage === num ? false : changePage(num - 1)">
1181
1216
  {{num}}
1182
1217
  </button>
1183
1218
  <button *ngIf="end < totalPages"
@@ -1194,7 +1229,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1194
1229
  </div>
1195
1230
  `,
1196
1231
  standalone: true,
1197
- imports: [PagerFocusableDirective, NgIf, NgFor, NgClass, ButtonComponent]
1232
+ imports: [PagerFocusableDirective, NgIf, NgFor, ButtonComponent]
1198
1233
  }]
1199
1234
  }], ctorParameters: function () { return [{ type: i1.LocalizationService }, { type: i0.ChangeDetectorRef }, { type: PagerContextService }, { type: i0.Renderer2 }]; }, propDecorators: { selectElement: [{
1200
1235
  type: ViewChild,
@@ -1236,6 +1271,16 @@ class PagerNextButtonsComponent extends PagerElementComponent {
1236
1271
  constructor(localization, pagerContext, cd) {
1237
1272
  super(localization, pagerContext, cd);
1238
1273
  }
1274
+ /**
1275
+ * @hidden
1276
+ */
1277
+ onClick(isLast = false) {
1278
+ if (this.disabled) {
1279
+ return false;
1280
+ }
1281
+ const targetPage = isLast ? this.totalPages - 1 : this.currentPage;
1282
+ return this.currentPage !== this.totalPages ? this.changePage(targetPage) : false;
1283
+ }
1239
1284
  onChanges({ total, skip, pageSize }) {
1240
1285
  this.total = total;
1241
1286
  this.skip = skip;
@@ -1256,7 +1301,7 @@ class PagerNextButtonsComponent extends PagerElementComponent {
1256
1301
  [class.k-disabled]="disabled"
1257
1302
  [title]="textFor('nextPage')"
1258
1303
  [attr.aria-label]="textFor('nextPage')"
1259
- (click)="currentPage !== totalPages ? changePage(currentPage) : false">
1304
+ (click)="onClick()">
1260
1305
  </button>
1261
1306
  <button kendoButton kendoPagerFocusable
1262
1307
  type="button"
@@ -1270,7 +1315,7 @@ class PagerNextButtonsComponent extends PagerElementComponent {
1270
1315
  [class.k-disabled]="disabled"
1271
1316
  [title]="textFor('lastPage')"
1272
1317
  [attr.aria-label]="textFor('lastPage')"
1273
- (click)="currentPage !== totalPages ? changePage(totalPages-1) : false">
1318
+ (click)="onClick(true)">
1274
1319
  </button>
1275
1320
  `, isInline: true, dependencies: [{ kind: "component", type: ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "directive", type: PagerFocusableDirective, selector: "[kendoPagerFocusable]", exportAs: ["kendoPagerFocusable"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1276
1321
  }
@@ -1292,7 +1337,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1292
1337
  [class.k-disabled]="disabled"
1293
1338
  [title]="textFor('nextPage')"
1294
1339
  [attr.aria-label]="textFor('nextPage')"
1295
- (click)="currentPage !== totalPages ? changePage(currentPage) : false">
1340
+ (click)="onClick()">
1296
1341
  </button>
1297
1342
  <button kendoButton kendoPagerFocusable
1298
1343
  type="button"
@@ -1306,7 +1351,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1306
1351
  [class.k-disabled]="disabled"
1307
1352
  [title]="textFor('lastPage')"
1308
1353
  [attr.aria-label]="textFor('lastPage')"
1309
- (click)="currentPage !== totalPages ? changePage(totalPages-1) : false">
1354
+ (click)="onClick(true)">
1310
1355
  </button>
1311
1356
  `,
1312
1357
  standalone: true,
@@ -1324,6 +1369,11 @@ class PagerInputComponent extends PagerElementComponent {
1324
1369
  zone;
1325
1370
  renderer;
1326
1371
  numericInput;
1372
+ /**
1373
+ * Controls the visibility of the page text label.
1374
+ * @hidden
1375
+ */
1376
+ showPageText = true;
1327
1377
  /**
1328
1378
  * Specifies the padding of the internal numeric input element.
1329
1379
  *
@@ -1397,9 +1447,9 @@ class PagerInputComponent extends PagerElementComponent {
1397
1447
  return this.totalPages !== 0;
1398
1448
  }
1399
1449
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PagerInputComponent, deps: [{ token: i1.LocalizationService }, { token: PagerContextService }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
1400
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: PagerInputComponent, isStandalone: true, selector: "kendo-datapager-input, kendo-pager-input", inputs: { size: "size" }, viewQueries: [{ propertyName: "numericInput", first: true, predicate: NumericTextBoxComponent, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
1450
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: PagerInputComponent, isStandalone: true, selector: "kendo-datapager-input, kendo-pager-input", inputs: { showPageText: "showPageText", size: "size" }, viewQueries: [{ propertyName: "numericInput", first: true, predicate: NumericTextBoxComponent, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
1401
1451
  <span class="k-pager-input">
1402
- {{textFor('page')}}
1452
+ <ng-container *ngIf="showPageText">{{textFor('page')}}</ng-container>
1403
1453
  <kendo-numerictextbox kendoPagerFocusable
1404
1454
  [spinners]="false"
1405
1455
  [decimals]="0"
@@ -1421,7 +1471,7 @@ class PagerInputComponent extends PagerElementComponent {
1421
1471
  </kendo-numerictextbox>
1422
1472
  {{textFor('of')}} {{totalPages}}
1423
1473
  </span>
1424
- `, isInline: true, dependencies: [{ kind: "component", type: NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode", "inputAttributes"], outputs: ["valueChange", "focus", "blur", "inputFocus", "inputBlur"], exportAs: ["kendoNumericTextBox"] }, { kind: "directive", type: PagerFocusableDirective, selector: "[kendoPagerFocusable]", exportAs: ["kendoPagerFocusable"] }, { kind: "directive", type: EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }] });
1474
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: NumericTextBoxComponent, selector: "kendo-numerictextbox", inputs: ["focusableId", "disabled", "readonly", "title", "autoCorrect", "format", "max", "min", "decimals", "placeholder", "step", "spinners", "rangeValidation", "tabindex", "tabIndex", "changeValueOnScroll", "selectOnFocus", "value", "maxlength", "size", "rounded", "fillMode", "inputAttributes"], outputs: ["valueChange", "focus", "blur", "inputFocus", "inputBlur"], exportAs: ["kendoNumericTextBox"] }, { kind: "directive", type: PagerFocusableDirective, selector: "[kendoPagerFocusable]", exportAs: ["kendoPagerFocusable"] }, { kind: "directive", type: EventsOutsideAngularDirective, selector: "[kendoEventsOutsideAngular]", inputs: ["kendoEventsOutsideAngular", "scope"] }] });
1425
1475
  }
1426
1476
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PagerInputComponent, decorators: [{
1427
1477
  type: Component,
@@ -1429,7 +1479,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1429
1479
  selector: 'kendo-datapager-input, kendo-pager-input',
1430
1480
  template: `
1431
1481
  <span class="k-pager-input">
1432
- {{textFor('page')}}
1482
+ <ng-container *ngIf="showPageText">{{textFor('page')}}</ng-container>
1433
1483
  <kendo-numerictextbox kendoPagerFocusable
1434
1484
  [spinners]="false"
1435
1485
  [decimals]="0"
@@ -1453,11 +1503,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1453
1503
  </span>
1454
1504
  `,
1455
1505
  standalone: true,
1456
- imports: [NgClass, NumericTextBoxComponent, PagerFocusableDirective, EventsOutsideAngularDirective]
1506
+ imports: [NgClass, NgIf, NumericTextBoxComponent, PagerFocusableDirective, EventsOutsideAngularDirective]
1457
1507
  }]
1458
1508
  }], ctorParameters: function () { return [{ type: i1.LocalizationService }, { type: PagerContextService }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }]; }, propDecorators: { numericInput: [{
1459
1509
  type: ViewChild,
1460
1510
  args: [NumericTextBoxComponent, { static: true }]
1511
+ }], showPageText: [{
1512
+ type: Input
1461
1513
  }], size: [{
1462
1514
  type: Input
1463
1515
  }] } });
@@ -1530,28 +1582,40 @@ const packageMetadata = {
1530
1582
  productName: 'Kendo UI for Angular',
1531
1583
  productCode: 'KENDOUIANGULAR',
1532
1584
  productCodes: ['KENDOUIANGULAR'],
1533
- publishDate: 1745321647,
1534
- version: '19.0.0-develop.2',
1585
+ publishDate: 1747411817,
1586
+ version: '19.0.0-develop.21',
1535
1587
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/'
1536
1588
  };
1537
1589
 
1538
- /**
1539
- * @hidden
1540
- */
1541
- const RESPONSIVE_BREAKPOINT_MEDIUM = 600;
1542
- /**
1543
- * @hidden
1544
- */
1545
- const RESPONSIVE_BREAKPOINT_LARGE = 768;
1546
-
1547
1590
  class PagerComponent {
1548
1591
  pagerContext;
1549
1592
  element;
1550
1593
  localization;
1551
1594
  renderer;
1552
1595
  ngZone;
1596
+ cdr;
1553
1597
  navigationService;
1554
1598
  template;
1599
+ set numericButtons(buttons) {
1600
+ const newWidth = buttons ? buttons.nativeElement?.offsetWidth : 0;
1601
+ if (buttons && newWidth !== this.pagerDimensions.numericButtonsWidth) {
1602
+ this.pagerDimensions.numericButtonsWidth = newWidth;
1603
+ }
1604
+ }
1605
+ set pagerInput(input) {
1606
+ const newWidth = input ? input.nativeElement?.offsetWidth : 0;
1607
+ if (input && newWidth !== this.pagerDimensions.inputWidth) {
1608
+ this.pagerDimensions.inputWidth = newWidth;
1609
+ }
1610
+ }
1611
+ pagerInputComponent;
1612
+ set pageSizes(sizes) {
1613
+ const newWidth = sizes ? sizes.nativeElement?.offsetWidth : 0;
1614
+ if (sizes && newWidth !== this.pagerDimensions.pageSizesWidth) {
1615
+ this.pagerDimensions.pageSizesWidth = newWidth;
1616
+ }
1617
+ }
1618
+ pageSizesComponent;
1555
1619
  /**
1556
1620
  * @hidden
1557
1621
  */
@@ -1612,8 +1676,8 @@ class PagerComponent {
1612
1676
  previousNext = true;
1613
1677
  /**
1614
1678
  * If set to `true`, the user can use dedicated shortcuts to interact with the Pager ([see example]({% slug keyboard_navigation_pager %})).
1615
- * By default, navigation is disabled and the Pager content is accessible in the normal tab sequence.
1616
- * @default false
1679
+ * By default, navigation is enabled. To disable it and make the Pager content accessible in the normal tab sequence, set the property to `false`.
1680
+ * @default true
1617
1681
  */
1618
1682
  set navigable(value) {
1619
1683
  this._navigable = value;
@@ -1640,12 +1704,17 @@ class PagerComponent {
1640
1704
  return this._size;
1641
1705
  }
1642
1706
  /**
1643
- * @hidden
1644
- * Toggles the Pager responsive functionality.
1707
+ * Toggles the Pager responsive functionality ([see example](slug:responsive_pager)).
1645
1708
  *
1646
1709
  * @default true
1647
1710
  */
1648
1711
  responsive = true;
1712
+ /**
1713
+ * Toggles the Pager adaptiveness functionality ([see example](slug:adaptive_mode_pager)).
1714
+ *
1715
+ * @default 'auto'
1716
+ */
1717
+ adaptiveMode = 'auto';
1649
1718
  /**
1650
1719
  * Fires when the current page of the Pager is changed ([see example](slug:overview_pager)).
1651
1720
  * You have to handle the event yourself and page the data.
@@ -1689,19 +1758,44 @@ class PagerComponent {
1689
1758
  context.currentPage = this.currentPage;
1690
1759
  return context;
1691
1760
  }
1761
+ /**
1762
+ * @hidden
1763
+ */
1764
+ showInput = false;
1765
+ /**
1766
+ * @hidden
1767
+ */
1768
+ initialized = false;
1692
1769
  subscriptions = new Subscription();
1693
1770
  _templateContext = {};
1694
1771
  _pageSizeValues = DEFAULT_PAGE_SIZE_VALUES;
1695
1772
  direction;
1696
1773
  isInnerNavigationEnabled = false;
1697
- _navigable = false;
1774
+ _navigable = true;
1698
1775
  _size = DEFAULT_SIZE;
1699
- constructor(pagerContext, element, localization, renderer, ngZone, navigationService) {
1776
+ /**
1777
+ * Stores the measurements of various Pager elements.
1778
+ * These dimensions are used for responsive layout calculations.
1779
+ * @hidden
1780
+ */
1781
+ pagerDimensions = {
1782
+ padding: 0,
1783
+ numericButtonsWidth: 0,
1784
+ inputWidth: 0,
1785
+ pageSizesWidth: 0,
1786
+ sizesTextWidth: 0,
1787
+ pageTextWidth: 0,
1788
+ infoTextWidth: 0,
1789
+ gapNumbersSizes: 0,
1790
+ gapSizesInfo: 0
1791
+ };
1792
+ constructor(pagerContext, element, localization, renderer, ngZone, cdr, navigationService) {
1700
1793
  this.pagerContext = pagerContext;
1701
1794
  this.element = element;
1702
1795
  this.localization = localization;
1703
1796
  this.renderer = renderer;
1704
1797
  this.ngZone = ngZone;
1798
+ this.cdr = cdr;
1705
1799
  this.navigationService = navigationService;
1706
1800
  validatePackage(packageMetadata);
1707
1801
  this.direction = localization.rtl ? 'rtl' : 'ltr';
@@ -1718,6 +1812,8 @@ class PagerComponent {
1718
1812
  this.subscriptions.add(this.pagerContext.pageSizeChange.subscribe(this.changePageSize.bind(this)));
1719
1813
  this.subscriptions.add(this.localization.changes.subscribe(({ rtl }) => {
1720
1814
  this.direction = rtl ? 'rtl' : 'ltr';
1815
+ this.measureAllTextWidths();
1816
+ this.responsive && this.resizeHandler();
1721
1817
  }));
1722
1818
  this.subscriptions.add(this.navigationService.innerNavigationChange.subscribe(this.innerNavigationChange.bind(this)));
1723
1819
  if (this.navigable) {
@@ -1726,14 +1822,34 @@ class PagerComponent {
1726
1822
  this.subscriptions.add(this.renderer.listen(wrapper, 'keydown', this.keyDownHandler.bind(this)));
1727
1823
  });
1728
1824
  }
1825
+ if (this.type === 'input') {
1826
+ this.showInput = true;
1827
+ }
1828
+ }
1829
+ get maxItems() {
1830
+ return Math.min(this.currentPage * this.pageSize, this.total);
1729
1831
  }
1730
1832
  ngAfterViewInit() {
1731
- this.responsive && this.resizeHandler();
1732
1833
  this.renderer.setAttribute(this.element.nativeElement, 'aria-label', this.ariaLabel);
1733
1834
  this.subscriptions.add(this.template.changes.subscribe(() => {
1835
+ this.measureAllTextWidths();
1734
1836
  this.responsive && this.resizeHandler();
1735
1837
  }));
1736
1838
  this.handleClasses(this.size, 'size');
1839
+ this.measureAllTextWidths();
1840
+ const padding = calculatePadding(this.element.nativeElement);
1841
+ this.pagerDimensions.padding = padding.padding;
1842
+ this.pagerDimensions.gapNumbersSizes = padding.gapNumbersSizes;
1843
+ this.pagerDimensions.gapSizesInfo = padding.gapSizesInfo;
1844
+ if (!isDocumentAvailable()) {
1845
+ this.initialized = true;
1846
+ return;
1847
+ }
1848
+ this.responsive && this.resizeHandler();
1849
+ setTimeout(() => {
1850
+ this.initialized = true;
1851
+ this.cdr.markForCheck();
1852
+ }, 0);
1737
1853
  }
1738
1854
  ngOnChanges(changes) {
1739
1855
  if (anyChanged(["pageSize", "skip", "total"], changes, false)) {
@@ -1745,7 +1861,14 @@ class PagerComponent {
1745
1861
  this.renderer.setAttribute(this.element.nativeElement, 'aria-label', this.ariaLabel);
1746
1862
  }
1747
1863
  if (changes['responsive']) {
1864
+ this.measureAllTextWidths();
1748
1865
  this.responsive && this.resizeHandler();
1866
+ if (!this.responsive) {
1867
+ this.showInput = this.type === 'input';
1868
+ }
1869
+ }
1870
+ if (changes['type']) {
1871
+ this.showNumericButtonsResponsive();
1749
1872
  }
1750
1873
  }
1751
1874
  ngOnDestroy() {
@@ -1787,40 +1910,37 @@ class PagerComponent {
1787
1910
  if (this.template?.first && !this.responsive) {
1788
1911
  return;
1789
1912
  }
1790
- const width = this.element.nativeElement.offsetWidth;
1913
+ if (!isDocumentAvailable() || !this.element?.nativeElement) {
1914
+ this.initialized = true;
1915
+ return;
1916
+ }
1917
+ let pagerWidth = this.element.nativeElement.offsetWidth;
1918
+ if (pagerWidth <= 0) {
1919
+ return;
1920
+ }
1791
1921
  this.ngZone.runOutsideAngular(() => {
1792
1922
  setTimeout(() => {
1793
- const numericButtonsElement = this.element.nativeElement.querySelector('kendo-datapager-numeric-buttons, kendo-pager-numeric-buttons');
1923
+ if (this.template?.first || !this.responsive) {
1924
+ return;
1925
+ }
1926
+ const numericButtonsWrapperElement = this.element.nativeElement.querySelector('.k-pager-numbers-wrap');
1794
1927
  const pagerInfoElement = this.element.nativeElement.querySelector('.k-pager-info');
1795
1928
  const pagerPageSizes = this.element.nativeElement.querySelector('.k-pager-sizes');
1796
- if (numericButtonsElement) {
1797
- const selectElement = numericButtonsElement.querySelector('select');
1798
- const numbersElement = numericButtonsElement.querySelector('.k-pager-numbers');
1799
- if (width < RESPONSIVE_BREAKPOINT_MEDIUM) {
1800
- this.renderer.removeClass(selectElement, 'k-hidden');
1801
- this.renderer.addClass(numbersElement, 'k-hidden');
1802
- }
1803
- else {
1804
- this.renderer.addClass(selectElement, 'k-hidden');
1805
- this.renderer.removeClass(numbersElement, 'k-hidden');
1806
- }
1929
+ let elementsWidths = numericButtonsWrapperElement?.offsetWidth + (pagerPageSizes?.offsetWidth || 0) + (pagerInfoElement?.offsetWidth > 0 ? Math.min(this.pagerDimensions.infoTextWidth) : 0);
1930
+ if (this.isElementVisible(pagerInfoElement)) {
1931
+ elementsWidths += this.pagerDimensions.gapSizesInfo;
1932
+ }
1933
+ pagerWidth -= this.pagerDimensions.padding;
1934
+ if (this.isElementVisible(pagerPageSizes)) {
1935
+ pagerWidth -= this.pagerDimensions.gapNumbersSizes;
1807
1936
  }
1808
- if (pagerInfoElement) {
1809
- if (width < RESPONSIVE_BREAKPOINT_LARGE) {
1810
- this.renderer.addClass(pagerInfoElement, 'k-hidden');
1811
- }
1812
- else {
1813
- this.renderer.removeClass(pagerInfoElement, 'k-hidden');
1814
- }
1937
+ if (Math.ceil(elementsWidths) <= pagerWidth) {
1938
+ this.showElementsInOrder(pagerWidth, elementsWidths);
1815
1939
  }
1816
- if (pagerPageSizes) {
1817
- if (width < RESPONSIVE_BREAKPOINT_MEDIUM) {
1818
- this.renderer.addClass(pagerPageSizes, 'k-hidden');
1819
- }
1820
- else {
1821
- this.renderer.removeClass(pagerPageSizes, 'k-hidden');
1822
- }
1940
+ else {
1941
+ this.hideElementsInOrder(pagerWidth, elementsWidths);
1823
1942
  }
1943
+ !this.initialized && this.ngZone.onStable.pipe(take(1)).subscribe(() => this.initialized = true);
1824
1944
  });
1825
1945
  });
1826
1946
  };
@@ -1898,8 +2018,172 @@ class PagerComponent {
1898
2018
  this.renderer.addClass(elem, classes.toAdd);
1899
2019
  }
1900
2020
  }
1901
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PagerComponent, deps: [{ token: PagerContextService, optional: true, skipSelf: true }, { token: i0.ElementRef }, { token: i1.LocalizationService }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: PagerNavigationService, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component });
1902
- 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: [
2021
+ showElementsInOrder(availableWidth, currentWidth) {
2022
+ const el = this.element.nativeElement;
2023
+ const numericButtonsElement = el.querySelector('kendo-datapager-numeric-buttons, kendo-pager-numeric-buttons');
2024
+ const pagerInfoElement = el.querySelector('.k-pager-info');
2025
+ const pagerPageSizes = el.querySelector('.k-pager-sizes');
2026
+ const pagerInput = el.querySelector('kendo-pager-input');
2027
+ const pagerSizesDropDown = el.querySelector('.k-pager-sizes .k-dropdownlist');
2028
+ if (this.type === 'input' && this.isElementVisible(pagerInfoElement) || this.isElementVisible(numericButtonsElement)) {
2029
+ return;
2030
+ }
2031
+ if (!this.isElementVisible(pagerPageSizes)) {
2032
+ const addDropDownWidth = currentWidth + this.pagerDimensions.pageSizesWidth + this.pagerDimensions.gapNumbersSizes - this.pagerDimensions.sizesTextWidth;
2033
+ if (addDropDownWidth > availableWidth)
2034
+ return;
2035
+ this.ngZone.run(() => this.pageSizesComponent && (this.pageSizesComponent.showItemsText = false));
2036
+ this.showElement(pagerPageSizes);
2037
+ currentWidth = addDropDownWidth;
2038
+ if (currentWidth >= availableWidth)
2039
+ return;
2040
+ }
2041
+ if (this.isElementVisible(pagerPageSizes) && this.pageSizesComponent && !this.pageSizesComponent.showItemsText) {
2042
+ const addPageSizesText = currentWidth - pagerSizesDropDown?.offsetWidth + this.pagerDimensions.pageSizesWidth;
2043
+ if (addPageSizesText > availableWidth)
2044
+ return;
2045
+ this.ngZone.run(() => this.pageSizesComponent.showItemsText = true);
2046
+ currentWidth = addPageSizesText;
2047
+ if (currentWidth >= availableWidth)
2048
+ return;
2049
+ }
2050
+ if (this.isElementVisible(pagerPageSizes) && this.pageSizesComponent?.showItemsText && this.pagerInputComponent && !this.pagerInputComponent.showPageText) {
2051
+ const addPageText = currentWidth - pagerInput?.offsetWidth + this.pagerDimensions.inputWidth;
2052
+ if (addPageText > availableWidth)
2053
+ return;
2054
+ this.ngZone.run(() => this.pagerInputComponent.showPageText = true);
2055
+ currentWidth = addPageText;
2056
+ if (currentWidth >= availableWidth)
2057
+ return;
2058
+ }
2059
+ if (this.isElementVisible(pagerPageSizes) && this.pagerInputComponent?.showPageText) {
2060
+ const addInfoText = currentWidth + this.pagerDimensions.infoTextWidth + this.pagerDimensions.gapSizesInfo;
2061
+ if (addInfoText > availableWidth)
2062
+ return;
2063
+ this.ngZone.run(() => {
2064
+ this.showElement(pagerInfoElement);
2065
+ });
2066
+ currentWidth = addInfoText;
2067
+ }
2068
+ if (this.isElementVisible(pagerInfoElement) && this.type === 'numeric') {
2069
+ const addNumericButtons = currentWidth - this.pagerDimensions.inputWidth + this.pagerDimensions.numericButtonsWidth;
2070
+ if (addNumericButtons > availableWidth)
2071
+ return;
2072
+ this.showElement(numericButtonsElement);
2073
+ this.ngZone.run(() => {
2074
+ this.showInput = false;
2075
+ this.cdr.markForCheck();
2076
+ });
2077
+ }
2078
+ }
2079
+ hideElementsInOrder(availableWidth, currentWidth) {
2080
+ const el = this.element.nativeElement;
2081
+ const numericButtonsElement = el.querySelector('kendo-datapager-numeric-buttons, kendo-pager-numeric-buttons');
2082
+ const pagerInfoElement = el.querySelector('.k-pager-info');
2083
+ const pagerPageSizes = el.querySelector('.k-pager-sizes');
2084
+ const pagerSizesDropDown = el.querySelector('.k-pager-sizes .k-dropdownlist');
2085
+ if (this.isElementVisible(numericButtonsElement)) {
2086
+ this.hideElement(numericButtonsElement);
2087
+ this.ngZone.run(() => this.showInput = true);
2088
+ currentWidth += this.pagerDimensions.inputWidth - this.pagerDimensions.numericButtonsWidth;
2089
+ if (currentWidth <= availableWidth)
2090
+ return;
2091
+ }
2092
+ if (this.isElementVisible(pagerInfoElement)) {
2093
+ this.hideElement(pagerInfoElement);
2094
+ currentWidth -= this.pagerDimensions.infoTextWidth;
2095
+ if (currentWidth <= availableWidth)
2096
+ return;
2097
+ }
2098
+ if (this.pagerInputComponent?.showPageText) {
2099
+ this.ngZone.run(() => this.pagerInputComponent.showPageText = false);
2100
+ currentWidth = currentWidth - this.pagerDimensions.pageTextWidth;
2101
+ if (currentWidth <= availableWidth)
2102
+ return;
2103
+ }
2104
+ if (this.isElementVisible(pagerPageSizes) && this.pageSizesComponent?.showItemsText) {
2105
+ this.ngZone.run(() => this.pageSizesComponent.showItemsText = false);
2106
+ currentWidth = currentWidth - this.pagerDimensions.pageSizesWidth + pagerSizesDropDown?.offsetWidth;
2107
+ if (currentWidth <= availableWidth)
2108
+ return;
2109
+ }
2110
+ this.hideElement(pagerPageSizes);
2111
+ }
2112
+ isElementVisible(element) {
2113
+ return element && !element?.classList.contains('k-hidden');
2114
+ }
2115
+ hideElement(element) {
2116
+ if (element) {
2117
+ this.renderer.addClass(element, 'k-hidden');
2118
+ }
2119
+ }
2120
+ showElement(element) {
2121
+ if (element) {
2122
+ this.renderer.removeClass(element, 'k-hidden');
2123
+ }
2124
+ }
2125
+ measureAllTextWidths() {
2126
+ if (!isDocumentAvailable()) {
2127
+ return;
2128
+ }
2129
+ const el = this.element.nativeElement;
2130
+ const existingInfo = el.querySelector('.k-pager-info');
2131
+ const existingInput = el.querySelector('.k-pager-input');
2132
+ const existingSizes = el.querySelector('.k-pager-sizes');
2133
+ // create a single measurement container
2134
+ const measureContainer = this.renderer.createElement('div');
2135
+ positionOffScreen(this.renderer, measureContainer);
2136
+ this.renderer.appendChild(this.element.nativeElement, measureContainer);
2137
+ const infoSpan = createMeasurementSpan(this.renderer, measureContainer, 'k-pager-info');
2138
+ const pageSpan = createMeasurementSpan(this.renderer, measureContainer, 'k-pager-input');
2139
+ const sizesSpan = createMeasurementSpan(this.renderer, measureContainer, 'k-pager-sizes');
2140
+ const infoText = `${this.currentPage} - ${this.maxItems} ${this.localization.get('of')} ${this.total} ${this.localization.get('items')}`;
2141
+ this.renderer.setProperty(infoSpan, 'textContent', infoText);
2142
+ this.renderer.setProperty(pageSpan, 'textContent', this.localization.get('page'));
2143
+ this.renderer.setProperty(sizesSpan, 'textContent', this.localization.get('itemsPerPage'));
2144
+ // copy computed styles if available
2145
+ if (existingInfo)
2146
+ copyComputedStyles(this.renderer, existingInfo, infoSpan);
2147
+ if (existingInput)
2148
+ copyComputedStyles(this.renderer, existingInput, pageSpan);
2149
+ if (existingSizes)
2150
+ copyComputedStyles(this.renderer, existingSizes, sizesSpan);
2151
+ // force a reflow to ensure measurements are accurate
2152
+ measureContainer.getBoundingClientRect();
2153
+ this.pagerDimensions.infoTextWidth = infoSpan?.offsetWidth;
2154
+ if (this.pagerDimensions.inputWidth && this.pagerDimensions.pageTextWidth) {
2155
+ this.pagerDimensions.inputWidth = this.pagerDimensions.inputWidth - this.pagerDimensions.pageTextWidth + pageSpan.offsetWidth;
2156
+ }
2157
+ this.pagerDimensions.pageTextWidth = pageSpan?.offsetWidth;
2158
+ if (this.pagerDimensions.pageSizesWidth && this.pagerDimensions.sizesTextWidth) {
2159
+ this.pagerDimensions.pageSizesWidth = this.pagerDimensions.pageSizesWidth - this.pagerDimensions.sizesTextWidth + sizesSpan.offsetWidth;
2160
+ }
2161
+ this.pagerDimensions.sizesTextWidth = sizesSpan?.offsetWidth;
2162
+ this.renderer.removeChild(this.element.nativeElement, measureContainer);
2163
+ }
2164
+ showNumericButtonsResponsive() {
2165
+ if (!this.responsive || (!this.numericButtons && !this.pagerInput) || !isDocumentAvailable()) {
2166
+ this.showInput = this.type === 'input';
2167
+ return;
2168
+ }
2169
+ const pagerInfoElement = this.element.nativeElement.querySelector('.k-pager-info');
2170
+ if (this.type === 'input' || !this.isElementVisible(pagerInfoElement)) {
2171
+ this.showInput = true;
2172
+ return;
2173
+ }
2174
+ const numericButtonsElement = this.element.nativeElement.querySelector('kendo-datapager-numeric-buttons, kendo-pager-numeric-buttons');
2175
+ if (this.isElementVisible(numericButtonsElement)) {
2176
+ this.showInput = false;
2177
+ return;
2178
+ }
2179
+ const pagerWidth = this.element.nativeElement?.offsetWidth;
2180
+ const numericButtonsWrapperElement = this.element.nativeElement.querySelector('.k-pager-numbers-wrap');
2181
+ const elementsWidths = numericButtonsWrapperElement?.offsetWidth + this.pagerDimensions.pageSizesWidth + this.pagerDimensions.infoTextWidth + this.pagerDimensions.gapSizesInfo;
2182
+ const hasAvailableWidth = pagerWidth > elementsWidths - this.pagerDimensions.inputWidth + this.pagerDimensions.numericButtonsWidth;
2183
+ this.showInput = !hasAvailableWidth;
2184
+ }
2185
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PagerComponent, deps: [{ token: PagerContextService, optional: true, skipSelf: true }, { token: i0.ElementRef }, { token: i1.LocalizationService }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: PagerNavigationService, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component });
2186
+ 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: [
1903
2187
  LocalizationService,
1904
2188
  PagerContextService,
1905
2189
  PagerNavigationService,
@@ -1907,7 +2191,7 @@ class PagerComponent {
1907
2191
  provide: L10N_PREFIX,
1908
2192
  useValue: 'kendo.pager'
1909
2193
  }
1910
- ], queries: [{ propertyName: "template", predicate: PagerTemplateDirective }], exportAs: ["kendoDataPager", "kendoPager"], usesOnChanges: true, ngImport: i0, template: `
2194
+ ], 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: `
1911
2195
  <ng-container kendoPagerLocalizedMessages
1912
2196
  i18n-ariaLabel="kendo.pager.ariaLabel|The value of the aria-label attribute of the Pager"
1913
2197
  ariaLabel="{{ 'Page navigation, page {currentPage} of {totalPages}' }}"
@@ -1952,25 +2236,27 @@ class PagerComponent {
1952
2236
  [ngTemplateOutletContext]="templateContext">
1953
2237
  </ng-container>
1954
2238
  <ng-template #default>
1955
- <div class="k-pager-numbers-wrap">
2239
+ <div class="k-pager-numbers-wrap" [ngStyle]="{opacity: initialized ? '1' : '0'}">
1956
2240
  <kendo-pager-prev-buttons [size]="size" *ngIf="previousNext"></kendo-pager-prev-buttons>
1957
2241
  <kendo-pager-numeric-buttons
1958
2242
  [size]="size"
1959
2243
  *ngIf="type === 'numeric' && buttonCount > 0"
1960
2244
  [buttonCount]="buttonCount">
1961
2245
  </kendo-pager-numeric-buttons>
1962
- <kendo-pager-input [size]="size" *ngIf="type === 'input'"></kendo-pager-input>
2246
+ <kendo-pager-input [size]="size" *ngIf="showInput"></kendo-pager-input>
1963
2247
  <kendo-pager-next-buttons [size]="size" *ngIf="previousNext"></kendo-pager-next-buttons>
1964
2248
  </div>
1965
2249
  <kendo-pager-page-sizes *ngIf="_pageSizeValues.length"
2250
+ [ngStyle]="{opacity: initialized ? '1' : '0'}"
1966
2251
  [size]="size"
1967
- [pageSizes]="_pageSizeValues">
2252
+ [pageSizes]="_pageSizeValues"
2253
+ [adaptiveMode]="adaptiveMode">
1968
2254
  </kendo-pager-page-sizes>
1969
- <kendo-pager-info *ngIf="info">
2255
+ <kendo-pager-info *ngIf="info" [ngStyle]="{opacity: initialized ? '1' : '0'}">
1970
2256
  </kendo-pager-info>
1971
2257
  </ng-template>
1972
2258
  <kendo-resize-sensor *ngIf="responsive" (resize)="resizeHandler()"></kendo-resize-sensor>
1973
- `, 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"] }] });
2259
+ `, 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"] }] });
1974
2260
  }
1975
2261
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PagerComponent, decorators: [{
1976
2262
  type: Component,
@@ -2031,39 +2317,56 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
2031
2317
  [ngTemplateOutletContext]="templateContext">
2032
2318
  </ng-container>
2033
2319
  <ng-template #default>
2034
- <div class="k-pager-numbers-wrap">
2320
+ <div class="k-pager-numbers-wrap" [ngStyle]="{opacity: initialized ? '1' : '0'}">
2035
2321
  <kendo-pager-prev-buttons [size]="size" *ngIf="previousNext"></kendo-pager-prev-buttons>
2036
2322
  <kendo-pager-numeric-buttons
2037
2323
  [size]="size"
2038
2324
  *ngIf="type === 'numeric' && buttonCount > 0"
2039
2325
  [buttonCount]="buttonCount">
2040
2326
  </kendo-pager-numeric-buttons>
2041
- <kendo-pager-input [size]="size" *ngIf="type === 'input'"></kendo-pager-input>
2327
+ <kendo-pager-input [size]="size" *ngIf="showInput"></kendo-pager-input>
2042
2328
  <kendo-pager-next-buttons [size]="size" *ngIf="previousNext"></kendo-pager-next-buttons>
2043
2329
  </div>
2044
2330
  <kendo-pager-page-sizes *ngIf="_pageSizeValues.length"
2331
+ [ngStyle]="{opacity: initialized ? '1' : '0'}"
2045
2332
  [size]="size"
2046
- [pageSizes]="_pageSizeValues">
2333
+ [pageSizes]="_pageSizeValues"
2334
+ [adaptiveMode]="adaptiveMode">
2047
2335
  </kendo-pager-page-sizes>
2048
- <kendo-pager-info *ngIf="info">
2336
+ <kendo-pager-info *ngIf="info" [ngStyle]="{opacity: initialized ? '1' : '0'}">
2049
2337
  </kendo-pager-info>
2050
2338
  </ng-template>
2051
2339
  <kendo-resize-sensor *ngIf="responsive" (resize)="resizeHandler()"></kendo-resize-sensor>
2052
2340
  `,
2053
2341
  standalone: true,
2054
- imports: [LocalizedMessagesDirective, NgIf, NgTemplateOutlet, PagerPrevButtonsComponent, PagerNumericButtonsComponent, PagerInputComponent, PagerNextButtonsComponent, PagerPageSizesComponent, PagerInfoComponent, ResizeSensorComponent]
2342
+ imports: [LocalizedMessagesDirective, NgIf, NgTemplateOutlet, PagerPrevButtonsComponent, PagerNumericButtonsComponent, PagerInputComponent, PagerNextButtonsComponent, PagerPageSizesComponent, PagerInfoComponent, ResizeSensorComponent, NgStyle]
2055
2343
  }]
2056
2344
  }], ctorParameters: function () { return [{ type: PagerContextService, decorators: [{
2057
2345
  type: Optional
2058
2346
  }, {
2059
2347
  type: SkipSelf
2060
- }] }, { type: i0.ElementRef }, { type: i1.LocalizationService }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: PagerNavigationService, decorators: [{
2348
+ }] }, { type: i0.ElementRef }, { type: i1.LocalizationService }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: PagerNavigationService, decorators: [{
2061
2349
  type: Optional
2062
2350
  }, {
2063
2351
  type: SkipSelf
2064
2352
  }] }]; }, propDecorators: { template: [{
2065
2353
  type: ContentChildren,
2066
2354
  args: [PagerTemplateDirective]
2355
+ }], numericButtons: [{
2356
+ type: ViewChild,
2357
+ args: [PagerNumericButtonsComponent, { read: ElementRef }]
2358
+ }], pagerInput: [{
2359
+ type: ViewChild,
2360
+ args: [PagerInputComponent, { read: ElementRef }]
2361
+ }], pagerInputComponent: [{
2362
+ type: ViewChild,
2363
+ args: [PagerInputComponent]
2364
+ }], pageSizes: [{
2365
+ type: ViewChild,
2366
+ args: [PagerPageSizesComponent, { read: ElementRef }]
2367
+ }], pageSizesComponent: [{
2368
+ type: ViewChild,
2369
+ args: [PagerPageSizesComponent]
2067
2370
  }], externalTemplate: [{
2068
2371
  type: Input
2069
2372
  }], total: [{
@@ -2088,6 +2391,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
2088
2391
  type: Input
2089
2392
  }], responsive: [{
2090
2393
  type: Input
2394
+ }], adaptiveMode: [{
2395
+ type: Input
2091
2396
  }], pageChange: [{
2092
2397
  type: Output
2093
2398
  }], pageSizeChange: [{