@patternfly/react-table 4.44.9 → 4.44.13

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 (69) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/esm/components/Table/Table.d.ts +2 -1
  3. package/dist/esm/components/Table/Table.d.ts.map +1 -1
  4. package/dist/esm/components/Table/Table.js.map +1 -1
  5. package/dist/esm/components/Table/TableTypes.d.ts +2 -1
  6. package/dist/esm/components/Table/TableTypes.d.ts.map +1 -1
  7. package/dist/esm/components/Table/TableTypes.js.map +1 -1
  8. package/dist/esm/components/Table/base/provider.d.ts +2 -2
  9. package/dist/esm/components/Table/base/types.d.ts +2 -2
  10. package/dist/esm/components/TableComposable/TableComposable.d.ts +1 -1
  11. package/dist/esm/components/TableComposable/Td.d.ts +1 -1
  12. package/dist/js/components/Table/Table.d.ts +2 -1
  13. package/dist/js/components/Table/Table.d.ts.map +1 -1
  14. package/dist/js/components/Table/Table.js.map +1 -1
  15. package/dist/js/components/Table/TableTypes.d.ts +2 -1
  16. package/dist/js/components/Table/TableTypes.d.ts.map +1 -1
  17. package/dist/js/components/Table/TableTypes.js.map +1 -1
  18. package/dist/js/components/Table/base/provider.d.ts +2 -2
  19. package/dist/js/components/Table/base/types.d.ts +2 -2
  20. package/dist/js/components/TableComposable/TableComposable.d.ts +1 -1
  21. package/dist/js/components/TableComposable/Td.d.ts +1 -1
  22. package/dist/umd/react-table.css +5 -3
  23. package/dist/umd/react-table.min.css +5 -3
  24. package/package.json +6 -6
  25. package/src/components/Table/Table.tsx +2 -1
  26. package/src/components/Table/TableTypes.tsx +2 -1
  27. package/src/components/Table/examples/LegacyTableActions.tsx +218 -0
  28. package/src/components/Table/examples/LegacyTableBasic.tsx +90 -0
  29. package/src/components/Table/examples/LegacyTableCellWidth.tsx +66 -0
  30. package/src/components/Table/examples/LegacyTableCompoundExpandable.tsx +175 -0
  31. package/src/components/Table/examples/LegacyTableControllingText.tsx +51 -0
  32. package/src/components/Table/examples/LegacyTableEmptyState.tsx +48 -0
  33. package/src/components/Table/examples/LegacyTableExpandable.tsx +172 -0
  34. package/src/components/Table/examples/LegacyTableFavoritable.tsx +157 -0
  35. package/src/components/Table/examples/LegacyTableHoverable.tsx +125 -0
  36. package/src/components/Table/examples/LegacyTableMisc.tsx +56 -0
  37. package/src/components/Table/examples/LegacyTableSelectable.tsx +124 -0
  38. package/src/components/Table/examples/LegacyTableSelectableRadio.tsx +54 -0
  39. package/src/components/Table/examples/LegacyTableSortable.tsx +120 -0
  40. package/src/components/Table/examples/LegacyTableSortableCustom.tsx +189 -0
  41. package/src/components/Table/examples/LegacyTableTextModifiers.tsx +31 -0
  42. package/src/components/Table/examples/LegacyTableTree.tsx +213 -0
  43. package/src/components/Table/examples/Table.md +83 -1848
  44. package/src/components/TableComposable/examples/ComposableTable.md +31 -2805
  45. package/src/components/TableComposable/examples/ComposableTableActions.tsx +163 -0
  46. package/src/components/TableComposable/examples/ComposableTableBasic.tsx +89 -0
  47. package/src/components/TableComposable/examples/ComposableTableCellWidth.tsx +56 -0
  48. package/src/components/TableComposable/examples/ComposableTableCompoundExpandable.tsx +103 -0
  49. package/src/components/TableComposable/examples/ComposableTableControllingText.tsx +51 -0
  50. package/src/components/TableComposable/examples/ComposableTableDraggable.tsx +170 -0
  51. package/src/components/TableComposable/examples/ComposableTableEmptyState.tsx +45 -0
  52. package/src/components/TableComposable/examples/ComposableTableExpandable.tsx +195 -0
  53. package/src/components/TableComposable/examples/ComposableTableFavoritable.tsx +118 -0
  54. package/src/components/TableComposable/examples/ComposableTableHoverable.tsx +67 -0
  55. package/src/components/TableComposable/examples/ComposableTableMisc.tsx +92 -0
  56. package/src/components/TableComposable/examples/ComposableTableMultipleStickyColumns.tsx +153 -0
  57. package/src/components/TableComposable/examples/ComposableTableNestedExpandable.tsx +127 -0
  58. package/src/components/TableComposable/examples/ComposableTableNestedHeaders.tsx +202 -0
  59. package/src/components/TableComposable/examples/ComposableTableSelectable.tsx +125 -0
  60. package/src/components/TableComposable/examples/ComposableTableSelectableRadio.tsx +68 -0
  61. package/src/components/TableComposable/examples/ComposableTableSortable.tsx +107 -0
  62. package/src/components/TableComposable/examples/ComposableTableSortableCustom.tsx +175 -0
  63. package/src/components/TableComposable/examples/ComposableTableStickyColumn.tsx +144 -0
  64. package/src/components/TableComposable/examples/ComposableTableStickyColumnsAndHeader.tsx +167 -0
  65. package/src/components/TableComposable/examples/ComposableTableTextModifiers.tsx +33 -0
  66. package/src/components/TableComposable/examples/ComposableTableTree.tsx +201 -0
  67. package/src/demos/Table.md +7 -6
  68. package/src/components/Table/examples/DemoSortableTable.js +0 -65
  69. package/src/components/TableComposable/examples/DemoSortableTable.js +0 -65
@@ -0,0 +1,201 @@
1
+ import React from 'react';
2
+ import { TableComposable, Thead, Tr, Th, Tbody, Td, TreeRowWrapper, TdProps } from '@patternfly/react-table';
3
+ import LeafIcon from '@patternfly/react-icons/dist/esm/icons/leaf-icon';
4
+ import FolderIcon from '@patternfly/react-icons/dist/esm/icons/folder-icon';
5
+ import FolderOpenIcon from '@patternfly/react-icons/dist/esm/icons/folder-open-icon';
6
+
7
+ interface RepositoriesTreeNode {
8
+ name: string;
9
+ branches: string;
10
+ pullRequests: string;
11
+ workspaces: string;
12
+ children?: RepositoriesTreeNode[];
13
+ }
14
+
15
+ export const ComposableTableTree: React.FunctionComponent = () => {
16
+ // In real usage, this data would come from some external source like an API via props.
17
+ const data: RepositoriesTreeNode[] = [
18
+ {
19
+ name: 'Repositories one',
20
+ branches: 'Branch one',
21
+ pullRequests: 'Pull request one',
22
+ workspaces: 'Workplace one',
23
+ children: [
24
+ {
25
+ name: 'Repositories two',
26
+ branches: 'Branch two',
27
+ pullRequests: 'Pull request two',
28
+ workspaces: 'Workplace two',
29
+ children: [
30
+ {
31
+ name: 'Repositories three',
32
+ branches: 'Branch three',
33
+ pullRequests: 'Pull request three',
34
+ workspaces: 'Workplace three'
35
+ },
36
+ {
37
+ name: 'Repositories four',
38
+ branches: 'Branch four',
39
+ pullRequests: 'Pull request four',
40
+ workspaces: 'Workplace four'
41
+ }
42
+ ]
43
+ },
44
+ {
45
+ name: 'Repositories five',
46
+ branches: 'Branch five',
47
+ pullRequests: 'Pull request five',
48
+ workspaces: 'Workplace five'
49
+ },
50
+ {
51
+ name: 'Repositories six',
52
+ branches: 'Branch six',
53
+ pullRequests: 'Pull request six',
54
+ workspaces: 'Workplace six'
55
+ }
56
+ ]
57
+ },
58
+ {
59
+ name: 'Repositories seven',
60
+ branches: 'Branch seven',
61
+ pullRequests: 'Pull request seven',
62
+ workspaces: 'Workplace seven',
63
+ children: [
64
+ {
65
+ name: 'Repositories eight',
66
+ branches: 'Branch eight',
67
+ pullRequests: 'Pull request eight',
68
+ workspaces: 'Workplace eight'
69
+ }
70
+ ]
71
+ },
72
+ {
73
+ name: 'Repositories nine',
74
+ branches: 'Branch nine',
75
+ pullRequests: 'Pull request nine',
76
+ workspaces: 'Workplace nine'
77
+ }
78
+ ];
79
+
80
+ const columnNames = {
81
+ name: 'Repositories',
82
+ branches: 'Branches',
83
+ prs: 'Pull requests',
84
+ workspaces: 'Workspaces'
85
+ };
86
+
87
+ const [expandedNodeNames, setExpandedNodeNames] = React.useState<string[]>(['Repositories one']);
88
+ const [expandedDetailsNodeNames, setExpandedDetailsNodeNames] = React.useState<string[]>([]);
89
+ const [selectedNodeNames, setSelectedNodeNames] = React.useState<string[]>([]);
90
+
91
+ const getDescendants = (node: RepositoriesTreeNode): RepositoriesTreeNode[] =>
92
+ [node].concat(...(node.children ? node.children.map(getDescendants) : []));
93
+ const areAllDescendantsSelected = (node: RepositoriesTreeNode) =>
94
+ getDescendants(node).every(n => selectedNodeNames.includes(n.name));
95
+ const areSomeDescendantsSelected = (node: RepositoriesTreeNode) =>
96
+ getDescendants(node).some(n => selectedNodeNames.includes(n.name));
97
+
98
+ const isNodeChecked = (node: RepositoriesTreeNode) => {
99
+ if (areAllDescendantsSelected(node)) {
100
+ return true;
101
+ }
102
+ if (areSomeDescendantsSelected(node)) {
103
+ return null;
104
+ }
105
+ return false;
106
+ };
107
+
108
+ /**
109
+ Recursive function which flattens the data into an array of flattened TreeRowWrapper components
110
+ params:
111
+ - nodes - array of a single level of tree nodes
112
+ - level - number representing how deeply nested the current row is
113
+ - posinset - position of the row relative to this row's siblings
114
+ - isHidden - defaults to false, true if this row's parent is expanded
115
+ - currentRowIndex - position of the row relative to the entire table
116
+ */
117
+ const renderRows = (
118
+ [node, ...remainingNodes]: RepositoriesTreeNode[],
119
+ level = 1,
120
+ posinset = 1,
121
+ rowIndex = 0,
122
+ isHidden = false
123
+ ): React.ReactNode[] => {
124
+ if (!node) {
125
+ return [];
126
+ }
127
+ const isExpanded = expandedNodeNames.includes(node.name);
128
+ const isDetailsExpanded = expandedDetailsNodeNames.includes(node.name);
129
+ const isChecked = isNodeChecked(node);
130
+ let icon = <LeafIcon />;
131
+ if (node.children) {
132
+ icon = isExpanded ? <FolderOpenIcon aria-hidden /> : <FolderIcon aria-hidden />;
133
+ }
134
+
135
+ const treeRow: TdProps['treeRow'] = {
136
+ onCollapse: () =>
137
+ setExpandedNodeNames(prevExpanded => {
138
+ const otherExpandedNodeNames = prevExpanded.filter(name => name !== node.name);
139
+ return isExpanded ? otherExpandedNodeNames : [...otherExpandedNodeNames, node.name];
140
+ }),
141
+ onToggleRowDetails: () =>
142
+ setExpandedDetailsNodeNames(prevDetailsExpanded => {
143
+ const otherDetailsExpandedNodeNames = prevDetailsExpanded.filter(name => name !== node.name);
144
+ return isDetailsExpanded ? otherDetailsExpandedNodeNames : [...otherDetailsExpandedNodeNames, node.name];
145
+ }),
146
+ onCheckChange: (_event, isChecking) => {
147
+ const nodeNamesToCheck = getDescendants(node).map(n => n.name);
148
+ setSelectedNodeNames(prevSelected => {
149
+ const otherSelectedNodeNames = prevSelected.filter(name => !nodeNamesToCheck.includes(name));
150
+ return !isChecking ? otherSelectedNodeNames : [...otherSelectedNodeNames, ...nodeNamesToCheck];
151
+ });
152
+ },
153
+ rowIndex,
154
+ props: {
155
+ isExpanded,
156
+ isDetailsExpanded,
157
+ isHidden,
158
+ 'aria-level': level,
159
+ 'aria-posinset': posinset,
160
+ 'aria-setsize': node.children ? node.children.length : 0,
161
+ isChecked,
162
+ icon
163
+ }
164
+ };
165
+
166
+ return [
167
+ <TreeRowWrapper key={node.name} row={{ props: treeRow.props }}>
168
+ <Td dataLabel={columnNames.name} treeRow={treeRow}>
169
+ {node.name}
170
+ </Td>
171
+ <Td dataLabel={columnNames.branches}>{node.branches}</Td>
172
+ <Td dataLabel={columnNames.prs}>{node.pullRequests}</Td>
173
+ <Td dataLabel={columnNames.workspaces}>{node.workspaces}</Td>
174
+ </TreeRowWrapper>,
175
+ ...(node.children && node.children.length
176
+ ? renderRows(node.children, level + 1, 1, rowIndex + 1, !isExpanded || isHidden)
177
+ : []),
178
+ ...renderRows(
179
+ remainingNodes,
180
+ level,
181
+ posinset + 1,
182
+ rowIndex + 1 + ((node.children && node.children.length) || 0),
183
+ isHidden
184
+ )
185
+ ];
186
+ };
187
+
188
+ return (
189
+ <TableComposable isTreeTable aria-label="Tree table">
190
+ <Thead>
191
+ <Tr>
192
+ <Th>{columnNames.name}</Th>
193
+ <Th>{columnNames.branches}</Th>
194
+ <Th>{columnNames.prs}</Th>
195
+ <Th>{columnNames.workspaces}</Th>
196
+ </Tr>
197
+ </Thead>
198
+ <Tbody>{renderRows(data)}</Tbody>
199
+ </TableComposable>
200
+ );
201
+ };
@@ -333,17 +333,18 @@ class ExpandCollapseAllTableDemo extends React.Component {
333
333
  this.toggleSelectAll = this.toggleSelectAll.bind(this);
334
334
  }
335
335
 
336
- onCollapse(event, rowKey, isOpen) {
336
+ onCollapse(event, rowIndex, isOpen) {
337
337
  const { rows, expandedRows, expandCollapseToggle } = this.state;
338
338
  const expandableRowLength = this.state.rows.filter(row => row.isOpen !== undefined).length;
339
339
  /**
340
340
  * Please do not use rowKey as row index for more complex tables.
341
341
  * Rather use some kind of identifier like ID passed with each row.
342
342
  */
343
- rows[rowKey].isOpen = isOpen;
343
+ const newRows = Array.from(rows);
344
+ newRows[rowIndex] = { ...newRows[rowIndex], isOpen };
344
345
  const updatedExpandedRows = isOpen ? expandedRows + 1 : expandedRows - 1;
345
346
  this.setState({
346
- rows,
347
+ rows: newRows,
347
348
  expandedRows: updatedExpandedRows,
348
349
  expandCollapseToggle:
349
350
  updatedExpandedRows === expandableRowLength
@@ -385,7 +386,7 @@ class ExpandCollapseAllTableDemo extends React.Component {
385
386
  selectedRows = isSelected ? selectableRowLength : 0;
386
387
  } else {
387
388
  rows = [...this.state.rows];
388
- rows[rowId].selected = isSelected;
389
+ rows[rowId] = { ...rows[rowId], selected: isSelected };
389
390
  selectedRows = isSelected ? selectedRows + 1 : selectedRows - 1;
390
391
  isChecked = selectedRows === 0 ? false : selectedRows === selectableRowLength ? true : null;
391
392
  }
@@ -864,7 +865,7 @@ class ColumnManagementAction extends React.Component {
864
865
  });
865
866
  } else {
866
867
  rows = [...this.state.rows];
867
- rows[rowId].selected = isSelected;
868
+ rows[rowId] = { ...rows[rowId], selected: isSelected };
868
869
  }
869
870
  this.setState({
870
871
  rows
@@ -1576,7 +1577,7 @@ class ColumnManagementAction extends React.Component {
1576
1577
  });
1577
1578
  } else {
1578
1579
  rows = [...this.state.rows];
1579
- rows[rowId].selected = isSelected;
1580
+ rows[rowId] = { ...rows[rowId], selected: isSelected };
1580
1581
  }
1581
1582
  this.setState({
1582
1583
  rows
@@ -1,65 +0,0 @@
1
- import React from 'react';
2
- import PropTypes from 'prop-types';
3
- import { Table, TableHeader, TableBody, TableVariant, sortable, SortByDirection } from '@patternfly/react-table';
4
-
5
- export default class DemoSortableTable extends React.Component {
6
- constructor(props) {
7
- super(props);
8
- this.state = {
9
- columns: [
10
- { title: 'Repositories', transforms: [sortable] },
11
- 'Branches',
12
- { title: 'Pull requests', transforms: [sortable] },
13
- 'Workspaces',
14
- 'Last Commit'
15
- ],
16
- rows: [props.firstColumnRows, ['a', 'two', 'k', 'four', 'five'], ['p', 'two', 'b', 'four', 'five']],
17
- sortBy: {}
18
- };
19
- this.onSort = this.onSort.bind(this);
20
- }
21
-
22
- onSort(_event, index, direction) {
23
- const sortedRows = this.state.rows.sort((a, b) => {
24
- if (a[index] < b[index]) {
25
- return -1;
26
- }
27
- return a[index] > b[index] ? 1 : 0;
28
- });
29
-
30
- this.setState({
31
- sortBy: {
32
- index,
33
- direction
34
- },
35
- rows: direction === SortByDirection.asc ? sortedRows : sortedRows.reverse()
36
- });
37
- }
38
-
39
- render() {
40
- const { id } = this.props;
41
- const { columns, rows, sortBy } = this.state;
42
-
43
- return (
44
- <Table
45
- aria-label="Sortable Table"
46
- variant={TableVariant.compact}
47
- sortBy={sortBy}
48
- onSort={this.onSort}
49
- cells={columns}
50
- rows={rows}
51
- className="pf-m-no-border-rows"
52
- id={id}
53
- isNested
54
- >
55
- <TableHeader />
56
- <TableBody />
57
- </Table>
58
- );
59
- }
60
- }
61
-
62
- DemoSortableTable.propTypes = {
63
- firstColumnRows: PropTypes.array.isRequired,
64
- id: PropTypes.string.isRequired
65
- };
@@ -1,65 +0,0 @@
1
- import React from 'react';
2
- import PropTypes from 'prop-types';
3
- import { Table, TableHeader, TableBody, TableVariant, sortable, SortByDirection } from '@patternfly/react-table';
4
-
5
- export default class DemoSortableTable extends React.Component {
6
- constructor(props) {
7
- super(props);
8
- this.state = {
9
- columns: [
10
- { title: 'Repositories', transforms: [sortable] },
11
- 'Branches',
12
- { title: 'Pull requests', transforms: [sortable] },
13
- 'Workspaces',
14
- 'Last Commit'
15
- ],
16
- rows: [props.firstColumnRows, ['a', 'two', 'k', 'four', 'five'], ['p', 'two', 'b', 'four', 'five']],
17
- sortBy: {}
18
- };
19
- this.onSort = this.onSort.bind(this);
20
- }
21
-
22
- onSort(_event, index, direction) {
23
- const sortedRows = this.state.rows.sort((a, b) => {
24
- if (a[index] < b[index]) {
25
- return -1;
26
- }
27
- return a[index] > b[index] ? 1 : 0;
28
- });
29
-
30
- this.setState({
31
- sortBy: {
32
- index,
33
- direction
34
- },
35
- rows: direction === SortByDirection.asc ? sortedRows : sortedRows.reverse()
36
- });
37
- }
38
-
39
- render() {
40
- const { id } = this.props;
41
- const { columns, rows, sortBy } = this.state;
42
-
43
- return (
44
- <Table
45
- aria-label="Sortable Table"
46
- variant={TableVariant.compact}
47
- sortBy={sortBy}
48
- onSort={this.onSort}
49
- cells={columns}
50
- rows={rows}
51
- className="pf-m-no-border-rows"
52
- id={id}
53
- isNested
54
- >
55
- <TableHeader />
56
- <TableBody />
57
- </Table>
58
- );
59
- }
60
- }
61
-
62
- DemoSortableTable.propTypes = {
63
- firstColumnRows: PropTypes.array.isRequired,
64
- id: PropTypes.string.isRequired
65
- };