This is an automated email from the ASF dual-hosted git repository. michaelsmolina pushed a commit to branch 3.1 in repository https://gitbox.apache.org/repos/asf/superset.git
commit 254f1ae512b91112c74378b80199801cb2a9aeca Author: Michael S. Molina <[email protected]> AuthorDate: Wed Feb 28 10:15:28 2024 -0500 fix: Navigating to an invalid page index in lists (#27273) --- .../src/components/ListView/ListView.test.tsx | 74 ++++++++++++++++++++++ .../src/components/ListView/ListView.tsx | 8 ++- 2 files changed, 81 insertions(+), 1 deletion(-) diff --git a/superset-frontend/src/components/ListView/ListView.test.tsx b/superset-frontend/src/components/ListView/ListView.test.tsx new file mode 100644 index 0000000000..9f4da16140 --- /dev/null +++ b/superset-frontend/src/components/ListView/ListView.test.tsx @@ -0,0 +1,74 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { render, waitFor } from 'spec/helpers/testing-library'; +import ListView from './ListView'; + +const mockedProps = { + title: 'Data Table', + columns: [ + { + accessor: 'id', + Header: 'ID', + sortable: true, + }, + { + accessor: 'age', + Header: 'Age', + }, + { + accessor: 'name', + Header: 'Name', + }, + { + accessor: 'time', + Header: 'Time', + }, + ], + data: [ + { id: 1, name: 'data 1', age: 10, time: '2020-11-18T07:53:45.354Z' }, + { id: 2, name: 'data 2', age: 1, time: '2020-11-18T07:53:45.354Z' }, + ], + count: 2, + pageSize: 1, + loading: false, + refreshData: jest.fn(), + addSuccessToast: jest.fn(), + addDangerToast: jest.fn(), +}; + +test('redirects to first page when page index is invalid', async () => { + const fetchData = jest.fn(); + window.history.pushState({}, '', '/?pageIndex=9'); + render(<ListView {...mockedProps} fetchData={fetchData} />, { + useRouter: true, + useQueryParams: true, + }); + await waitFor(() => { + expect(window.location.search).toEqual('?pageIndex=0'); + expect(fetchData).toBeCalledTimes(2); + expect(fetchData).toHaveBeenCalledWith( + expect.objectContaining({ pageIndex: 9 }), + ); + expect(fetchData).toHaveBeenCalledWith( + expect.objectContaining({ pageIndex: 0 }), + ); + }); + fetchData.mockClear(); +}); diff --git a/superset-frontend/src/components/ListView/ListView.tsx b/superset-frontend/src/components/ListView/ListView.tsx index 93847ca5d8..0cdb4ba034 100644 --- a/superset-frontend/src/components/ListView/ListView.tsx +++ b/superset-frontend/src/components/ListView/ListView.tsx @@ -322,6 +322,12 @@ function ListView<T extends object = any>({ if (!bulkSelectEnabled) toggleAllRowsSelected(false); }, [bulkSelectEnabled, toggleAllRowsSelected]); + useEffect(() => { + if (!loading && pageIndex > pageCount - 1 && pageCount > 0) { + gotoPage(0); + } + }, [gotoPage, loading, pageCount, pageIndex]); + return ( <ListViewStyles> {allowBulkTagActions && ( @@ -463,7 +469,7 @@ function ListView<T extends object = any>({ <div className="pagination-container"> <Pagination totalPages={pageCount || 0} - currentPage={pageCount ? pageIndex + 1 : 0} + currentPage={pageCount && pageIndex < pageCount ? pageIndex + 1 : 0} onChange={(p: number) => gotoPage(p - 1)} hideFirstAndLastPageLinks />
