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

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>
@@ -9,6 +9,7 @@ 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
11
  import * as i3 from "@progress/kendo-angular-dropdowns";
12
+ import * as i4 from "./focusable.directive";
12
13
  /**
13
14
  * Displays a drop-down list for the page size selection ([see example]({% slug pager_settings %})).
14
15
  */
@@ -187,9 +188,9 @@ export class PagerPageSizesComponent extends PagerElementComponent {
187
188
  this.cd.markForCheck();
188
189
  }
189
190
  }
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
191
+ 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 }], target: i0.ɵɵFactoryTarget.Component });
192
+ 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: `
193
+ <kendo-dropdownlist kendoPagerFocusable
193
194
  #dropdownlist
194
195
  [data]="pageSizes"
195
196
  textField="text"
@@ -198,14 +199,14 @@ PagerPageSizesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0"
198
199
  [value]="pageSize"
199
200
  (valueChange)="pageSizeChange($event, dropdownlist)"></kendo-dropdownlist>
200
201
  {{ 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: [{
202
+ `, 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 });
203
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PagerPageSizesComponent, decorators: [{
203
204
  type: Component,
204
205
  args: [{
205
206
  changeDetection: ChangeDetectionStrategy.OnPush,
206
207
  selector: 'kendo-datapager-page-sizes',
207
208
  template: `
208
- <kendo-dropdownlist
209
+ <kendo-dropdownlist kendoPagerFocusable
209
210
  #dropdownlist
210
211
  [data]="pageSizes"
211
212
  textField="text"
@@ -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,68 @@ 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 && !isFirstPage) {
236
+ this.pagerContext.changePage(0);
237
+ }
238
+ else if (isEnd && !isLastPage) {
239
+ this.pagerContext.changePage(this.totalPages - 1);
240
+ }
241
+ else if (this.isInnerNavigationEnabled) {
242
+ if (isEsc) {
243
+ this.navigationService.toggleInnerNavigation(false);
244
+ wrapper.focus();
245
+ }
246
+ else if (isTab) {
247
+ this.navigationService.keepFocusWithinComponent(wrapper, target, e);
248
+ }
249
+ }
250
+ else {
251
+ if (isArrowLeftOrPageUp && !isFirstPage) {
252
+ this.pagerContext.prevPage();
253
+ }
254
+ else if (isArrowRightOrPageDown && !isLastPage) {
255
+ this.pagerContext.nextPage();
256
+ }
257
+ else if (isEnter) {
258
+ if (e.target !== wrapper) {
259
+ return;
260
+ }
261
+ e.preventDefault();
262
+ const [firstFocusable] = this.navigationService.getFirstAndLastFocusable(wrapper);
263
+ this.navigationService.toggleInnerNavigation(true);
264
+ firstFocusable === null || firstFocusable === void 0 ? void 0 : firstFocusable.focus();
265
+ }
266
+ }
267
+ });
268
+ }
269
+ innerNavigationChange(value) {
270
+ this.isInnerNavigationEnabled = value;
271
+ }
176
272
  }
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: [
273
+ 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 });
274
+ 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
275
  LocalizationService,
180
- PagerContextService
276
+ PagerContextService,
277
+ PagerNavigationService
181
278
  ], 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
279
  <ng-container kendoDataPagerLocalizedMessages
183
280
  i18n-firstPage="kendo.pager.firstPage|The label for the first page button in the Pager"
@@ -209,6 +306,9 @@ PagerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version
209
306
 
210
307
  i18n-selectPage="kendo.pager.selectPage|The text of the title and aria-label attributes applied to the page chooser in the Pager"
211
308
  selectPage="Select page"
309
+
310
+ i18n-inputLabel="kendo.pager.inputLabel|The text of the aria-label attribute applied to the input element for entering the page number."
311
+ inputLabel="Type a page number"
212
312
  >
213
313
  </ng-container>
214
314
  <ng-container
@@ -228,15 +328,16 @@ PagerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version
228
328
  <kendo-datapager-page-sizes *ngIf="pageSizeValues" [pageSizes]="pageSizeValues"></kendo-datapager-page-sizes>
229
329
  </ng-container>
230
330
  <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: [{
331
+ `, 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"] }] });
332
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: PagerComponent, decorators: [{
233
333
  type: Component,
234
334
  args: [{
235
335
  selector: 'kendo-datapager',
236
336
  exportAs: 'kendoDataPager',
237
337
  providers: [
238
338
  LocalizationService,
239
- PagerContextService
339
+ PagerContextService,
340
+ PagerNavigationService
240
341
  ],
241
342
  template: `
242
343
  <ng-container kendoDataPagerLocalizedMessages
@@ -269,6 +370,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
269
370
 
270
371
  i18n-selectPage="kendo.pager.selectPage|The text of the title and aria-label attributes applied to the page chooser in the Pager"
271
372
  selectPage="Select page"
373
+
374
+ i18n-inputLabel="kendo.pager.inputLabel|The text of the aria-label attribute applied to the input element for entering the page number."
375
+ inputLabel="Type a page number"
272
376
  >
273
377
  </ng-container>
274
378
  <ng-container
@@ -290,7 +394,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
290
394
  <kendo-resize-sensor></kendo-resize-sensor>
291
395
  `
292
396
  }]
293
- }], ctorParameters: function () { return [{ type: i1.PagerContextService }, { type: i0.ElementRef }, { type: i2.LocalizationService }]; }, propDecorators: { resizeSensor: [{
397
+ }], ctorParameters: function () { return [{ type: i1.PagerContextService }, { type: i0.ElementRef }, { type: i2.LocalizationService }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: i3.PagerNavigationService }]; }, propDecorators: { resizeSensor: [{
294
398
  type: ViewChild,
295
399
  args: [ResizeSensorComponent, { static: true }]
296
400
  }], template: [{
@@ -312,6 +416,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
312
416
  type: Input
313
417
  }], previousNext: [{
314
418
  type: Input
419
+ }], navigable: [{
420
+ type: Input
315
421
  }], pageChange: [{
316
422
  type: Output
317
423
  }], pageSizeChange: [{
@@ -322,7 +428,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
322
428
  }], widgetRole: [{
323
429
  type: HostBinding,
324
430
  args: ['attr.role']
431
+ }], roleDescription: [{
432
+ type: HostBinding,
433
+ args: ['attr.aria-roledescription']
434
+ }], keyShortcuts: [{
435
+ type: HostBinding,
436
+ args: ['attr.aria-keyshortcuts']
437
+ }], hostTabindex: [{
438
+ type: HostBinding,
439
+ args: ['attr.tabindex']
325
440
  }], dir: [{
326
441
  type: HostBinding,
327
442
  args: ['attr.dir']
443
+ }], focusHandler: [{
444
+ type: HostListener,
445
+ args: ['focusin', ['$event']]
328
446
  }] } });
@@ -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(',');