Skip to content

Commit c4b3658

Browse files
authored
fix(AnalyticalTable): don't scroll when calling toggleRowExpanded (#5296)
Fixes #5181
1 parent ec5f0eb commit c4b3658

File tree

4 files changed

+69
-29
lines changed

4 files changed

+69
-29
lines changed

packages/main/src/components/AnalyticalTable/AnalyticalTable.cy.tsx

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1900,6 +1900,34 @@ describe('AnalyticalTable', () => {
19001900
});
19011901

19021902
it("Expandable: don't scroll when expanded/collapsed", () => {
1903+
const TestComp = () => {
1904+
const tableInstanceRef = useRef();
1905+
return (
1906+
<>
1907+
<button
1908+
onClick={() => {
1909+
tableInstanceRef.current.toggleRowExpanded('6');
1910+
}}
1911+
>
1912+
toggle row
1913+
</button>
1914+
<AnalyticalTable
1915+
data={[
1916+
...dataTree,
1917+
...dataTree,
1918+
...dataTree,
1919+
{ name: 'toggle', subRows: [{ name: 'toggled' }] },
1920+
...dataTree,
1921+
...dataTree
1922+
]}
1923+
columns={columns}
1924+
isTreeTable
1925+
visibleRows={5}
1926+
tableInstance={tableInstanceRef}
1927+
/>
1928+
</>
1929+
);
1930+
};
19031931
cy.mount(<AnalyticalTable data={[...dataTree, ...dataTree]} columns={columns} isTreeTable visibleRows={5} />);
19041932
cy.findAllByText('Katy Bradshaw').eq(1).trigger('keydown', {
19051933
key: 'Enter'
@@ -1960,6 +1988,16 @@ describe('AnalyticalTable', () => {
19601988
force: true
19611989
});
19621990
cy.get('[data-component-name="AnalyticalTableBody"]').invoke('scrollTop').should('not.equal', 0);
1991+
1992+
cy.mount(<TestComp />);
1993+
cy.get('[data-component-name="AnalyticalTableBody"]').scrollTo('center');
1994+
cy.findByText('toggled').should('not.exist');
1995+
cy.findByText('toggle row').click();
1996+
cy.findByText('toggled').should('be.visible');
1997+
cy.get('[data-component-name="AnalyticalTableBody"]').invoke('scrollTop').should('not.equal', 0);
1998+
cy.findByText('toggle row').click();
1999+
cy.findByText('toggled').should('not.exist');
2000+
cy.get('[data-component-name="AnalyticalTableBody"]').invoke('scrollTop').should('not.equal', 0);
19632001
});
19642002

19652003
it('multi-sort', () => {

packages/main/src/components/AnalyticalTable/TableBody/VirtualTableBodyContainer.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ export const VirtualTableBodyContainer = (props: VirtualTableBodyContainerProps)
5555

5656
useEffect(() => {
5757
if (prevDataLength.current > dataLength) {
58+
// if prevData is larger because a row was collapsed, no scroll should be executed
5859
if (rowCollapsedFlag) {
5960
dispatch({
6061
type: 'ROW_COLLAPSED_FLAG',

packages/main/src/components/AnalyticalTable/hooks/useToggleRowExpand.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { enrichEventWithDetails } from '@ui5/webcomponents-react-base';
22
import type { ReactTableHooks } from '../types/index.js';
33

44
const getToggleRowExpandedProps = (rowProps, { row, instance, userProps }) => {
5-
const { dispatch, manualGroupBy } = instance;
5+
const { manualGroupBy } = instance;
66
const { onRowExpandChange, isTreeTable, renderRowSubComponent, alwaysShowSubComponent } =
77
instance.webComponentsReactProperties;
88
const onClick = (e, noPropagation = true) => {
@@ -19,13 +19,6 @@ const getToggleRowExpandedProps = (rowProps, { row, instance, userProps }) => {
1919
}
2020
}
2121

22-
if (row.isExpanded) {
23-
dispatch({
24-
type: 'ROW_COLLAPSED_FLAG',
25-
payload: true
26-
});
27-
}
28-
2922
onRowExpandChange(
3023
enrichEventWithDetails(e, {
3124
row,
Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { actions } from 'react-table';
22

3-
export const stateReducer = (prevState, action) => {
3+
export const stateReducer = (state, action, _prevState, instance) => {
44
const { payload } = action;
55

6-
if (prevState.isRtl && action.type === actions.columnResizing) {
6+
if (state.isRtl && action.type === actions.columnResizing) {
77
const { clientX } = action;
8-
const { startX, columnWidth, headerIdWidths } = prevState.columnResizing;
8+
const { startX, columnWidth, headerIdWidths } = state.columnResizing;
99

1010
const deltaX = startX - clientX;
1111
const percentageDeltaX = deltaX / columnWidth;
@@ -17,45 +17,53 @@ export const stateReducer = (prevState, action) => {
1717
});
1818

1919
return {
20-
...prevState,
20+
...state,
2121
columnResizing: {
22-
...prevState.columnResizing,
22+
...state.columnResizing,
2323
columnWidths: {
24-
...prevState.columnResizing.columnWidths,
24+
...state.columnResizing.columnWidths,
2525
...newColumnWidths
2626
}
2727
}
2828
};
2929
}
30-
3130
switch (action.type) {
31+
case 'toggleRowExpanded':
32+
// this flag disables scrolling to the top of the table if a table is collapsed
33+
if (!state.expanded[action.id]) {
34+
instance.dispatch({
35+
type: 'ROW_COLLAPSED_FLAG',
36+
payload: true
37+
});
38+
}
39+
return state;
3240
case 'TABLE_RESIZE':
33-
return { ...prevState, tableClientWidth: payload.tableClientWidth };
41+
return { ...state, tableClientWidth: payload.tableClientWidth };
3442
case 'VISIBLE_ROWS':
35-
return { ...prevState, visibleRows: payload.visibleRows };
43+
return { ...state, visibleRows: payload.visibleRows };
3644
case 'TABLE_SCROLLING_ENABLED':
37-
return { ...prevState, isScrollable: payload.isScrollable };
45+
return { ...state, isScrollable: payload.isScrollable };
3846
case 'SET_SELECTED_ROW_IDS':
39-
return { ...prevState, selectedRowIds: payload.selectedRowIds };
47+
return { ...state, selectedRowIds: payload.selectedRowIds };
4048
case 'SET_POPIN_COLUMNS':
41-
return { ...prevState, popInColumns: payload };
49+
return { ...state, popInColumns: payload };
4250
case 'INTERACTIVE_ROWS_HAVE_POPIN':
43-
return { ...prevState, interactiveRowsHavePopIn: payload };
51+
return { ...state, interactiveRowsHavePopIn: payload };
4452
case 'IS_RTL':
45-
return { ...prevState, isRtl: payload.isRtl };
53+
return { ...state, isRtl: payload.isRtl };
4654
case 'SUB_COMPONENTS_HEIGHT':
47-
return { ...prevState, subComponentsHeight: payload };
55+
return { ...state, subComponentsHeight: payload };
4856
case 'TABLE_COL_RESIZED':
49-
return { ...prevState, tableColResized: payload };
57+
return { ...state, tableColResized: payload };
5058
case 'SELECT_ROW_CB':
51-
return { ...prevState, selectedRowPayload: payload };
59+
return { ...state, selectedRowPayload: payload };
5260
case 'ROW_COLLAPSED_FLAG':
53-
return { ...prevState, rowCollapsed: payload };
61+
return { ...state, rowCollapsed: payload };
5462
case 'COLUMN_DND_START':
55-
return { ...prevState, dndColumn: payload };
63+
return { ...state, dndColumn: payload };
5664
case 'COLUMN_DND_END':
57-
return { ...prevState, dndColumn: '' };
65+
return { ...state, dndColumn: '' };
5866
default:
59-
return prevState;
67+
return state;
6068
}
6169
};

0 commit comments

Comments
 (0)