ag-grid
Version:
Advanced Javascript Datagrid. Supports raw Javascript, AngularJS 1.x, AngularJS 2.0 and Web Components
307 lines (253 loc) • 11.3 kB
text/typescript
/// <reference path="../utils.ts" />
module ag.grid {
var utils = Utils;
var template =
'<div class="ag-paging-panel">'+
'<span id="pageRowSummaryPanel" class="ag-paging-row-summary-panel">'+
'<span id="firstRowOnPage"></span>'+
' [TO] '+
'<span id="lastRowOnPage"></span>'+
' [OF] '+
'<span id="recordCount"></span>'+
'</span>'+
'<span class="ag-paging-page-summary-panel">'+
'<button class="ag-paging-button" id="btFirst">[FIRST]</button>'+
'<button class="ag-paging-button" id="btPrevious">[PREVIOUS]</button>'+
'[PAGE] '+
'<span id="current"></span>'+
' [OF] '+
'<span id="total"></span>'+
'<button class="ag-paging-button" id="btNext">[NEXT]</button>'+
'<button class="ag-paging-button" id="btLast">[LAST]</button>'+
'</span>'+
'</div>';
export class PaginationController {
eGui: any;
btNext: any;
btPrevious: any;
btFirst: any;
btLast: any;
lbCurrent: any;
lbTotal: any;
lbRecordCount: any;
lbFirstRowOnPage: any;
lbLastRowOnPage: any;
ePageRowSummaryPanel: any;
angularGrid: any;
callVersion: any;
gridOptionsWrapper: any;
datasource: any;
pageSize: any;
rowCount: any;
foundMaxRow: any;
totalPages: any;
currentPage: any;
init(angularGrid: any, gridOptionsWrapper: any) {
this.gridOptionsWrapper = gridOptionsWrapper;
this.angularGrid = angularGrid;
this.setupComponents();
this.callVersion = 0;
}
setDatasource(datasource: any) {
this.datasource = datasource;
if (!datasource) {
// only continue if we have a valid datasource to work with
return;
}
this.reset();
}
reset() {
// copy pageSize, to guard against it changing the the datasource between calls
if (this.datasource.pageSize && typeof this.datasource.pageSize !== 'number') {
console.warn('datasource.pageSize should be a number');
}
this.pageSize = this.datasource.pageSize;
// see if we know the total number of pages, or if it's 'to be decided'
if (typeof this.datasource.rowCount === 'number' && this.datasource.rowCount >= 0) {
this.rowCount = this.datasource.rowCount;
this.foundMaxRow = true;
this.calculateTotalPages();
} else {
this.rowCount = 0;
this.foundMaxRow = false;
this.totalPages = null;
}
this.currentPage = 0;
// hide the summary panel until something is loaded
this.ePageRowSummaryPanel.style.visibility = 'hidden';
this.setTotalLabels();
this.loadPage();
}
setTotalLabels() {
if (this.foundMaxRow) {
this.lbTotal.innerHTML = this.totalPages.toLocaleString();
this.lbRecordCount.innerHTML = this.rowCount.toLocaleString();
} else {
var moreText = this.gridOptionsWrapper.getLocaleTextFunc()('more', 'more');
this.lbTotal.innerHTML = moreText;
this.lbRecordCount.innerHTML = moreText;
}
}
calculateTotalPages() {
this.totalPages = Math.floor((this.rowCount - 1) / this.pageSize) + 1;
}
pageLoaded(rows: any, lastRowIndex: any) {
var firstId = this.currentPage * this.pageSize;
this.angularGrid.setRows(rows, firstId);
// see if we hit the last row
if (!this.foundMaxRow && typeof lastRowIndex === 'number' && lastRowIndex >= 0) {
this.foundMaxRow = true;
this.rowCount = lastRowIndex;
this.calculateTotalPages();
this.setTotalLabels();
// if overshot pages, go back
if (this.currentPage > this.totalPages) {
this.currentPage = this.totalPages - 1;
this.loadPage();
}
}
this.enableOrDisableButtons();
this.updateRowLabels();
}
updateRowLabels() {
var startRow: any;
var endRow: any;
if (this.isZeroPagesToDisplay()) {
startRow = 0;
endRow = 0;
} else {
startRow = (this.pageSize * this.currentPage) + 1;
endRow = startRow + this.pageSize - 1;
if (this.foundMaxRow && endRow > this.rowCount) {
endRow = this.rowCount;
}
}
this.lbFirstRowOnPage.innerHTML = (startRow).toLocaleString();
this.lbLastRowOnPage.innerHTML = (endRow).toLocaleString();
// show the summary panel, when first shown, this is blank
this.ePageRowSummaryPanel.style.visibility = null;
}
loadPage() {
this.enableOrDisableButtons();
var startRow = this.currentPage * this.datasource.pageSize;
var endRow = (this.currentPage + 1) * this.datasource.pageSize;
this.lbCurrent.innerHTML = (this.currentPage + 1).toLocaleString();
this.callVersion++;
var callVersionCopy = this.callVersion;
var that = this;
this.angularGrid.showLoadingPanel(true);
var sortModel: any;
if (this.gridOptionsWrapper.isEnableServerSideSorting()) {
sortModel = this.angularGrid.getSortModel();
}
var filterModel: any;
if (this.gridOptionsWrapper.isEnableServerSideFilter()) {
filterModel = this.angularGrid.getFilterModel();
}
var params = {
startRow: startRow,
endRow: endRow,
successCallback: successCallback,
failCallback: failCallback,
sortModel: sortModel,
filterModel: filterModel
};
// check if old version of datasource used
var getRowsParams = utils.getFunctionParameters(this.datasource.getRows);
if (getRowsParams.length > 1) {
console.warn('ag-grid: It looks like your paging datasource is of the old type, taking more than one parameter.');
console.warn('ag-grid: From ag-grid 1.9.0, now the getRows takes one parameter. See the documentation for details.');
}
this.datasource.getRows(params);
function successCallback(rows: any, lastRowIndex: any) {
if (that.isCallDaemon(callVersionCopy)) {
return;
}
that.pageLoaded(rows, lastRowIndex);
}
function failCallback() {
if (that.isCallDaemon(callVersionCopy)) {
return;
}
// set in an empty set of rows, this will at
// least get rid of the loading panel, and
// stop blocking things
that.angularGrid.setRows([]);
}
}
isCallDaemon(versionCopy: any) {
return versionCopy !== this.callVersion;
}
onBtNext() {
this.currentPage++;
this.loadPage();
}
onBtPrevious() {
this.currentPage--;
this.loadPage();
}
onBtFirst() {
this.currentPage = 0;
this.loadPage();
}
onBtLast() {
this.currentPage = this.totalPages - 1;
this.loadPage();
}
isZeroPagesToDisplay() {
return this.foundMaxRow && this.totalPages === 0;
}
enableOrDisableButtons() {
var disablePreviousAndFirst = this.currentPage === 0;
this.btPrevious.disabled = disablePreviousAndFirst;
this.btFirst.disabled = disablePreviousAndFirst;
var zeroPagesToDisplay = this.isZeroPagesToDisplay();
var onLastPage = this.foundMaxRow && this.currentPage === (this.totalPages - 1);
var disableNext = onLastPage || zeroPagesToDisplay;
this.btNext.disabled = disableNext;
var disableLast = !this.foundMaxRow || zeroPagesToDisplay || this.currentPage === (this.totalPages - 1);
this.btLast.disabled = disableLast;
}
createTemplate() {
var localeTextFunc = this.gridOptionsWrapper.getLocaleTextFunc();
return template
.replace('[PAGE]', localeTextFunc('page', 'Page'))
.replace('[TO]', localeTextFunc('to', 'to'))
.replace('[OF]', localeTextFunc('of', 'of'))
.replace('[OF]', localeTextFunc('of', 'of'))
.replace('[FIRST]', localeTextFunc('first', 'First'))
.replace('[PREVIOUS]', localeTextFunc('previous', 'Previous'))
.replace('[NEXT]', localeTextFunc('next', 'Next'))
.replace('[LAST]', localeTextFunc('last', 'Last'));
}
getGui() {
return this.eGui;
}
setupComponents() {
this.eGui = utils.loadTemplate(this.createTemplate());
this.btNext = this.eGui.querySelector('#btNext');
this.btPrevious = this.eGui.querySelector('#btPrevious');
this.btFirst = this.eGui.querySelector('#btFirst');
this.btLast = this.eGui.querySelector('#btLast');
this.lbCurrent = this.eGui.querySelector('#current');
this.lbTotal = this.eGui.querySelector('#total');
this.lbRecordCount = this.eGui.querySelector('#recordCount');
this.lbFirstRowOnPage = this.eGui.querySelector('#firstRowOnPage');
this.lbLastRowOnPage = this.eGui.querySelector('#lastRowOnPage');
this.ePageRowSummaryPanel = this.eGui.querySelector('#pageRowSummaryPanel');
var that = this;
this.btNext.addEventListener('click', function () {
that.onBtNext();
});
this.btPrevious.addEventListener('click', function () {
that.onBtPrevious();
});
this.btFirst.addEventListener('click', function () {
that.onBtFirst();
});
this.btLast.addEventListener('click', function () {
that.onBtLast();
});
}
}
}