From 5a5c255f778ea127cb808246ce181bb78874987b Mon Sep 17 00:00:00 2001 From: Pig Fang Date: Sat, 4 Jul 2020 16:41:30 +0800 Subject: [PATCH] tweak pagination --- .../assets/src/components/Pagination.tsx | 40 ++++++++++++++++--- .../assets/src/components/PaginationItem.tsx | 7 +++- .../tests/components/Pagination.test.tsx | 15 +++---- 3 files changed, 48 insertions(+), 14 deletions(-) diff --git a/resources/assets/src/components/Pagination.tsx b/resources/assets/src/components/Pagination.tsx index 62208c2c..2888177c 100644 --- a/resources/assets/src/components/Pagination.tsx +++ b/resources/assets/src/components/Pagination.tsx @@ -1,4 +1,5 @@ import React from 'react' +import { t } from '@/scripts/i18n' import PaginationItem from './PaginationItem' interface Props { @@ -7,7 +8,7 @@ interface Props { onChange(page: number): void | Promise } -export const labels = { +const labels = { prev: '‹', next: '›', } @@ -21,13 +22,21 @@ const Pagination: React.FC = (props) => { return (
    - onChange(page - 1)}> + onChange(page - 1)} + > {labels.prev} + + {t('vendor.datatable.prev')} + {totalPages < 8 ? ( Array.from({ length: totalPages }).map((_, i) => ( onChange(i + 1)} > @@ -40,6 +49,7 @@ const Pagination: React.FC = (props) => { [1, 2, 3, 4].map((n) => ( onChange(n)} > @@ -47,21 +57,31 @@ const Pagination: React.FC = (props) => { )) ) : ( - onChange(1)}>1 + onChange(1)} + > + 1 + )} - ... + + ... + {page > 3 && page < totalPages - 2 && ( <> {[page - 1, page, page + 1].map((n) => ( onChange(n)} > {n} ))} - ... + + ... + )} {totalPages - page < 3 ? ( @@ -69,6 +89,7 @@ const Pagination: React.FC = (props) => { (n) => ( onChange(n)} > @@ -77,16 +98,23 @@ const Pagination: React.FC = (props) => { ), ) ) : ( - onChange(totalPages)}> + onChange(totalPages)} + > {totalPages} )} )} onChange(page + 1)} > + + {t('vendor.datatable.next')} + {labels.next}
diff --git a/resources/assets/src/components/PaginationItem.tsx b/resources/assets/src/components/PaginationItem.tsx index ddbe3a38..fe75ec1c 100644 --- a/resources/assets/src/components/PaginationItem.tsx +++ b/resources/assets/src/components/PaginationItem.tsx @@ -3,6 +3,8 @@ import React from 'react' interface Props { disabled?: boolean active?: boolean + title?: string + className?: string onClick?(): void } @@ -14,6 +16,9 @@ const PaginationItem: React.FC = (props) => { if (props.disabled) { classes.push('disabled') } + if (props.className) { + classes.push(props.className) + } const handleClick = (event: React.MouseEvent) => { event.preventDefault() @@ -23,7 +28,7 @@ const PaginationItem: React.FC = (props) => { } return ( -
  • +
  • {props.children} diff --git a/resources/assets/tests/components/Pagination.test.tsx b/resources/assets/tests/components/Pagination.test.tsx index d35ba1eb..0de31297 100644 --- a/resources/assets/tests/components/Pagination.test.tsx +++ b/resources/assets/tests/components/Pagination.test.tsx @@ -1,13 +1,14 @@ import React from 'react' import { render, fireEvent } from '@testing-library/react' -import Pagination, { labels } from '@/components/Pagination' +import { t } from '@/scripts/i18n' +import Pagination from '@/components/Pagination' test('hide when total pages is invalid', () => { const { queryByText } = render( {}} />, ) - expect(queryByText(labels.prev)).not.toBeInTheDocument() - expect(queryByText(labels.next)).not.toBeInTheDocument() + expect(queryByText(t('vendor.datatable.prev'))).not.toBeInTheDocument() + expect(queryByText(t('vendor.datatable.next'))).not.toBeInTheDocument() }) describe('previous page', () => { @@ -16,7 +17,7 @@ describe('previous page', () => { const { getByText } = render( , ) - fireEvent.click(getByText(labels.prev)) + fireEvent.click(getByText(t('vendor.datatable.prev'))) expect(mock).toBeCalledWith(2) }) @@ -25,7 +26,7 @@ describe('previous page', () => { const { getByText } = render( , ) - fireEvent.click(getByText(labels.prev)) + fireEvent.click(getByText(t('vendor.datatable.prev'))) expect(mock).not.toBeCalled() }) }) @@ -36,7 +37,7 @@ describe('next page', () => { const { getByText } = render( , ) - fireEvent.click(getByText(labels.next)) + fireEvent.click(getByText(t('vendor.datatable.next'))) expect(mock).toBeCalledWith(4) }) @@ -45,7 +46,7 @@ describe('next page', () => { const { getByText } = render( , ) - fireEvent.click(getByText(labels.next)) + fireEvent.click(getByText(t('vendor.datatable.next'))) expect(mock).not.toBeCalled() }) })