From 53f5e08cd77d19c78345ff18c4de63fa624b76ec Mon Sep 17 00:00:00 2001 From: belousovjr Date: Mon, 27 Nov 2023 17:26:28 +0200 Subject: [PATCH 1/4] Added clickable rows to table component --- src/components/Button/Button.tsx | 6 +- src/components/Table/Table.tsx | 97 +++++++++++++++----------- src/components/Table/index.stories.tsx | 11 +-- src/components/Table/styles.ts | 44 +++++++++--- src/components/Table/types.ts | 1 + src/components/Table/utils.ts | 8 --- 6 files changed, 101 insertions(+), 66 deletions(-) diff --git a/src/components/Button/Button.tsx b/src/components/Button/Button.tsx index e5a0d72..df4bc38 100644 --- a/src/components/Button/Button.tsx +++ b/src/components/Button/Button.tsx @@ -1,6 +1,6 @@ import { ButtonProps } from "./types"; import LoadingSpinner from "../Loaders/LoadingSpinner"; -import { ButtonContainer, ButtonContent, ButtonLoader, ButtonWrapper } from './styles'; +import { ButtonContainer, ButtonContent, ButtonLoader, ButtonWrapper } from "./styles"; ButtonWrapper.defaultProps = { variant: "default", @@ -14,7 +14,7 @@ export default function ({ loading, onClick, ...props -}: ButtonProps & { loading?: boolean; onClick?: () => void }) { +}: ButtonProps & { loading?: boolean; onClick?: (e: MouseEvent) => void }) { return ( { if (loading || props.disabled) e.preventDefault(); - else if (onClick) onClick(); + else if (onClick) onClick(e); }} > diff --git a/src/components/Table/Table.tsx b/src/components/Table/Table.tsx index ac86f35..8b6156d 100644 --- a/src/components/Table/Table.tsx +++ b/src/components/Table/Table.tsx @@ -6,6 +6,7 @@ import { TableItem, TablePagBtn, TablePagWrap, + TableRow, TableWrap, } from "./styles"; import { ITableProps, SortData } from "./types"; @@ -43,6 +44,7 @@ export default function Table({ changePage = (page: number) => {}, loading, emptyCard, + clickRow, }: ITableProps) { const maxPage = useMemo(() => Math.ceil(items.length / perPage), [items, perPage]); @@ -78,48 +80,61 @@ export default function Table({ {header} {items.length && !loading ? ( - - {headers.map((header, i) => { - const isSortable = !!((header.sortable && header.key) || header.sortFunc); - return ( - - {header.key && header.title && ( - { - const sortBy = header.key; - if (sortBy) { - if (sortData?.sortBy === sortBy && sortData.reverseOrder) setSortData(null); - else { - const reverseOrder = sortData?.sortBy !== sortBy ? false : !sortData?.reverseOrder; - setSortData({ sortBy, reverseOrder }); + + + {headers.map((header, i) => { + const isSortable = !!((header.sortable && header.key) || header.sortFunc); + return ( + + {header.key && header.title && ( + { + const sortBy = header.key; + if (sortBy) { + if (sortData?.sortBy === sortBy && sortData.reverseOrder) setSortData(null); + else { + const reverseOrder = sortData?.sortBy !== sortBy ? false : !sortData?.reverseOrder; + setSortData({ sortBy, reverseOrder }); + } } - } - }} - active={sortData?.sortBy === header.key} - > - {isSortable && } - {header.title} - - )} - {header.tooltip && ( - - - - - - )} - - ); - })} - {paginatedItems.map((item) => - headers.map((header, j) => { - const customContent = header.renderFunc && header.renderFunc(item); - const nativeContent = String(header.key ? item[header.key] : ""); - const content = customContent || nativeContent; - return {content}; - }) - )} + }} + active={sortData?.sortBy === header.key} + > + {isSortable && ( + + )} + {header.title} + + )} + {header.tooltip && ( + + + + + + )} + + ); + })} + + {paginatedItems.map((item, k) => ( + { + if (clickRow) clickRow(item); + }} + clickable={!!clickRow} + > + {headers.map((header, j) => { + const customContent = header.renderFunc && header.renderFunc(item); + const nativeContent = String(header.key ? item[header.key] : ""); + const content = customContent || nativeContent; + return {content}; + })} + + ))} ) : loading ? ( diff --git a/src/components/Table/index.stories.tsx b/src/components/Table/index.stories.tsx index 50ff994..2169075 100644 --- a/src/components/Table/index.stories.tsx +++ b/src/components/Table/index.stories.tsx @@ -102,7 +102,6 @@ export const Table = () => { ), }, - { key: "price", title: "Price $", @@ -115,7 +114,8 @@ export const Table = () => { width: "77px", renderFunc: (item) => ( - -
- +
+
- - - - - - - - Amount - - -
-
- Value 1 + + + + + + + + Amount + + +
- 4 -
-
- Value 4 +
+ Value 1 +
+
+ 4 +
- 3 +
+ Value 4 +
+
+ 3 +
Page
1
of
@@ -428,11 +469,11 @@ describe("Table", () => {