@patternfly/react-table 6.0.0-alpha.1 → 6.0.0-alpha.3

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 (233) hide show
  1. package/CHANGELOG.md +188 -0
  2. package/README.md +2 -2
  3. package/components/package.json +1 -1
  4. package/deprecated/package.json +1 -1
  5. package/dist/dynamic/components/Table/package.json +1 -1
  6. package/dist/dynamic/components/Table/utils/decorators/package.json +1 -1
  7. package/dist/dynamic/components/Table/utils/package.json +1 -1
  8. package/dist/dynamic/deprecated/components/Table/base/package.json +1 -1
  9. package/dist/dynamic/deprecated/components/Table/package.json +1 -1
  10. package/dist/dynamic/deprecated/components/package.json +1 -1
  11. package/dist/esm/components/Table/ActionsColumn.d.ts +1 -1
  12. package/dist/esm/components/Table/ActionsColumn.d.ts.map +1 -1
  13. package/dist/esm/components/Table/Caption.js +1 -1
  14. package/dist/esm/components/Table/Caption.js.map +1 -1
  15. package/dist/esm/components/Table/CollapseColumn.js +1 -1
  16. package/dist/esm/components/Table/CollapseColumn.js.map +1 -1
  17. package/dist/esm/components/Table/DraggableRowWrapper.js +2 -2
  18. package/dist/esm/components/Table/DraggableRowWrapper.js.map +1 -1
  19. package/dist/esm/components/Table/EditColumn.js +1 -1
  20. package/dist/esm/components/Table/EditColumn.js.map +1 -1
  21. package/dist/esm/components/Table/EditableSelectInputCell.js +2 -2
  22. package/dist/esm/components/Table/EditableSelectInputCell.js.map +1 -1
  23. package/dist/esm/components/Table/EditableTextCell.js +2 -2
  24. package/dist/esm/components/Table/EditableTextCell.js.map +1 -1
  25. package/dist/esm/components/Table/ExpandableRowContent.js +1 -1
  26. package/dist/esm/components/Table/ExpandableRowContent.js.map +1 -1
  27. package/dist/esm/components/Table/HeaderCellInfoWrapper.js +1 -1
  28. package/dist/esm/components/Table/HeaderCellInfoWrapper.js.map +1 -1
  29. package/dist/esm/components/Table/InnerScrollContainer.js +1 -1
  30. package/dist/esm/components/Table/InnerScrollContainer.js.map +1 -1
  31. package/dist/esm/components/Table/OuterScrollContainer.js +1 -1
  32. package/dist/esm/components/Table/OuterScrollContainer.js.map +1 -1
  33. package/dist/esm/components/Table/RowWrapper.d.ts +1 -1
  34. package/dist/esm/components/Table/SortColumn.js +1 -1
  35. package/dist/esm/components/Table/SortColumn.js.map +1 -1
  36. package/dist/esm/components/Table/Table.d.ts +1 -1
  37. package/dist/esm/components/Table/Table.d.ts.map +1 -1
  38. package/dist/esm/components/Table/Table.js +5 -5
  39. package/dist/esm/components/Table/Table.js.map +1 -1
  40. package/dist/esm/components/Table/TableText.js +1 -1
  41. package/dist/esm/components/Table/TableText.js.map +1 -1
  42. package/dist/esm/components/Table/Tbody.d.ts +1 -1
  43. package/dist/esm/components/Table/Tbody.d.ts.map +1 -1
  44. package/dist/esm/components/Table/Tbody.js +1 -1
  45. package/dist/esm/components/Table/Tbody.js.map +1 -1
  46. package/dist/esm/components/Table/Td.d.ts +1 -1
  47. package/dist/esm/components/Table/Td.d.ts.map +1 -1
  48. package/dist/esm/components/Table/Td.js +9 -5
  49. package/dist/esm/components/Table/Td.js.map +1 -1
  50. package/dist/esm/components/Table/Th.d.ts +1 -1
  51. package/dist/esm/components/Table/Th.d.ts.map +1 -1
  52. package/dist/esm/components/Table/Th.js +6 -3
  53. package/dist/esm/components/Table/Th.js.map +1 -1
  54. package/dist/esm/components/Table/Thead.d.ts +1 -1
  55. package/dist/esm/components/Table/Thead.d.ts.map +1 -1
  56. package/dist/esm/components/Table/Thead.js +1 -1
  57. package/dist/esm/components/Table/Thead.js.map +1 -1
  58. package/dist/esm/components/Table/Tr.d.ts +2 -2
  59. package/dist/esm/components/Table/Tr.d.ts.map +1 -1
  60. package/dist/esm/components/Table/Tr.js +2 -2
  61. package/dist/esm/components/Table/Tr.js.map +1 -1
  62. package/dist/esm/components/Table/TreeRowWrapper.js +2 -2
  63. package/dist/esm/components/Table/TreeRowWrapper.js.map +1 -1
  64. package/dist/esm/components/Table/base/provider.d.ts +8 -8
  65. package/dist/esm/components/Table/base/types.d.ts +7 -7
  66. package/dist/esm/components/Table/utils/decorators/cellActions.js +1 -1
  67. package/dist/esm/components/Table/utils/decorators/cellActions.js.map +1 -1
  68. package/dist/esm/components/Table/utils/decorators/cellWidth.js +1 -1
  69. package/dist/esm/components/Table/utils/decorators/cellWidth.js.map +1 -1
  70. package/dist/esm/components/Table/utils/decorators/classNames.js +1 -1
  71. package/dist/esm/components/Table/utils/decorators/classNames.js.map +1 -1
  72. package/dist/esm/components/Table/utils/decorators/collapsible.js +1 -1
  73. package/dist/esm/components/Table/utils/decorators/collapsible.js.map +1 -1
  74. package/dist/esm/components/Table/utils/decorators/compoundExpand.js +1 -1
  75. package/dist/esm/components/Table/utils/decorators/compoundExpand.js.map +1 -1
  76. package/dist/esm/components/Table/utils/decorators/editable.js +1 -1
  77. package/dist/esm/components/Table/utils/decorators/editable.js.map +1 -1
  78. package/dist/esm/components/Table/utils/decorators/favoritable.js +1 -1
  79. package/dist/esm/components/Table/utils/decorators/favoritable.js.map +1 -1
  80. package/dist/esm/components/Table/utils/decorators/info.js +1 -1
  81. package/dist/esm/components/Table/utils/decorators/info.js.map +1 -1
  82. package/dist/esm/components/Table/utils/decorators/selectable.js +2 -2
  83. package/dist/esm/components/Table/utils/decorators/selectable.js.map +1 -1
  84. package/dist/esm/components/Table/utils/decorators/sortable.js +1 -1
  85. package/dist/esm/components/Table/utils/decorators/sortable.js.map +1 -1
  86. package/dist/esm/components/Table/utils/decorators/treeRow.d.ts +3 -3
  87. package/dist/esm/components/Table/utils/decorators/treeRow.d.ts.map +1 -1
  88. package/dist/esm/components/Table/utils/decorators/treeRow.js +5 -5
  89. package/dist/esm/components/Table/utils/decorators/treeRow.js.map +1 -1
  90. package/dist/esm/components/Table/utils/decorators/wrappable.js +1 -1
  91. package/dist/esm/components/Table/utils/decorators/wrappable.js.map +1 -1
  92. package/dist/esm/demos/index.d.ts +2 -0
  93. package/dist/esm/demos/index.d.ts.map +1 -0
  94. package/dist/esm/demos/index.js +2 -0
  95. package/dist/esm/demos/index.js.map +1 -0
  96. package/dist/esm/demos/sampleData.d.ts +13 -0
  97. package/dist/esm/demos/sampleData.d.ts.map +1 -0
  98. package/dist/esm/demos/sampleData.js +764 -0
  99. package/dist/esm/demos/sampleData.js.map +1 -0
  100. package/dist/esm/deprecated/components/Table/Body.d.ts +1 -1
  101. package/dist/esm/deprecated/components/Table/Body.d.ts.map +1 -1
  102. package/dist/esm/deprecated/components/Table/Table.d.ts +1 -1
  103. package/dist/esm/deprecated/components/Table/Table.js +1 -1
  104. package/dist/esm/deprecated/components/Table/Table.js.map +1 -1
  105. package/dist/esm/deprecated/components/Table/base/body.d.ts +8 -2
  106. package/dist/esm/deprecated/components/Table/base/body.d.ts.map +1 -1
  107. package/dist/esm/deprecated/components/Table/base/header.d.ts +1 -1
  108. package/dist/esm/deprecated/components/Table/base/header.d.ts.map +1 -1
  109. package/dist/esm/index.d.ts +1 -0
  110. package/dist/esm/index.d.ts.map +1 -1
  111. package/dist/esm/index.js +1 -0
  112. package/dist/esm/index.js.map +1 -1
  113. package/dist/js/components/Table/ActionsColumn.d.ts +1 -1
  114. package/dist/js/components/Table/ActionsColumn.d.ts.map +1 -1
  115. package/dist/js/components/Table/ActionsColumn.js +6 -6
  116. package/dist/js/components/Table/ActionsColumn.js.map +1 -1
  117. package/dist/js/components/Table/CollapseColumn.js +2 -2
  118. package/dist/js/components/Table/CollapseColumn.js.map +1 -1
  119. package/dist/js/components/Table/DraggableCell.js +2 -2
  120. package/dist/js/components/Table/DraggableCell.js.map +1 -1
  121. package/dist/js/components/Table/EditColumn.js +4 -4
  122. package/dist/js/components/Table/EditColumn.js.map +1 -1
  123. package/dist/js/components/Table/EditableSelectInputCell.js +1 -1
  124. package/dist/js/components/Table/EditableSelectInputCell.js.map +1 -1
  125. package/dist/js/components/Table/EditableTextCell.js +1 -1
  126. package/dist/js/components/Table/EditableTextCell.js.map +1 -1
  127. package/dist/js/components/Table/FavoritesCell.js +2 -2
  128. package/dist/js/components/Table/FavoritesCell.js.map +1 -1
  129. package/dist/js/components/Table/HeaderCellInfoWrapper.js +4 -4
  130. package/dist/js/components/Table/HeaderCellInfoWrapper.js.map +1 -1
  131. package/dist/js/components/Table/RowWrapper.d.ts +1 -1
  132. package/dist/js/components/Table/RowWrapper.js +2 -1
  133. package/dist/js/components/Table/RowWrapper.js.map +1 -1
  134. package/dist/js/components/Table/SortColumn.js +3 -3
  135. package/dist/js/components/Table/SortColumn.js.map +1 -1
  136. package/dist/js/components/Table/Table.d.ts +1 -1
  137. package/dist/js/components/Table/Table.d.ts.map +1 -1
  138. package/dist/js/components/Table/Table.js +2 -2
  139. package/dist/js/components/Table/Table.js.map +1 -1
  140. package/dist/js/components/Table/TableText.js +1 -1
  141. package/dist/js/components/Table/TableText.js.map +1 -1
  142. package/dist/js/components/Table/TableTypes.js +4 -0
  143. package/dist/js/components/Table/TableTypes.js.map +1 -1
  144. package/dist/js/components/Table/Tbody.d.ts +1 -1
  145. package/dist/js/components/Table/Tbody.d.ts.map +1 -1
  146. package/dist/js/components/Table/Td.d.ts +1 -1
  147. package/dist/js/components/Table/Td.d.ts.map +1 -1
  148. package/dist/js/components/Table/Td.js +8 -4
  149. package/dist/js/components/Table/Td.js.map +1 -1
  150. package/dist/js/components/Table/Th.d.ts +1 -1
  151. package/dist/js/components/Table/Th.d.ts.map +1 -1
  152. package/dist/js/components/Table/Th.js +5 -2
  153. package/dist/js/components/Table/Th.js.map +1 -1
  154. package/dist/js/components/Table/Thead.d.ts +1 -1
  155. package/dist/js/components/Table/Thead.d.ts.map +1 -1
  156. package/dist/js/components/Table/Tr.d.ts +2 -2
  157. package/dist/js/components/Table/Tr.d.ts.map +1 -1
  158. package/dist/js/components/Table/Tr.js +1 -1
  159. package/dist/js/components/Table/Tr.js.map +1 -1
  160. package/dist/js/components/Table/base/provider.d.ts +8 -8
  161. package/dist/js/components/Table/base/types.d.ts +7 -7
  162. package/dist/js/components/Table/base/types.js +4 -0
  163. package/dist/js/components/Table/base/types.js.map +1 -1
  164. package/dist/js/components/Table/utils/decorators/sortable.js +1 -1
  165. package/dist/js/components/Table/utils/decorators/sortable.js.map +1 -1
  166. package/dist/js/components/Table/utils/decorators/treeRow.d.ts +3 -3
  167. package/dist/js/components/Table/utils/decorators/treeRow.d.ts.map +1 -1
  168. package/dist/js/components/Table/utils/decorators/treeRow.js +7 -7
  169. package/dist/js/components/Table/utils/decorators/treeRow.js.map +1 -1
  170. package/dist/js/demos/index.d.ts +2 -0
  171. package/dist/js/demos/index.d.ts.map +1 -0
  172. package/dist/js/demos/index.js +5 -0
  173. package/dist/js/demos/index.js.map +1 -0
  174. package/dist/js/demos/sampleData.d.ts +13 -0
  175. package/dist/js/demos/sampleData.d.ts.map +1 -0
  176. package/dist/js/demos/sampleData.js +767 -0
  177. package/dist/js/demos/sampleData.js.map +1 -0
  178. package/dist/js/deprecated/components/Table/Body.d.ts +1 -1
  179. package/dist/js/deprecated/components/Table/Body.d.ts.map +1 -1
  180. package/dist/js/deprecated/components/Table/BodyCell.js +4 -3
  181. package/dist/js/deprecated/components/Table/BodyCell.js.map +1 -1
  182. package/dist/js/deprecated/components/Table/Table.d.ts +1 -1
  183. package/dist/js/deprecated/components/Table/Table.js +1 -1
  184. package/dist/js/deprecated/components/Table/Table.js.map +1 -1
  185. package/dist/js/deprecated/components/Table/base/body.d.ts +8 -2
  186. package/dist/js/deprecated/components/Table/base/body.d.ts.map +1 -1
  187. package/dist/js/deprecated/components/Table/base/header.d.ts +1 -1
  188. package/dist/js/deprecated/components/Table/base/header.d.ts.map +1 -1
  189. package/dist/js/index.d.ts +1 -0
  190. package/dist/js/index.d.ts.map +1 -1
  191. package/dist/js/index.js +1 -0
  192. package/dist/js/index.js.map +1 -1
  193. package/dist/umd/react-table.min.js +9 -9
  194. package/package.json +6 -6
  195. package/src/components/Table/Table.tsx +2 -2
  196. package/src/components/Table/Td.tsx +10 -5
  197. package/src/components/Table/Th.tsx +6 -3
  198. package/src/components/Table/Tr.tsx +1 -1
  199. package/src/components/Table/examples/Table.md +3 -0
  200. package/src/components/Table/examples/TableCompoundExpandable.tsx +2 -1
  201. package/src/components/Table/examples/TableMisc.tsx +3 -1
  202. package/src/components/Table/examples/TableNestedHeaders.tsx +4 -3
  203. package/src/components/Table/examples/TableNestedStickyHeader.tsx +4 -3
  204. package/src/components/Table/examples/TableStickyColumnsAndHeader.tsx +5 -4
  205. package/src/components/Table/utils/decorators/treeRow.tsx +3 -3
  206. package/src/components/Table/utils/transformers.test.tsx +14 -8
  207. package/src/demos/Table.md +159 -0
  208. package/src/demos/examples/TableAutomaticPagination.tsx +101 -0
  209. package/src/{docs/demos/table-demos/BulkSelect.jsx → demos/examples/TableBulkSelect.tsx} +41 -20
  210. package/src/demos/examples/TableColumnManagement.tsx +486 -0
  211. package/src/demos/examples/TableColumnManagementWithDraggable.tsx +641 -0
  212. package/src/{docs/demos/table-demos/Compact.jsx → demos/examples/TableCompact.tsx} +32 -16
  213. package/src/{docs/demos/table-demos/CompoundExpansion.jsx → demos/examples/TableCompoundExpansion.tsx} +27 -13
  214. package/src/demos/examples/TableEmptyStateDefault.tsx +60 -0
  215. package/src/demos/examples/TableEmptyStateError.tsx +53 -0
  216. package/src/demos/examples/TableEmptyStateLoading.tsx +43 -0
  217. package/src/{docs/demos/table-demos/ExpandCollapseAll.jsx → demos/examples/TableExpandCollapseAll.tsx} +17 -10
  218. package/src/demos/examples/TableFilterable.tsx +394 -0
  219. package/src/{docs/demos/table-demos/SortableResponsive.jsx → demos/examples/TableSortableResponsive.tsx} +30 -29
  220. package/src/{docs/demos/table-demos/StaticBottomPagination.jsx → demos/examples/TableStaticBottomPagination.tsx} +22 -9
  221. package/src/{docs/demos/table-demos/StickyFirstColumn.jsx → demos/examples/TableStickyFirstColumn.tsx} +31 -9
  222. package/src/{docs/demos/table-demos/StickyHeader.jsx → demos/examples/TableStickyHeader.tsx} +3 -3
  223. package/src/demos/index.ts +1 -0
  224. package/src/{docs/demos/table-demos/sampleData.js → demos/sampleData.tsx} +88 -77
  225. package/src/deprecated/components/Table/__tests__/Table.test.tsx +4 -9
  226. package/src/deprecated/components/Table/examples/LegacyTableCompoundExpandable.tsx +4 -3
  227. package/src/deprecated/components/Table/examples/LegacyTableMisc.tsx +4 -3
  228. package/src/deprecated/components/Table/examples/LegacyTableSelectable.tsx +2 -1
  229. package/src/deprecated/components/Table/examples/LegacyTableStripedCustomTr.tsx +2 -6
  230. package/src/deprecated/components/Table/examples/Table.md +2 -0
  231. package/src/index.ts +1 -0
  232. package/src/docs/demos/Table.md +0 -1622
  233. package/src/docs/demos/table-demos/ColumnManagement.jsx +0 -471
@@ -6,44 +6,63 @@ import {
6
6
  DropdownItem,
7
7
  MenuToggle,
8
8
  MenuToggleCheckbox,
9
+ MenuToggleElement,
9
10
  PageSection,
10
11
  Pagination,
11
12
  Toolbar,
12
13
  ToolbarContent,
13
14
  ToolbarGroup,
14
- ToolbarItem
15
+ ToolbarItem,
16
+ PaginationVariant
15
17
  } from '@patternfly/react-core';
16
18
  import { Table, Thead, Tr, Th, Tbody, Td } from '@patternfly/react-table';
17
- import DashboardWrapper from '@patternfly/react-core/src/demos/examples/DashboardWrapper';
18
- import { rows, columns } from '@patternfly/react-table/src/docs/demos/table-demos/sampleData';
19
+ import { rows, columns, SampleDataRow } from '@patternfly/react-table/dist/esm/demos/sampleData';
20
+ import { DashboardWrapper } from '@patternfly/react-core/dist/esm/demos/DashboardWrapper';
19
21
 
20
- export const BulkSelectTableDemo = () => {
22
+ export const TableBulkSelect: React.FunctionComponent = () => {
21
23
  const [isBulkSelectDropdownOpen, setIsBulkSelectDropdownOpen] = React.useState(false);
22
24
  const [bulkSelection, setBulkSelection] = React.useState('');
23
25
  const [page, setPage] = React.useState(1);
24
26
  const [perPage, setPerPage] = React.useState(10);
25
27
  const [paginatedRows, setPaginatedRows] = React.useState(rows.slice(0, 10));
26
- const [selectedRows, setSelectedRows] = React.useState([]);
27
- const handleSetPage = (_evt, newPage, _perPage, startIdx, endIdx) => {
28
- setPaginatedRows(rows.slice(startIdx, endIdx));
28
+ const [selectedRows, setSelectedRows] = React.useState<string[]>([]);
29
+
30
+ const handleSetPage = (
31
+ _evt: React.MouseEvent | React.KeyboardEvent | MouseEvent,
32
+ newPage: number,
33
+ _perPage: number,
34
+ startIdx: number,
35
+ endIdx: number
36
+ ) => {
37
+ setPaginatedRows(rows?.slice(startIdx, endIdx));
29
38
  setPage(newPage);
30
39
  };
31
- const handlePerPageSelect = (_evt, newPerPage, newPage, startIdx, endIdx) => {
40
+
41
+ const handlePerPageSelect = (
42
+ _evt: React.MouseEvent | React.KeyboardEvent | MouseEvent,
43
+ newPerPage: number,
44
+ newPage: number,
45
+ startIdx: number,
46
+ endIdx: number
47
+ ) => {
32
48
  setPaginatedRows(rows.slice(startIdx, endIdx));
33
49
  setPage(newPage);
34
50
  setPerPage(newPerPage);
35
51
  };
36
52
 
37
- const setRowSelected = (row, isSelecting = true) =>
53
+ const setRowSelected = (row: SampleDataRow, isSelecting: boolean) =>
38
54
  setSelectedRows((prevSelected) => {
39
55
  const otherSelectedRows = prevSelected.filter((r) => r !== row.name);
40
56
  return isSelecting ? [...otherSelectedRows, row.name] : otherSelectedRows;
41
57
  });
42
- const selectAllRows = (isSelecting = true) => setSelectedRows(isSelecting ? rows.map((r) => r.name) : []);
43
- const selectPageRows = (isSelecting = true) => setSelectedRows(isSelecting ? paginatedRows.map((r) => r.name) : []);
44
- const isRowSelected = (row) => selectedRows.includes(row.name);
45
58
 
46
- const buildPagination = (variant, isCompact) => (
59
+ const selectAllRows = (isSelecting: boolean) => setSelectedRows(isSelecting ? rows.map((r) => r.name) : []);
60
+
61
+ const selectPageRows = (isSelecting: boolean) => setSelectedRows(isSelecting ? paginatedRows.map((r) => r.name) : []);
62
+
63
+ const isRowSelected = (row: any) => selectedRows.includes(row.name);
64
+
65
+ const buildPagination = (variant: 'bottom' | 'top' | PaginationVariant, isCompact: boolean) => (
47
66
  <Pagination
48
67
  isCompact={isCompact}
49
68
  itemCount={rows.length}
@@ -72,10 +91,11 @@ export const BulkSelectTableDemo = () => {
72
91
  <DropdownItem value="all">Select all ({rows.length} items)</DropdownItem>
73
92
  </>
74
93
  );
94
+
75
95
  return (
76
96
  <Dropdown
77
97
  role="menu"
78
- onSelect={(_ev, value) => {
98
+ onSelect={(_event: React.MouseEvent<Element, MouseEvent>, value: string) => {
79
99
  if (value === 'all') {
80
100
  selectAllRows(bulkSelection !== 'all');
81
101
  } else if (value === 'page') {
@@ -83,11 +103,11 @@ export const BulkSelectTableDemo = () => {
83
103
  } else {
84
104
  setSelectedRows([]);
85
105
  }
86
- setBulkSelection(value);
106
+ setBulkSelection(value as string);
87
107
  }}
88
108
  isOpen={isBulkSelectDropdownOpen}
89
- onOpenChange={(isOpen) => setIsBulkSelectDropdownOpen(isOpen)}
90
- toggle={(toggleRef) => (
109
+ onOpenChange={(isOpen: boolean) => setIsBulkSelectDropdownOpen(isOpen)}
110
+ toggle={(toggleRef: React.Ref<MenuToggleElement>) => (
91
111
  <MenuToggle
92
112
  ref={toggleRef}
93
113
  isExpanded={isBulkSelectDropdownOpen}
@@ -122,7 +142,7 @@ export const BulkSelectTableDemo = () => {
122
142
  <ToolbarGroup>
123
143
  <ToolbarItem variant="bulk-select">{buildBulkSelectDropdown()}</ToolbarItem>
124
144
  </ToolbarGroup>
125
- <ToolbarItem variant="pagination">{buildPagination('top')}</ToolbarItem>
145
+ <ToolbarItem variant="pagination">{buildPagination('top', false)}</ToolbarItem>
126
146
  </ToolbarContent>
127
147
  </Toolbar>
128
148
  );
@@ -147,7 +167,8 @@ export const BulkSelectTableDemo = () => {
147
167
  <Td
148
168
  select={{
149
169
  rowIndex,
150
- onSelect: (_event, isSelecting) => setRowSelected(row, isSelecting),
170
+ onSelect: (_event: React.FormEvent<HTMLInputElement>, isSelecting: boolean) =>
171
+ setRowSelected(row, isSelecting),
151
172
  isSelected: isRowSelected(row)
152
173
  }}
153
174
  />
@@ -159,7 +180,7 @@ export const BulkSelectTableDemo = () => {
159
180
  ))}
160
181
  </Tbody>
161
182
  </Table>
162
- {buildPagination('bottom')}
183
+ {buildPagination('bottom', true)}
163
184
  </PageSection>
164
185
  </DashboardWrapper>
165
186
  );
@@ -0,0 +1,486 @@
1
+ import React from 'react';
2
+
3
+ import {
4
+ Button,
5
+ Card,
6
+ DataList,
7
+ DataListCheck,
8
+ DataListItem,
9
+ DataListItemRow,
10
+ DataListCell,
11
+ DataListItemCells,
12
+ Label,
13
+ Toolbar,
14
+ ToolbarContent,
15
+ ToolbarItem,
16
+ MenuToggle,
17
+ Modal,
18
+ OverflowMenu,
19
+ OverflowMenuGroup,
20
+ OverflowMenuItem,
21
+ PageSection,
22
+ Pagination,
23
+ PaginationVariant,
24
+ Text,
25
+ TextContent,
26
+ TextVariants
27
+ } from '@patternfly/react-core';
28
+ import { Table, TableText, Thead, Tr, Th, Tbody, Td } from '@patternfly/react-table';
29
+ import FilterIcon from '@patternfly/react-icons/dist/esm/icons/filter-icon';
30
+ import SortAmountDownIcon from '@patternfly/react-icons/dist/esm/icons/sort-amount-down-icon';
31
+ import { DashboardWrapper } from '@patternfly/react-core/dist/esm/demos/DashboardWrapper';
32
+ import { capitalize } from '@patternfly/react-table/src/components/Table/utils/utils';
33
+ import { rows, columns, SampleDataRow } from '@patternfly/react-table/dist/esm/demos/sampleData';
34
+
35
+ export const TableColumnManagement: React.FunctionComponent = () => {
36
+ const defaultColumns = columns;
37
+ const defaultRows = rows;
38
+
39
+ const [filters, setFilters] = React.useState<string[]>([]);
40
+ const [filteredColumns, setFilteredColumns] = React.useState<string[]>([]);
41
+ const [filteredRows, setFilteredRows] = React.useState<SampleDataRow[]>([]);
42
+ const [managedColumns, setManagedColumns] = React.useState<string[]>(defaultColumns);
43
+ const [managedRows, setManagedRows] = React.useState<SampleDataRow[]>(defaultRows);
44
+ const [isModalOpen, setIsModalOpen] = React.useState(false);
45
+ const [checkedState, setCheckedState] = React.useState<boolean[]>(Array(columns.length).fill(true));
46
+ const [page, setPage] = React.useState(1);
47
+ const [perPage, setPerPage] = React.useState(10);
48
+ const [paginatedRows, setPaginatedRows] = React.useState<any[]>(rows);
49
+
50
+ const matchCheckboxNameToColumn = (name: string): string => {
51
+ switch (name) {
52
+ case 'check1':
53
+ return 'Servers';
54
+ case 'check2':
55
+ return 'Threads';
56
+ case 'check3':
57
+ return 'Applications';
58
+ case 'check4':
59
+ return 'Workspaces';
60
+ case 'check5':
61
+ return 'Status';
62
+ case 'check6':
63
+ return 'Location';
64
+ case 'check7':
65
+ return 'Last Modified';
66
+ case 'check8':
67
+ return 'URL';
68
+ default:
69
+ return '';
70
+ }
71
+ };
72
+
73
+ const matchSelectedColumnNameToAttr = (name: string): string => {
74
+ switch (name) {
75
+ case 'Servers':
76
+ return 'name';
77
+ case 'Threads':
78
+ return 'threads';
79
+ case 'Applications':
80
+ return 'applications';
81
+ case 'Workspaces':
82
+ return 'workspaces';
83
+ case 'Status':
84
+ return 'status';
85
+ case 'Location':
86
+ return 'location';
87
+ case 'Last Modified':
88
+ return 'lastModified';
89
+ case 'URL':
90
+ return 'url';
91
+ default:
92
+ return '';
93
+ }
94
+ };
95
+
96
+ // Pagination logic
97
+ const handleSetPage = (
98
+ _evt: MouseEvent | React.MouseEvent<Element, MouseEvent> | React.KeyboardEvent<Element>,
99
+ newPage: number
100
+ ) => {
101
+ setPage(newPage);
102
+ };
103
+
104
+ const handlePerPageSelect = (
105
+ _evt: MouseEvent | React.MouseEvent<Element, MouseEvent> | React.KeyboardEvent<Element>,
106
+ newPerPage: number
107
+ ) => {
108
+ setPerPage(newPerPage);
109
+ };
110
+
111
+ const renderPagination = (variant: 'top' | 'bottom' | PaginationVariant, isCompact: boolean) => (
112
+ <Pagination
113
+ isCompact={isCompact}
114
+ itemCount={rows.length}
115
+ page={page}
116
+ perPage={perPage}
117
+ onSetPage={handleSetPage}
118
+ onPerPageSelect={handlePerPageSelect}
119
+ variant={variant}
120
+ titles={{
121
+ paginationAriaLabel: `${variant} pagination`
122
+ }}
123
+ />
124
+ );
125
+
126
+ React.useEffect(() => {
127
+ setPaginatedRows(managedRows.slice((page - 1) * perPage, page * perPage - 1));
128
+ }, [managedRows, page, perPage]);
129
+
130
+ // Removes attribute from each node object in Data.jsx
131
+ const removePropFromObject = (object: any, keys: string[]): any =>
132
+ keys.reduce((obj, prop) => {
133
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
134
+ const { [prop]: _, ...keep } = obj;
135
+ return keep;
136
+ }, object);
137
+
138
+ // Filters columns out of table that are not selected in the column management modal
139
+ const filterData = (checked: boolean, name: string) => {
140
+ const selectedColumn = matchSelectedColumnNameToAttr(name);
141
+
142
+ const filteredRows: SampleDataRow[] = [];
143
+ if (checked) {
144
+ const updatedFilters = filters.filter((item) => item !== selectedColumn);
145
+
146
+ // Only show the names of columns that were selected in the modal
147
+ const filteredColumns = defaultColumns.filter(
148
+ (column) => !updatedFilters.includes(matchSelectedColumnNameToAttr(column))
149
+ );
150
+
151
+ // Remove the attributes (i.e. "columns") that were not selected
152
+ defaultRows.forEach((item) => filteredRows.push(removePropFromObject(item, updatedFilters)));
153
+
154
+ setFilters(updatedFilters);
155
+ setFilteredColumns(filteredColumns);
156
+ setFilteredRows(filteredRows);
157
+ } else {
158
+ const updatedFilters = filters;
159
+ updatedFilters.push(selectedColumn);
160
+
161
+ // Only show the names of columns that were selected in the modal
162
+ const filteredColumns = managedColumns.filter(
163
+ (column) => !filters.includes(matchSelectedColumnNameToAttr(column))
164
+ );
165
+
166
+ // Remove the attributes (i.e. "columns") that were not selected
167
+ managedRows.forEach((item) => filteredRows.push(removePropFromObject(item, updatedFilters)));
168
+
169
+ setFilters(updatedFilters);
170
+ setFilteredColumns(filteredColumns);
171
+ setFilteredRows(filteredRows);
172
+ }
173
+ };
174
+
175
+ const unfilterAllData = () => {
176
+ setFilters([]);
177
+ setFilteredColumns(defaultColumns);
178
+ setFilteredRows(defaultRows);
179
+ };
180
+
181
+ const handleChange = (event: React.FormEvent<HTMLInputElement>, checked: boolean) => {
182
+ const target = event.currentTarget;
183
+ const value = target.type === 'checkbox' ? target.checked : target.value;
184
+
185
+ // Remove any columns from the table that aren't checked
186
+ filterData(checked, matchCheckboxNameToColumn(target.name));
187
+ const checkedIndex: number = columns.findIndex((element) => element === matchCheckboxNameToColumn(target.name));
188
+
189
+ const updatedCheckedState: boolean[] = [...checkedState];
190
+ updatedCheckedState[checkedIndex] = value as boolean;
191
+ setCheckedState(updatedCheckedState);
192
+ };
193
+
194
+ const handleModalToggle = (_event: React.MouseEvent<Element, MouseEvent> | KeyboardEvent) => {
195
+ setIsModalOpen(!isModalOpen);
196
+ };
197
+
198
+ const onSave = () => {
199
+ setManagedColumns(filteredColumns);
200
+ setManagedRows(filteredRows);
201
+ setPaginatedRows(filteredRows);
202
+ setIsModalOpen(!isModalOpen);
203
+ };
204
+
205
+ const selectAllColumns = () => {
206
+ unfilterAllData();
207
+ setCheckedState(Array(columns.length).fill(true));
208
+ };
209
+
210
+ const renderModal = () => (
211
+ <Modal
212
+ title="Manage columns"
213
+ isOpen={isModalOpen}
214
+ variant="small"
215
+ description={
216
+ <TextContent>
217
+ <Text component={TextVariants.p}>Selected categories will be displayed in the table.</Text>
218
+ <Button isInline onClick={selectAllColumns} variant="link">
219
+ Select all
220
+ </Button>
221
+ </TextContent>
222
+ }
223
+ onClose={handleModalToggle}
224
+ actions={[
225
+ <Button key="save" variant="primary" onClick={onSave}>
226
+ Save
227
+ </Button>,
228
+ <Button key="cancel" variant="secondary" onClick={handleModalToggle}>
229
+ Cancel
230
+ </Button>
231
+ ]}
232
+ >
233
+ <DataList aria-label="Table column management" id="table-column-management" isCompact>
234
+ <DataListItem aria-labelledby="table-column-management-item1">
235
+ <DataListItemRow>
236
+ <DataListCheck
237
+ aria-labelledby="table-column-management-item1"
238
+ checked={checkedState[0]}
239
+ name="check1"
240
+ id="check1"
241
+ onChange={handleChange}
242
+ />
243
+ <DataListItemCells
244
+ dataListCells={[
245
+ <DataListCell id="table-column-management-item1" key="table-column-management-item1">
246
+ <label htmlFor="check1">{columns[0]}</label>
247
+ </DataListCell>
248
+ ]}
249
+ />
250
+ </DataListItemRow>
251
+ </DataListItem>
252
+ <DataListItem aria-labelledby="table-column-management-item2">
253
+ <DataListItemRow>
254
+ <DataListCheck
255
+ aria-labelledby="table-column-management-item2"
256
+ checked={checkedState[1]}
257
+ name="check2"
258
+ id="check2"
259
+ onChange={handleChange}
260
+ />
261
+ <DataListItemCells
262
+ dataListCells={[
263
+ <DataListCell id="table-column-management-item2" key="table-column-management-item2">
264
+ <label htmlFor="check2">{columns[1]}</label>
265
+ </DataListCell>
266
+ ]}
267
+ />
268
+ </DataListItemRow>
269
+ </DataListItem>
270
+ <DataListItem aria-labelledby="table-column-management-item3">
271
+ <DataListItemRow>
272
+ <DataListCheck
273
+ aria-labelledby="table-column-management-item3"
274
+ checked={checkedState[2]}
275
+ name="check3"
276
+ id="check3"
277
+ onChange={handleChange}
278
+ />
279
+ <DataListItemCells
280
+ dataListCells={[
281
+ <DataListCell id="table-column-management-item3" key="table-column-management-item3">
282
+ <label htmlFor="check3">{columns[2]}</label>
283
+ </DataListCell>
284
+ ]}
285
+ />
286
+ </DataListItemRow>
287
+ </DataListItem>
288
+ <DataListItem aria-labelledby="table-column-management-item4">
289
+ <DataListItemRow>
290
+ <DataListCheck
291
+ aria-labelledby="table-column-management-item4"
292
+ checked={checkedState[3]}
293
+ name="check4"
294
+ id="check4"
295
+ onChange={handleChange}
296
+ />
297
+ <DataListItemCells
298
+ dataListCells={[
299
+ <DataListCell id="table-column-management-item4" key="table-column-management-item4">
300
+ <label htmlFor="check4">{columns[3]}</label>
301
+ </DataListCell>
302
+ ]}
303
+ />
304
+ </DataListItemRow>
305
+ </DataListItem>
306
+ <DataListItem aria-labelledby="table-column-management-item4">
307
+ <DataListItemRow>
308
+ <DataListCheck
309
+ aria-labelledby="table-column-management-item4"
310
+ checked={checkedState[4]}
311
+ name="check5"
312
+ id="check5"
313
+ onChange={handleChange}
314
+ />
315
+ <DataListItemCells
316
+ dataListCells={[
317
+ <DataListCell id="table-column-management-item4" key="table-column-management-item4">
318
+ <label htmlFor="check5">{columns[4]}</label>
319
+ </DataListCell>
320
+ ]}
321
+ />
322
+ </DataListItemRow>
323
+ </DataListItem>
324
+ <DataListItem aria-labelledby="table-column-management-item5">
325
+ <DataListItemRow>
326
+ <DataListCheck
327
+ aria-labelledby="table-column-management-item5"
328
+ checked={checkedState[5]}
329
+ name="check6"
330
+ id="check6"
331
+ onChange={handleChange}
332
+ />
333
+ <DataListItemCells
334
+ dataListCells={[
335
+ <DataListCell id="table-column-management-item5" key="table-column-management-item5">
336
+ <label htmlFor="check6">{columns[5]}</label>
337
+ </DataListCell>
338
+ ]}
339
+ />
340
+ </DataListItemRow>
341
+ </DataListItem>
342
+ <DataListItem aria-labelledby="table-column-management-item6">
343
+ <DataListItemRow>
344
+ <DataListCheck
345
+ aria-labelledby="table-column-management-item6"
346
+ checked={checkedState[6]}
347
+ name="check7"
348
+ id="check7"
349
+ onChange={handleChange}
350
+ />
351
+ <DataListItemCells
352
+ dataListCells={[
353
+ <DataListCell id="table-column-management-item6" key="table-column-management-item5">
354
+ <label htmlFor="check7">{columns[6]}</label>
355
+ </DataListCell>
356
+ ]}
357
+ />
358
+ </DataListItemRow>
359
+ </DataListItem>
360
+ <DataListItem aria-labelledby="table-column-management-item5">
361
+ <DataListItemRow>
362
+ <DataListCheck
363
+ aria-labelledby="table-column-management-item5"
364
+ checked={checkedState[7]}
365
+ name="check8"
366
+ id="check8"
367
+ onChange={handleChange}
368
+ />
369
+ <DataListItemCells
370
+ dataListCells={[
371
+ <DataListCell id="table-column-management-item7" key="table-column-management-item7">
372
+ <label htmlFor="check8">{columns[7]}</label>
373
+ </DataListCell>
374
+ ]}
375
+ />
376
+ </DataListItemRow>
377
+ </DataListItem>
378
+ </DataList>
379
+ </Modal>
380
+ );
381
+
382
+ const renderLabel = (labelText: string): JSX.Element => {
383
+ switch (labelText) {
384
+ case 'Running':
385
+ return <Label color="green">{labelText}</Label>;
386
+ case 'Stopped':
387
+ return <Label color="orange">{labelText}</Label>;
388
+ case 'Needs maintenance':
389
+ return <Label color="blue">{labelText}</Label>;
390
+ case 'Down':
391
+ return <Label color="red">{labelText}</Label>;
392
+ default:
393
+ return <></>;
394
+ }
395
+ };
396
+
397
+ const toolbarItems = (
398
+ <React.Fragment>
399
+ <Toolbar id="page-layout-table-column-management-action-toolbar-top">
400
+ <span id="page-layout-table-column-management-action-toolbar-top-select-checkbox-label" hidden>
401
+ Choose one
402
+ </span>
403
+ <ToolbarContent>
404
+ <ToolbarItem variant="overflow-menu">
405
+ <OverflowMenu breakpoint="md">
406
+ <OverflowMenuItem>
407
+ <MenuToggle>
408
+ <FilterIcon /> Name
409
+ </MenuToggle>
410
+ </OverflowMenuItem>
411
+ <OverflowMenuItem>
412
+ <MenuToggle variant="plain" aria-label="Sort columns">
413
+ <SortAmountDownIcon aria-hidden="true" />
414
+ </MenuToggle>
415
+ </OverflowMenuItem>
416
+ <OverflowMenuGroup groupType="button" isPersistent>
417
+ <OverflowMenuItem>
418
+ <Button variant="primary">Action</Button>
419
+ </OverflowMenuItem>
420
+ <OverflowMenuItem isPersistent>
421
+ <Button variant="link" onClick={handleModalToggle}>
422
+ Manage columns
423
+ </Button>
424
+ </OverflowMenuItem>
425
+ </OverflowMenuGroup>
426
+ </OverflowMenu>
427
+ </ToolbarItem>
428
+ <ToolbarItem variant="pagination">{renderPagination('top', false)}</ToolbarItem>
429
+ </ToolbarContent>
430
+ </Toolbar>
431
+ </React.Fragment>
432
+ );
433
+
434
+ return (
435
+ <React.Fragment>
436
+ <DashboardWrapper hasPageTemplateTitle>
437
+ <PageSection isFilled>
438
+ <Card>
439
+ {toolbarItems}
440
+ <Table variant="compact" aria-label="Column Management Table">
441
+ <Thead>
442
+ <Tr>
443
+ {managedColumns.map((column, columnIndex) => (
444
+ <Th key={columnIndex}>{column}</Th>
445
+ ))}
446
+ </Tr>
447
+ </Thead>
448
+ <Tbody>
449
+ {paginatedRows.map((row, rowIndex) => (
450
+ <Tr key={rowIndex}>
451
+ <>
452
+ {Object.entries(row).map(([key, value]) =>
453
+ // eslint-disable-next-line no-nested-ternary
454
+ key === 'status' ? (
455
+ // eslint-disable-next-line react/jsx-key
456
+ <Td width={15} dataLabel="Status">
457
+ {renderLabel(value as string)}
458
+ </Td>
459
+ ) : key === 'url' ? (
460
+ <Td width={10} dataLabel="URL" modifier="truncate">
461
+ <TableText>
462
+ <a href="#">{row.url}</a>
463
+ </TableText>
464
+ </Td>
465
+ ) : (
466
+ <Td
467
+ width={key === 'name' ? 15 : 10}
468
+ dataLabel={key === 'lastModified' ? 'Last modified' : capitalize(key)}
469
+ >
470
+ {value as string}
471
+ </Td>
472
+ )
473
+ )}
474
+ </>
475
+ </Tr>
476
+ ))}
477
+ </Tbody>
478
+ </Table>
479
+ {renderPagination('bottom', false)}
480
+ {renderModal()}
481
+ </Card>
482
+ </PageSection>
483
+ </DashboardWrapper>
484
+ </React.Fragment>
485
+ );
486
+ };