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

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 (268) hide show
  1. package/CHANGELOG.md +290 -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 +3 -3
  22. package/dist/esm/components/Table/EditableSelectInputCell.js.map +1 -1
  23. package/dist/esm/components/Table/EditableTextCell.js +3 -3
  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/SelectColumn.d.ts +5 -0
  35. package/dist/esm/components/Table/SelectColumn.d.ts.map +1 -1
  36. package/dist/esm/components/Table/SelectColumn.js +6 -3
  37. package/dist/esm/components/Table/SelectColumn.js.map +1 -1
  38. package/dist/esm/components/Table/SortColumn.d.ts +4 -0
  39. package/dist/esm/components/Table/SortColumn.d.ts.map +1 -1
  40. package/dist/esm/components/Table/SortColumn.js +3 -3
  41. package/dist/esm/components/Table/SortColumn.js.map +1 -1
  42. package/dist/esm/components/Table/Table.d.ts +1 -1
  43. package/dist/esm/components/Table/Table.d.ts.map +1 -1
  44. package/dist/esm/components/Table/Table.js +5 -5
  45. package/dist/esm/components/Table/Table.js.map +1 -1
  46. package/dist/esm/components/Table/TableText.d.ts +3 -1
  47. package/dist/esm/components/Table/TableText.d.ts.map +1 -1
  48. package/dist/esm/components/Table/TableText.js +13 -11
  49. package/dist/esm/components/Table/TableText.js.map +1 -1
  50. package/dist/esm/components/Table/TableTypes.d.ts +3 -0
  51. package/dist/esm/components/Table/TableTypes.d.ts.map +1 -1
  52. package/dist/esm/components/Table/Tbody.d.ts +1 -1
  53. package/dist/esm/components/Table/Tbody.d.ts.map +1 -1
  54. package/dist/esm/components/Table/Tbody.js +1 -1
  55. package/dist/esm/components/Table/Tbody.js.map +1 -1
  56. package/dist/esm/components/Table/Td.d.ts +1 -1
  57. package/dist/esm/components/Table/Td.d.ts.map +1 -1
  58. package/dist/esm/components/Table/Td.js +9 -5
  59. package/dist/esm/components/Table/Td.js.map +1 -1
  60. package/dist/esm/components/Table/Th.d.ts +4 -1
  61. package/dist/esm/components/Table/Th.d.ts.map +1 -1
  62. package/dist/esm/components/Table/Th.js +20 -10
  63. package/dist/esm/components/Table/Th.js.map +1 -1
  64. package/dist/esm/components/Table/Thead.d.ts +1 -1
  65. package/dist/esm/components/Table/Thead.d.ts.map +1 -1
  66. package/dist/esm/components/Table/Thead.js +1 -1
  67. package/dist/esm/components/Table/Thead.js.map +1 -1
  68. package/dist/esm/components/Table/Tr.d.ts +2 -2
  69. package/dist/esm/components/Table/Tr.d.ts.map +1 -1
  70. package/dist/esm/components/Table/Tr.js +2 -2
  71. package/dist/esm/components/Table/Tr.js.map +1 -1
  72. package/dist/esm/components/Table/TreeRowWrapper.js +2 -2
  73. package/dist/esm/components/Table/TreeRowWrapper.js.map +1 -1
  74. package/dist/esm/components/Table/base/provider.d.ts +8 -8
  75. package/dist/esm/components/Table/base/types.d.ts +7 -7
  76. package/dist/esm/components/Table/utils/decorators/cellActions.js +1 -1
  77. package/dist/esm/components/Table/utils/decorators/cellActions.js.map +1 -1
  78. package/dist/esm/components/Table/utils/decorators/cellWidth.js +1 -1
  79. package/dist/esm/components/Table/utils/decorators/cellWidth.js.map +1 -1
  80. package/dist/esm/components/Table/utils/decorators/classNames.js +1 -1
  81. package/dist/esm/components/Table/utils/decorators/classNames.js.map +1 -1
  82. package/dist/esm/components/Table/utils/decorators/collapsible.js +1 -1
  83. package/dist/esm/components/Table/utils/decorators/collapsible.js.map +1 -1
  84. package/dist/esm/components/Table/utils/decorators/compoundExpand.js +1 -1
  85. package/dist/esm/components/Table/utils/decorators/compoundExpand.js.map +1 -1
  86. package/dist/esm/components/Table/utils/decorators/editable.js +1 -1
  87. package/dist/esm/components/Table/utils/decorators/editable.js.map +1 -1
  88. package/dist/esm/components/Table/utils/decorators/favoritable.js +1 -1
  89. package/dist/esm/components/Table/utils/decorators/favoritable.js.map +1 -1
  90. package/dist/esm/components/Table/utils/decorators/info.js +1 -1
  91. package/dist/esm/components/Table/utils/decorators/info.js.map +1 -1
  92. package/dist/esm/components/Table/utils/decorators/selectable.d.ts.map +1 -1
  93. package/dist/esm/components/Table/utils/decorators/selectable.js +4 -4
  94. package/dist/esm/components/Table/utils/decorators/selectable.js.map +1 -1
  95. package/dist/esm/components/Table/utils/decorators/sortable.d.ts.map +1 -1
  96. package/dist/esm/components/Table/utils/decorators/sortable.js +7 -4
  97. package/dist/esm/components/Table/utils/decorators/sortable.js.map +1 -1
  98. package/dist/esm/components/Table/utils/decorators/treeRow.d.ts +3 -3
  99. package/dist/esm/components/Table/utils/decorators/treeRow.d.ts.map +1 -1
  100. package/dist/esm/components/Table/utils/decorators/treeRow.js +5 -5
  101. package/dist/esm/components/Table/utils/decorators/treeRow.js.map +1 -1
  102. package/dist/esm/components/Table/utils/decorators/wrappable.js +1 -1
  103. package/dist/esm/components/Table/utils/decorators/wrappable.js.map +1 -1
  104. package/dist/esm/demos/index.d.ts +2 -0
  105. package/dist/esm/demos/index.d.ts.map +1 -0
  106. package/dist/esm/demos/index.js +2 -0
  107. package/dist/esm/demos/index.js.map +1 -0
  108. package/dist/esm/demos/sampleData.d.ts +13 -0
  109. package/dist/esm/demos/sampleData.d.ts.map +1 -0
  110. package/dist/esm/demos/sampleData.js +764 -0
  111. package/dist/esm/demos/sampleData.js.map +1 -0
  112. package/dist/esm/deprecated/components/Table/Body.d.ts +1 -1
  113. package/dist/esm/deprecated/components/Table/Body.d.ts.map +1 -1
  114. package/dist/esm/deprecated/components/Table/Table.d.ts +1 -1
  115. package/dist/esm/deprecated/components/Table/Table.js +1 -1
  116. package/dist/esm/deprecated/components/Table/Table.js.map +1 -1
  117. package/dist/esm/deprecated/components/Table/base/body.d.ts +8 -2
  118. package/dist/esm/deprecated/components/Table/base/body.d.ts.map +1 -1
  119. package/dist/esm/deprecated/components/Table/base/header.d.ts +1 -1
  120. package/dist/esm/deprecated/components/Table/base/header.d.ts.map +1 -1
  121. package/dist/esm/index.d.ts +1 -0
  122. package/dist/esm/index.d.ts.map +1 -1
  123. package/dist/esm/index.js +1 -0
  124. package/dist/esm/index.js.map +1 -1
  125. package/dist/js/components/Table/ActionsColumn.d.ts +1 -1
  126. package/dist/js/components/Table/ActionsColumn.d.ts.map +1 -1
  127. package/dist/js/components/Table/ActionsColumn.js +6 -6
  128. package/dist/js/components/Table/ActionsColumn.js.map +1 -1
  129. package/dist/js/components/Table/CollapseColumn.js +2 -2
  130. package/dist/js/components/Table/CollapseColumn.js.map +1 -1
  131. package/dist/js/components/Table/DraggableCell.js +2 -2
  132. package/dist/js/components/Table/DraggableCell.js.map +1 -1
  133. package/dist/js/components/Table/EditColumn.js +4 -4
  134. package/dist/js/components/Table/EditColumn.js.map +1 -1
  135. package/dist/js/components/Table/EditableSelectInputCell.js +2 -2
  136. package/dist/js/components/Table/EditableSelectInputCell.js.map +1 -1
  137. package/dist/js/components/Table/EditableTextCell.js +2 -2
  138. package/dist/js/components/Table/EditableTextCell.js.map +1 -1
  139. package/dist/js/components/Table/FavoritesCell.js +2 -2
  140. package/dist/js/components/Table/FavoritesCell.js.map +1 -1
  141. package/dist/js/components/Table/HeaderCellInfoWrapper.js +4 -4
  142. package/dist/js/components/Table/HeaderCellInfoWrapper.js.map +1 -1
  143. package/dist/js/components/Table/RowWrapper.d.ts +1 -1
  144. package/dist/js/components/Table/RowWrapper.js +2 -1
  145. package/dist/js/components/Table/RowWrapper.js.map +1 -1
  146. package/dist/js/components/Table/SelectColumn.d.ts +5 -0
  147. package/dist/js/components/Table/SelectColumn.d.ts.map +1 -1
  148. package/dist/js/components/Table/SelectColumn.js +6 -3
  149. package/dist/js/components/Table/SelectColumn.js.map +1 -1
  150. package/dist/js/components/Table/SortColumn.d.ts +4 -0
  151. package/dist/js/components/Table/SortColumn.d.ts.map +1 -1
  152. package/dist/js/components/Table/SortColumn.js +6 -5
  153. package/dist/js/components/Table/SortColumn.js.map +1 -1
  154. package/dist/js/components/Table/Table.d.ts +1 -1
  155. package/dist/js/components/Table/Table.d.ts.map +1 -1
  156. package/dist/js/components/Table/Table.js +2 -2
  157. package/dist/js/components/Table/Table.js.map +1 -1
  158. package/dist/js/components/Table/TableText.d.ts +3 -1
  159. package/dist/js/components/Table/TableText.d.ts.map +1 -1
  160. package/dist/js/components/Table/TableText.js +13 -11
  161. package/dist/js/components/Table/TableText.js.map +1 -1
  162. package/dist/js/components/Table/TableTypes.d.ts +3 -0
  163. package/dist/js/components/Table/TableTypes.d.ts.map +1 -1
  164. package/dist/js/components/Table/TableTypes.js +4 -0
  165. package/dist/js/components/Table/TableTypes.js.map +1 -1
  166. package/dist/js/components/Table/Tbody.d.ts +1 -1
  167. package/dist/js/components/Table/Tbody.d.ts.map +1 -1
  168. package/dist/js/components/Table/Td.d.ts +1 -1
  169. package/dist/js/components/Table/Td.d.ts.map +1 -1
  170. package/dist/js/components/Table/Td.js +8 -4
  171. package/dist/js/components/Table/Td.js.map +1 -1
  172. package/dist/js/components/Table/Th.d.ts +4 -1
  173. package/dist/js/components/Table/Th.d.ts.map +1 -1
  174. package/dist/js/components/Table/Th.js +18 -8
  175. package/dist/js/components/Table/Th.js.map +1 -1
  176. package/dist/js/components/Table/Thead.d.ts +1 -1
  177. package/dist/js/components/Table/Thead.d.ts.map +1 -1
  178. package/dist/js/components/Table/Tr.d.ts +2 -2
  179. package/dist/js/components/Table/Tr.d.ts.map +1 -1
  180. package/dist/js/components/Table/Tr.js +1 -1
  181. package/dist/js/components/Table/Tr.js.map +1 -1
  182. package/dist/js/components/Table/base/provider.d.ts +8 -8
  183. package/dist/js/components/Table/base/types.d.ts +7 -7
  184. package/dist/js/components/Table/base/types.js +4 -0
  185. package/dist/js/components/Table/base/types.js.map +1 -1
  186. package/dist/js/components/Table/utils/decorators/selectable.d.ts.map +1 -1
  187. package/dist/js/components/Table/utils/decorators/selectable.js +2 -2
  188. package/dist/js/components/Table/utils/decorators/selectable.js.map +1 -1
  189. package/dist/js/components/Table/utils/decorators/sortable.d.ts.map +1 -1
  190. package/dist/js/components/Table/utils/decorators/sortable.js +7 -4
  191. package/dist/js/components/Table/utils/decorators/sortable.js.map +1 -1
  192. package/dist/js/components/Table/utils/decorators/treeRow.d.ts +3 -3
  193. package/dist/js/components/Table/utils/decorators/treeRow.d.ts.map +1 -1
  194. package/dist/js/components/Table/utils/decorators/treeRow.js +7 -7
  195. package/dist/js/components/Table/utils/decorators/treeRow.js.map +1 -1
  196. package/dist/js/demos/index.d.ts +2 -0
  197. package/dist/js/demos/index.d.ts.map +1 -0
  198. package/dist/js/demos/index.js +5 -0
  199. package/dist/js/demos/index.js.map +1 -0
  200. package/dist/js/demos/sampleData.d.ts +13 -0
  201. package/dist/js/demos/sampleData.d.ts.map +1 -0
  202. package/dist/js/demos/sampleData.js +767 -0
  203. package/dist/js/demos/sampleData.js.map +1 -0
  204. package/dist/js/deprecated/components/Table/Body.d.ts +1 -1
  205. package/dist/js/deprecated/components/Table/Body.d.ts.map +1 -1
  206. package/dist/js/deprecated/components/Table/BodyCell.js +4 -3
  207. package/dist/js/deprecated/components/Table/BodyCell.js.map +1 -1
  208. package/dist/js/deprecated/components/Table/Table.d.ts +1 -1
  209. package/dist/js/deprecated/components/Table/Table.js +1 -1
  210. package/dist/js/deprecated/components/Table/Table.js.map +1 -1
  211. package/dist/js/deprecated/components/Table/base/body.d.ts +8 -2
  212. package/dist/js/deprecated/components/Table/base/body.d.ts.map +1 -1
  213. package/dist/js/deprecated/components/Table/base/header.d.ts +1 -1
  214. package/dist/js/deprecated/components/Table/base/header.d.ts.map +1 -1
  215. package/dist/js/index.d.ts +1 -0
  216. package/dist/js/index.d.ts.map +1 -1
  217. package/dist/js/index.js +1 -0
  218. package/dist/js/index.js.map +1 -1
  219. package/dist/umd/react-table.min.js +9 -9
  220. package/package.json +6 -6
  221. package/src/components/Table/EditableSelectInputCell.tsx +1 -1
  222. package/src/components/Table/EditableTextCell.tsx +1 -1
  223. package/src/components/Table/SelectColumn.tsx +27 -8
  224. package/src/components/Table/SortColumn.tsx +15 -1
  225. package/src/components/Table/Table.tsx +2 -2
  226. package/src/components/Table/TableText.tsx +19 -9
  227. package/src/components/Table/TableTypes.tsx +3 -0
  228. package/src/components/Table/Td.tsx +10 -5
  229. package/src/components/Table/Th.tsx +22 -8
  230. package/src/components/Table/Tr.tsx +1 -1
  231. package/src/components/Table/examples/Table.md +3 -0
  232. package/src/components/Table/examples/TableCompoundExpandable.tsx +2 -1
  233. package/src/components/Table/examples/TableMisc.tsx +3 -1
  234. package/src/components/Table/examples/TableNestedHeaders.tsx +4 -3
  235. package/src/components/Table/examples/TableNestedStickyHeader.tsx +4 -3
  236. package/src/components/Table/examples/TableStickyColumnsAndHeader.tsx +5 -4
  237. package/src/components/Table/utils/decorators/selectable.tsx +2 -1
  238. package/src/components/Table/utils/decorators/sortable.tsx +8 -2
  239. package/src/components/Table/utils/decorators/treeRow.tsx +3 -3
  240. package/src/components/Table/utils/transformers.test.tsx +14 -8
  241. package/src/demos/Table.md +159 -0
  242. package/src/demos/examples/TableAutomaticPagination.tsx +101 -0
  243. package/src/{docs/demos/table-demos/BulkSelect.jsx → demos/examples/TableBulkSelect.tsx} +41 -20
  244. package/src/demos/examples/TableColumnManagement.tsx +486 -0
  245. package/src/demos/examples/TableColumnManagementWithDraggable.tsx +641 -0
  246. package/src/{docs/demos/table-demos/Compact.jsx → demos/examples/TableCompact.tsx} +32 -16
  247. package/src/{docs/demos/table-demos/CompoundExpansion.jsx → demos/examples/TableCompoundExpansion.tsx} +27 -13
  248. package/src/demos/examples/TableEmptyStateDefault.tsx +60 -0
  249. package/src/demos/examples/TableEmptyStateError.tsx +53 -0
  250. package/src/demos/examples/TableEmptyStateLoading.tsx +43 -0
  251. package/src/{docs/demos/table-demos/ExpandCollapseAll.jsx → demos/examples/TableExpandCollapseAll.tsx} +17 -10
  252. package/src/demos/examples/TableFilterable.tsx +394 -0
  253. package/src/{docs/demos/table-demos/SortableResponsive.jsx → demos/examples/TableSortableResponsive.tsx} +30 -28
  254. package/src/{docs/demos/table-demos/StaticBottomPagination.jsx → demos/examples/TableStaticBottomPagination.tsx} +22 -9
  255. package/src/{docs/demos/table-demos/StickyFirstColumn.jsx → demos/examples/TableStickyFirstColumn.tsx} +31 -9
  256. package/src/{docs/demos/table-demos/StickyHeader.jsx → demos/examples/TableStickyHeader.tsx} +3 -3
  257. package/src/demos/index.ts +1 -0
  258. package/src/{docs/demos/table-demos/sampleData.js → demos/sampleData.tsx} +88 -77
  259. package/src/deprecated/components/Table/__tests__/Table.test.tsx +4 -9
  260. package/src/deprecated/components/Table/__tests__/__snapshots__/Table.test.tsx.snap +8 -8
  261. package/src/deprecated/components/Table/examples/LegacyTableCompoundExpandable.tsx +4 -3
  262. package/src/deprecated/components/Table/examples/LegacyTableMisc.tsx +4 -3
  263. package/src/deprecated/components/Table/examples/LegacyTableSelectable.tsx +2 -1
  264. package/src/deprecated/components/Table/examples/LegacyTableStripedCustomTr.tsx +2 -6
  265. package/src/deprecated/components/Table/examples/Table.md +2 -0
  266. package/src/index.ts +1 -0
  267. package/src/docs/demos/Table.md +0 -1622
  268. package/src/docs/demos/table-demos/ColumnManagement.jsx +0 -471
@@ -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
+ };