Since mat paginator does not have go to specific page, Here I created a component wrapping mat paginator.
mat-paginator-goto.component.ts
import {
Component,
OnInit,
Input,
Output,
EventEmitter,
ViewChild
} from "@angular/core";
import { MatPaginator, PageEvent } from "@angular/material/paginator";
@Component({
selector: "mat-paginator-goto",
templateUrl: "./mat-paginator-goto.component.html",
styleUrls: ["./mat-paginator-goto.component.scss"]
})
export class MatPaginatorGotoComponent implements OnInit {
pageSize: number;
pageIndex: number;
length: number;
goTo: number;
pageNumbers: number[];
@ViewChild(MatPaginator) paginator: MatPaginator;
@Input() disabled = false;
@Input() hidePageSize = false;
@Input() pageSizeOptions: number[];
@Input() showFirstLastButtons = false;
@Output() page = new EventEmitter<PageEvent>();
@Input("pageIndex") set pageIndexChanged(pageIndex: number) {
this.pageIndex = pageIndex;
}
@Input("length") set lengthChanged(length: number) {
this.length = length;
this.updateGoto();
}
@Input("pageSize") set pageSizeChanged(pageSize: number) {
this.pageSize = pageSize;
this.updateGoto();
}
constructor() {}
ngOnInit() {
this.updateGoto();
}
updateGoto() {
this.goTo = (this.pageIndex || 0) + 1;
this.pageNumbers = [];
for (let i = 1; i <= Math.ceil(this.length / this.pageSize); i++) {
this.pageNumbers.push(i);
}
}
paginationChange(pageEvt: PageEvent) {
this.length = pageEvt.length;
this.pageIndex = pageEvt.pageIndex;
this.pageSize = pageEvt.pageSize;
this.updateGoto();
this.emitPageEvent(pageEvt);
}
goToChange() {
this.paginator.pageIndex = this.goTo - 1;
const event: PageEvent = {
length: this.paginator.length,
pageIndex: this.paginator.pageIndex,
pageSize: this.paginator.pageSize
};
this.paginator.page.next(event);
this.emitPageEvent(event);
}
emitPageEvent(pageEvent: PageEvent) {
this.page.next(pageEvent);
}
}
mat-paginator-goto.component.html
<div class="d-flex">
<mat-paginator [length]="length" [pageIndex]="pageIndex" [pageSize]="pageSize" [pageSizeOptions]="pageSizeOptions" (page)="paginationChange($event)">
</mat-paginator>
<div class="go-to-container">
<div class="go-to-label">Go To: </div>
<mat-form-field>
<mat-select [(ngModel)]="goTo" (selectionChange)="goToChange()">
<mat-option *ngFor="let pageNumber of pageNumbers" [value]="pageNumber">{{pageNumber}}</mat-option>
</mat-select>
</mat-form-field>
</div>
</div>
mat-paginator-goto.component.scss
//Bootstrap Temp
.d-flex {
display: flex;
}
//Original
.go-to-container {
display: flex;
align-items: baseline;
background: white;
mat-form-field {
width: 56px;
margin: 6px 4px 0 4px;
font-size: 12px;
}
.go-to-label {
margin: 0 4px;
font-size: 12px;
color: rgba(0,0,0,.54);
font-family: Roboto, "Helvetica Neue", sans-serif;
}
}
Simply import it in module and use.
import { MatPaginatorGotoComponent } from './mat-paginator-goto/mat-paginator-goto.component';
@NgModule({
declarations: [ MatPaginatorGotoComponent ],
})


Comments
Post a Comment