mirror of
https://github.com/Tria-plc/emaui.git
synced 2026-08-27 20:10:58 +00:00
79 lines
2.3 KiB
JavaScript
79 lines
2.3 KiB
JavaScript
'use client';
|
|
'use strict';
|
|
|
|
var React = require('react');
|
|
var useUncontrolled = require('../use-uncontrolled/use-uncontrolled.cjs');
|
|
|
|
function range(start, end) {
|
|
const length = end - start + 1;
|
|
return Array.from({ length }, (_, index) => index + start);
|
|
}
|
|
const DOTS = "dots";
|
|
function usePagination({
|
|
total,
|
|
siblings = 1,
|
|
boundaries = 1,
|
|
page,
|
|
initialPage = 1,
|
|
onChange
|
|
}) {
|
|
const _total = Math.max(Math.trunc(total), 0);
|
|
const [activePage, setActivePage] = useUncontrolled.useUncontrolled({
|
|
value: page,
|
|
onChange,
|
|
defaultValue: initialPage,
|
|
finalValue: initialPage
|
|
});
|
|
const setPage = (pageNumber) => {
|
|
if (pageNumber <= 0) {
|
|
setActivePage(1);
|
|
} else if (pageNumber > _total) {
|
|
setActivePage(_total);
|
|
} else {
|
|
setActivePage(pageNumber);
|
|
}
|
|
};
|
|
const next = () => setPage(activePage + 1);
|
|
const previous = () => setPage(activePage - 1);
|
|
const first = () => setPage(1);
|
|
const last = () => setPage(_total);
|
|
const paginationRange = React.useMemo(() => {
|
|
const totalPageNumbers = siblings * 2 + 3 + boundaries * 2;
|
|
if (totalPageNumbers >= _total) {
|
|
return range(1, _total);
|
|
}
|
|
const leftSiblingIndex = Math.max(activePage - siblings, boundaries);
|
|
const rightSiblingIndex = Math.min(activePage + siblings, _total - boundaries);
|
|
const shouldShowLeftDots = leftSiblingIndex > boundaries + 2;
|
|
const shouldShowRightDots = rightSiblingIndex < _total - (boundaries + 1);
|
|
if (!shouldShowLeftDots && shouldShowRightDots) {
|
|
const leftItemCount = siblings * 2 + boundaries + 2;
|
|
return [...range(1, leftItemCount), DOTS, ...range(_total - (boundaries - 1), _total)];
|
|
}
|
|
if (shouldShowLeftDots && !shouldShowRightDots) {
|
|
const rightItemCount = boundaries + 1 + 2 * siblings;
|
|
return [...range(1, boundaries), DOTS, ...range(_total - rightItemCount, _total)];
|
|
}
|
|
return [
|
|
...range(1, boundaries),
|
|
DOTS,
|
|
...range(leftSiblingIndex, rightSiblingIndex),
|
|
DOTS,
|
|
...range(_total - boundaries + 1, _total)
|
|
];
|
|
}, [_total, siblings, activePage]);
|
|
return {
|
|
range: paginationRange,
|
|
active: activePage,
|
|
setPage,
|
|
next,
|
|
previous,
|
|
first,
|
|
last
|
|
};
|
|
}
|
|
|
|
exports.DOTS = DOTS;
|
|
exports.usePagination = usePagination;
|
|
//# sourceMappingURL=use-pagination.cjs.map
|