Skip to content

Commit 2644ca0

Browse files
committed
fix(paginator): getNumberOfPages off by one
1 parent 65cff32 commit 2644ca0

File tree

4 files changed

+25
-6
lines changed

4 files changed

+25
-6
lines changed

src/demo-app/demo-app/demo-module.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ import {TableDemoModule} from '../table/table-demo-module';
6464
import {BadgeDemo} from '../badge/badge-demo';
6565
import {TreeDemoModule} from '../tree/tree-demo-module';
6666
import {ConnectedOverlayDemo, DemoOverlay} from '../connected-overlay/connected-overlay-demo';
67-
import {PaginatorDemo} from 'paginator/paginator-demo';
67+
import {PaginatorDemo} from '../paginator/paginator-demo';
6868

6969
@NgModule({
7070
imports: [

src/demo-app/paginator/paginator-demo.html

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ <h2>No inputs</h2>
2222
<mat-slide-toggle [(ngModel)]="showFirstLastButtons">Show first/last buttons</mat-slide-toggle>
2323
</div>
2424

25-
<mat-paginator (page)="handlePageEvent($event)"
25+
<mat-paginator #paginator
26+
(page)="handlePageEvent($event)"
2627
[length]="length"
2728
[pageSize]="pageSize"
2829
[showFirstLastButtons]="showFirstLastButtons"
@@ -32,4 +33,5 @@ <h2>No inputs</h2>
3233
</mat-paginator>
3334

3435
<div> Output event: {{pageEvent | json}} </div>
36+
<div> getNumberOfPages: {{paginator.getNumberOfPages()}} </div>
3537
</mat-card>

src/lib/paginator/paginator.spec.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,23 @@ describe('MatPaginator', () => {
295295
expect(paginationEvent ? paginationEvent.pageIndex : null).toBe(0);
296296
});
297297

298+
it('should keep track of the right number of pages', () => {
299+
component.pageSize = 10;
300+
component.length = 100;
301+
fixture.detectChanges();
302+
expect(paginator.getNumberOfPages()).toBe(10);
303+
304+
component.pageSize = 10;
305+
component.length = 0;
306+
fixture.detectChanges();
307+
expect(paginator.getNumberOfPages()).toBe(0);
308+
309+
component.pageSize = 10;
310+
component.length = 10;
311+
fixture.detectChanges();
312+
expect(paginator.getNumberOfPages()).toBe(1);
313+
});
314+
298315
it('should show a select only if there are multiple options', () => {
299316
expect(paginator._displayedPageSizeOptions).toEqual([5, 10, 25, 100]);
300317
expect(fixture.nativeElement.querySelector('.mat-select')).not.toBeNull();

src/lib/paginator/paginator.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ export class MatPaginator implements OnInit, OnDestroy {
159159
lastPage(): void {
160160
// hasNextPage being false implies at the end
161161
if (!this.hasNextPage()) { return; }
162-
this.pageIndex = this.getNumberOfPages();
162+
this.pageIndex = this.getNumberOfPages() - 1;
163163
this._emitPageEvent();
164164
}
165165

@@ -170,13 +170,13 @@ export class MatPaginator implements OnInit, OnDestroy {
170170

171171
/** Whether there is a next page. */
172172
hasNextPage(): boolean {
173-
const numberOfPages = this.getNumberOfPages();
174-
return this.pageIndex < numberOfPages && this.pageSize != 0;
173+
const maxPageIndex = this.getNumberOfPages() - 1;
174+
return this.pageIndex < maxPageIndex && this.pageSize != 0;
175175
}
176176

177177
/** Calculate the number of pages */
178178
getNumberOfPages(): number {
179-
return Math.ceil(this.length / this.pageSize) - 1;
179+
return Math.ceil(this.length / this.pageSize);
180180
}
181181

182182

0 commit comments

Comments
 (0)