• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

IQSS / dataverse-frontend / 14227773064

02 Apr 2025 07:18PM UTC coverage: 97.467% (-0.6%) from 98.075%
14227773064

push

github

GPortas
Added: explanatory comment to port mapping of dev_dataverse and removed redundant param

2652 of 2775 branches covered (95.57%)

Branch coverage included in aggregate %.

6006 of 6108 relevant lines covered (98.33%)

13660.16 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

69.01
/src/sections/shared/pagination/PaginationControls.tsx
1
import { Col, Pagination, Row } from '@iqss/dataverse-design-system'
2
import { PageNumbersButtonsWithEllipsis } from './PageNumbersButtonsWithEllipsis'
3
import { PageSizeSelector } from './PageSizeSelector'
4
import styles from './Pagination.module.scss'
5
import { PaginationInfo } from '../../../shared/pagination/domain/models/PaginationInfo'
6
import { useEffect, useState } from 'react'
7
import { FilePaginationInfo } from '../../../files/domain/models/FilePaginationInfo'
8
import { DatasetPaginationInfo } from '../../../dataset/domain/models/DatasetPaginationInfo'
9
import { useSearchParams } from 'react-router-dom'
10

11
interface PaginationProps {
12
  onPaginationInfoChange: (
13
    paginationInfo: PaginationInfo<DatasetPaginationInfo | FilePaginationInfo>
14
  ) => void
15
  initialPaginationInfo: PaginationInfo<DatasetPaginationInfo | FilePaginationInfo>
16
  showPageSizeSelector?: boolean
17
  updateQueryParam?: boolean
18
}
19
const MINIMUM_NUMBER_OF_PAGES_TO_DISPLAY_PAGINATION = 2
96✔
20
export function PaginationControls({
96✔
21
  onPaginationInfoChange,
22
  initialPaginationInfo,
23
  showPageSizeSelector = true,
4,351✔
24
  updateQueryParam = false
4,359✔
25
}: PaginationProps) {
4,359✔
26
  const [searchParams, setSearchParams] = useSearchParams()
4,359✔
27
  const [paginationInfo, setPaginationInfo] = useState<DatasetPaginationInfo | FilePaginationInfo>(
4,359✔
28
    initialPaginationInfo
29
  )
30
  const goToPage = (newPage: number) => {
4,359✔
31
    setPaginationInfo(paginationInfo.goToPage(newPage))
230✔
32
  }
33
  const goToPreviousPage = () => {
4,359✔
34
    setPaginationInfo(paginationInfo.goToPreviousPage())
48✔
35
  }
36
  const goToNextPage = () => {
4,359✔
37
    setPaginationInfo(paginationInfo.goToNextPage())
68✔
38
  }
39
  const setPageSize = (newPageSize: number) => {
4,359✔
40
    setPaginationInfo(paginationInfo.withPageSize(newPageSize))
230✔
41
  }
42

43
  useEffect(() => {
4,359✔
44
    onPaginationInfoChange(paginationInfo)
1,090✔
45
    // TODO: Not a priority as not used for inifinite scroll is used but the eslint disable should be removed and the dependency should be added
46
    // eslint-disable-next-line react-hooks/exhaustive-deps
47
  }, [paginationInfo.pageSize])
2,081✔
48

617✔
49
  useEffect(() => {
2,895!
50
    onPaginationInfoChange(paginationInfo)
673!
51
    if (updateQueryParam) {
673!
52
      if (searchParams.get('page') !== paginationInfo.page.toString()) {
×
53
        searchParams.set('page', paginationInfo.page.toString())
×
54
        setSearchParams(searchParams)
×
55
      }
56
    }
57
    // TODO: Not a priority as not used for inifinite scroll is used but the eslint disable should be removed and the dependency should be added
2,081✔
58
    // eslint-disable-next-line react-hooks/exhaustive-deps
750✔
59
  }, [paginationInfo.page])
60

61
  useEffect(() => {
4,359✔
62
    setPaginationInfo(paginationInfo.withTotal(initialPaginationInfo.totalItems))
1,264!
63
    // TODO: Not a priority as not used for inifinite scroll is used but the eslint disable should be removed and the dependency should be added
×
64
    // eslint-disable-next-line react-hooks/exhaustive-deps
×
65
  }, [initialPaginationInfo.totalItems])
×
66

×
67
  useEffect(() => {
2,278✔
68
    if (updateQueryParam) {
458!
69
      if (searchParams.get('page') !== paginationInfo.page.toString()) {
×
70
        const page = searchParams.get('page') ? parseInt(searchParams.get('page') as string) : 1
×
71
        searchParams.set('page', page.toString())
×
72
        setSearchParams(searchParams, { replace: true })
2,081✔
73
        goToPage(page)
1,082✔
74
      }
75
    }
999✔
76
    // TODO: Not a priority as not used for inifinite scroll is used but the eslint disable should be removed and the dependency should be added
77
    // eslint-disable-next-line react-hooks/exhaustive-deps
78
  }, [searchParams])
79

80
  if (paginationInfo.totalPages < MINIMUM_NUMBER_OF_PAGES_TO_DISPLAY_PAGINATION) {
2,278✔
81
    return <></>
1,193✔
82
  }
83
  return (
1,093✔
84
    <Row className={styles.row}>
85
      <Col md="auto">
24✔
86
        <div className={styles.container}>
87
          <Pagination>
88
            <Pagination.First
89
              onClick={() => goToPage(1)}
8✔
90
              disabled={!paginationInfo.hasPreviousPage}
91
            />
92
            <Pagination.Prev
93
              onClick={() => goToPreviousPage()}
24✔
94
              disabled={!paginationInfo.hasPreviousPage}
34✔
95
            />
96
            <PageNumbersButtonsWithEllipsis
97
              selectedPageIndex={paginationInfo.page - 1}
98
              pageCount={paginationInfo.totalPages}
17✔
99
              goToPage={goToPage}
100
            />
101
            <Pagination.Next
102
              onClick={() => goToNextPage()}
34✔
103
              disabled={!paginationInfo.hasNextPage}
104
            />
105
            <Pagination.Last
106
              onClick={() => goToPage(paginationInfo.totalPages)}
17✔
107
              disabled={!paginationInfo.hasNextPage}
108
            />
109
          </Pagination>
110
          {showPageSizeSelector && (
2,186✔
111
            <PageSizeSelector
112
              itemName={paginationInfo.itemName}
113
              pageSize={paginationInfo.pageSize}
46✔
114
              setPageSize={setPageSize}
115
            />
116
          )}
117
        </div>
118
      </Col>
119
    </Row>
120
  )
121
}
50✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc