lbs-react-table
Version:
A table component made with React, with pagination, search and sorting. Works on small screens.
123 lines (120 loc) • 4.69 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = Pagination;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
var _react = _interopRequireWildcard(require("react"));
/* eslint-disable eqeqeq */
/* eslint-disable react-hooks/exhaustive-deps */
/**
*
* The Pagination part of the custom table component
*
* @function Pagination
*
* @returns the Pagination component
*
*/
function Pagination(_ref) {
var firstItemIndex = _ref.firstItemIndex,
lastItemIndex = _ref.lastItemIndex,
_ref$total = _ref.total,
total = _ref$total === void 0 ? 0 : _ref$total,
_ref$itemsPerPage = _ref.itemsPerPage,
itemsPerPage = _ref$itemsPerPage === void 0 ? 10 : _ref$itemsPerPage,
_ref$currentPage = _ref.currentPage,
currentPage = _ref$currentPage === void 0 ? 1 : _ref$currentPage,
onPageChange = _ref.onPageChange;
var _useState = (0, _react.useState)(0),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
totalPages = _useState2[0],
setTotalPages = _useState2[1];
(0, _react.useEffect)(function () {
if (total > 0 && itemsPerPage > 0) {
setTotalPages(Math.ceil(total / itemsPerPage));
}
if (total == 0) {
setTotalPages(1);
}
}, [total, itemsPerPage]);
var createPaginationItem = function createPaginationItem(i, currentPage) {
return /*#__PURE__*/_react.default.createElement("div", {
className: i === currentPage ? 'pagination-indexNumber pagination-active' : 'pagination-indexNumber',
key: i,
onClick: function onClick() {
return onPageChange(i);
}
}, i);
};
var paginationItems = (0, _react.useMemo)(function () {
var pages = [];
if (totalPages === 1) {
return '';
} else if (totalPages < 6) {
for (var i = 1; i <= totalPages; i++) {
pages.push(createPaginationItem(i, currentPage));
}
} else if (currentPage < 4) {
for (var _i = 1; _i <= 4; _i++) {
pages.push(createPaginationItem(_i, currentPage));
}
pages.push( /*#__PURE__*/_react.default.createElement("div", {
className: "pagination-indexNumber pagination-dots",
key: "..."
}, "..."));
pages.push(createPaginationItem(totalPages, currentPage));
} else if (currentPage > totalPages - 3) {
pages.push(createPaginationItem(1, currentPage));
pages.push( /*#__PURE__*/_react.default.createElement("div", {
className: "pagination-indexNumber pagination-dots",
key: "..."
}, "..."));
for (var _i2 = totalPages - 3; _i2 <= totalPages; _i2++) {
pages.push(createPaginationItem(_i2, currentPage));
}
} else if (totalPages > 1) {
pages.push( /*#__PURE__*/_react.default.createElement("div", {
className: "pagination-indexNumber",
key: 1,
onClick: function onClick() {
return onPageChange(1);
}
}, 1));
pages.push( /*#__PURE__*/_react.default.createElement("div", {
className: "pagination-indexNumber pagination-dots",
key: "...1"
}, "..."));
for (var _i3 = currentPage - 1; _i3 <= currentPage + 1; _i3++) {
pages.push(createPaginationItem(_i3, currentPage));
}
pages.push( /*#__PURE__*/_react.default.createElement("div", {
className: "pagination-indexNumber pagination-dots",
key: "...2"
}, "..."));
pages.push(createPaginationItem(totalPages, currentPage));
}
return pages;
}, [totalPages, currentPage]);
return /*#__PURE__*/_react.default.createElement("div", {
className: "pagination-container"
}, total > 0 ? /*#__PURE__*/_react.default.createElement("div", {
className: "pagination-index"
}, "Showing ", firstItemIndex, " to ", lastItemIndex, " of ", total, " entries") : /*#__PURE__*/_react.default.createElement("div", {
className: "pagination-index pagination-index-error"
}, "No results available"), /*#__PURE__*/_react.default.createElement("div", {
className: "pagination-nav"
}, /*#__PURE__*/_react.default.createElement("button", {
onClick: function onClick() {
return onPageChange(currentPage - 1);
},
hidden: currentPage === 1
}, "Previous"), paginationItems, /*#__PURE__*/_react.default.createElement("button", {
onClick: function onClick() {
return onPageChange(currentPage + 1);
},
hidden: currentPage === totalPages
}, "Next")));
}