diff --git a/superset-frontend/spec/javascripts/explore/utils_spec.jsx b/superset-frontend/spec/javascripts/explore/utils_spec.jsx index 8e419d135..11a40b237 100644 --- a/superset-frontend/spec/javascripts/explore/utils_spec.jsx +++ b/superset-frontend/spec/javascripts/explore/utils_spec.jsx @@ -23,6 +23,7 @@ import { buildV1ChartDataPayload, getExploreUrl, getExploreLongUrl, + getDataTablePageSize, shouldUseLegacyApi, } from 'src/explore/exploreUtils'; import { @@ -200,6 +201,20 @@ describe('exploreUtils', () => { }); }); + describe('getDataTablePageSize', () => { + it('divides samples data into pages dynamically', () => { + let pageSize; + pageSize = getDataTablePageSize(500); + expect(pageSize).toEqual(20); + pageSize = getDataTablePageSize(0); + expect(pageSize).toEqual(50); + pageSize = getDataTablePageSize(1); + expect(pageSize).toEqual(10000); + pageSize = getDataTablePageSize(1000000); + expect(pageSize).toEqual(5); + }); + }); + describe('buildV1ChartDataPayload', () => { it('generate valid request payload despite no registered buildQuery', () => { const v1RequestPayload = buildV1ChartDataPayload({ diff --git a/superset-frontend/src/explore/components/DataTableControl.tsx b/superset-frontend/src/explore/components/DataTableControl.tsx index 8768e31bf..52619f37d 100644 --- a/superset-frontend/src/explore/components/DataTableControl.tsx +++ b/superset-frontend/src/explore/components/DataTableControl.tsx @@ -90,7 +90,7 @@ export const useFilteredTableData = ( const formattedData = applyFormattingToTabularData(data); return formattedData.filter((row: Record) => Object.values(row).some(value => - value.toString().toLowerCase().includes(filterText.toLowerCase()), + value?.toString().toLowerCase().includes(filterText.toLowerCase()), ), ); }, [data, filterText]); diff --git a/superset-frontend/src/explore/components/DataTablesPane.tsx b/superset-frontend/src/explore/components/DataTablesPane.tsx index 9336051e7..d9b3493c6 100644 --- a/superset-frontend/src/explore/components/DataTablesPane.tsx +++ b/superset-frontend/src/explore/components/DataTablesPane.tsx @@ -24,6 +24,7 @@ import Loading from 'src/components/Loading'; import TableView, { EmptyWrapperType } from 'src/components/TableView'; import { getChartDataRequest } from 'src/chart/chartAction'; import { getClientErrorObject } from 'src/utils/getClientErrorObject'; +import { getDataTablePageSize } from 'src/explore/exploreUtils'; import { CopyToClipboardButton, FilterInput, @@ -181,6 +182,9 @@ export const DataTablesPane = ({ }; const renderDataTable = (type: string) => { + // restrict cell count to 10000 or min 5 rows to avoid crashing browser + const columnsLength = columns[type].length; + const pageSize = getDataTablePageSize(columnsLength); if (isLoading[type]) { return ; } @@ -195,7 +199,8 @@ export const DataTablesPane = ({