import { calculatePageNumber } from './calculatePageNumber'; export /** * Generate an array of page numbers (or the '...' string) which is used in an ng-repeat to generate the * links used in pagination * * @param currentPage * @param rowsPerPage * @param paginationRange * @param collectionLength * @returns {Array} */ function generatePagesArray( currentPage: number, collectionLength: number, rowsPerPage: number, paginationRange: number ): (number | '...')[] { const pages: (number | '...')[] = []; const totalPages = Math.ceil(collectionLength / rowsPerPage); const halfWay = Math.ceil(paginationRange / 2); let position; if (currentPage <= halfWay) { position = 'start'; } else if (totalPages - halfWay < currentPage) { position = 'end'; } else { position = 'middle'; } const ellipsesNeeded = paginationRange < totalPages; for (let i = 1; i <= totalPages && i <= paginationRange; i += 1) { const pageNumber = calculatePageNumber( i, currentPage, paginationRange, totalPages ); const openingEllipsesNeeded = i === 2 && (position === 'middle' || position === 'end'); const closingEllipsesNeeded = i === paginationRange - 1 && (position === 'middle' || position === 'start'); if (ellipsesNeeded && (openingEllipsesNeeded || closingEllipsesNeeded)) { pages.push('...'); } else { pages.push(pageNumber); } } return pages; }