UNPKG

@aegov/design-system-react

Version:

A design system for the Government of the United Arab Emirates. Extending the original design system released as @aegov/design-system, this is the package specefically created for the ReactJs enviornment.

130 lines (129 loc) 5.84 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireDefault(require("react")); var _zod = require("zod"); var _react2 = require("@phosphor-icons/react"); var _utils = require("../../utils"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const paginationSchema = _zod.z.object({ currentPage: _zod.z.number().min(1), totalPages: _zod.z.number().min(1), onPageChange: _zod.z.function(), className: _zod.z.string().optional(), showFirstLast: _zod.z.boolean().optional() }); function Pagination({ currentPage, totalPages, onPageChange, className, showFirstLast = false }) { try { paginationSchema.parse({ currentPage, totalPages, onPageChange, className, showFirstLast }); } catch (error) { console.error('Pagination validation error:', error); return null; } const getPageNumbers = () => { const pages = []; const showEllipsis = totalPages > 7; if (showEllipsis) { if (currentPage <= 3) { // Show first 5 pages + ellipsis + last page for (let i = 1; i <= 5; i++) pages.push(i); pages.push('...'); pages.push(totalPages); } else if (currentPage >= totalPages - 2) { // Show first page + ellipsis + last 5 pages pages.push(1); pages.push('...'); for (let i = totalPages - 4; i <= totalPages; i++) pages.push(i); } else { // Show first page + ellipsis + current-1, current, current+1 + ellipsis + last page pages.push(1); pages.push('...'); for (let i = currentPage - 1; i <= currentPage + 1; i++) pages.push(i); pages.push('...'); pages.push(totalPages); } } else { // Show all pages if total pages <= 7 for (let i = 1; i <= totalPages; i++) pages.push(i); } return pages; }; const iconClasses = "h-5 w-5 rtl:-scale-x-100"; return /*#__PURE__*/_react.default.createElement("div", { className: (0, _utils.cn)("flex items-center justify-center", className) }, /*#__PURE__*/_react.default.createElement("div", { className: "flex w-full items-center justify-between sm:hidden" }, /*#__PURE__*/_react.default.createElement("button", { onClick: () => onPageChange(currentPage - 1), disabled: currentPage === 1, className: "inline-flex items-center gap-2 px-2 py-1 text-gray-700 disabled:opacity-50" }, /*#__PURE__*/_react.default.createElement(_react2.CaretLeft, { className: iconClasses }), /*#__PURE__*/_react.default.createElement("span", null, "Previous")), /*#__PURE__*/_react.default.createElement("span", { className: "text-sm" }, "Page ", currentPage, " of ", totalPages), /*#__PURE__*/_react.default.createElement("button", { onClick: () => onPageChange(currentPage + 1), disabled: currentPage === totalPages, className: "inline-flex items-center gap-2 px-2 py-1 text-gray-700 disabled:opacity-50" }, /*#__PURE__*/_react.default.createElement("span", null, "Next"), /*#__PURE__*/_react.default.createElement(_react2.CaretRight, { className: iconClasses }))), /*#__PURE__*/_react.default.createElement("div", { className: "hidden sm:flex sm:items-center sm:gap-1" }, showFirstLast && /*#__PURE__*/_react.default.createElement("button", { onClick: () => onPageChange(1), disabled: currentPage === 1, className: "inline-flex items-center gap-2 px-2 py-1 text-gray-700 hover:text-primary-600 disabled:opacity-50" }, /*#__PURE__*/_react.default.createElement(_react2.CaretDoubleLeft, { className: iconClasses }), /*#__PURE__*/_react.default.createElement("span", { className: "hidden lg:inline" }, "First")), /*#__PURE__*/_react.default.createElement("button", { onClick: () => onPageChange(currentPage - 1), disabled: currentPage === 1, className: "inline-flex items-center gap-2 px-2 py-1 text-gray-700 hover:text-primary-600 disabled:opacity-50" }, /*#__PURE__*/_react.default.createElement(_react2.CaretLeft, { className: iconClasses }), /*#__PURE__*/_react.default.createElement("span", { className: "hidden lg:inline" }, "Previous")), /*#__PURE__*/_react.default.createElement("div", { className: "flex items-center gap-1" }, getPageNumbers().map((page, index) => page === '...' ? /*#__PURE__*/_react.default.createElement("span", { key: `ellipsis-${index}`, className: "px-2 text-gray-400" }, "...") : /*#__PURE__*/_react.default.createElement("button", { key: page, onClick: () => onPageChange(page), className: (0, _utils.cn)("inline-flex h-8 w-8 items-center justify-center rounded-full text-sm", currentPage === page ? "bg-primary-550 text-white" : "text-gray-700 hover:bg-primary-50 hover:text-primary-600") }, page))), /*#__PURE__*/_react.default.createElement("button", { onClick: () => onPageChange(currentPage + 1), disabled: currentPage === totalPages, className: "inline-flex items-center gap-2 px-2 py-1 text-gray-700 hover:text-primary-600 disabled:opacity-50" }, /*#__PURE__*/_react.default.createElement("span", { className: "hidden lg:inline" }, "Next"), /*#__PURE__*/_react.default.createElement(_react2.CaretRight, { className: iconClasses })), showFirstLast && /*#__PURE__*/_react.default.createElement("button", { onClick: () => onPageChange(totalPages), disabled: currentPage === totalPages, className: "inline-flex items-center gap-2 px-2 py-1 text-gray-700 hover:text-primary-600 disabled:opacity-50" }, /*#__PURE__*/_react.default.createElement("span", { className: "hidden lg:inline" }, "Last"), /*#__PURE__*/_react.default.createElement(_react2.CaretDoubleRight, { className: iconClasses })))); } var _default = exports.default = Pagination;