@progress/kendo-angular-pager 4.0.6 → 4.1.0-dev.202211250852

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.
@@ -7,7 +7,8 @@ import { PagerElementComponent } from './pager-element.component';
7
7
  import * as i0 from "@angular/core";
8
8
  import * as i1 from "@progress/kendo-angular-l10n";
9
9
  import * as i2 from "./pager-context.service";
10
- import * as i3 from "@angular/common";
10
+ import * as i3 from "./focusable.directive";
11
+ import * as i4 from "@angular/common";
11
12
  /**
12
13
  * Displays numeric buttons to enable navigation between the pages.
13
14
  */
@@ -87,9 +88,9 @@ export class PagerNumericButtonsComponent extends PagerElementComponent {
87
88
  return this.textFor('selectPage');
88
89
  }
89
90
  }
90
- PagerNumericButtonsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: PagerNumericButtonsComponent, deps: [{ token: i1.LocalizationService }, { token: i0.ChangeDetectorRef }, { token: i2.PagerContextService }], target: i0.ɵɵFactoryTarget.Component });
91
- PagerNumericButtonsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: PagerNumericButtonsComponent, selector: "kendo-datapager-numeric-buttons", inputs: { buttonCount: "buttonCount" }, host: { properties: { "class.k-pager-numbers-wrap": "this.numbersWrapClass" } }, usesInheritance: true, ngImport: i0, template: `
92
- <select
91
+ PagerNumericButtonsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PagerNumericButtonsComponent, deps: [{ token: i1.LocalizationService }, { token: i0.ChangeDetectorRef }, { token: i2.PagerContextService }], target: i0.ɵɵFactoryTarget.Component });
92
+ PagerNumericButtonsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: PagerNumericButtonsComponent, selector: "kendo-datapager-numeric-buttons", inputs: { buttonCount: "buttonCount" }, host: { properties: { "class.k-pager-numbers-wrap": "this.numbersWrapClass" } }, usesInheritance: true, ngImport: i0, template: `
93
+ <select kendoPagerFocusable
93
94
  class="k-dropdown-list k-picker k-picker-md k-rounded-md k-picker-solid"
94
95
  [attr.title]="pageChooserLabel"
95
96
  [attr.aria-label]="pageChooserLabel"
@@ -118,15 +119,17 @@ PagerNumericButtonsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12
118
119
  <ul [ngClass]="{'k-pager-numbers': true}">
119
120
  <li *ngIf="start > 1">
120
121
  <button
121
- type="button"
122
+ type="button" kendoPagerFocusable
122
123
  class="k-link"
123
124
  [attr.aria-label]="pageLabel(start - 1)"
125
+ [attr.title]="pageLabel(start - 1)"
124
126
  (click)="changePage(start - 2)">...</button>
125
127
  </li>
126
128
  <li *ngFor="let num of buttons">
127
129
  <button
128
- type="button"
130
+ type="button" kendoPagerFocusable
129
131
  [attr.aria-label]="pageLabel(num)"
132
+ [attr.title]="pageLabel(num)"
130
133
  [attr.aria-current]="currentPage === num ? 'page' : undefined"
131
134
  [ngClass]="{'k-link': true, 'k-selected':currentPage === num}"
132
135
  (click)="changePage(num - 1)">
@@ -135,20 +138,21 @@ PagerNumericButtonsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12
135
138
  </li>
136
139
  <li *ngIf="end < totalPages">
137
140
  <button
138
- type="button"
141
+ type="button" kendoPagerFocusable
139
142
  class="k-link"
140
143
  [attr.aria-label]="pageLabel(end + 1)"
144
+ [attr.title]="pageLabel(end + 1)"
141
145
  (click)="changePage(end)">...</button>
142
146
  </li>
143
147
  </ul>
144
- `, isInline: true, directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
145
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: PagerNumericButtonsComponent, decorators: [{
148
+ `, isInline: true, directives: [{ type: i3.PagerFocusableDirective, selector: "[kendoPagerFocusable]", exportAs: ["kendoPagerFocusable"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
149
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PagerNumericButtonsComponent, decorators: [{
146
150
  type: Component,
147
151
  args: [{
148
152
  changeDetection: ChangeDetectionStrategy.OnPush,
149
153
  selector: 'kendo-datapager-numeric-buttons',
150
154
  template: `
151
- <select
155
+ <select kendoPagerFocusable
152
156
  class="k-dropdown-list k-picker k-picker-md k-rounded-md k-picker-solid"
153
157
  [attr.title]="pageChooserLabel"
154
158
  [attr.aria-label]="pageChooserLabel"
@@ -177,15 +181,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
177
181
  <ul [ngClass]="{'k-pager-numbers': true}">
178
182
  <li *ngIf="start > 1">
179
183
  <button
180
- type="button"
184
+ type="button" kendoPagerFocusable
181
185
  class="k-link"
182
186
  [attr.aria-label]="pageLabel(start - 1)"
187
+ [attr.title]="pageLabel(start - 1)"
183
188
  (click)="changePage(start - 2)">...</button>
184
189
  </li>
185
190
  <li *ngFor="let num of buttons">
186
191
  <button
187
- type="button"
192
+ type="button" kendoPagerFocusable
188
193
  [attr.aria-label]="pageLabel(num)"
194
+ [attr.title]="pageLabel(num)"
189
195
  [attr.aria-current]="currentPage === num ? 'page' : undefined"
190
196
  [ngClass]="{'k-link': true, 'k-selected':currentPage === num}"
191
197
  (click)="changePage(num - 1)">
@@ -194,9 +200,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
194
200
  </li>
195
201
  <li *ngIf="end < totalPages">
196
202
  <button
197
- type="button"
203
+ type="button" kendoPagerFocusable
198
204
  class="k-link"
199
205
  [attr.aria-label]="pageLabel(end + 1)"
206
+ [attr.title]="pageLabel(end + 1)"
200
207
  (click)="changePage(end)">...</button>
201
208
  </li>
202
209
  </ul>
@@ -5,17 +5,21 @@
5
5
  import { Component, ChangeDetectionStrategy, HostBinding, Input, ViewChild } from '@angular/core';
6
6
  import { PagerElementComponent } from './pager-element.component';
7
7
  import { PageSizeChangeEvent } from './pagesizechange-event';
8
+ import { Keys } from '@progress/kendo-angular-common';
8
9
  import * as i0 from "@angular/core";
9
10
  import * as i1 from "@progress/kendo-angular-l10n";
10
11
  import * as i2 from "./pager-context.service";
11
12
  import * as i3 from "@progress/kendo-angular-dropdowns";
13
+ import * as i4 from "./focusable.directive";
12
14
  /**
13
15
  * Displays a drop-down list for the page size selection ([see example]({% slug pager_settings %})).
14
16
  */
15
17
  export class PagerPageSizesComponent extends PagerElementComponent {
16
- constructor(localization, cd, pagerContext) {
18
+ constructor(localization, cd, pagerContext, element, ngZone) {
17
19
  super(localization, pagerContext, cd);
18
20
  this.pagerContext = pagerContext;
21
+ this.element = element;
22
+ this.ngZone = ngZone;
19
23
  this._pageSizes = [];
20
24
  }
21
25
  /**
@@ -169,6 +173,12 @@ export class PagerPageSizesComponent extends PagerElementComponent {
169
173
  }
170
174
  ngAfterViewInit() {
171
175
  this.dropDownList.wrapper.nativeElement.setAttribute('aria-label', this.textFor('itemsPerPage'));
176
+ this.ngZone.runOutsideAngular(() => {
177
+ this.element.nativeElement.addEventListener('keydown', this.keyDownHandler.bind(this), true);
178
+ });
179
+ }
180
+ ngOnDestroy() {
181
+ this.element.nativeElement.removeEventListener('keydown', this.keyDownHandler);
172
182
  }
173
183
  /**
174
184
  * @hidden
@@ -186,10 +196,16 @@ export class PagerPageSizesComponent extends PagerElementComponent {
186
196
  this.pageSize = typeof pageSize === 'number' ? pageSize : this.total;
187
197
  this.cd.markForCheck();
188
198
  }
199
+ keyDownHandler(ev) {
200
+ if (ev.keyCode === Keys.Escape && this.dropDownList.isOpen) {
201
+ ev.stopPropagation();
202
+ this.dropDownList.toggle(false);
203
+ }
204
+ }
189
205
  }
190
- PagerPageSizesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: PagerPageSizesComponent, deps: [{ token: i1.LocalizationService }, { token: i0.ChangeDetectorRef }, { token: i2.PagerContextService }], target: i0.ɵɵFactoryTarget.Component });
191
- PagerPageSizesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: PagerPageSizesComponent, selector: "kendo-datapager-page-sizes", inputs: { pageSizes: "pageSizes" }, host: { properties: { "class.k-pager-sizes": "this.classes", "class.k-label": "this.classes" } }, viewQueries: [{ propertyName: "dropDownList", first: true, predicate: ["dropdownlist"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
192
- <kendo-dropdownlist
206
+ PagerPageSizesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PagerPageSizesComponent, deps: [{ token: i1.LocalizationService }, { token: i0.ChangeDetectorRef }, { token: i2.PagerContextService }, { token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
207
+ PagerPageSizesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: PagerPageSizesComponent, selector: "kendo-datapager-page-sizes", inputs: { pageSizes: "pageSizes" }, host: { properties: { "class.k-pager-sizes": "this.classes", "class.k-label": "this.classes" } }, viewQueries: [{ propertyName: "dropDownList", first: true, predicate: ["dropdownlist"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
208
+ <kendo-dropdownlist kendoPagerFocusable
193
209
  #dropdownlist
194
210
  [data]="pageSizes"
195
211
  textField="text"
@@ -198,14 +214,14 @@ PagerPageSizesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0"
198
214
  [value]="pageSize"
199
215
  (valueChange)="pageSizeChange($event, dropdownlist)"></kendo-dropdownlist>
200
216
  {{ textFor('itemsPerPage') }}
201
- `, isInline: true, components: [{ type: i3.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["iconClass", "loading", "data", "value", "textField", "valueField", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
202
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: PagerPageSizesComponent, decorators: [{
217
+ `, isInline: true, components: [{ type: i3.DropDownListComponent, selector: "kendo-dropdownlist", inputs: ["iconClass", "loading", "data", "value", "textField", "valueField", "popupSettings", "listHeight", "defaultItem", "disabled", "itemDisabled", "readonly", "filterable", "virtual", "ignoreCase", "delay", "valuePrimitive", "tabindex", "tabIndex", "size", "rounded", "fillMode", "id"], outputs: ["valueChange", "filterChange", "selectionChange", "open", "opened", "close", "closed", "focus", "blur"], exportAs: ["kendoDropDownList"] }], directives: [{ type: i4.PagerFocusableDirective, selector: "[kendoPagerFocusable]", exportAs: ["kendoPagerFocusable"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
218
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PagerPageSizesComponent, decorators: [{
203
219
  type: Component,
204
220
  args: [{
205
221
  changeDetection: ChangeDetectionStrategy.OnPush,
206
222
  selector: 'kendo-datapager-page-sizes',
207
223
  template: `
208
- <kendo-dropdownlist
224
+ <kendo-dropdownlist kendoPagerFocusable
209
225
  #dropdownlist
210
226
  [data]="pageSizes"
211
227
  textField="text"
@@ -216,7 +232,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
216
232
  {{ textFor('itemsPerPage') }}
217
233
  `
218
234
  }]
219
- }], ctorParameters: function () { return [{ type: i1.LocalizationService }, { type: i0.ChangeDetectorRef }, { type: i2.PagerContextService }]; }, propDecorators: { dropDownList: [{
235
+ }], ctorParameters: function () { return [{ type: i1.LocalizationService }, { type: i0.ChangeDetectorRef }, { type: i2.PagerContextService }, { type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { dropDownList: [{
220
236
  type: ViewChild,
221
237
  args: ['dropdownlist', { static: true }]
222
238
  }], pageSizes: [{
@@ -8,6 +8,7 @@ import { PagerElementComponent } from './pager-element.component';
8
8
  import * as i0 from "@angular/core";
9
9
  import * as i1 from "@progress/kendo-angular-l10n";
10
10
  import * as i2 from "./pager-context.service";
11
+ import * as i3 from "./focusable.directive";
11
12
  /**
12
13
  * Displays buttons for navigating to the first and to the previous page ([see example]({% slug pager_settings %})).
13
14
  */
@@ -32,10 +33,10 @@ export class PagerPrevButtonsComponent extends PagerElementComponent {
32
33
  this.cd.markForCheck();
33
34
  }
34
35
  }
35
- PagerPrevButtonsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: PagerPrevButtonsComponent, deps: [{ token: i1.LocalizationService }, { token: i2.PagerContextService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
36
- PagerPrevButtonsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: PagerPrevButtonsComponent, selector: "kendo-datapager-prev-buttons", usesInheritance: true, ngImport: i0, template: `
36
+ PagerPrevButtonsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PagerPrevButtonsComponent, deps: [{ token: i1.LocalizationService }, { token: i2.PagerContextService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
37
+ PagerPrevButtonsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: PagerPrevButtonsComponent, selector: "kendo-datapager-prev-buttons", usesInheritance: true, ngImport: i0, template: `
37
38
  <button
38
- type="button"
39
+ type="button" kendoPagerFocusable
39
40
  class="k-link k-pager-nav k-pager-first"
40
41
  [class.k-disabled]="disabled"
41
42
  [title]="textFor('firstPage')"
@@ -45,7 +46,7 @@ PagerPrevButtonsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.
45
46
  <span class="k-icon k-i-seek-w" role="note" [attr.aria-label]="textFor('firstPage')"></span>
46
47
  </button>
47
48
  <button
48
- type="button"
49
+ type="button" kendoPagerFocusable
49
50
  class="k-link k-pager-nav"
50
51
  [class.k-disabled]="disabled"
51
52
  [title]="textFor('previousPage')"
@@ -54,15 +55,15 @@ PagerPrevButtonsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.
54
55
  (click)="currentPage !== 1 ? changePage(currentPage-2) : false">
55
56
  <span class="k-icon k-i-arrow-w" role="note" [attr.aria-label]="textFor('previousPage')"></span>
56
57
  </button>
57
- `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
58
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: PagerPrevButtonsComponent, decorators: [{
58
+ `, isInline: true, directives: [{ type: i3.PagerFocusableDirective, selector: "[kendoPagerFocusable]", exportAs: ["kendoPagerFocusable"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
59
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PagerPrevButtonsComponent, decorators: [{
59
60
  type: Component,
60
61
  args: [{
61
62
  changeDetection: ChangeDetectionStrategy.OnPush,
62
63
  selector: 'kendo-datapager-prev-buttons',
63
64
  template: `
64
65
  <button
65
- type="button"
66
+ type="button" kendoPagerFocusable
66
67
  class="k-link k-pager-nav k-pager-first"
67
68
  [class.k-disabled]="disabled"
68
69
  [title]="textFor('firstPage')"
@@ -72,7 +73,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
72
73
  <span class="k-icon k-i-seek-w" role="note" [attr.aria-label]="textFor('firstPage')"></span>
73
74
  </button>
74
75
  <button
75
- type="button"
76
+ type="button" kendoPagerFocusable
76
77
  class="k-link k-pager-nav"
77
78
  [class.k-disabled]="disabled"
78
79
  [title]="textFor('previousPage')"
@@ -51,9 +51,9 @@ export class PagerTemplateDirective {
51
51
  this.templateRef = templateRef;
52
52
  }
53
53
  }
54
- PagerTemplateDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: PagerTemplateDirective, deps: [{ token: i0.TemplateRef, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
55
- PagerTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.16", type: PagerTemplateDirective, selector: "[kendoDataPagerTemplate]", ngImport: i0 });
56
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: PagerTemplateDirective, decorators: [{
54
+ PagerTemplateDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PagerTemplateDirective, deps: [{ token: i0.TemplateRef, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
55
+ PagerTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.17", type: PagerTemplateDirective, selector: "[kendoDataPagerTemplate]", ngImport: i0 });
56
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PagerTemplateDirective, decorators: [{
57
57
  type: Directive,
58
58
  args: [{
59
59
  selector: '[kendoDataPagerTemplate]'
@@ -3,32 +3,37 @@
3
3
  * Licensed under commercial license. See LICENSE.md in the project root for more information
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import { RESPONSIVE_BREAKPOINT_MEDIUM, RESPONSIVE_BREAKPOINT_LARGE } from './common/constants';
6
- import { Component, Input, EventEmitter, Output, HostBinding, ViewChild, ContentChild } from '@angular/core';
6
+ import { Component, Input, EventEmitter, Output, HostBinding, ViewChild, ContentChild, HostListener } from '@angular/core';
7
7
  import { PagerTemplateDirective } from "./pager-template.directive";
8
- import { anyChanged, ResizeSensorComponent } from "@progress/kendo-angular-common";
8
+ import { anyChanged, Keys, ResizeSensorComponent } from "@progress/kendo-angular-common";
9
9
  import { PagerContextService } from "./pager-context.service";
10
10
  import { Subscription } from "rxjs";
11
11
  import { DEFAULT_PAGE_SIZE_VALUES } from '../util';
12
12
  import { LocalizationService } from '@progress/kendo-angular-l10n';
13
13
  import { validatePackage } from '@progress/kendo-licensing';
14
14
  import { packageMetadata } from '../package-metadata';
15
+ import { PagerNavigationService } from './navigation.service';
15
16
  import * as i0 from "@angular/core";
16
17
  import * as i1 from "./pager-context.service";
17
18
  import * as i2 from "@progress/kendo-angular-l10n";
18
- import * as i3 from "./pager-prev-buttons.component";
19
- import * as i4 from "./pager-numeric-buttons.component";
20
- import * as i5 from "./pager-input.component";
21
- import * as i6 from "./pager-next-buttons.component";
22
- import * as i7 from "./pager-info.component";
23
- import * as i8 from "./pager-page-sizes.component";
24
- import * as i9 from "@progress/kendo-angular-common";
25
- import * as i10 from "./localization/localized-messages.directive";
26
- import * as i11 from "@angular/common";
19
+ import * as i3 from "./navigation.service";
20
+ import * as i4 from "./pager-prev-buttons.component";
21
+ import * as i5 from "./pager-numeric-buttons.component";
22
+ import * as i6 from "./pager-input.component";
23
+ import * as i7 from "./pager-next-buttons.component";
24
+ import * as i8 from "./pager-info.component";
25
+ import * as i9 from "./pager-page-sizes.component";
26
+ import * as i10 from "@progress/kendo-angular-common";
27
+ import * as i11 from "./localization/localized-messages.directive";
28
+ import * as i12 from "@angular/common";
27
29
  export class PagerComponent {
28
- constructor(pagerContext, element, localization) {
30
+ constructor(pagerContext, element, localization, renderer, ngZone, navigationService) {
29
31
  this.pagerContext = pagerContext;
30
32
  this.element = element;
31
33
  this.localization = localization;
34
+ this.renderer = renderer;
35
+ this.ngZone = ngZone;
36
+ this.navigationService = navigationService;
32
37
  /**
33
38
  * Represents the total number of data items in the collection.
34
39
  */
@@ -65,10 +70,15 @@ export class PagerComponent {
65
70
  */
66
71
  this.pageSizeChange = new EventEmitter();
67
72
  this.pagerClass = true;
68
- this.widgetRole = 'navigation';
73
+ this.widgetRole = 'application';
74
+ this.roleDescription = 'pager';
75
+ this.keyShortcuts = 'Enter ArrowRight ArrowLeft';
76
+ this.hostTabindex = '0';
69
77
  this.subscriptions = new Subscription();
70
78
  this._templateContext = {};
71
79
  this._pageSizeValues = DEFAULT_PAGE_SIZE_VALUES;
80
+ this.isInnerNavigationEnabled = false;
81
+ this._navigable = false;
72
82
  this.resizeHandler = () => {
73
83
  if (this.template) {
74
84
  return;
@@ -100,9 +110,30 @@ export class PagerComponent {
100
110
  set pageSizeValues(pageSizeValues) {
101
111
  this._pageSizeValues = Array.isArray(pageSizeValues) ? pageSizeValues : pageSizeValues ? DEFAULT_PAGE_SIZE_VALUES : false;
102
112
  }
113
+ /**
114
+ * If set to `true`, the user can use dedicated shortcuts to interact with the Pager ([see example]({% slug keyboard_navigation_pager %})).
115
+ * By default, navigation is disabled and the Pager content is accessible in the normal tab sequence.
116
+ * @default false
117
+ */
118
+ set navigable(value) {
119
+ this._navigable = value;
120
+ this.navigationService.isNavigable = value;
121
+ }
122
+ ;
123
+ get navigable() {
124
+ return this._navigable;
125
+ }
126
+ ;
103
127
  get dir() {
104
128
  return this.direction;
105
129
  }
130
+ /**
131
+ * @hidden
132
+ */
133
+ focusHandler(ev) {
134
+ const isInnerNavigationEnabled = ev.target !== this.element.nativeElement;
135
+ this.navigationService.toggleInnerNavigation(isInnerNavigationEnabled);
136
+ }
106
137
  get totalPages() {
107
138
  return Math.ceil((this.total || 0) / this.pageSize);
108
139
  }
@@ -128,9 +159,17 @@ export class PagerComponent {
128
159
  this.subscriptions.add(this.localization.changes.subscribe(({ rtl }) => {
129
160
  this.direction = rtl ? 'rtl' : 'ltr';
130
161
  }));
162
+ this.subscriptions.add(this.navigationService.innerNavigationChange.subscribe(this.innerNavigationChange.bind(this)));
163
+ if (this.navigable) {
164
+ const wrapper = this.element.nativeElement;
165
+ this.ngZone.runOutsideAngular(() => {
166
+ this.subscriptions.add(this.renderer.listen(wrapper, 'keydown', this.keyDownHandler.bind(this)));
167
+ });
168
+ }
131
169
  }
132
170
  ngAfterViewInit() {
133
171
  this.resizeHandler();
172
+ this.renderer.setAttribute(this.element.nativeElement, 'aria-label', this.ariaLabel);
134
173
  }
135
174
  ngOnChanges(changes) {
136
175
  if (anyChanged(["pageSize", "skip", "total"], changes, false)) {
@@ -139,6 +178,7 @@ export class PagerComponent {
139
178
  skip: this.skip,
140
179
  total: this.total
141
180
  });
181
+ this.renderer.setAttribute(this.element.nativeElement, 'aria-label', this.ariaLabel);
142
182
  }
143
183
  }
144
184
  ngOnDestroy() {
@@ -173,11 +213,72 @@ export class PagerComponent {
173
213
  this.pageChange.emit({ skip: this.skip, take: event.newPageSize });
174
214
  }
175
215
  }
216
+ textFor(value) {
217
+ return this.localization.get(value);
218
+ }
219
+ get ariaLabel() {
220
+ return `${this.textFor('page')} ${this.currentPage} ${this.textFor('of')} ${this.totalPages}`;
221
+ }
222
+ keyDownHandler(e) {
223
+ const target = e.target;
224
+ const wrapper = this.element.nativeElement;
225
+ const isArrowLeftOrPageUp = e.keyCode === Keys.ArrowLeft || e.keyCode === Keys.PageUp;
226
+ const isArrowRightOrPageDown = e.keyCode === Keys.ArrowRight || e.keyCode === Keys.PageDown;
227
+ const isEnter = e.keyCode === Keys.Enter;
228
+ const isHome = e.keyCode === Keys.Home;
229
+ const isEnd = e.keyCode === Keys.End;
230
+ const isEsc = e.keyCode === Keys.Escape;
231
+ const isTab = e.keyCode === Keys.Tab;
232
+ const isFirstPage = this.currentPage === 1;
233
+ const isLastPage = this.currentPage === this.totalPages;
234
+ this.ngZone.run(() => {
235
+ if (isHome) {
236
+ e.preventDefault();
237
+ !isFirstPage && this.pagerContext.changePage(0);
238
+ }
239
+ else if (isEnd) {
240
+ e.preventDefault();
241
+ !isLastPage && this.pagerContext.changePage(this.totalPages - 1);
242
+ }
243
+ else if (this.isInnerNavigationEnabled) {
244
+ if (isEsc) {
245
+ this.navigationService.toggleInnerNavigation(false);
246
+ wrapper.focus();
247
+ }
248
+ else if (isTab) {
249
+ this.navigationService.keepFocusWithinComponent(wrapper, target, e);
250
+ }
251
+ }
252
+ else {
253
+ if (isArrowLeftOrPageUp) {
254
+ e.preventDefault();
255
+ !isFirstPage && this.pagerContext.prevPage();
256
+ }
257
+ else if (isArrowRightOrPageDown) {
258
+ e.preventDefault();
259
+ !isLastPage && this.pagerContext.nextPage();
260
+ }
261
+ else if (isEnter) {
262
+ if (e.target !== wrapper) {
263
+ return;
264
+ }
265
+ e.preventDefault();
266
+ const [firstFocusable] = this.navigationService.getFirstAndLastFocusable(wrapper);
267
+ this.navigationService.toggleInnerNavigation(true);
268
+ firstFocusable === null || firstFocusable === void 0 ? void 0 : firstFocusable.focus();
269
+ }
270
+ }
271
+ });
272
+ }
273
+ innerNavigationChange(value) {
274
+ this.isInnerNavigationEnabled = value;
275
+ }
176
276
  }
177
- PagerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: PagerComponent, deps: [{ token: i1.PagerContextService }, { token: i0.ElementRef }, { token: i2.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
178
- PagerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: PagerComponent, selector: "kendo-datapager", inputs: { total: "total", skip: "skip", pageSize: "pageSize", buttonCount: "buttonCount", info: "info", type: "type", pageSizeValues: "pageSizeValues", previousNext: "previousNext" }, outputs: { pageChange: "pageChange", pageSizeChange: "pageSizeChange" }, host: { properties: { "class.k-pager": "this.pagerClass", "attr.role": "this.widgetRole", "attr.dir": "this.dir" } }, providers: [
277
+ PagerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PagerComponent, deps: [{ token: i1.PagerContextService }, { token: i0.ElementRef }, { token: i2.LocalizationService }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i3.PagerNavigationService }], target: i0.ɵɵFactoryTarget.Component });
278
+ PagerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: PagerComponent, selector: "kendo-datapager", inputs: { total: "total", skip: "skip", pageSize: "pageSize", buttonCount: "buttonCount", info: "info", type: "type", pageSizeValues: "pageSizeValues", previousNext: "previousNext", navigable: "navigable" }, 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: [
179
279
  LocalizationService,
180
- PagerContextService
280
+ PagerContextService,
281
+ PagerNavigationService
181
282
  ], queries: [{ propertyName: "template", first: true, predicate: PagerTemplateDirective, descendants: true }], viewQueries: [{ propertyName: "resizeSensor", first: true, predicate: ResizeSensorComponent, descendants: true, static: true }], exportAs: ["kendoDataPager"], usesOnChanges: true, ngImport: i0, template: `
182
283
  <ng-container kendoDataPagerLocalizedMessages
183
284
  i18n-firstPage="kendo.pager.firstPage|The label for the first page button in the Pager"
@@ -209,6 +310,9 @@ PagerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version
209
310
 
210
311
  i18n-selectPage="kendo.pager.selectPage|The text of the title and aria-label attributes applied to the page chooser in the Pager"
211
312
  selectPage="Select page"
313
+
314
+ i18n-inputLabel="kendo.pager.inputLabel|The text of the aria-label attribute applied to the input element for entering the page number."
315
+ inputLabel="Type a page number"
212
316
  >
213
317
  </ng-container>
214
318
  <ng-container
@@ -228,15 +332,16 @@ PagerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version
228
332
  <kendo-datapager-page-sizes *ngIf="pageSizeValues" [pageSizes]="pageSizeValues"></kendo-datapager-page-sizes>
229
333
  </ng-container>
230
334
  <kendo-resize-sensor></kendo-resize-sensor>
231
- `, isInline: true, components: [{ type: i3.PagerPrevButtonsComponent, selector: "kendo-datapager-prev-buttons" }, { type: i4.PagerNumericButtonsComponent, selector: "kendo-datapager-numeric-buttons", inputs: ["buttonCount"] }, { type: i5.PagerInputComponent, selector: "kendo-datapager-input" }, { type: i6.PagerNextButtonsComponent, selector: "kendo-datapager-next-buttons" }, { type: i7.PagerInfoComponent, selector: "kendo-datapager-info" }, { type: i8.PagerPageSizesComponent, selector: "kendo-datapager-page-sizes", inputs: ["pageSizes"] }, { type: i9.ResizeSensorComponent, selector: "kendo-resize-sensor", inputs: ["rateLimit"], outputs: ["resize"] }], directives: [{ type: i10.LocalizedMessagesDirective, selector: "[kendoDataPagerLocalizedMessages]" }, { type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i11.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
232
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: PagerComponent, decorators: [{
335
+ `, isInline: true, components: [{ type: i4.PagerPrevButtonsComponent, selector: "kendo-datapager-prev-buttons" }, { type: i5.PagerNumericButtonsComponent, selector: "kendo-datapager-numeric-buttons", inputs: ["buttonCount"] }, { type: i6.PagerInputComponent, selector: "kendo-datapager-input" }, { type: i7.PagerNextButtonsComponent, selector: "kendo-datapager-next-buttons" }, { type: i8.PagerInfoComponent, selector: "kendo-datapager-info" }, { type: i9.PagerPageSizesComponent, selector: "kendo-datapager-page-sizes", inputs: ["pageSizes"] }, { type: i10.ResizeSensorComponent, selector: "kendo-resize-sensor", inputs: ["rateLimit"], outputs: ["resize"] }], directives: [{ type: i11.LocalizedMessagesDirective, selector: "[kendoDataPagerLocalizedMessages]" }, { type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i12.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
336
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PagerComponent, decorators: [{
233
337
  type: Component,
234
338
  args: [{
235
339
  selector: 'kendo-datapager',
236
340
  exportAs: 'kendoDataPager',
237
341
  providers: [
238
342
  LocalizationService,
239
- PagerContextService
343
+ PagerContextService,
344
+ PagerNavigationService
240
345
  ],
241
346
  template: `
242
347
  <ng-container kendoDataPagerLocalizedMessages
@@ -269,6 +374,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
269
374
 
270
375
  i18n-selectPage="kendo.pager.selectPage|The text of the title and aria-label attributes applied to the page chooser in the Pager"
271
376
  selectPage="Select page"
377
+
378
+ i18n-inputLabel="kendo.pager.inputLabel|The text of the aria-label attribute applied to the input element for entering the page number."
379
+ inputLabel="Type a page number"
272
380
  >
273
381
  </ng-container>
274
382
  <ng-container
@@ -290,7 +398,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
290
398
  <kendo-resize-sensor></kendo-resize-sensor>
291
399
  `
292
400
  }]
293
- }], ctorParameters: function () { return [{ type: i1.PagerContextService }, { type: i0.ElementRef }, { type: i2.LocalizationService }]; }, propDecorators: { resizeSensor: [{
401
+ }], ctorParameters: function () { return [{ type: i1.PagerContextService }, { type: i0.ElementRef }, { type: i2.LocalizationService }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: i3.PagerNavigationService }]; }, propDecorators: { resizeSensor: [{
294
402
  type: ViewChild,
295
403
  args: [ResizeSensorComponent, { static: true }]
296
404
  }], template: [{
@@ -312,6 +420,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
312
420
  type: Input
313
421
  }], previousNext: [{
314
422
  type: Input
423
+ }], navigable: [{
424
+ type: Input
315
425
  }], pageChange: [{
316
426
  type: Output
317
427
  }], pageSizeChange: [{
@@ -322,7 +432,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
322
432
  }], widgetRole: [{
323
433
  type: HostBinding,
324
434
  args: ['attr.role']
435
+ }], roleDescription: [{
436
+ type: HostBinding,
437
+ args: ['attr.aria-roledescription']
438
+ }], keyShortcuts: [{
439
+ type: HostBinding,
440
+ args: ['attr.aria-keyshortcuts']
441
+ }], hostTabindex: [{
442
+ type: HostBinding,
443
+ args: ['attr.tabindex']
325
444
  }], dir: [{
326
445
  type: HostBinding,
327
446
  args: ['attr.dir']
447
+ }], focusHandler: [{
448
+ type: HostListener,
449
+ args: ['focusin', ['$event']]
328
450
  }] } });
@@ -19,6 +19,7 @@ import { EventsModule } from '@progress/kendo-angular-common';
19
19
  import { LocalizedMessagesDirective } from './localization/localized-messages.directive';
20
20
  import { CustomMessagesComponent } from './localization/custom-messages.component';
21
21
  import { ResizeSensorModule } from '@progress/kendo-angular-common';
22
+ import { PagerFocusableDirective } from './focusable.directive';
22
23
  import * as i0 from "@angular/core";
23
24
  const importedModules = [
24
25
  CommonModule,
@@ -37,7 +38,8 @@ const INTERNAL_COMPONENTS = [
37
38
  PagerPageSizesComponent,
38
39
  PagerTemplateDirective,
39
40
  LocalizedMessagesDirective,
40
- CustomMessagesComponent
41
+ CustomMessagesComponent,
42
+ PagerFocusableDirective
41
43
  ];
42
44
  const providers = [
43
45
  {
@@ -62,8 +64,8 @@ export class PagerModule {
62
64
  ];
63
65
  }
64
66
  }
65
- PagerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: PagerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
66
- PagerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: PagerModule, declarations: [PagerComponent,
67
+ PagerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PagerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
68
+ PagerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PagerModule, declarations: [PagerComponent,
67
69
  PagerPrevButtonsComponent,
68
70
  PagerNextButtonsComponent,
69
71
  PagerNumericButtonsComponent,
@@ -72,7 +74,8 @@ PagerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "1
72
74
  PagerPageSizesComponent,
73
75
  PagerTemplateDirective,
74
76
  LocalizedMessagesDirective,
75
- CustomMessagesComponent], imports: [CommonModule,
77
+ CustomMessagesComponent,
78
+ PagerFocusableDirective], imports: [CommonModule,
76
79
  NumericTextBoxModule,
77
80
  DropDownListModule,
78
81
  EventsModule,
@@ -85,9 +88,10 @@ PagerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "1
85
88
  PagerPageSizesComponent,
86
89
  PagerTemplateDirective,
87
90
  LocalizedMessagesDirective,
88
- CustomMessagesComponent] });
89
- PagerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: PagerModule, providers: [providers], imports: [[...importedModules]] });
90
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: PagerModule, decorators: [{
91
+ CustomMessagesComponent,
92
+ PagerFocusableDirective] });
93
+ PagerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PagerModule, providers: [providers], imports: [[...importedModules]] });
94
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PagerModule, decorators: [{
91
95
  type: NgModule,
92
96
  args: [{
93
97
  declarations: [INTERNAL_COMPONENTS],
package/esm2015/util.js CHANGED
@@ -6,3 +6,29 @@
6
6
  * @hidden
7
7
  */
8
8
  export const DEFAULT_PAGE_SIZE_VALUES = [5, 10, 20];
9
+ /**
10
+ * @hidden
11
+ */
12
+ const focusableDirectiveSelector = '[kendoPagerFocusable]';
13
+ /**
14
+ * @hidden
15
+ */
16
+ export const getAllFocusableChildren = (parent) => {
17
+ return parent.querySelectorAll(focusableDirectiveSelector);
18
+ };
19
+ /**
20
+ * @hidden
21
+ */
22
+ export const focusableSelector = [
23
+ 'a[href]:not([disabled])',
24
+ 'area[href]:not([disabled])',
25
+ 'input:not([disabled])',
26
+ 'select:not([disabled])',
27
+ 'textarea:not([disabled])',
28
+ 'button',
29
+ 'iframe:not([disabled])',
30
+ 'object:not([disabled])',
31
+ 'embed:not([disabled])',
32
+ '*[tabindex]:not([disabled])',
33
+ '*[contenteditable]:not([disabled]):not([contenteditable="false"])'
34
+ ].join(',');