Skip to content

Commit ee2785c

Browse files
authoredAug 23, 2024
refactor(AnalyticalTable): remove selectedFlatRows & add rowsById to onRowSelect (#6255)
BREAKING CHANGE: `selectedFlatRows` has been removed from the `detail` object of `onRowSelect`.
1 parent 418fba9 commit ee2785c

File tree

4 files changed

+64
-24
lines changed

4 files changed

+64
-24
lines changed
 

‎docs/MigrationGuide.mdx

+17
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,23 @@ function MyComponent() {
540540

541541
- `portalContainer` has been removed as it's no longer needed due to the [Popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API) used in the `Popover` ui5 web component.
542542

543+
**Changed Events:**
544+
545+
- `onRowSelect`: Since calculating `selectedFlatRows` was very costly, it has been removed from the `detail` event object. If you still want to use it, you can calculate it yourself:
546+
547+
```js
548+
const handleOnRowSelect = (event) => {
549+
const { selectedRowIds, rowsById } = event.detail;
550+
const selectedRowIdsArrayMapped = Object.keys(selectedRowIds).reduce((acc, key) => {
551+
if (selectedRowIds[key]) {
552+
acc.push(rowsById[key]);
553+
}
554+
return acc;
555+
}, []);
556+
console.log(selectedRowIdsArrayMapped);
557+
};
558+
```
559+
543560
**Renamed Enums:**
544561

545562
Names of the following enums have changed:

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

+37-8
Original file line numberDiff line numberDiff line change
@@ -470,12 +470,18 @@ describe('AnalyticalTable', () => {
470470
filterable
471471
columns={columns}
472472
onRowSelect={(e) => {
473-
const { allRowsSelected, isSelected, row, selectedFlatRows, selectedRowIds } = e.detail;
473+
const { allRowsSelected, isSelected, row, rowsById, selectedRowIds } = e.detail;
474+
const selectedRowIdsArrayMapped = Object.keys(selectedRowIds).reduce((acc, key) => {
475+
if (selectedRowIds[key]) {
476+
acc.push(rowsById[key]);
477+
}
478+
return acc;
479+
}, []);
474480
setRelevantPayload({
475481
allRowsSelected,
476482
isSelected,
477483
row: row.id,
478-
selectedFlatRows: selectedFlatRows.map((item) => ({
484+
selectedFlatRows: selectedRowIdsArrayMapped.map((item) => ({
479485
id: item?.id
480486
})),
481487
selectedRowIds
@@ -582,7 +588,14 @@ describe('AnalyticalTable', () => {
582588
columns={columns}
583589
globalFilterValue={globalFilterVal}
584590
onRowSelect={(e) => {
585-
setSelectedFlatRows(e.detail.selectedFlatRows.map((item) => item.id));
591+
const { selectedRowIds: _selectedRowIds, rowsById } = e.detail;
592+
const selectedRowIdsArrayMapped = Object.keys(_selectedRowIds).reduce((acc, key) => {
593+
if (_selectedRowIds[key]) {
594+
acc.push(rowsById[key]);
595+
}
596+
return acc;
597+
}, []);
598+
setSelectedFlatRows(selectedRowIdsArrayMapped.map((item) => item.id));
586599
setSelectedRowIdsCb(e.detail.selectedRowIds);
587600
setAllRowsSelected(e.detail.allRowsSelected);
588601
onRowSelect(e);
@@ -591,7 +604,8 @@ describe('AnalyticalTable', () => {
591604
selectedRowIds={selectedRowIds}
592605
/>
593606
<p>
594-
"event.detail.selectedFlatRows:"<span data-testid="payload">{JSON.stringify(selectedFlatRows)}</span>
607+
"selectedFlatRows (state - not part of event):"
608+
<span data-testid="payload">{JSON.stringify(selectedFlatRows)}</span>
595609
</p>
596610
<p>
597611
"e.detail.selectedRowIds:"<span data-testid="payloadRowsById">{JSON.stringify(selectedRowIdsCb)}</span>
@@ -610,6 +624,7 @@ describe('AnalyticalTable', () => {
610624
cy.findByText('Name-1').click();
611625
cy.findByText('Name-5').click();
612626
cy.findByText('Name-5').click();
627+
613628
cy.findByTestId('payload').should('have.text', '["0","1"]');
614629
cy.findByTestId('payloadRowsById').should('have.text', '{"0":true,"1":true}');
615630
cy.findByTestId('payloadAllRowsSelected').should('have.text', 'false');
@@ -806,12 +821,18 @@ describe('AnalyticalTable', () => {
806821
columns={columns}
807822
tableInstance={tableInstance}
808823
onRowSelect={(e) => {
809-
const { allRowsSelected, isSelected, row, selectedFlatRows, selectedRowIds } = e.detail;
824+
const { allRowsSelected, isSelected, row, rowsById, selectedRowIds } = e.detail;
825+
const selectedRowIdsArrayMapped = Object.keys(selectedRowIds).reduce((acc, key) => {
826+
if (selectedRowIds[key]) {
827+
acc.push(rowsById[key]);
828+
}
829+
return acc;
830+
}, []);
810831
setRelevantPayload({
811832
allRowsSelected,
812833
isSelected,
813834
row: row.id,
814-
selectedFlatRows: selectedFlatRows.map((item) => ({
835+
selectedFlatRows: selectedRowIdsArrayMapped.map((item) => ({
815836
id: item?.id
816837
})),
817838
selectedRowIds
@@ -2398,11 +2419,19 @@ describe('AnalyticalTable', () => {
23982419
const TestComp = () => {
23992420
const [stringifiedPl, setStringifiedPl] = useState('');
24002421
const handleSelect = (e) => {
2401-
const { allRowsSelected, selectedFlatRows, selectedRowIds } = e.detail;
2422+
const { allRowsSelected, rowsById, selectedRowIds } = e.detail;
2423+
2424+
const selectedRowIdsArrayMapped = Object.keys(selectedRowIds).reduce((acc, key) => {
2425+
if (selectedRowIds[key]) {
2426+
acc.push(rowsById[key]);
2427+
}
2428+
return acc;
2429+
}, []);
2430+
24022431
setStringifiedPl(
24032432
JSON.stringify({
24042433
selectedRowIds,
2405-
selectedFlatRows: selectedFlatRows.map((item) => ({
2434+
selectedFlatRows: selectedRowIdsArrayMapped.map((item) => ({
24062435
id: item?.id
24072436
})),
24082437
allRowsSelected

‎packages/main/src/components/AnalyticalTable/hooks/useRowSelectionColumn.tsx

+4-3
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ function getNextSelectedRowIds(rowsById) {
6161

6262
const headerProps = (props, { instance }) => {
6363
const {
64-
flatRows,
6564
webComponentsReactProperties: {
6665
onRowSelect,
6766
selectionMode,
@@ -70,10 +69,13 @@ const headerProps = (props, { instance }) => {
7069
toggleAllRowsSelected,
7170
isAllRowsSelected,
7271
rowsById,
72+
preFilteredRowsById,
7373
dispatch,
7474
state: { filters, globalFilter }
7575
} = instance;
7676
const style = { ...props.style, cursor: 'pointer', display: 'flex', justifyContent: 'center' };
77+
const isFiltered = filters?.length > 0 || !!globalFilter;
78+
const _rowsById = isFiltered ? preFilteredRowsById : rowsById;
7779
if (
7880
props.key === 'header___ui5wcr__internal_selection_column' &&
7981
selectionMode === AnalyticalTableSelectionMode.Multiple
@@ -83,16 +85,15 @@ const headerProps = (props, { instance }) => {
8385
props.onClick(e);
8486
}
8587
toggleAllRowsSelected(!isAllRowsSelected);
86-
const isFiltered = filters?.length > 0 || !!globalFilter;
8788
if (typeof onRowSelect === 'function') {
8889
if (isFiltered) {
8990
dispatch({ type: 'SELECT_ROW_CB', payload: { event: e, row: undefined, selectAll: true, fired: true } });
9091
} else {
9192
onRowSelect(
9293
// cannot use instance.selectedFlatRows here as it only returns all rows on the first level
9394
enrichEventWithDetails(e, {
95+
rowsById: _rowsById,
9496
allRowsSelected: !isAllRowsSelected,
95-
selectedFlatRows: !isAllRowsSelected ? flatRows : [],
9697
selectedRowIds: !isAllRowsSelected ? getNextSelectedRowIds(rowsById) : {}
9798
})
9899
);

‎packages/main/src/components/AnalyticalTable/hooks/useSelectionChangeCallback.ts

+6-13
Original file line numberDiff line numberDiff line change
@@ -14,35 +14,28 @@ export const useSelectionChangeCallback = (hooks: ReactTableHooks) => {
1414
if (selectedRowPayload?.fired) {
1515
const { event: e, row: selRow, selectAll } = selectedRowPayload;
1616
const row = rowsById[selRow?.id];
17+
// when selecting a row on a filtered table, `preFilteredRowsById` has to be used, otherwise filtered out rows are undefined
18+
const _rowsById = isFiltered ? preFilteredRowsById : rowsById;
1719

1820
if (row || selectAll) {
1921
const payload = {
2022
row: row,
23+
rowsById: _rowsById,
2124
isSelected: row?.isSelected,
22-
selectedFlatRows: row?.isSelected ? [row] : [],
2325
allRowsSelected: false,
2426
selectedRowIds
2527
};
2628

2729
if (webComponentsReactProperties.selectionMode === AnalyticalTableSelectionMode.Multiple) {
28-
// when selecting a row on a filtered table, `preFilteredRowsById` has to be used, otherwise filtered out rows are undefined
29-
const tempRowsById = isFiltered ? preFilteredRowsById : rowsById;
30-
const selectedRowIdsArrayMapped = Object.keys(selectedRowIds).reduce((acc, key) => {
31-
if (selectedRowIds[key]) {
32-
acc.push(tempRowsById[key]);
33-
}
34-
return acc;
35-
}, []);
36-
37-
payload.selectedFlatRows = selectedRowIdsArrayMapped;
38-
if (selectedRowIdsArrayMapped.length === Object.keys(tempRowsById).length) {
30+
if (Object.keys(selectedRowIds).length === Object.keys(_rowsById).length) {
3931
payload.allRowsSelected = true;
4032
}
33+
4134
if (selectAll) {
4235
dispatch({ type: 'SELECT_ROW_CB', payload: { event: e, row, selectAll: false, fired: false } });
4336
webComponentsReactProperties?.onRowSelect(
4437
enrichEventWithDetails(e, {
45-
selectedFlatRows: payload.selectedFlatRows,
38+
rowsById: payload.rowsById,
4639
allRowsSelected: payload.allRowsSelected,
4740
selectedRowIds: payload.selectedRowIds
4841
})

0 commit comments

Comments
 (0)
Please sign in to comment.