Skip to content

Commit 95d13d6

Browse files
committed
pagination ellipses for more than 7 pages
1 parent 3d93517 commit 95d13d6

3 files changed

Lines changed: 57 additions & 18 deletions

File tree

readme.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
- [Discogs API Collection](https://www.discogs.com/developers#page:user-collection,header:user-collection-collection-items-by-folder)
44
- [Discogs API Release](https://www.discogs.com/developers#page:database,header:database-release)
55

6+
This application uses Discogs' API but is not affiliated with, sponsored or endorsed by Discogs. 'Discogs' is a trademark of Zink Media, LLC. Data provided by Discogs.
7+
68
Tools
79

810
- [React](https://react.dev)

src/components/PaginationRow.tsx

Lines changed: 53 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type { Pagination as PaginationType } from '@/lib/types-collection'
33
import {
44
Pagination,
55
PaginationContent,
6-
// PaginationEllipsis,
6+
PaginationEllipsis,
77
PaginationItem,
88
PaginationLink,
99
PaginationNext,
@@ -35,6 +35,31 @@ type PaginationRowProps = {
3535
setSort: React.Dispatch<React.SetStateAction<SortingOption>>
3636
}
3737

38+
type PaginationItemsType = (number | 'start-ellipsis' | 'end-ellipsis')[]
39+
40+
const getPaginationItems = (current: number, total: number) => {
41+
if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1)
42+
43+
const items: PaginationItemsType = []
44+
45+
if (current <= 4) {
46+
// beginning: 1..5, ellipsis, last
47+
items.push(1, 2, 3, 4, 5, 'end-ellipsis', total)
48+
return items
49+
}
50+
51+
if (current >= total - 3) {
52+
// ending: first, ellipsis, last-4..last
53+
items.push(1, 'start-ellipsis')
54+
for (let p = total - 4; p <= total; p++) items.push(p)
55+
return items
56+
}
57+
58+
// middle: first, ellipsis, current-1, current, current+1, ellipsis, last
59+
items.push(1, 'start-ellipsis', current - 1, current, current + 1, 'end-ellipsis', total)
60+
return items
61+
}
62+
3863
export const PaginationRow = ({
3964
pagination,
4065
setPage,
@@ -59,22 +84,33 @@ export const PaginationRow = ({
5984
}}
6085
/>
6186
</PaginationItem>
62-
{Array.from({ length: pagination.pages }, (_, i) => (
63-
<PaginationItem key={i + 1}>
64-
<PaginationLink
65-
isActive={i + 1 === pagination.page}
66-
onClick={(e) => {
67-
e.preventDefault()
68-
setPage(i + 1)
69-
}}
70-
>
71-
{i + 1}
72-
</PaginationLink>
73-
</PaginationItem>
74-
))}
75-
{/* <PaginationItem>
76-
<PaginationEllipsis />
77-
</PaginationItem> */}
87+
88+
{getPaginationItems(pagination.page, pagination.pages).map((item, index) => {
89+
if (item === 'start-ellipsis' || item === 'end-ellipsis') {
90+
return (
91+
<PaginationItem key={`ellipsis-${index}`}>
92+
<PaginationEllipsis />
93+
</PaginationItem>
94+
)
95+
}
96+
97+
const pageNum = item
98+
99+
return (
100+
<PaginationItem key={pageNum}>
101+
<PaginationLink
102+
isActive={pageNum === pagination.page}
103+
onClick={(e) => {
104+
e.preventDefault()
105+
setPage(pageNum)
106+
}}
107+
>
108+
{pageNum}
109+
</PaginationLink>
110+
</PaginationItem>
111+
)
112+
})}
113+
78114
<PaginationItem>
79115
<PaginationNext
80116
disabled={pagination.page === pagination.pages}

src/components/ui/pagination.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,10 @@ function PaginationLink({ className, isActive, size = 'icon', ...props }: Pagina
4343
data-active={isActive}
4444
className={cn(
4545
buttonVariants({
46-
variant: isActive ? 'outline' : 'ghost',
46+
variant: isActive ? 'default' : 'ghost',
4747
size,
4848
}),
49+
'transition-none', // prevent active page "jumping" effect when changing page
4950
className
5051
)}
5152
{...props}

0 commit comments

Comments
 (0)