diff --git a/packages/main/src/components/AnalyticalTable/hooks/useRowSelect.ts b/packages/main/src/components/AnalyticalTable/hooks/useRowSelect.ts index 33c42ce8203..f631f672a6b 100644 --- a/packages/main/src/components/AnalyticalTable/hooks/useRowSelect.ts +++ b/packages/main/src/components/AnalyticalTable/hooks/useRowSelect.ts @@ -1,4 +1,4 @@ -import { useCallback } from 'react'; +import { useCallback, useMemo } from 'react'; import { actions, makePropGetter, ensurePluginOrder, useGetLatest, useMountedLayoutEffect } from 'react-table'; import { AnalyticalTableSelectionMode } from '../../../enums/AnalyticalTableSelectionMode.js'; import type { ReactTableHooks, RowType, TableInstance } from '../types/index.js'; @@ -22,7 +22,7 @@ const emptyArray: RowType[] = []; * This is a fork of react-table's `useRowSelect` with performance optimizations: * - Early exit when `selectionMode` is 'None' * - Skips `selectedFlatRows` computation, `isAllRowsSelected` checks, and `prepareRow` overhead when selection is disabled - * - `isAllRowsSelected` computation is memoized + * - `selectedFlatRows` computation is memoized * - Uses stable noop references when disabled * - Fixes select-all indeterminate state considering filtered-out rows (now only visible rows are considered) * @@ -250,23 +250,29 @@ function useInstance(instance: TableInstance) { ensurePluginOrder(plugins, ['useFilters', 'useGroupBy', 'useSortBy', 'useExpanded', 'usePagination'], 'useRowSelect'); - // UI5WCR: early exit when selection disabled - let selectedFlatRows: RowType[] = emptyArray; - let isAllRowsSelected = false; - let isAllPageRowsSelected = false; + // UI5WCR: memoized computation with early exit when selection disabled. + const selectedFlatRows = useMemo(() => { + if (!isSelectionEnabled) { + return emptyArray; + } - if (isSelectionEnabled) { - selectedFlatRows = []; + const result: RowType[] = []; rows.forEach((row) => { const isSelected = selectSubRows ? getRowIsSelected(row, selectedRowIds, getSubRows) : !!selectedRowIds[row.id]; row.isSelected = !!isSelected; row.isSomeSelected = isSelected === null; if (isSelected) { - selectedFlatRows.push(row); + result.push(row); } }); + return result; + }, [rows, selectSubRows, selectedRowIds, getSubRows, isSelectionEnabled]); + let isAllRowsSelected = false; + let isAllPageRowsSelected = false; + + if (isSelectionEnabled) { // isAllRowsSelected const rowIds = Object.keys(nonGroupedRowsById); const selectedIds = Object.keys(selectedRowIds);