From 8e9a56d0b0a9e79c32a0766f5930703971690dc7 Mon Sep 17 00:00:00 2001 From: Abhay Date: Tue, 13 May 2025 13:45:21 +0530 Subject: [PATCH 1/2] refactor: Enhance MultiLevelTable structure and styling - Updated MultiLevelTable component to improve readability and maintainability by restructuring code and formatting. - Introduced a new wrapper for the table to handle overflow and ensure proper styling. - Added CSS rules to prevent cell content from wrapping and enhance table responsiveness. - Refactored rendering logic for pagination and table body for better separation of concerns. --- src/components/MultiLevelTable.tsx | 161 +++++++++++++++++------------ src/styles/MultiLevelTable.css | 18 ++++ 2 files changed, 111 insertions(+), 68 deletions(-) diff --git a/src/components/MultiLevelTable.tsx b/src/components/MultiLevelTable.tsx index fc6d6ee..886440a 100644 --- a/src/components/MultiLevelTable.tsx +++ b/src/components/MultiLevelTable.tsx @@ -13,7 +13,7 @@ import { Pagination } from "./Pagination"; import type { PaginationProps } from "./Pagination"; import { TableHeader } from "./TableHeader"; import { TableRow } from "./TableRow"; -import { SortType } from '../constants/sort'; +import { SortType } from "../constants/sort"; import { defaultTheme } from "../constants/theme"; import { mergeThemeProps } from "../mergeThemeProps"; import type { ThemeProps } from "../types/theme"; @@ -76,13 +76,17 @@ export const MultiLevelTable: React.FC = ({ disableSortBy: sortable ? col.sortable === false : true, sortType: col.customSortFn ? SortType.Custom : SortType.Basic, sortFn: col.customSortFn, - Cell: ({ row, value }: { row: Row; value: string | number }) => { + Cell: ({ + row, + value, + }: { + row: Row; + value: string | number; + }) => { const item = row.original; return ( -
- {col.render ? col.render(value, item) : value?.toString()} -
+
{col.render ? col.render(value, item) : value?.toString()}
); }, Filter: col.filterable @@ -122,8 +126,12 @@ export const MultiLevelTable: React.FC = ({ initialState: { pageSize } as TableStateWithPagination, // @ts-expect-error - sortTypes is not included in the type definition but is supported by react-table sortTypes: { - custom: (rowA: Row, rowB: Row, columnId: string) => { - const column = columns.find(col => col.key === columnId); + custom: ( + rowA: Row, + rowB: Row, + columnId: string + ) => { + const column = columns.find((col) => col.key === columnId); if (column?.customSortFn) return column.customSortFn(rowA.original, rowB.original, columnId); @@ -162,7 +170,6 @@ export const MultiLevelTable: React.FC = ({ newSet.delete(rowId); else newSet.add(rowId); - return newSet; }); @@ -194,69 +201,87 @@ export const MultiLevelTable: React.FC = ({ }); }; + const renderPagination = () => { + if (renderCustomPagination) + return renderCustomPagination({ + canPreviousPage, + canNextPage, + pageOptions, + pageCount, + pageIndex, + pageSize: currentPageSize, + gotoPage, + nextPage, + previousPage, + setPageSize, + theme: mergedTheme, + }); + + + return ( + + ); + }; + + const renderTableBody = () => { + return ( + + {page.map((row) => { + prepareRow(row); + const parentId = row.original.id; + const hasChildren = rowsMap.has(parentId); + + return ( + + hasChildren && toggleRow(parentId)} + theme={mergedTheme} + expandIcon={expandIcon} + /> + {renderNestedRows(parentId)} + + ); + })} + + ); + }; + return (
- - - - {page.map((row) => { - prepareRow(row); - const parentId = row.original.id; - const hasChildren = rowsMap.has(parentId); - - return ( - - hasChildren && toggleRow(parentId)} - theme={mergedTheme} - expandIcon={expandIcon} - /> - {renderNestedRows(parentId)} - - ); - })} - -
+
+ + + {renderTableBody()} +
- {renderCustomPagination ? ( - renderCustomPagination({ - canPreviousPage, - canNextPage, - pageOptions, - pageCount, - pageIndex, - pageSize: currentPageSize, - gotoPage, - nextPage, - previousPage, - setPageSize, - theme: mergedTheme, - }) - ) : ( - - )} + {renderPagination()} +
); }; diff --git a/src/styles/MultiLevelTable.css b/src/styles/MultiLevelTable.css index ab1eb3f..2cf05e9 100644 --- a/src/styles/MultiLevelTable.css +++ b/src/styles/MultiLevelTable.css @@ -1,4 +1,22 @@ .table-container { width: 100%; border-collapse: collapse; +} + +.table-wrapper { + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} + +.table-container { + min-width: 100%; + white-space: nowrap; +} + +/* Ensure table cells don't wrap content */ +.table-container td, +.table-container th { + white-space: nowrap; + padding: 8px; } \ No newline at end of file From 48efac44f53376cff417bfd2c2ba78a0fd9c0762 Mon Sep 17 00:00:00 2001 From: Abhay Date: Tue, 13 May 2025 13:51:14 +0530 Subject: [PATCH 2/2] Fix: Update test case --- tests/components/MultiLevelTable.test.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/components/MultiLevelTable.test.tsx b/tests/components/MultiLevelTable.test.tsx index c3ae03f..fe02ff7 100644 --- a/tests/components/MultiLevelTable.test.tsx +++ b/tests/components/MultiLevelTable.test.tsx @@ -189,7 +189,8 @@ describe('MultiLevelTable', () => { ); const table = screen.getByRole('table'); - expect(table.parentElement).toHaveStyle({ backgroundColor: '#f0f0f0' }); + const tableWrapper = table.closest('.table-wrapper'); + expect(tableWrapper?.parentElement).toHaveStyle({ backgroundColor: '#f0f0f0' }); expect(table).toHaveStyle({ borderColor: '#ff0000' }); }); it('handles custom column rendering', () => {