From 1d5b9e67386f57bdd66bfeaa4618d6600624156d Mon Sep 17 00:00:00 2001 From: Andrew Seguin Date: Thu, 10 May 2018 10:06:09 -0700 Subject: [PATCH] fix(paginator): getNumberOfPages off by one --- src/demo-app/paginator/paginator-demo.html | 4 +++- src/lib/paginator/paginator.spec.ts | 17 +++++++++++++++++ src/lib/paginator/paginator.ts | 12 ++++++++---- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/demo-app/paginator/paginator-demo.html b/src/demo-app/paginator/paginator-demo.html index b011fbab4826..d75b72294f99 100644 --- a/src/demo-app/paginator/paginator-demo.html +++ b/src/demo-app/paginator/paginator-demo.html @@ -22,7 +22,8 @@

No inputs

Show first/last buttons - No inputs
Output event: {{pageEvent | json}}
+
getNumberOfPages: {{paginator.getNumberOfPages()}}
diff --git a/src/lib/paginator/paginator.spec.ts b/src/lib/paginator/paginator.spec.ts index 044dc207fcda..131caf899c5e 100644 --- a/src/lib/paginator/paginator.spec.ts +++ b/src/lib/paginator/paginator.spec.ts @@ -325,6 +325,23 @@ describe('MatPaginator', () => { })); }); + it('should keep track of the right number of pages', () => { + component.pageSize = 10; + component.length = 100; + fixture.detectChanges(); + expect(paginator.getNumberOfPages()).toBe(10); + + component.pageSize = 10; + component.length = 0; + fixture.detectChanges(); + expect(paginator.getNumberOfPages()).toBe(0); + + component.pageSize = 10; + component.length = 10; + fixture.detectChanges(); + expect(paginator.getNumberOfPages()).toBe(1); + }); + it('should show a select only if there are multiple options', () => { expect(paginator._displayedPageSizeOptions).toEqual([5, 10, 25, 100]); expect(fixture.nativeElement.querySelector('.mat-select')).not.toBeNull(); diff --git a/src/lib/paginator/paginator.ts b/src/lib/paginator/paginator.ts index 266425944efa..59821c867587 100644 --- a/src/lib/paginator/paginator.ts +++ b/src/lib/paginator/paginator.ts @@ -181,7 +181,7 @@ export class MatPaginator extends _MatPaginatorBase implements OnInit, OnDestroy if (!this.hasNextPage()) { return; } const previousPageIndex = this.pageIndex; - this.pageIndex = this.getNumberOfPages(); + this.pageIndex = this.getNumberOfPages() - 1; this._emitPageEvent(previousPageIndex); } @@ -192,13 +192,17 @@ export class MatPaginator extends _MatPaginatorBase implements OnInit, OnDestroy /** Whether there is a next page. */ hasNextPage(): boolean { - const numberOfPages = this.getNumberOfPages(); - return this.pageIndex < numberOfPages && this.pageSize != 0; + const maxPageIndex = this.getNumberOfPages() - 1; + return this.pageIndex < maxPageIndex && this.pageSize != 0; } /** Calculate the number of pages */ getNumberOfPages(): number { - return Math.ceil(this.length / this.pageSize) - 1; + if (!this.pageSize) { + return 0; + } + + return Math.ceil(this.length / this.pageSize); }