ag-grid
Version:
Advanced Data Grid / Data Table supporting Javascript / React / AngularJS / Web Components
187 lines (152 loc) • 7.48 kB
text/typescript
import {Component} from "../../widgets/component";
import {Autowired, PostConstruct} from "../../context/context";
import {GridOptionsWrapper} from "../../gridOptionsWrapper";
import {RefSelector} from "../../widgets/componentAnnotations";
import {_} from "../../utils";
import {EventService} from "../../eventService";
import {Events} from "../../events";
import {RowRenderer} from "../../rendering/rowRenderer";
import {PaginationProxy} from "../paginationProxy";
export class PaginationComp extends Component {
private gridOptionsWrapper: GridOptionsWrapper;
private eventService: EventService;
private paginationProxy: PaginationProxy;
private rowRenderer: RowRenderer;
private btFirst: HTMLButtonElement;
private btPrevious: HTMLButtonElement;
private btNext: HTMLButtonElement;
private btLast: HTMLButtonElement;
private lbRecordCount: any;
private lbFirstRowOnPage: any;
private lbLastRowOnPage: any;
private eSummaryPanel: any;
private lbCurrent: any;
private lbTotal: any;
constructor() {
super();
}
private postConstruct(): void {
this.setTemplate(this.getTemplate());
let isPaging = this.gridOptionsWrapper.isPagination();
let paginationPanelEnabled = isPaging && !this.gridOptionsWrapper.isSuppressPaginationPanel();
if (!paginationPanelEnabled) {
this.setVisible(false);
return;
}
this.addDestroyableEventListener(this.eventService, Events.EVENT_PAGINATION_CHANGED, this.onPaginationChanged.bind(this));
this.addDestroyableEventListener(this.btFirst, 'click', this.onBtFirst.bind(this));
this.addDestroyableEventListener(this.btLast, 'click', this.onBtLast.bind(this));
this.addDestroyableEventListener(this.btNext, 'click', this.onBtNext.bind(this));
this.addDestroyableEventListener(this.btPrevious, 'click', this.onBtPrevious.bind(this));
this.onPaginationChanged();
}
private onPaginationChanged(): void{
this.enableOrDisableButtons();
this.updateRowLabels();
this.setCurrentPageLabel();
this.setTotalLabels();
}
private setCurrentPageLabel(): void {
let pagesExist = this.paginationProxy.getTotalPages() > 0;
let currentPage = this.paginationProxy.getCurrentPage();
let toDisplay = pagesExist ? currentPage + 1 : 0;
this.lbCurrent.innerHTML = this.formatNumber(toDisplay);
}
private formatNumber(value: number): string {
let userFunc = this.gridOptionsWrapper.getPaginationNumberFormatterFunc();
if (userFunc) {
return userFunc({value: value});
} else {
return _.formatNumberCommas(value);
}
}
private getTemplate(): string {
let localeTextFunc = this.gridOptionsWrapper.getLocaleTextFunc();
let strPage = localeTextFunc('page', 'Page');
let strTo = localeTextFunc('to', 'to');
let strOf = localeTextFunc('of', 'of');
let strFirst = localeTextFunc('first', 'First');
let strPrevious = localeTextFunc('previous', 'Previous');
let strNext = localeTextFunc('next', 'Next');
let strLast = localeTextFunc('last', 'Last');
return `<div class="ag-paging-panel ag-font-style">
<span ref="eSummaryPanel" class="ag-paging-row-summary-panel">
<span ref="lbFirstRowOnPage"></span> ${strTo} <span ref="lbLastRowOnPage"></span> ${strOf} <span ref="lbRecordCount"></span>
</span>
<span class="ag-paging-page-summary-panel">
<button type="button" class="ag-paging-button" ref="btFirst">${strFirst}</button>
<button type="button" class="ag-paging-button" ref="btPrevious">${strPrevious}</button>
${strPage} <span ref="lbCurrent"></span> ${strOf} <span ref="lbTotal"></span>
<button type="button" class="ag-paging-button" ref="btNext">${strNext}</button>
<button type="button" class="ag-paging-button" ref="btLast">${strLast}</button>
</span>
</div>`;
}
private onBtNext() {
this.paginationProxy.goToNextPage();
}
private onBtPrevious() {
this.paginationProxy.goToPreviousPage();
}
private onBtFirst() {
this.paginationProxy.goToFirstPage();
}
private onBtLast() {
this.paginationProxy.goToLastPage();
}
private enableOrDisableButtons() {
let currentPage = this.paginationProxy.getCurrentPage();
let maxRowFound = this.paginationProxy.isLastPageFound();
let totalPages = this.paginationProxy.getTotalPages();
let disablePreviousAndFirst = currentPage === 0;
this.btPrevious.disabled = disablePreviousAndFirst;
this.btFirst.disabled = disablePreviousAndFirst;
let zeroPagesToDisplay = this.isZeroPagesToDisplay();
let onLastPage = maxRowFound && currentPage === (totalPages - 1);
let disableNext = onLastPage || zeroPagesToDisplay;
this.btNext.disabled = disableNext;
let disableLast = !maxRowFound || zeroPagesToDisplay || currentPage === (totalPages - 1);
this.btLast.disabled = disableLast;
}
private updateRowLabels() {
let currentPage = this.paginationProxy.getCurrentPage();
let pageSize = this.paginationProxy.getPageSize();
let maxRowFound = this.paginationProxy.isLastPageFound();
let rowCount = this.paginationProxy.isLastPageFound() ?
this.paginationProxy.getTotalRowCount() : null;
let startRow: any;
let endRow: any;
if (this.isZeroPagesToDisplay()) {
startRow = 0;
endRow = 0;
} else {
startRow = (pageSize * currentPage) + 1;
endRow = startRow + pageSize - 1;
if (maxRowFound && endRow > rowCount) {
endRow = rowCount;
}
}
this.lbFirstRowOnPage.innerHTML = this.formatNumber(startRow);
this.lbLastRowOnPage.innerHTML = this.formatNumber(endRow);
}
private isZeroPagesToDisplay() {
let maxRowFound = this.paginationProxy.isLastPageFound();
let totalPages = this.paginationProxy.getTotalPages();
return maxRowFound && totalPages === 0;
}
private setTotalLabels() {
let lastPageFound = this.paginationProxy.isLastPageFound();
let totalPages = this.paginationProxy.getTotalPages();
let rowCount = this.paginationProxy.isLastPageFound() ?
this.paginationProxy.getTotalRowCount() : null;
if (lastPageFound) {
this.lbTotal.innerHTML = this.formatNumber(totalPages);
this.lbRecordCount.innerHTML = this.formatNumber(rowCount);
} else {
let moreText = this.gridOptionsWrapper.getLocaleTextFunc()('more', 'more');
this.lbTotal.innerHTML = moreText;
this.lbRecordCount.innerHTML = moreText;
}
}
}