@undp/design-system-react
Version:
React based design system for UNDP
1 lines • 9.77 kB
Source Map (JSON)
{"version":3,"file":"Pagination-C7dHfirZ.cjs","names":[],"sources":["../src/components/ui/Pagination/pagination.tsx","../src/components/ui/Pagination/index.tsx"],"sourcesContent":["import { ChevronLeft, ChevronRight, MoreHorizontal } from 'lucide-react';\nimport React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nfunction PaginationUnit({ className, ...props }: React.ComponentProps<'nav'>) {\n return (\n <nav\n {...props}\n aria-label='pagination'\n className={cn('mx-auto flex w-full justify-center', className)}\n />\n );\n}\nPaginationUnit.displayName = 'PaginationUnit';\n\nconst PaginationContent = React.forwardRef<HTMLUListElement, React.ComponentProps<'ul'>>(\n ({ className, ...props }, ref) => (\n <ul\n {...props}\n ref={ref}\n className={cn('flex list-none flex-row items-center gap-1', className)}\n />\n ),\n);\nPaginationContent.displayName = 'PaginationContent';\n\nconst PaginationItem = React.forwardRef<HTMLLIElement, React.ComponentProps<'li'>>(\n ({ className, ...props }, ref) => (\n <li {...props} ref={ref} className={cn('mr-2 last:mr-0', className)} />\n ),\n);\nPaginationItem.displayName = 'PaginationItem';\n\nfunction PaginationLink({\n className,\n children,\n ...props\n}: React.ButtonHTMLAttributes<HTMLButtonElement>) {\n return (\n <button\n {...props}\n type='button'\n className={cn('p-4 text-base text-content-primary', className)}\n >\n {children}\n </button>\n );\n}\nPaginationLink.displayName = 'PaginationLink';\n\nfunction PaginationPrevious({ className, ...props }: React.ComponentProps<typeof PaginationLink>) {\n return (\n <PaginationLink\n {...props}\n aria-label='Go to previous page'\n className={cn(\n 'rounded-full bg-surface p-2 hover:bg-surface-hover rtl:scale-x-[-1]',\n className,\n )}\n >\n <ChevronLeft className='h-6 w-6 stroke-foreground' />\n </PaginationLink>\n );\n}\nPaginationPrevious.displayName = 'PaginationPrevious';\n\nfunction PaginationNext({ className, ...props }: React.ComponentProps<typeof PaginationLink>) {\n return (\n <PaginationLink\n {...props}\n aria-label='Go to next page'\n className={cn(\n 'rounded-full bg-surface p-2 hover:bg-surface-hover rtl:scale-x-[-1]',\n className,\n )}\n >\n <ChevronRight className='h-6 w-6 stroke-foreground' />\n </PaginationLink>\n );\n}\nPaginationNext.displayName = 'PaginationNext';\n\nfunction PaginationEllipsis({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n {...props}\n aria-hidden\n className={cn('flex h-9 w-9 items-center justify-center', className)}\n >\n <MoreHorizontal className='h-4 w-4 text-content-primary' />\n <span className='sr-only'>More pages</span>\n </span>\n );\n}\nPaginationEllipsis.displayName = 'PaginationEllipsis';\n\nexport {\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n PaginationUnit,\n};\n","import { useEffect, useState } from 'react';\nimport { cn } from '@/lib/utils';\nimport {\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n PaginationUnit,\n} from './pagination';\n\nconst getPageNumbers = (currentPageNo: number, totalPages: number) => {\n const pages: (number | 'ellipsis')[] = [];\n\n if (totalPages <= 7) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n // Always show first page\n pages.push(1);\n\n if (currentPageNo <= 3) {\n pages.push(2, 3, 4, 'ellipsis');\n } else if (currentPageNo >= totalPages - 2) {\n pages.push('ellipsis', totalPages - 3, totalPages - 2, totalPages - 1);\n } else {\n pages.push('ellipsis', currentPageNo - 1, currentPageNo, currentPageNo + 1, 'ellipsis');\n }\n\n // Always show last page\n pages.push(totalPages);\n\n return pages;\n};\n\nfunction Pagination(props: {\n defaultPage?: number;\n total: number;\n pageSize: number;\n onChange: (page: number) => void;\n className?: string;\n classNames?: {\n control?: string;\n list?: string;\n navigation?: string;\n ellipsis?: string;\n active?: string;\n };\n}) {\n const { defaultPage = 1, total, pageSize, onChange, className, classNames } = props;\n const totalPages = Math.ceil(total / pageSize);\n const [currentPage, setCurrentPage] = useState(defaultPage);\n const [pageNumbers, setPageNumbers] = useState<(number | 'ellipsis')[]>(\n getPageNumbers(defaultPage, totalPages),\n );\n\n useEffect(() => {\n setPageNumbers(getPageNumbers(currentPage, totalPages));\n }, [currentPage, totalPages]);\n return (\n <PaginationUnit className={cn('select-none', className, classNames?.control)}>\n <PaginationContent>\n <PaginationItem>\n <PaginationPrevious\n onClick={() => {\n if (currentPage > 1) {\n onChange(currentPage - 1);\n setCurrentPage(currentPage - 1);\n }\n }}\n className={cn(\n 'cursor-pointer',\n classNames?.navigation,\n currentPage <= 1 && 'pointer-events-none cursor-not-allowed opacity-35',\n )}\n />\n </PaginationItem>\n\n {pageNumbers.map((page) => (\n <PaginationItem key={page}>\n {page === 'ellipsis' ? (\n <PaginationEllipsis className={classNames?.ellipsis} />\n ) : (\n <PaginationLink\n onClick={() => {\n setCurrentPage(page);\n onChange(page);\n }}\n className={cn(\n 'flex h-[32px] w-[32px] cursor-pointer items-center justify-center rounded-full hover:bg-surface-hover',\n classNames?.list,\n page === currentPage && [\n 'bg-secondary text-content-reverse hover:bg-secondary-hover',\n classNames?.active,\n ],\n )}\n >\n {page}\n </PaginationLink>\n )}\n </PaginationItem>\n ))}\n\n <PaginationItem>\n <PaginationNext\n onClick={() => {\n if (currentPage < totalPages) {\n onChange(currentPage + 1);\n setCurrentPage(currentPage + 1);\n }\n }}\n className={cn(\n 'cursor-pointer',\n classNames?.navigation,\n currentPage >= totalPages && 'pointer-events-none cursor-not-allowed opacity-35',\n )}\n />\n </PaginationItem>\n </PaginationContent>\n </PaginationUnit>\n );\n}\n\nexport { Pagination };\n"],"mappings":"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"}