/* eslint-disable max-len */ /* eslint-disable no-param-reassign */ import BaseFoundation, { DefaultAdapter } from '../base/foundation'; import { numbers } from './constants'; export interface PaginationAdapter
, S = Record {
setPageList: (pageListState: AdapterPageList) => void;
setDisabled: (prevIsDisabled: boolean, nextIsDisabled: boolean) => void;
updateTotal: (total: number) => void;
updatePageSize: (pageSize: number) => void;
updateQuickJumpPage: (quickJumpPage: string | number) => void;
setCurrentPage: (pageIndex: number) => void;
registerKeyDownHandler: (handler: KeyDownHandler) => void;
unregisterKeyDownHandler: (handler: KeyDownHandler) => void;
notifyPageChange: (pageIndex: number | string) => void;
notifyPageSizeChange: (pageSize: number) => void;
notifyChange: (pageIndex: number | string, pageSize: number) => void;
}
export type PageRenderText = number | '...';
export type PageList = PageRenderText[];
export interface AdapterPageList {
pageList: PageRenderText[];
restLeftPageList: number[];
restRightPageList: number[];
}
export type KeyDownHandler = any;
class PaginationFoundation , S = Record ) {
super({ ...adapter });
}
init() {
const { currentPage, total, pageSize } = this.getStates();
// If pageSize is set, pageSizeOpts does not work
this._updateDisabled({ currentPage, total, pageSize });
this._updatePageList({ currentPage, total, pageSize });
this._registerEventHandler();
}
destroy() {
this._unregisterEventHandler();
}
_registerEventHandler() {
this._adapter.registerKeyDownHandler(this.handleKeyDown);
}
_unregisterEventHandler() {
this._adapter.unregisterKeyDownHandler(this.handleKeyDown);
}
_updateDisabled(pageInfo: { currentPage: number; total: number; pageSize: number }) {
const { currentPage, total, pageSize } = pageInfo;
const totalPageNum = this._getTotalPageNumber(total, pageSize);
let prevIsDisabled = false;
let nextIsDisabled = false;
if (currentPage === 1) {
prevIsDisabled = true;
nextIsDisabled = totalPageNum < 2;
} else if (currentPage === totalPageNum) {
prevIsDisabled = false;
nextIsDisabled = true;
}
this._adapter.setDisabled(prevIsDisabled, nextIsDisabled);
}
goPage(targetPageIndex: number | '...') {
if (targetPageIndex === '...') {
return;
}
const { pageSize, currentPage } = this.getStates();
const isControlComponent = this._isInProps('currentPage');
if (targetPageIndex === currentPage) {
return;
}
if (!isControlComponent) {
this.updatePage(targetPageIndex);
this._adapter.notifyPageChange(targetPageIndex);
this._adapter.notifyChange(targetPageIndex, pageSize);
} else {
this._adapter.notifyPageChange(targetPageIndex);
this._adapter.notifyChange(targetPageIndex, pageSize);
}
}
updatePage(targetPageIndex = 1, total?: number, pageSize?: number) {
// maybe undefined or null
if (total === null || typeof total === 'undefined') {
total = this.getState('total');
}
if (pageSize === null || typeof pageSize === 'undefined') {
pageSize = this.getState('pageSize');
}
this._updateDisabled({ currentPage: targetPageIndex, total, pageSize });
this._updatePageList({ currentPage: targetPageIndex, total, pageSize });
this._adapter.updateTotal(total);
this._adapter.setCurrentPage(targetPageIndex);
this._adapter.updatePageSize(pageSize);
}
goPrev() {
const { currentPage } = this.getStates();
if (currentPage > 1) {
this.goPage(currentPage - 1);
}
}
goNext() {
const { currentPage, total, pageSize } = this.getStates();
const totalPageNum = this._getTotalPageNumber(total, pageSize);
if (currentPage <= totalPageNum - 1) {
this.goPage(currentPage as number + 1);
}
}
_updatePageList(pageListInfo: { currentPage: number; total: number; pageSize: number }) {
const { currentPage, total, pageSize } = pageListInfo;
let pageList: PageList = [];
let restLeftPageList: number[] = []; // pages before ...
let restRightPageList: number[] = []; // pages after ...
/** Pager truncation logic (t is the total number of pages, c is the current page):
- No need to truncate when t<=7 pages
- When t>7
- When c<4, the fourth is a truncation symbol (...)
- When c=4, the sixth is the truncation symbol (...)
- When 4