@patternfly/react-table 4.29.72 → 4.30.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +35 -0
- package/dist/esm/components/Table/Body.d.ts +2 -2
- package/dist/esm/components/Table/Body.d.ts.map +1 -1
- package/dist/esm/components/Table/Body.js +11 -1
- package/dist/esm/components/Table/Body.js.map +1 -1
- package/dist/esm/components/Table/RowWrapper.d.ts.map +1 -1
- package/dist/esm/components/Table/RowWrapper.js +2 -2
- package/dist/esm/components/Table/RowWrapper.js.map +1 -1
- package/dist/esm/components/Table/TableTypes.d.ts +2 -0
- package/dist/esm/components/Table/TableTypes.d.ts.map +1 -1
- package/dist/esm/components/Table/utils/decorators/treeRow.d.ts.map +1 -1
- package/dist/esm/components/Table/utils/decorators/treeRow.js +6 -6
- package/dist/esm/components/Table/utils/decorators/treeRow.js.map +1 -1
- package/dist/esm/components/TableComposable/Tr.d.ts +7 -1
- package/dist/esm/components/TableComposable/Tr.d.ts.map +1 -1
- package/dist/esm/components/TableComposable/Tr.js +11 -2
- package/dist/esm/components/TableComposable/Tr.js.map +1 -1
- package/dist/js/components/Table/Body.d.ts +2 -2
- package/dist/js/components/Table/Body.d.ts.map +1 -1
- package/dist/js/components/Table/Body.js +11 -1
- package/dist/js/components/Table/Body.js.map +1 -1
- package/dist/js/components/Table/RowWrapper.d.ts.map +1 -1
- package/dist/js/components/Table/RowWrapper.js +2 -2
- package/dist/js/components/Table/RowWrapper.js.map +1 -1
- package/dist/js/components/Table/TableTypes.d.ts +2 -0
- package/dist/js/components/Table/TableTypes.d.ts.map +1 -1
- package/dist/js/components/Table/utils/decorators/treeRow.d.ts.map +1 -1
- package/dist/js/components/Table/utils/decorators/treeRow.js +6 -6
- package/dist/js/components/Table/utils/decorators/treeRow.js.map +1 -1
- package/dist/js/components/TableComposable/Tr.d.ts +7 -1
- package/dist/js/components/TableComposable/Tr.d.ts.map +1 -1
- package/dist/js/components/TableComposable/Tr.js +11 -2
- package/dist/js/components/TableComposable/Tr.js.map +1 -1
- package/dist/umd/react-table.css +16422 -16422
- package/dist/umd/react-table.js +30 -11
- package/dist/umd/react-table.min.css +11191 -11191
- package/dist/umd/react-table.min.js +2 -2
- package/package.json +6 -6
- package/src/components/Table/Body.tsx +21 -6
- package/src/components/Table/RowWrapper.tsx +3 -1
- package/src/components/Table/TableTypes.ts +2 -0
- package/src/components/Table/__snapshots__/Table.test.tsx.snap +1568 -784
- package/src/components/Table/examples/Table.md +111 -94
- package/src/components/Table/utils/decorators/treeRow.tsx +12 -6
- package/src/components/TableComposable/Tr.tsx +25 -1
- package/src/components/TableComposable/examples/ComposableTable.md +68 -7
|
@@ -195,99 +195,6 @@ class SimpleTable extends React.Component {
|
|
|
195
195
|
}
|
|
196
196
|
```
|
|
197
197
|
|
|
198
|
-
### Row click handler and header cell tooltips/popovers
|
|
199
|
-
|
|
200
|
-
```js
|
|
201
|
-
import React from 'react';
|
|
202
|
-
import { Table, TableHeader, TableBody, textCenter } from '@patternfly/react-table';
|
|
203
|
-
import styles from '@patternfly/react-styles/css/components/Table/table';
|
|
204
|
-
|
|
205
|
-
class RowClickTable extends React.Component {
|
|
206
|
-
constructor(props) {
|
|
207
|
-
super(props);
|
|
208
|
-
this.state = {
|
|
209
|
-
columns: [
|
|
210
|
-
{
|
|
211
|
-
title: 'Repositories',
|
|
212
|
-
transforms: [
|
|
213
|
-
info({
|
|
214
|
-
tooltip: 'More information about repositories',
|
|
215
|
-
className: 'repositories-info-tip',
|
|
216
|
-
tooltipProps: {
|
|
217
|
-
isContentLeftAligned: true
|
|
218
|
-
}
|
|
219
|
-
})
|
|
220
|
-
]
|
|
221
|
-
},
|
|
222
|
-
'Branches',
|
|
223
|
-
{
|
|
224
|
-
title: 'Pull requests',
|
|
225
|
-
transforms: [
|
|
226
|
-
info({
|
|
227
|
-
popover: (
|
|
228
|
-
<div>
|
|
229
|
-
More <strong>information</strong> on pull requests
|
|
230
|
-
</div>
|
|
231
|
-
),
|
|
232
|
-
ariaLabel: 'More information on pull requests',
|
|
233
|
-
popoverProps: {
|
|
234
|
-
headerContent: 'Pull requests',
|
|
235
|
-
footerContent: <a href="">Click here for even more info</a>
|
|
236
|
-
}
|
|
237
|
-
})
|
|
238
|
-
]
|
|
239
|
-
},
|
|
240
|
-
'Workspaces',
|
|
241
|
-
{
|
|
242
|
-
title: 'Last commit',
|
|
243
|
-
transforms: [textCenter],
|
|
244
|
-
cellTransforms: [textCenter]
|
|
245
|
-
}
|
|
246
|
-
],
|
|
247
|
-
rows: [
|
|
248
|
-
['Repository one', 'Branch one', 'PR one', 'Workspace one', 'Commit one'],
|
|
249
|
-
{
|
|
250
|
-
cells: [
|
|
251
|
-
{
|
|
252
|
-
title: <div>one - 2</div>,
|
|
253
|
-
props: { title: 'hover title', colSpan: 3 }
|
|
254
|
-
},
|
|
255
|
-
'four - 2',
|
|
256
|
-
'five - 2'
|
|
257
|
-
]
|
|
258
|
-
},
|
|
259
|
-
{
|
|
260
|
-
cells: [
|
|
261
|
-
'one - 3',
|
|
262
|
-
'two - 3',
|
|
263
|
-
'three - 3',
|
|
264
|
-
'four - 3',
|
|
265
|
-
{
|
|
266
|
-
title: 'five - 3 (not centered)',
|
|
267
|
-
props: { textCenter: false }
|
|
268
|
-
}
|
|
269
|
-
]
|
|
270
|
-
}
|
|
271
|
-
]
|
|
272
|
-
};
|
|
273
|
-
this.rowClickHandler = (event, row) => {
|
|
274
|
-
console.log('handle row click', row);
|
|
275
|
-
};
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
render() {
|
|
279
|
-
const { columns, rows } = this.state;
|
|
280
|
-
|
|
281
|
-
return (
|
|
282
|
-
<Table caption="Row click handler table" cells={columns} rows={rows}>
|
|
283
|
-
<TableHeader className={styles.modifiers.nowrap} />
|
|
284
|
-
<TableBody onRowClick={this.rowClickHandler} />
|
|
285
|
-
</Table>
|
|
286
|
-
);
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
```
|
|
290
|
-
|
|
291
198
|
### Custom row wrapper
|
|
292
199
|
|
|
293
200
|
Custom row wrappers are passed to the `Table` component via the `rowWrapper` prop.
|
|
@@ -458,7 +365,7 @@ class SortableTable extends React.Component {
|
|
|
458
365
|
}
|
|
459
366
|
```
|
|
460
367
|
|
|
461
|
-
### Selectable
|
|
368
|
+
### Selectable with checkbox
|
|
462
369
|
|
|
463
370
|
To enable row selection, set the `onSelect` callback prop on the Table.
|
|
464
371
|
|
|
@@ -637,6 +544,116 @@ class SelectableTable extends React.Component {
|
|
|
637
544
|
}
|
|
638
545
|
```
|
|
639
546
|
|
|
547
|
+
### Hoverable rows, selectable rows, and header cell tooltips/popovers
|
|
548
|
+
|
|
549
|
+
This selectable rows feature is intended for use when a table is used to present a list of objects in a Primary-detail view.
|
|
550
|
+
|
|
551
|
+
```js
|
|
552
|
+
import React from 'react';
|
|
553
|
+
import { Table, TableHeader, TableBody, textCenter } from '@patternfly/react-table';
|
|
554
|
+
import styles from '@patternfly/react-styles/css/components/Table/table';
|
|
555
|
+
|
|
556
|
+
class RowClickTable extends React.Component {
|
|
557
|
+
constructor(props) {
|
|
558
|
+
super(props);
|
|
559
|
+
this.state = {
|
|
560
|
+
columns: [
|
|
561
|
+
{
|
|
562
|
+
title: 'Repositories',
|
|
563
|
+
transforms: [
|
|
564
|
+
info({
|
|
565
|
+
tooltip: 'More information about repositories',
|
|
566
|
+
className: 'repositories-info-tip',
|
|
567
|
+
tooltipProps: {
|
|
568
|
+
isContentLeftAligned: true
|
|
569
|
+
}
|
|
570
|
+
})
|
|
571
|
+
]
|
|
572
|
+
},
|
|
573
|
+
'Branches',
|
|
574
|
+
{
|
|
575
|
+
title: 'Pull requests',
|
|
576
|
+
transforms: [
|
|
577
|
+
info({
|
|
578
|
+
popover: (
|
|
579
|
+
<div>
|
|
580
|
+
More <strong>information</strong> on pull requests
|
|
581
|
+
</div>
|
|
582
|
+
),
|
|
583
|
+
ariaLabel: 'More information on pull requests',
|
|
584
|
+
popoverProps: {
|
|
585
|
+
headerContent: 'Pull requests',
|
|
586
|
+
footerContent: <a href="">Click here for even more info</a>
|
|
587
|
+
}
|
|
588
|
+
})
|
|
589
|
+
]
|
|
590
|
+
},
|
|
591
|
+
'Workspaces',
|
|
592
|
+
{
|
|
593
|
+
title: 'Last commit',
|
|
594
|
+
transforms: [textCenter],
|
|
595
|
+
cellTransforms: [textCenter]
|
|
596
|
+
}
|
|
597
|
+
],
|
|
598
|
+
rows: [
|
|
599
|
+
{
|
|
600
|
+
cells: ['Repository one', 'Branch one', 'PR one', 'Workspace one', 'Commit one'],
|
|
601
|
+
isHoverable: true,
|
|
602
|
+
isRowSelected: false
|
|
603
|
+
},
|
|
604
|
+
{
|
|
605
|
+
cells: [
|
|
606
|
+
{
|
|
607
|
+
title: <div>one - 2</div>,
|
|
608
|
+
props: { title: 'hover title', colSpan: 3 }
|
|
609
|
+
},
|
|
610
|
+
'four - 2',
|
|
611
|
+
'five - 2'
|
|
612
|
+
],
|
|
613
|
+
isHoverable: true,
|
|
614
|
+
isRowSelected: false
|
|
615
|
+
},
|
|
616
|
+
{
|
|
617
|
+
cells: [
|
|
618
|
+
'one - 3',
|
|
619
|
+
'two - 3',
|
|
620
|
+
'three - 3',
|
|
621
|
+
'four - 3',
|
|
622
|
+
{
|
|
623
|
+
title: 'five - 3 (not centered)',
|
|
624
|
+
props: { textCenter: false }
|
|
625
|
+
}
|
|
626
|
+
],
|
|
627
|
+
isHoverable: true,
|
|
628
|
+
isRowSelected: false
|
|
629
|
+
}
|
|
630
|
+
]
|
|
631
|
+
};
|
|
632
|
+
|
|
633
|
+
this.rowClickHandler = (event, row, rowProps) => {
|
|
634
|
+
this.setState(prevState => {
|
|
635
|
+
const updatedRows = [...prevState.rows];
|
|
636
|
+
updatedRows[rowProps.rowIndex].isRowSelected = !prevState.rows[rowProps.rowIndex].isRowSelected;
|
|
637
|
+
return {
|
|
638
|
+
rows: updatedRows
|
|
639
|
+
}
|
|
640
|
+
});
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
render() {
|
|
645
|
+
const { columns, rows } = this.state;
|
|
646
|
+
|
|
647
|
+
return (
|
|
648
|
+
<Table caption="Row click handler table" cells={columns} rows={rows}>
|
|
649
|
+
<TableHeader className={styles.modifiers.nowrap} />
|
|
650
|
+
<TableBody onRowClick={this.rowClickHandler} />
|
|
651
|
+
</Table>
|
|
652
|
+
);
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
```
|
|
656
|
+
|
|
640
657
|
### Actions and first cell in body rows as th
|
|
641
658
|
|
|
642
659
|
To use actions you can either specify an array of actions and pass that into the `Table`'s `actions` prop, or for more control you can use the `actionResolver` callback prop to add actions conditionally.
|
|
@@ -26,9 +26,15 @@ export const treeRow = (
|
|
|
26
26
|
} = rowData.props;
|
|
27
27
|
const content = value.title || value;
|
|
28
28
|
const text = (
|
|
29
|
-
<div className={css(stylesTreeView.tableTreeViewText)}>
|
|
30
|
-
{icon &&
|
|
31
|
-
|
|
29
|
+
<div className={css(stylesTreeView.tableTreeViewText)} key="tree-view-text">
|
|
30
|
+
{icon && (
|
|
31
|
+
<span className={css(stylesTreeView.tableTreeViewIcon)} key="tree-view-text-icon">
|
|
32
|
+
{icon}
|
|
33
|
+
</span>
|
|
34
|
+
)}
|
|
35
|
+
<span className="pf-c-table__text" key="table-text">
|
|
36
|
+
{content}
|
|
37
|
+
</span>
|
|
32
38
|
</div>
|
|
33
39
|
);
|
|
34
40
|
const onChange = (isChecked: boolean, event: React.FormEvent<HTMLInputElement>) => {
|
|
@@ -41,7 +47,7 @@ export const treeRow = (
|
|
|
41
47
|
level !== undefined ? (
|
|
42
48
|
<div className={css(stylesTreeView.tableTreeViewMain)}>
|
|
43
49
|
{setsize > 0 && (
|
|
44
|
-
<span className={css(stylesTreeView.tableToggle)}>
|
|
50
|
+
<span className={css(stylesTreeView.tableToggle)} key="table-toggle">
|
|
45
51
|
<Button
|
|
46
52
|
variant="plain"
|
|
47
53
|
onClick={event => onCollapse && onCollapse(event, rowIndex, content, rowData)}
|
|
@@ -56,7 +62,7 @@ export const treeRow = (
|
|
|
56
62
|
</span>
|
|
57
63
|
)}
|
|
58
64
|
{!!onCheckChange && (
|
|
59
|
-
<span className={css(stylesTreeView.tableCheck)}>
|
|
65
|
+
<span className={css(stylesTreeView.tableCheck)} key="table-check">
|
|
60
66
|
<Checkbox
|
|
61
67
|
id={checkboxId || `checkbox_${rowIndex}`}
|
|
62
68
|
aria-label={checkAriaLabel || `Row ${rowIndex} checkbox`}
|
|
@@ -67,7 +73,7 @@ export const treeRow = (
|
|
|
67
73
|
)}
|
|
68
74
|
{text}
|
|
69
75
|
{!!onToggleRowDetails && (
|
|
70
|
-
<span className={css(stylesTreeView.tableTreeViewDetailsToggle)}>
|
|
76
|
+
<span className={css(stylesTreeView.tableTreeViewDetailsToggle)} key="view-details-toggle">
|
|
71
77
|
<Button
|
|
72
78
|
variant="plain"
|
|
73
79
|
aria-expanded={isDetailsExpanded}
|
|
@@ -17,6 +17,12 @@ export interface TrProps extends React.HTMLProps<HTMLTableRowElement>, OUIAProps
|
|
|
17
17
|
isExpanded?: boolean;
|
|
18
18
|
/** Only applicable to Tr within the Tbody: Whether the row is editable */
|
|
19
19
|
isEditable?: boolean;
|
|
20
|
+
/** Flag which adds hover styles for the table row */
|
|
21
|
+
isHoverable?: boolean;
|
|
22
|
+
/** Flag indicating the row is selected - adds selected styling */
|
|
23
|
+
isRowSelected?: boolean;
|
|
24
|
+
/** An event handler for the row */
|
|
25
|
+
onRowClick?: (event?: React.KeyboardEvent | React.MouseEvent) => void;
|
|
20
26
|
}
|
|
21
27
|
|
|
22
28
|
const TrBase: React.FunctionComponent<TrProps> = ({
|
|
@@ -25,22 +31,40 @@ const TrBase: React.FunctionComponent<TrProps> = ({
|
|
|
25
31
|
isExpanded,
|
|
26
32
|
isEditable,
|
|
27
33
|
isHidden = false,
|
|
34
|
+
isHoverable = false,
|
|
35
|
+
isRowSelected = false,
|
|
28
36
|
innerRef,
|
|
29
37
|
ouiaId,
|
|
30
38
|
ouiaSafe = true,
|
|
39
|
+
onRowClick,
|
|
31
40
|
...props
|
|
32
41
|
}: TrProps) => {
|
|
33
42
|
const ouiaProps = useOUIAProps('TableRow', ouiaId, ouiaSafe);
|
|
43
|
+
|
|
44
|
+
let onKeyDown = null;
|
|
45
|
+
if (onRowClick) {
|
|
46
|
+
onKeyDown = (e: React.KeyboardEvent) => {
|
|
47
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
48
|
+
onRowClick(e);
|
|
49
|
+
e.preventDefault();
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
34
54
|
return (
|
|
35
55
|
<tr
|
|
36
56
|
className={css(
|
|
37
57
|
className,
|
|
38
58
|
isExpanded !== undefined && styles.tableExpandableRow,
|
|
39
59
|
isExpanded && styles.modifiers.expanded,
|
|
40
|
-
isEditable && inlineStyles.modifiers.inlineEditable
|
|
60
|
+
isEditable && inlineStyles.modifiers.inlineEditable,
|
|
61
|
+
isHoverable && styles.modifiers.hoverable,
|
|
62
|
+
isRowSelected && styles.modifiers.selected
|
|
41
63
|
)}
|
|
42
64
|
hidden={isHidden || (isExpanded !== undefined && !isExpanded)}
|
|
65
|
+
{...(isHoverable && { tabIndex: 0 })}
|
|
43
66
|
ref={innerRef}
|
|
67
|
+
{...(onRowClick && { onClick: onRowClick, onKeyDown })}
|
|
44
68
|
{...ouiaProps}
|
|
45
69
|
{...props}
|
|
46
70
|
>
|
|
@@ -139,11 +139,11 @@ ComposableTableBasic = () => {
|
|
|
139
139
|
};
|
|
140
140
|
```
|
|
141
141
|
|
|
142
|
-
### Composable:
|
|
142
|
+
### Composable: Custom row wrapper, header tooltips & popovers
|
|
143
143
|
|
|
144
144
|
- If you add the `noWrap` prop to `Thead`, it won't wrap it if there is no space
|
|
145
145
|
- You can add the `textCenter` prop to `Th` or `Td` to center the contents
|
|
146
|
-
- You can pass `
|
|
146
|
+
- You can pass `className`, `style` and more to `Tr`
|
|
147
147
|
|
|
148
148
|
To add a header tooltip or popover to `Th`, pass a `ThInfoType` object via the `info` prop.
|
|
149
149
|
|
|
@@ -158,9 +158,7 @@ ComposableTableMisc = () => {
|
|
|
158
158
|
[{ title: 'one - 2', colSpan: 3 }, null, null, 'four - 2', 'five - 2'],
|
|
159
159
|
['one - 3', 'two - 3', 'three - 3', 'four - 3', { title: 'five - 3 (not centered)', textCenter: false }]
|
|
160
160
|
];
|
|
161
|
-
|
|
162
|
-
console.log(`handle row click ${rowIndex}`, row);
|
|
163
|
-
};
|
|
161
|
+
|
|
164
162
|
return (
|
|
165
163
|
<TableComposable aria-label="Misc table">
|
|
166
164
|
<Thead noWrap>
|
|
@@ -206,7 +204,6 @@ ComposableTableMisc = () => {
|
|
|
206
204
|
return (
|
|
207
205
|
<Tr
|
|
208
206
|
key={rowIndex}
|
|
209
|
-
onClick={event => onRowClick(event, rowIndex, row)}
|
|
210
207
|
className={isOddRow ? 'odd-row-class' : 'even-row-class'}
|
|
211
208
|
style={isOddRow ? customStyle : {}}
|
|
212
209
|
>
|
|
@@ -354,7 +351,7 @@ ComposableTableSortable = () => {
|
|
|
354
351
|
};
|
|
355
352
|
```
|
|
356
353
|
|
|
357
|
-
### Composable: Selectable
|
|
354
|
+
### Composable: Selectable with checkbox
|
|
358
355
|
|
|
359
356
|
To make a row selectable, the table needs a selection column.
|
|
360
357
|
The selection column is just another column, but with selection specific props added.
|
|
@@ -562,6 +559,70 @@ ComposableTableSelectableRadio = () => {
|
|
|
562
559
|
};
|
|
563
560
|
```
|
|
564
561
|
|
|
562
|
+
### Composable: Row click handler, hoverable & selected rows
|
|
563
|
+
|
|
564
|
+
This selectable rows feature is intended for use when a table is used to present a list of objects in a Primary-detail view.
|
|
565
|
+
|
|
566
|
+
```js
|
|
567
|
+
import React from 'react';
|
|
568
|
+
import { TableComposable, Thead, Tbody, Tr, Th, Td } from '@patternfly/react-table';
|
|
569
|
+
|
|
570
|
+
ComposableTableHoverable = () => {
|
|
571
|
+
const columns = ['Repositories', 'Branches', 'Pull requests', 'Workspaces', 'Last commit'];
|
|
572
|
+
const [rows, setRows] = React.useState([
|
|
573
|
+
{ cells: ['one', 'two', 'a', 'four', 'five'], isRowSelected: false},
|
|
574
|
+
{ cells: ['a', 'two', 'k', 'four', 'five'], isRowSelected: false},
|
|
575
|
+
{ cells: ['p', 'two', 'b', 'four', 'five'], isRowSelected: false}
|
|
576
|
+
]);
|
|
577
|
+
const onRowClick = (event, rowIndex, row) => {
|
|
578
|
+
const updatedRows = [...rows];
|
|
579
|
+
updatedRows[rowIndex].isRowSelected = !rows[rowIndex].isRowSelected;
|
|
580
|
+
setRows(updatedRows);
|
|
581
|
+
};
|
|
582
|
+
|
|
583
|
+
return (
|
|
584
|
+
<TableComposable aria-label="Misc table">
|
|
585
|
+
<Thead noWrap>
|
|
586
|
+
<Tr>
|
|
587
|
+
<Th>
|
|
588
|
+
{columns[0]}
|
|
589
|
+
</Th>
|
|
590
|
+
<Th>{columns[1]}</Th>
|
|
591
|
+
<Th>
|
|
592
|
+
{columns[2]}
|
|
593
|
+
</Th>
|
|
594
|
+
<Th>{columns[3]}</Th>
|
|
595
|
+
<Th>{columns[4]}</Th>
|
|
596
|
+
</Tr>
|
|
597
|
+
</Thead>
|
|
598
|
+
<Tbody>
|
|
599
|
+
{rows.map((row, rowIndex) => {
|
|
600
|
+
return (
|
|
601
|
+
<Tr
|
|
602
|
+
key={rowIndex}
|
|
603
|
+
onRowClick={event => onRowClick(event, rowIndex, row.cells)}
|
|
604
|
+
isHoverable
|
|
605
|
+
isRowSelected={row.isRowSelected}
|
|
606
|
+
>
|
|
607
|
+
{row.cells.map((cell, cellIndex) => {
|
|
608
|
+
return (
|
|
609
|
+
<Td
|
|
610
|
+
key={`${rowIndex}_${cellIndex}`}
|
|
611
|
+
dataLabel={columns[cellIndex]}
|
|
612
|
+
>
|
|
613
|
+
{cell}
|
|
614
|
+
</Td>
|
|
615
|
+
);
|
|
616
|
+
})}
|
|
617
|
+
</Tr>
|
|
618
|
+
);
|
|
619
|
+
})}
|
|
620
|
+
</Tbody>
|
|
621
|
+
</TableComposable>
|
|
622
|
+
);
|
|
623
|
+
};
|
|
624
|
+
```
|
|
625
|
+
|
|
565
626
|
### Composable: Actions
|
|
566
627
|
|
|
567
628
|
This example demonstrates adding actions as the last column. The header's last cell is an empty cell, and each body row's last cell is an action cell.
|