@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.
- package/esm2022/package-metadata.mjs +2 -2
- package/esm2022/pager/pager-input.component.mjs +13 -6
- package/esm2022/pager/pager-numeric-buttons.component.mjs +3 -51
- package/esm2022/pager/pager-page-sizes.component.mjs +30 -5
- package/esm2022/pager/pager.component.mjs +312 -50
- package/esm2022/util.mjs +48 -0
- package/fesm2022/progress-kendo-angular-pager.mjs +403 -118
- package/index.d.ts +1 -0
- package/package.json +8 -8
- package/pager/pager-input.component.d.ts +6 -1
- package/pager/pager-page-sizes.component.d.ts +15 -1
- package/pager/pager.component.d.ts +42 -6
- package/schematics/ngAdd/index.js +6 -6
- package/util.d.ts +30 -0
- package/esm2022/pager/common/constants.mjs +0 -12
- package/pager/common/constants.d.ts +0 -12
|
@@ -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
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
278
|
-
|
|
279
|
-
|
|
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
|
-
|
|
290
|
-
|
|
291
|
-
|
|
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 (
|
|
298
|
-
|
|
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
|
-
|
|
383
|
-
|
|
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="
|
|
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="
|
|
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
|
+
};
|