UNPKG

@ministryofjustice/hmpps-digital-prison-reporting-frontend

Version:

The Digital Prison Reporting Frontend contains templates and code to help display data effectively in UI applications.

120 lines (119 loc) 3.65 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const SELECTED_PAGE_PARAM = 'selectedPage'; const PAGE_SIZE_PARAM = 'pageSize'; const DEFAULT_PAGE = 1; const DEFAULT_PAGE_SIZE = 20; /** * Creates the pages for the pagination component * * @param {string} pathname * @param {string} search * @param {number} totalRows * @param pageSize * @param currentPage * @return {*} {{ pages: page[]; pagesLength: number }} */ const createPages = (pathname, queryParams, totalRows, pageSize, currentPage) => { const pagesLength = Math.ceil(totalRows / pageSize); const pages = []; Array(pagesLength) .fill(0) .forEach((_, index) => { const pageNumber = index + 1; queryParams.set(SELECTED_PAGE_PARAM, `${pageNumber}`); if (pageNumber === 1 || pageNumber === pagesLength || (pageNumber >= currentPage - 1 && pageNumber <= currentPage + 1)) { pages.push({ number: pageNumber, href: `${pathname}?${queryParams.toString()}`, current: pageNumber === currentPage, }); } else if (pageNumber === 2 || pageNumber === pagesLength - 1) { pages.push({ ellipsis: true }); } }); return { pages, pagesLength, }; }; /** * Creates the next link * * @param {string} pathname * @param {string} search * @param {number} lastPage * @param totalRows * @param currentPage * @return {*} {(string | undefined)} */ const createNext = (pathname, search, lastPage, totalRows, currentPage) => { const queryParams = new URLSearchParams(search); if (totalRows > 0) { if (currentPage === lastPage) { return undefined; } const nextPage = currentPage + 1; queryParams.set(SELECTED_PAGE_PARAM, `${nextPage}`); return `${pathname}?${queryParams.toString()}`; } return undefined; }; /** * Creates the previous link * * @param {string} pathname * @param {string} search * @param currentPage * @return {*} {(string | undefined)} */ const createPrev = (pathname, search, currentPage) => { const queryParams = new URLSearchParams(search); if (currentPage === 1) { return undefined; } const prevPage = currentPage - 1; queryParams.set(SELECTED_PAGE_PARAM, `${prevPage}`); return `${pathname}?${queryParams.toString()}`; }; /** * Set the select items for the page size component * * @param {number} totalRows * @return {*} */ const setPageSizes = (totalRows) => { const pageSizes = [10, 20, 100, 200, totalRows]; return pageSizes.map((size, i) => { if (i === pageSizes.length - 1) { return { value: totalRows, text: 'All' }; } return { value: size, text: size.toString() }; }); }; /** * Init pagination * * @return {*} */ exports.default = { getPaginationData: (url, totalRows) => { const { pathname, search } = url; const queryParams = new URLSearchParams(search); const pageSize = +queryParams.get(PAGE_SIZE_PARAM) || DEFAULT_PAGE_SIZE; const currentPage = +queryParams.get(SELECTED_PAGE_PARAM) || DEFAULT_PAGE; const { pages, pagesLength } = createPages(pathname, queryParams, totalRows, pageSize, currentPage); return { next: createNext(pathname, search, pagesLength, totalRows, currentPage), prev: createPrev(pathname, search, currentPage), pages, pageSize, currentPage, totalRows, sizes: setPageSizes(totalRows), }; }, };