From 1c4e8fc1617efa70a95c8991639e7132cb8a09b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Mierzwa?= Date: Wed, 10 Jun 2020 13:14:50 +0100 Subject: [PATCH] fix(ui): rewrite Pagination with hooks --- ui/src/Components/LabelSetList/index.js | 1 - ui/src/Components/Pagination/index.js | 154 +++++++++--------- ui/src/Components/Pagination/index.test.js | 30 +++- .../Components/SilenceModal/Browser/index.js | 10 -- 4 files changed, 104 insertions(+), 91 deletions(-) diff --git a/ui/src/Components/LabelSetList/index.js b/ui/src/Components/LabelSetList/index.js index e2383e82a..019f5ca4f 100644 --- a/ui/src/Components/LabelSetList/index.js +++ b/ui/src/Components/LabelSetList/index.js @@ -57,7 +57,6 @@ const LabelSetList = ({ alertStore, labelsList }) => { { + const [activePage, setActivePage] = useState(initialPage); - constructor(props) { - super(props); - this.HotKeysRef = React.createRef(); - } + useEffect(() => { + if (activePage > totalPages) { + const page = Math.max(1, totalPages); + setActivePage(page); + setPageCallback(page); + } + }, [activePage, maxPerPage, totalPages, setPageCallback]); - onPageUp = () => { - const { setPageCallback, activePage, totalPages } = this.props; - setPageCallback(Math.min(activePage + 1, totalPages)); - }; + const onChange = useCallback( + (page) => { + setActivePage(page); + setPageCallback(page); + }, + [setPageCallback] + ); - onPageDown = () => { - const { setPageCallback, activePage } = this.props; - setPageCallback(Math.max(activePage - 1, 1)); - }; + const onPageUp = useCallback(() => { + const page = Math.min(activePage + 1, totalPages); + setActivePage(page); + setPageCallback(page); + }, [activePage, setPageCallback, totalPages]); - componentDidMount() { - this.HotKeysRef.current.focus(); - } + const onPageDown = useCallback(() => { + const page = Math.max(activePage - 1, 1); + setActivePage(page); + setPageCallback(page); + }, [activePage, setPageCallback]); - render() { - const { - totalItemsCount, - totalPages, - maxPerPage, - activePage, - setPageCallback, - } = this.props; - - const isMobile = IsMobile(); - - return ( - - {totalItemsCount > maxPerPage ? ( -
- } - nextPageText={} - firstPageText={} - lastPageText={} - /> -
- ) : null} -
- ); - } -} + return ( + r && r.focus()} + keyMap={{ + onArrowLeft: "ArrowLeft", + onArrowRight: "ArrowRight", + }} + handlers={{ + onArrowLeft: onPageDown, + onArrowRight: onPageUp, + }} + allowChanges + > + {totalItemsCount > maxPerPage ? ( +
+ } + nextPageText={} + firstPageText={} + lastPageText={} + /> +
+ ) : null} +
+ ); +}; +PageSelect.propTypes = { + totalPages: PropTypes.number.isRequired, + initialPage: PropTypes.number, + maxPerPage: PropTypes.number.isRequired, + totalItemsCount: PropTypes.number.isRequired, + setPageCallback: PropTypes.func.isRequired, +}; +PageSelect.defaultProps = { + initialPage: 1, +}; export { PageSelect }; diff --git a/ui/src/Components/Pagination/index.test.js b/ui/src/Components/Pagination/index.test.js index dc73c52c1..4205a770a 100644 --- a/ui/src/Components/Pagination/index.test.js +++ b/ui/src/Components/Pagination/index.test.js @@ -26,7 +26,6 @@ describe("", () => { const tree = mount( ", () => { ); tree.simulate("focus"); - setPageCallback.mockImplementation((val) => - tree.setProps({ activePage: val }) - ); - PressKey(tree, "ArrowRight", 39); expect(setPageCallback).toHaveBeenLastCalledWith(2); @@ -68,7 +63,6 @@ describe("", () => { const tree = mount( ", () => { const tree = mount( ", () => { ); expect(tree.find(".page-link")).toHaveLength(5); }); + + it("resets page if activePage >= totalPages", () => { + const setPageCallback = jest.fn(); + const tree = mount( + + ); + expect(tree.find(".page-item").at(3).hasClass("active")).toBe(true); + + tree.setProps({ totalPages: 2 }); + tree.update(); + expect(tree.find(".page-item").at(2).hasClass("active")).toBe(true); + expect(setPageCallback).toHaveBeenLastCalledWith(2); + + tree.setProps({ totalPages: 5 }); + tree.update(); + expect(tree.find(".page-item").at(2).hasClass("active")).toBe(true); + }); }); diff --git a/ui/src/Components/SilenceModal/Browser/index.js b/ui/src/Components/SilenceModal/Browser/index.js index 79945c2e4..b48dc6520 100644 --- a/ui/src/Components/SilenceModal/Browser/index.js +++ b/ui/src/Components/SilenceModal/Browser/index.js @@ -77,15 +77,6 @@ const Browser = ({ { deps: [currentTime] } ); - useEffect(() => { - if (response) { - const totalPages = Math.ceil(response.length / maxPerPage); - if (activePage > totalPages) { - setActivePage(Math.max(1, totalPages)); - } - } - }, [activePage, maxPerPage, response]); - useEffect(() => { const timer = setInterval(() => { setCurrentTime(Math.floor(Date.now() / 1000)); @@ -168,7 +159,6 @@ const Browser = ({ ))}