@bigbinary/neetoui
Version:
neetoUI drives the experience at all neeto products
187 lines (173 loc) • 7.07 kB
JavaScript
'use strict';
var React = require('react');
var classnames = require('classnames');
var neetoIcons = require('@bigbinary/neeto-icons');
var ramda = require('ramda');
var reactRouterDom = require('react-router-dom');
require('@babel/runtime/helpers/slicedToArray');
require('@bigbinary/neeto-hotkeys');
require('./overlayManager.js');
var index = require('./index--BeRLo6L.js');
var useQueryParams = require('./useQueryParams-l5fJJYCR.js');
var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
require('@babel/runtime/helpers/classCallCheck');
require('@babel/runtime/helpers/createClass');
require('@babel/runtime/helpers/defineProperty');
require('@bigbinary/neeto-cist');
require('qs');
require('./en-K2ZIAV2F.js');
require('dayjs');
require('dayjs/plugin/localeData');
require('dayjs/plugin/utc');
require('dayjs/plugin/weekday');
require('dayjs/plugin/weekOfYear');
var DOTS = "...";
var usePaginationQueryParams = function usePaginationQueryParams() {
var queryParams = useQueryParams.useQueryParams();
var history = reactRouterDom.useHistory();
var updatePageInQueryParam = function updatePageInQueryParam(page) {
var params = {
page: page
};
var pathname = window.location.pathname;
history.push(index.buildUrl(pathname, ramda.mergeLeft(params, queryParams)));
};
return {
updatePageInQueryParam: updatePageInQueryParam
};
};
var range = function range(start, end) {
var length = end - start + 1;
return Array.from({
length: length
}, function (_, index) {
return index + start;
});
};
var usePagination = function usePagination(_ref) {
var count = _ref.count,
pageSize = _ref.pageSize,
_ref$siblingCount = _ref.siblingCount,
siblingCount = _ref$siblingCount === void 0 ? 1 : _ref$siblingCount,
pageNo = _ref.pageNo;
var paginationRange = React.useMemo(function () {
var totalPageCount = Math.ceil(count / pageSize);
// Pages count is determined as siblingCount + firstPage + lastPage + pageNo + 2*DOTS
var totalPageNumbers = siblingCount + 5;
// If the number of pages is less than the page numbers we want to show in our
// paginationComponent, we return the range [1..totalPageCount]
if (totalPageNumbers >= totalPageCount) {
return range(1, totalPageCount);
}
// Calculate left and right sibling index and make sure they are within range 1 and totalPageCount
var leftSiblingIndex = Math.max(pageNo - siblingCount, 1);
var rightSiblingIndex = Math.min(pageNo + siblingCount, totalPageCount);
// We do not show dots just when there is just one page number to be inserted between the extremes of sibling and the page limits i.e 1 and totalPageCount. Hence we are using leftSiblingIndex > 2 and rightSiblingIndex < totalPageCount - 2
var shouldShowLeftDots = leftSiblingIndex > 2;
var shouldShowRightDots = rightSiblingIndex < totalPageCount - 2;
var firstPageIndex = 1;
var lastPageIndex = totalPageCount;
// Case 2: No left dots to show, but rights dots to be shown
if (!shouldShowLeftDots && shouldShowRightDots) {
var leftItemCount = 3 + 2 * siblingCount;
var leftRange = range(1, leftItemCount);
return [].concat(_toConsumableArray(leftRange), [DOTS, totalPageCount]);
}
// Case 3: No right dots to show, but left dots to be shown
if (shouldShowLeftDots && !shouldShowRightDots) {
var rightItemCount = 3 + 2 * siblingCount;
var rightRange = range(totalPageCount - rightItemCount + 1, totalPageCount);
return [firstPageIndex, DOTS].concat(_toConsumableArray(rightRange));
}
// Case 4: Both left and right dots to be shown
if (shouldShowLeftDots && shouldShowRightDots) {
var middleRange = range(leftSiblingIndex, rightSiblingIndex);
return [firstPageIndex, DOTS].concat(_toConsumableArray(middleRange), [DOTS, lastPageIndex]);
}
return undefined;
}, [count, pageSize, siblingCount, pageNo]);
return paginationRange;
};
var Pagination = function Pagination(_ref) {
var _ref$count = _ref.count,
count = _ref$count === void 0 ? 0 : _ref$count,
pageNo = _ref.pageNo,
navigate = _ref.navigate,
pageSize = _ref.pageSize,
_ref$siblingCount = _ref.siblingCount,
siblingCount = _ref$siblingCount === void 0 ? 1 : _ref$siblingCount,
_ref$className = _ref.className,
className = _ref$className === void 0 ? "" : _ref$className;
var paginationRange = usePagination({
pageNo: pageNo,
count: count,
siblingCount: siblingCount,
pageSize: pageSize
});
var _usePaginationQueryPa = usePaginationQueryParams(),
updatePageInQueryParam = _usePaginationQueryPa.updatePageInQueryParam;
if (!navigate) navigate = updatePageInQueryParam;
if (pageNo === 0 || paginationRange.length < 2) {
return null;
}
var onNext = function onNext() {
if (!isLastPage) navigate(pageNo + 1);
};
var onPrevious = function onPrevious() {
if (!isFirstPage) navigate(pageNo - 1);
};
var lastPage = paginationRange[paginationRange.length - 1];
var isFirstPage = pageNo === 1;
var isLastPage = pageNo === lastPage;
return /*#__PURE__*/React.createElement("nav", {
"aria-label": "Pagination Navigation",
role: "navigation"
}, /*#__PURE__*/React.createElement("ul", {
className: classnames(["neeto-ui-pagination__wrapper", className])
}, /*#__PURE__*/React.createElement("li", {
"data-testid": "left-navigate-button",
tabIndex: 0,
className: classnames({
"neeto-ui-pagination__item": true,
"neeto-ui-pagination__item--navigate": true,
disabled: isFirstPage
}),
onClick: onPrevious
}, /*#__PURE__*/React.createElement("a", null, /*#__PURE__*/React.createElement(neetoIcons.Left, {
size: 20
}))), paginationRange.map(function (pageNumber, index) {
var isActive = pageNumber === pageNo;
if (pageNumber === DOTS) {
return /*#__PURE__*/React.createElement("li", {
className: "neeto-ui-pagination__item neeto-ui-pagination__item--dots",
"data-testid": "dots",
key: index
}, "\u2026");
}
return /*#__PURE__*/React.createElement("li", {
"aria-current": isActive && true,
key: index,
tabIndex: 0,
"aria-label": isActive ? "Current Page, Page ".concat(pageNumber) : "Goto Page ".concat(pageNumber),
className: classnames("neeto-ui-pagination__item", {
active: isActive
}),
onClick: function onClick() {
return navigate(pageNumber);
}
}, /*#__PURE__*/React.createElement("a", null, pageNumber));
}), /*#__PURE__*/React.createElement("li", {
"data-testid": "right-navigate-button",
tabIndex: 0,
className: classnames({
"neeto-ui-pagination__item": true,
"neeto-ui-pagination__item--navigate": true,
disabled: isLastPage
}),
onClick: onNext
}, /*#__PURE__*/React.createElement("a", null, /*#__PURE__*/React.createElement(neetoIcons.Right, {
size: 20
})))));
};
module.exports = Pagination;
//# sourceMappingURL=Pagination.js.map