Skip to content

Commit 9307160

Browse files
author
Hector Arce De Las Heras
committed
Implemented multi-row and column support
Enhanced the application to support multiple rows and columns. This update provides a more flexible layout and improves the display of data, allowing for a more organized and readable structure
1 parent 54a03a1 commit 9307160

File tree

5 files changed

+46
-10
lines changed

5 files changed

+46
-10
lines changed

src/components/table/component/table.tsx

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { useId } from '@/hooks';
77
import { pickAriaProps } from '@/utils/aria/aria';
88

99
import {
10+
EmptyRowHeader,
1011
TableCaptionStyled,
1112
TableColumnHeaderStyled,
1213
TableRowGroupBodyStyled,
@@ -31,16 +32,20 @@ export const TableComponent = (
3132
const footerVariant = props.footer?.variant ?? props.styles?.footerVariant;
3233
const uniqueId = useId('tableCaption');
3334
const DIVIDER_CONTENT = 'DividerContent';
34-
const hasSomeDivider = props.headers.some(h => h.config.hasDivider);
35+
const hasSomeDivider = props.headers.some(h => h.config?.hasDivider);
3536
const hasSomeDividerContent = props.values.some(o => {
3637
return !!Object.getOwnPropertyDescriptor(o, 'dividerContent');
3738
});
3839
const headersElement = props.headers.filter(
39-
({ config }: { config: ConfigType }) => !config.hidden?.[props.device]
40+
({ config }: { config?: ConfigType }) => !config?.hidden?.[props.device]
4041
);
4142
const headersElementWithoutDivider = headersElement.filter(
42-
element => !element.config.hasDivider || !hasSomeDividerContent
43+
element => !element.config?.hasDivider || !hasSomeDividerContent
4344
);
45+
const hasRowHeader = props.values.some(o => {
46+
return !!Object.getOwnPropertyDescriptor(o, 'rowHeader');
47+
});
48+
4449
return (
4550
<>
4651
<TableStyled
@@ -66,6 +71,7 @@ export const TableComponent = (
6671
numberOfCells={headersElement.length}
6772
styles={props.styles.header?.[props.headerVariant]}
6873
>
74+
<EmptyRowHeader styles={props.styles.header?.[props.headerVariant]} />
6975
{hasSomeDividerContent && (
7076
<TableColumnHeaderStyled
7177
key={'dividerContent'}
@@ -93,7 +99,7 @@ export const TableComponent = (
9399
customBackgroundColor={headerValue?.config?.backgroundColor}
94100
customWidth={headerValue?.config?.width}
95101
flexWidth={headerValue?.config?.flexWidth}
96-
hasDivider={headerValue.config.hasDivider}
102+
hasDivider={headerValue?.config?.hasDivider}
97103
scope="col"
98104
styles={props.styles.header?.[props.headerVariant]}
99105
>
@@ -131,6 +137,7 @@ export const TableComponent = (
131137
<TableRow
132138
{...props}
133139
key={indexValue}
140+
hasRowHeader={hasRowHeader}
134141
hasSomeDivider={hasSomeDivider}
135142
hasSomeDividerContent={hasSomeDividerContent}
136143
hasSomeExpandedContent={props.hasSomeExpandedContent}

src/components/table/component/tableRow.tsx

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ import * as React from 'react';
33

44
import { ButtonType } from '@/components/button';
55
import { ElementOrIcon } from '@/components/elementOrIcon';
6+
import { Text, TextComponentType } from '@/components/text';
67

78
import { useContent } from '../hooks/useContent';
89
import {
910
TableColumnBodyStyled,
11+
TableColumnHeaderStyled,
1012
TableEmptyExpandedContentRow,
1113
TableExpandedButton,
1214
TableExpandedCellStyled,
@@ -22,6 +24,7 @@ export interface ITableRow extends Omit<ITableStandAlone, 'values' | 'headerVari
2224
indexRow: number;
2325
hasSomeDivider: boolean;
2426
hasSomeDividerContent: boolean;
27+
hasRowHeader: boolean;
2528
}
2629

2730
/**
@@ -31,6 +34,7 @@ export interface ITableRow extends Omit<ITableStandAlone, 'values' | 'headerVari
3134
export const TableRow = (props: ITableRow): JSX.Element => {
3235
const {
3336
divider,
37+
rowHeader,
3438
dividerValue,
3539
getExpandedAria,
3640
getValue,
@@ -57,6 +61,17 @@ export const TableRow = (props: ITableRow): JSX.Element => {
5761
styles={props.styles.bodyRows?.[rowVariant]}
5862
>
5963
<TableDivider divider={dividerValue()} styles={props.styles.divider} />
64+
{rowHeader && (
65+
<TableColumnHeaderStyled scope="row" styles={props.styles.header?.[rowHeader.variant]}>
66+
<Text
67+
component={TextComponentType.SPAN}
68+
customTypography={props.styles.header?.[rowHeader.variant]?.typography}
69+
dataTestId={`${props.dataTestId}RowHeader${props.indexRow}`}
70+
>
71+
{rowHeader.label}
72+
</Text>
73+
</TableColumnHeaderStyled>
74+
)}
6075
{props.headers
6176
.filter(headerValue => headerValue.id !== divider?.id)
6277
.map((headerValue, indexHeader) => {
@@ -65,17 +80,17 @@ export const TableRow = (props: ITableRow): JSX.Element => {
6580
<TableColumnBodyStyled
6681
key={indexHeader}
6782
customAlign={
68-
headerValue.config?.alignValue?.[props.device] ||
83+
headerValue?.config?.alignValue?.[props.device] ||
6984
headerValue?.config?.alignValue ||
70-
headerValue.config?.alignHeader?.[props.device] ||
85+
headerValue?.config?.alignHeader?.[props.device] ||
7186
headerValue?.config?.alignHeader
7287
}
7388
customBackgroundColor={
7489
getBackgroundColorCellValue(headerValue) ?? props.value.backgroundColor
7590
}
76-
customWidth={headerValue.config?.width}
91+
customWidth={headerValue?.config?.width}
7792
data-testid={`${props.dataTestId}Row${props.indexRow}Content${indexHeader}`}
78-
flexWidth={headerValue.config?.flexWidth}
93+
flexWidth={headerValue?.config?.flexWidth}
7994
hasSomeExpandedContent={props.hasSomeExpandedContent && hasExpandedIcon}
8095
styles={props.styles.bodyRows?.[rowVariant]}
8196
>

src/components/table/hooks/useContent.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import * as React from 'react';
44
import {
55
DividerContent,
66
ITableHeader,
7+
ITableRowHeader,
78
ITableStandAlone,
89
IValue,
910
TableDividerType,
@@ -19,6 +20,7 @@ interface IUseContent extends Omit<ITableStandAlone, 'values' | 'headerVariant'>
1920

2021
interface IUseContentResponse {
2122
divider?: ITableHeader;
23+
rowHeader?: ITableRowHeader;
2224
dividerValue: () => null | TableDividerType | unknown;
2325
getExpandedAria: () => string | undefined;
2426
getValue: (headerValue: ITableHeader) => string | JSX.Element | DividerContent;
@@ -32,7 +34,7 @@ interface IUseContentResponse {
3234

3335
export const useContent = (props: IUseContent): IUseContentResponse => {
3436
const [showExpandedContent, setShowExpandedContent] = React.useState(props.initialExpanded);
35-
const divider = props.headers.find(header => header.config.hasDivider);
37+
const divider = props.headers.find(header => header?.config?.hasDivider);
3638
const rowVariant = props.value.rowVariant || 'DEFAULT';
3739

3840
const handleShowExpandedContent = (value: boolean) => {
@@ -102,8 +104,11 @@ export const useContent = (props: IUseContent): IUseContentResponse => {
102104

103105
const hasExpandedContentRow = !!Object.getOwnPropertyDescriptor(props.value, 'expandedContent');
104106

107+
const rowHeader = props.value.rowHeader;
108+
105109
return {
106110
divider,
111+
rowHeader,
107112
dividerValue,
108113
getExpandedAria,
109114
getValue,

src/components/table/table.styled.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,3 +316,7 @@ export const ListEmptyExpandedContentItem = styled.div`
316316
width: 0;
317317
height: 0;
318318
`;
319+
320+
export const EmptyRowHeader = styled.td<{ styles?: TableHeaderStylesTypes }>`
321+
${({ styles }) => getStyles(styles?.column)}
322+
`;

src/components/table/types/table.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ export type IValue = {
7575
accordionIconCollapsedAriaLabel?: string;
7676
accordionIconExpandedAriaLabel?: string;
7777
rowVariant?: string;
78+
rowHeader?: ITableRowHeader;
7879
rowBorderPosition?: LineSeparatorPositionType;
7980
backgroundColor?: string;
8081
} & {
@@ -117,10 +118,14 @@ export type DividerContent = { dividerContent?: TableDividerType };
117118
export interface ITableHeader {
118119
label: React.ReactNode;
119120
id: string;
120-
config: ConfigType;
121+
config?: ConfigType;
121122
value?: ValueFunctionType & DividerContent;
122123
}
123124

125+
export interface ITableRowHeader extends Omit<ITableHeader, 'id'> {
126+
variant: string;
127+
}
128+
124129
export type TableFooterType = Omit<IFooter, 'children' | 'variant'> & {
125130
content?: JSX.Element[] | JSX.Element;
126131
variant?: string;

0 commit comments

Comments
 (0)