Skip to content

Commit 74116f8

Browse files
author
Karine Brandelli Padilha
committed
feat: create TableFooter and TablePagination
1 parent 2ba4bbb commit 74116f8

File tree

6 files changed

+180
-4
lines changed

6 files changed

+180
-4
lines changed

jest.config.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ module.exports = {
99
'!<rootDir>/src/core/feedback/dialog-v2/index.ts',
1010
'!<rootDir>/src/core/navigation/breadcrumbs/index.tsx',
1111
'!<rootDir>/src/core/inputs/select/index.tsx',
12-
'!<rootDir>/src/core/inputs/date-time/index.tsx'
12+
'!<rootDir>/src/core/inputs/date-time/index.tsx',
13+
'!<rootDir>/src/core/data-display/table/table-pagination.tsx'
1314
],
1415
transform: {
1516
'.+\\.(ts|tsx)$': 'ts-jest'

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "flipper-ui",
3-
"version": "0.34.2",
3+
"version": "0.34.3",
44
"description": "React UI based on the @mui/material toolkit for the web",
55
"main": "dist/index.js",
66
"author": "NG",
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import React from 'react'
2+
import MuiTableFooter from '@mui/material/TableFooter'
3+
import type { DefaultProps } from '../../types'
4+
import type { TableFooterProps } from '@mui/material/TableFooter'
5+
import { theme } from '@/theme'
6+
7+
const { grays } = theme.colors
8+
9+
export interface ITableFooterProps extends DefaultProps, TableFooterProps {}
10+
11+
const TableFooter = ({
12+
style,
13+
margin,
14+
padding,
15+
children
16+
}: ITableFooterProps) => (
17+
<MuiTableFooter
18+
style={{
19+
borderColor: grays.g7,
20+
margin,
21+
padding,
22+
...style
23+
}}>
24+
{children}
25+
</MuiTableFooter>
26+
)
27+
28+
export default TableFooter
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import React from 'react'
2+
import type { ChangeEvent, CSSProperties, MouseEvent } from 'react'
3+
import MuiTablePagination from '@mui/material/TablePagination'
4+
import type { TablePaginationProps } from '@mui/material/TablePagination'
5+
import { theme } from '@/theme'
6+
7+
const { grays } = theme.colors
8+
9+
interface ITablePaginationProps
10+
extends Omit<
11+
TablePaginationProps,
12+
| 'component'
13+
| 'count'
14+
| 'page'
15+
| 'rowsPerPage'
16+
| 'onPageChange'
17+
| 'onRowsPerPageChange'
18+
> {
19+
count: number
20+
page: number
21+
rowsPerPage: number
22+
rowsPerPageOptions?: number[]
23+
onPageChange: (
24+
event: MouseEvent<HTMLButtonElement> | null,
25+
page: number
26+
) => void
27+
onRowsPerPageChange: (
28+
event: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>
29+
) => void
30+
style?: CSSProperties
31+
}
32+
33+
const TablePagination = ({
34+
count,
35+
page,
36+
rowsPerPage,
37+
rowsPerPageOptions,
38+
onPageChange,
39+
onRowsPerPageChange,
40+
style,
41+
padding,
42+
...props
43+
}: ITablePaginationProps) => {
44+
return (
45+
<MuiTablePagination
46+
count={count}
47+
page={page}
48+
rowsPerPage={rowsPerPage}
49+
rowsPerPageOptions={
50+
rowsPerPageOptions ? rowsPerPageOptions : [5, 10, 25]
51+
}
52+
labelRowsPerPage='Linhas por página:'
53+
labelDisplayedRows={({ from, to, count }) => {
54+
return `${from}-${to} de ${count !== -1 ? count : `mais que ${to}`}`
55+
}}
56+
style={{
57+
borderColor: grays.g7,
58+
padding,
59+
...style
60+
}}
61+
sx={{
62+
borderBottom: `1px solid ${grays.g7} !important;`
63+
}}
64+
onPageChange={onPageChange}
65+
onRowsPerPageChange={onRowsPerPageChange}
66+
{...props}
67+
/>
68+
)
69+
}
70+
71+
export default TablePagination

src/core/data-display/table/table.spec.tsx

Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
import React, { act } from 'react'
2-
import { render, waitFor } from '@testing-library/react'
1+
import React, { act, useState } from 'react'
2+
import { fireEvent, render, waitFor } from '@testing-library/react'
33
import { userEvent } from '@testing-library/user-event'
44
import TableBody from './table-body'
55
import TableCell from './table-cell'
6+
import TableFooter from './table-footer'
67
import TableHead from './table-head'
8+
import TablePagination from './table-pagination'
79
import TableRow from './table-row'
810
import Table from '.'
911
import '@testing-library/jest-dom'
@@ -14,6 +16,9 @@ interface IProps {
1416
}
1517

1618
const Default = ({ onSort, color }: IProps) => {
19+
const [page, setPage] = useState(0)
20+
const [rowsPerPage, setRowsPerPage] = useState(2)
21+
1722
return (
1823
<Table>
1924
<TableHead color={color} onSort={onSort ? onSort : undefined}>
@@ -31,7 +36,32 @@ const Default = ({ onSort, color }: IProps) => {
3136
<TableCell>Table-Row-Name-2</TableCell>
3237
<TableCell>Table-Row-Name-Email-2</TableCell>
3338
</TableRow>
39+
<TableRow>
40+
<TableCell>Table-Row-Name-3</TableCell>
41+
<TableCell>Table-Row-Name-Email-3</TableCell>
42+
</TableRow>
43+
<TableRow>
44+
<TableCell>Table-Row-Name-4</TableCell>
45+
<TableCell>Table-Row-Name-Email-4</TableCell>
46+
</TableRow>
3447
</TableBody>
48+
<TableFooter>
49+
<TableRow>
50+
<TablePagination
51+
page={page}
52+
rowsPerPage={rowsPerPage}
53+
count={4}
54+
rowsPerPageOptions={[1, 2, 4]}
55+
onPageChange={(_, page: number) => {
56+
setPage(page)
57+
}}
58+
onRowsPerPageChange={event => {
59+
setRowsPerPage(parseInt(event.target.value, 10))
60+
setPage(0)
61+
}}
62+
/>
63+
</TableRow>
64+
</TableFooter>
3565
</Table>
3666
)
3767
}
@@ -88,4 +118,48 @@ describe('Table', () => {
88118
expect(headerStyle.backgroundColor).toBe('blue')
89119
})
90120
})
121+
122+
it('should render footer', () => {
123+
const { container } = render(<Default color='blue' />)
124+
125+
const footer = container.querySelector(
126+
'.MuiTableFooter-root'
127+
) as HTMLTableCellElement
128+
129+
waitFor(() => {
130+
expect(footer).toBeInTheDocument()
131+
})
132+
})
133+
134+
it('should change page when next page button is clicked', () => {
135+
const { getByText, getByLabelText } = render(<Default />)
136+
137+
const pageDisplay = getByText('1-2 de 4')
138+
139+
expect(pageDisplay).toBeInTheDocument()
140+
141+
const nextPageButton = getByLabelText('Go to next page')
142+
143+
fireEvent.click(nextPageButton)
144+
145+
expect(getByText('3-4 de 4')).toBeInTheDocument()
146+
})
147+
148+
it('should change rows per page', () => {
149+
const { getByRole, getAllByRole } = render(<Default />)
150+
151+
const combobox = getByRole('combobox')
152+
153+
fireEvent.mouseDown(combobox)
154+
155+
const option = getByRole('option', { name: '4' })
156+
157+
fireEvent.click(option)
158+
159+
expect(combobox).toHaveTextContent('4')
160+
161+
const rowsAfter = getAllByRole('rowgroup')[1].childElementCount
162+
163+
expect(rowsAfter).toBe(4)
164+
})
91165
})

src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ export { default as TableBody } from './core/data-display/table/table-body'
2121
export { default as TableCell } from './core/data-display/table/table-cell'
2222
export { default as TableHead } from './core/data-display/table/table-head'
2323
export { default as TableRow } from './core/data-display/table/table-row'
24+
export { default as TableFooter } from './core/data-display/table/table-footer'
25+
export { default as TablePagination } from './core/data-display/table/table-pagination'
2426
export { default as Typography } from './core/data-display/typography'
2527

2628
export { default as Collapse } from './core/feedback/collapse'

0 commit comments

Comments
 (0)