@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.
Files changed (46) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/esm/components/Table/Body.d.ts +2 -2
  3. package/dist/esm/components/Table/Body.d.ts.map +1 -1
  4. package/dist/esm/components/Table/Body.js +11 -1
  5. package/dist/esm/components/Table/Body.js.map +1 -1
  6. package/dist/esm/components/Table/RowWrapper.d.ts.map +1 -1
  7. package/dist/esm/components/Table/RowWrapper.js +2 -2
  8. package/dist/esm/components/Table/RowWrapper.js.map +1 -1
  9. package/dist/esm/components/Table/TableTypes.d.ts +2 -0
  10. package/dist/esm/components/Table/TableTypes.d.ts.map +1 -1
  11. package/dist/esm/components/Table/utils/decorators/treeRow.d.ts.map +1 -1
  12. package/dist/esm/components/Table/utils/decorators/treeRow.js +6 -6
  13. package/dist/esm/components/Table/utils/decorators/treeRow.js.map +1 -1
  14. package/dist/esm/components/TableComposable/Tr.d.ts +7 -1
  15. package/dist/esm/components/TableComposable/Tr.d.ts.map +1 -1
  16. package/dist/esm/components/TableComposable/Tr.js +11 -2
  17. package/dist/esm/components/TableComposable/Tr.js.map +1 -1
  18. package/dist/js/components/Table/Body.d.ts +2 -2
  19. package/dist/js/components/Table/Body.d.ts.map +1 -1
  20. package/dist/js/components/Table/Body.js +11 -1
  21. package/dist/js/components/Table/Body.js.map +1 -1
  22. package/dist/js/components/Table/RowWrapper.d.ts.map +1 -1
  23. package/dist/js/components/Table/RowWrapper.js +2 -2
  24. package/dist/js/components/Table/RowWrapper.js.map +1 -1
  25. package/dist/js/components/Table/TableTypes.d.ts +2 -0
  26. package/dist/js/components/Table/TableTypes.d.ts.map +1 -1
  27. package/dist/js/components/Table/utils/decorators/treeRow.d.ts.map +1 -1
  28. package/dist/js/components/Table/utils/decorators/treeRow.js +6 -6
  29. package/dist/js/components/Table/utils/decorators/treeRow.js.map +1 -1
  30. package/dist/js/components/TableComposable/Tr.d.ts +7 -1
  31. package/dist/js/components/TableComposable/Tr.d.ts.map +1 -1
  32. package/dist/js/components/TableComposable/Tr.js +11 -2
  33. package/dist/js/components/TableComposable/Tr.js.map +1 -1
  34. package/dist/umd/react-table.css +16422 -16422
  35. package/dist/umd/react-table.js +30 -11
  36. package/dist/umd/react-table.min.css +11191 -11191
  37. package/dist/umd/react-table.min.js +2 -2
  38. package/package.json +6 -6
  39. package/src/components/Table/Body.tsx +21 -6
  40. package/src/components/Table/RowWrapper.tsx +3 -1
  41. package/src/components/Table/TableTypes.ts +2 -0
  42. package/src/components/Table/__snapshots__/Table.test.tsx.snap +1568 -784
  43. package/src/components/Table/examples/Table.md +111 -94
  44. package/src/components/Table/utils/decorators/treeRow.tsx +12 -6
  45. package/src/components/TableComposable/Tr.tsx +25 -1
  46. 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 && <span className={css(stylesTreeView.tableTreeViewIcon)}>{icon}</span>}
31
- <span className="pf-c-table__text">{content}</span>
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: Row click handler, custom row wrapper, header tooltips & popovers
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 `onClick`, `className`, `style` and more to `Tr`
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
- const onRowClick = (event, rowIndex, row) => {
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.