Skip to content

Commit 1f58ce3

Browse files
authored
Merge pull request #7280 from IgniteUI/paging-issue-7247
Pager: Total pages issue "0 of n" on remote paging
2 parents 1c72914 + c1c2d63 commit 1f58ce3

File tree

8 files changed

+139
-3
lines changed

8 files changed

+139
-3
lines changed

projects/igniteui-angular/src/lib/paginator/paginator.component.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ export class IgxPaginatorComponent extends DisplayDensityBase {
8383
this.perPageChange.emit(this._perPage);
8484
this._selectOptions = this.sortUniqueOptions(this.defaultSelectValues, this._perPage);
8585
this.totalPages = Math.ceil(this.totalRecords / this._perPage);
86-
if (this._page >= this.totalPages) {
87-
this._page = this.totalPages - 1;
86+
if (this.totalPages !== 0 && this.page >= this.totalPages) {
87+
this.page = this.totalPages - 1;
8888
}
8989
}
9090

src/app/app.component.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,11 @@ export class AppComponent implements OnInit {
247247
icon: 'view_column',
248248
name: 'Grid Remote Virtualization'
249249
},
250+
{
251+
link: '/gridRemotePaging',
252+
icon: 'view_column',
253+
name: 'Grid Remote Paging'
254+
},
250255
{
251256
link: '/gridRowEdit',
252257
icon: 'view_column',

src/app/app.module.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ import { GridColumnPinningSampleComponent } from './grid-column-pinning/grid-col
7171
import { GridColumnResizingSampleComponent } from './grid-column-resizing/grid-column-resizing.sample';
7272
import { GridSummaryComponent } from './grid-summaries/grid-summaries.sample';
7373
import { GridPerformanceSampleComponent } from './grid-performance/grid-performance.sample';
74+
import { GridRemotePagingSampleComponent } from './grid-remote-paging/grid-remote-paging.sample';
7475
import { GridSelectionComponent } from './grid-selection/grid-selection.sample';
7576
import { GridRowDraggableComponent } from './grid-row-draggable/grid-row-draggable.sample';
7677
import { GridToolbarSampleComponent } from './grid-toolbar/grid-toolbar.sample';
@@ -238,7 +239,8 @@ const components = [
238239
GridSaveStateComponent,
239240
AboutComponent,
240241
ReactiveFormSampleComponent,
241-
DateRangeSampleComponent
242+
DateRangeSampleComponent,
243+
GridRemotePagingSampleComponent
242244
];
243245

244246
@NgModule({

src/app/app.routing.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import { GridColumnPinningSampleComponent } from './grid-column-pinning/grid-col
4444
import { GridColumnResizingSampleComponent } from './grid-column-resizing/grid-column-resizing.sample';
4545
import { GridSummaryComponent } from './grid-summaries/grid-summaries.sample';
4646
import { GridPerformanceSampleComponent } from './grid-performance/grid-performance.sample';
47+
import { GridRemotePagingSampleComponent } from './grid-remote-paging/grid-remote-paging.sample';
4748
import { GridSelectionComponent } from './grid-selection/grid-selection.sample';
4849
import { GridRowDraggableComponent } from './grid-row-draggable/grid-row-draggable.sample';
4950
import { GridVirtualizationSampleComponent } from './grid-remote-virtualization/grid-remote-virtualization.sample';
@@ -276,6 +277,10 @@ const appRoutes = [
276277
path: 'gridPerformance',
277278
component: GridPerformanceSampleComponent
278279
},
280+
{
281+
path: 'gridRemotePaging',
282+
component: GridRemotePagingSampleComponent
283+
},
279284
{
280285
path: 'gridSelection',
281286
component: GridSelectionComponent
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<div class="sample-wrapper dark-grid">
2+
<igx-grid igxPreventDocumentScroll #grid1 [data]="data | async" width="100%" height="540px" [paging]="true" [perPage]="perPage" [paginationTemplate]="customPager">
3+
<igx-column field="ID"></igx-column>
4+
<igx-column field="ProductName"></igx-column>
5+
<igx-column field="QuantityPerUnit"></igx-column>
6+
<igx-column field="SupplierName"></igx-column>
7+
<igx-column field="UnitsInStock"></igx-column>
8+
<igx-column field="Rating"></igx-column>
9+
</igx-grid>
10+
<ng-template #customPager let-api>
11+
<igx-paginator #paginator
12+
[totalRecords]="totalCount"
13+
[(page)]="page"
14+
[(perPage)]="perPage"
15+
[selectLabel]="'Records per page:'"
16+
[selectOptions]="selectOptions"
17+
[displayDensity]="grid1.displayDensity"
18+
(pageChange)="paginate($event)"
19+
(perPageChange)="perPageChange($event)">
20+
</igx-paginator>
21+
</ng-template>
22+
</div>
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import { AfterViewInit, Component, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core';
2+
import { IgxGridComponent } from 'igniteui-angular';
3+
import { RemoteService } from '../shared/remote.service';
4+
import { Observable } from 'rxjs';
5+
6+
@Component({
7+
selector: 'app-grid-remote-paging-sample',
8+
templateUrl: 'grid-remote-paging.sample.html'
9+
})
10+
export class GridRemotePagingSampleComponent implements OnInit, AfterViewInit, OnDestroy {
11+
12+
public page = 0;
13+
public totalCount = 0;
14+
public pages = [];
15+
public data: Observable<any[]>;
16+
public selectOptions = [5, 10, 15, 25, 50];
17+
18+
@ViewChild('customPager', { read: TemplateRef, static: true }) public remotePager: TemplateRef<any>;
19+
@ViewChild('grid1', { static: true }) public grid1: IgxGridComponent;
20+
21+
private _perPage = 10;
22+
private _dataLengthSubscriber;
23+
24+
constructor(private remoteService: RemoteService) {
25+
}
26+
27+
public get perPage(): number {
28+
return this._perPage;
29+
}
30+
31+
public set perPage(val: number) {
32+
this._perPage = val;
33+
// this.paginate(0);
34+
}
35+
36+
public ngOnInit() {
37+
this.data = this.remoteService.remotePagingData.asObservable();
38+
39+
this._dataLengthSubscriber = this.remoteService.getPagingDataLength().subscribe((data) => {
40+
this.totalCount = data;
41+
this.grid1.isLoading = false;
42+
});
43+
}
44+
45+
public ngOnDestroy() {
46+
if (this._dataLengthSubscriber) {
47+
this._dataLengthSubscriber.unsubscribe();
48+
}
49+
}
50+
51+
public ngAfterViewInit() {
52+
this.grid1.isLoading = true;
53+
this.remoteService.getPagingData(0, this.perPage);
54+
}
55+
56+
public paginate(page: number) {
57+
this.page = page;
58+
const skip = this.page * this.perPage;
59+
const top = this.perPage;
60+
61+
this.remoteService.getPagingData(skip, top);
62+
}
63+
64+
public perPageChange(perPage: number) {
65+
const skip = this.page * perPage;
66+
const top = perPage;
67+
68+
this.remoteService.getPagingData(skip, top);
69+
}
70+
}

src/app/routing.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ import { GridColumnResizingSampleComponent } from './grid-column-resizing/grid-c
5454
import { GridGroupBySampleComponent } from './grid-groupby/grid-groupby.sample';
5555
import { GridSummaryComponent } from './grid-summaries/grid-summaries.sample';
5656
import { GridPerformanceSampleComponent } from './grid-performance/grid-performance.sample';
57+
import { GridRemotePagingSampleComponent } from './grid-remote-paging/grid-remote-paging.sample';
5758
import { GridSelectionComponent } from './grid-selection/grid-selection.sample';
5859
import { GridRowDraggableComponent } from './grid-row-draggable/grid-row-draggable.sample';
5960
import { GridToolbarSampleComponent } from './grid-toolbar/grid-toolbar.sample';
@@ -365,6 +366,10 @@ const appRoutes = [
365366
path: 'gridRowPinning',
366367
component: GridRowPinningSampleComponent
367368
},
369+
{
370+
path: 'gridRemotePaging',
371+
component: GridRemotePagingSampleComponent
372+
},
368373
{
369374
path: 'gridColumnResizing',
370375
component: GridColumnResizingSampleComponent

src/app/shared/remote.service.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import { HttpClient } from '@angular/common/http';
66
@Injectable()
77
export class RemoteService {
88

9+
public remotePagingData: BehaviorSubject<any[]>;
10+
public urlPaging = 'https://www.igniteui.com/api/products';
911
totalCount: Observable<number>;
1012
_totalCount: BehaviorSubject<number>;
1113
remoteData: Observable<any[]>;
@@ -18,6 +20,7 @@ export class RemoteService {
1820
this.remoteData = this._remoteData.asObservable();
1921
this._totalCount = new BehaviorSubject(null);
2022
this.totalCount = this._totalCount.asObservable();
23+
this.remotePagingData = new BehaviorSubject([]);
2124
}
2225

2326
nullData() {
@@ -45,4 +48,28 @@ export class RemoteService {
4548
buildUrl(dataState: any) {
4649
return this.urlBuilder(dataState);
4750
}
51+
52+
// Remote paging
53+
public getPagingData(index?: number, perPage?: number): any {
54+
let qS = '';
55+
56+
if (perPage) {
57+
qS = `?$skip=${index}&$top=${perPage}&$count=true`;
58+
}
59+
60+
this.http
61+
.get(`${this.urlPaging + qS}`).pipe(
62+
map((data: any) => {
63+
return data;
64+
})
65+
).subscribe((data) => this.remotePagingData.next(data));
66+
}
67+
68+
public getPagingDataLength(): any {
69+
return this.http.get(this.urlPaging).pipe(
70+
map((data: any) => {
71+
return data.length;
72+
})
73+
);
74+
}
4875
}

0 commit comments

Comments
 (0)