@patternfly/react-table 6.0.0-alpha.2 → 6.0.0-alpha.4

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 (123) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/components/package.json +1 -1
  3. package/deprecated/package.json +1 -1
  4. package/dist/dynamic/components/Table/package.json +1 -1
  5. package/dist/dynamic/components/Table/utils/decorators/package.json +1 -1
  6. package/dist/dynamic/components/Table/utils/package.json +1 -1
  7. package/dist/dynamic/deprecated/components/Table/base/package.json +1 -1
  8. package/dist/dynamic/deprecated/components/Table/package.json +1 -1
  9. package/dist/dynamic/deprecated/components/package.json +1 -1
  10. package/dist/esm/components/Table/Caption.js +1 -1
  11. package/dist/esm/components/Table/Caption.js.map +1 -1
  12. package/dist/esm/components/Table/CollapseColumn.js +1 -1
  13. package/dist/esm/components/Table/CollapseColumn.js.map +1 -1
  14. package/dist/esm/components/Table/DraggableRowWrapper.js +2 -2
  15. package/dist/esm/components/Table/DraggableRowWrapper.js.map +1 -1
  16. package/dist/esm/components/Table/EditColumn.js +1 -1
  17. package/dist/esm/components/Table/EditColumn.js.map +1 -1
  18. package/dist/esm/components/Table/EditableSelectInputCell.js +2 -2
  19. package/dist/esm/components/Table/EditableSelectInputCell.js.map +1 -1
  20. package/dist/esm/components/Table/EditableTextCell.js +2 -2
  21. package/dist/esm/components/Table/EditableTextCell.js.map +1 -1
  22. package/dist/esm/components/Table/ExpandableRowContent.js +1 -1
  23. package/dist/esm/components/Table/ExpandableRowContent.js.map +1 -1
  24. package/dist/esm/components/Table/HeaderCellInfoWrapper.js +1 -1
  25. package/dist/esm/components/Table/HeaderCellInfoWrapper.js.map +1 -1
  26. package/dist/esm/components/Table/InnerScrollContainer.js +1 -1
  27. package/dist/esm/components/Table/InnerScrollContainer.js.map +1 -1
  28. package/dist/esm/components/Table/OuterScrollContainer.js +1 -1
  29. package/dist/esm/components/Table/OuterScrollContainer.js.map +1 -1
  30. package/dist/esm/components/Table/SortColumn.js +1 -1
  31. package/dist/esm/components/Table/SortColumn.js.map +1 -1
  32. package/dist/esm/components/Table/Table.js +3 -3
  33. package/dist/esm/components/Table/Table.js.map +1 -1
  34. package/dist/esm/components/Table/TableText.js +1 -1
  35. package/dist/esm/components/Table/TableText.js.map +1 -1
  36. package/dist/esm/components/Table/Tbody.js +1 -1
  37. package/dist/esm/components/Table/Tbody.js.map +1 -1
  38. package/dist/esm/components/Table/Td.js +3 -3
  39. package/dist/esm/components/Table/Td.js.map +1 -1
  40. package/dist/esm/components/Table/Th.js +2 -2
  41. package/dist/esm/components/Table/Th.js.map +1 -1
  42. package/dist/esm/components/Table/Thead.js +1 -1
  43. package/dist/esm/components/Table/Thead.js.map +1 -1
  44. package/dist/esm/components/Table/Tr.js +2 -2
  45. package/dist/esm/components/Table/Tr.js.map +1 -1
  46. package/dist/esm/components/Table/TreeRowWrapper.js +2 -2
  47. package/dist/esm/components/Table/TreeRowWrapper.js.map +1 -1
  48. package/dist/esm/components/Table/utils/decorators/cellActions.js +1 -1
  49. package/dist/esm/components/Table/utils/decorators/cellActions.js.map +1 -1
  50. package/dist/esm/components/Table/utils/decorators/cellWidth.js +1 -1
  51. package/dist/esm/components/Table/utils/decorators/cellWidth.js.map +1 -1
  52. package/dist/esm/components/Table/utils/decorators/classNames.js +1 -1
  53. package/dist/esm/components/Table/utils/decorators/classNames.js.map +1 -1
  54. package/dist/esm/components/Table/utils/decorators/collapsible.js +1 -1
  55. package/dist/esm/components/Table/utils/decorators/collapsible.js.map +1 -1
  56. package/dist/esm/components/Table/utils/decorators/compoundExpand.js +1 -1
  57. package/dist/esm/components/Table/utils/decorators/compoundExpand.js.map +1 -1
  58. package/dist/esm/components/Table/utils/decorators/editable.js +1 -1
  59. package/dist/esm/components/Table/utils/decorators/editable.js.map +1 -1
  60. package/dist/esm/components/Table/utils/decorators/favoritable.js +1 -1
  61. package/dist/esm/components/Table/utils/decorators/favoritable.js.map +1 -1
  62. package/dist/esm/components/Table/utils/decorators/info.js +1 -1
  63. package/dist/esm/components/Table/utils/decorators/info.js.map +1 -1
  64. package/dist/esm/components/Table/utils/decorators/selectable.js +2 -2
  65. package/dist/esm/components/Table/utils/decorators/selectable.js.map +1 -1
  66. package/dist/esm/components/Table/utils/decorators/sortable.js +1 -1
  67. package/dist/esm/components/Table/utils/decorators/sortable.js.map +1 -1
  68. package/dist/esm/components/Table/utils/decorators/treeRow.js +2 -2
  69. package/dist/esm/components/Table/utils/decorators/treeRow.js.map +1 -1
  70. package/dist/esm/components/Table/utils/decorators/wrappable.js +1 -1
  71. package/dist/esm/components/Table/utils/decorators/wrappable.js.map +1 -1
  72. package/dist/esm/demos/index.d.ts +2 -0
  73. package/dist/esm/demos/index.d.ts.map +1 -0
  74. package/dist/esm/demos/index.js +2 -0
  75. package/dist/esm/demos/index.js.map +1 -0
  76. package/dist/esm/demos/sampleData.d.ts +13 -0
  77. package/dist/esm/demos/sampleData.d.ts.map +1 -0
  78. package/dist/esm/demos/sampleData.js +764 -0
  79. package/dist/esm/demos/sampleData.js.map +1 -0
  80. package/dist/esm/deprecated/components/Table/Table.js +1 -1
  81. package/dist/esm/deprecated/components/Table/Table.js.map +1 -1
  82. package/dist/esm/index.d.ts +1 -0
  83. package/dist/esm/index.d.ts.map +1 -1
  84. package/dist/esm/index.js +1 -0
  85. package/dist/esm/index.js.map +1 -1
  86. package/dist/js/demos/index.d.ts +2 -0
  87. package/dist/js/demos/index.d.ts.map +1 -0
  88. package/dist/js/demos/index.js +5 -0
  89. package/dist/js/demos/index.js.map +1 -0
  90. package/dist/js/demos/sampleData.d.ts +13 -0
  91. package/dist/js/demos/sampleData.d.ts.map +1 -0
  92. package/dist/js/demos/sampleData.js +767 -0
  93. package/dist/js/demos/sampleData.js.map +1 -0
  94. package/dist/js/index.d.ts +1 -0
  95. package/dist/js/index.d.ts.map +1 -1
  96. package/dist/js/index.js +1 -0
  97. package/dist/js/index.js.map +1 -1
  98. package/dist/umd/react-table.min.js +3 -3
  99. package/package.json +6 -6
  100. package/src/components/Table/examples/TableStickyColumnsAndHeader.tsx +5 -4
  101. package/src/components/Table/utils/transformers.test.tsx +1 -0
  102. package/src/demos/Table.md +159 -0
  103. package/src/demos/examples/TableAutomaticPagination.tsx +101 -0
  104. package/src/{docs/demos/table-demos/BulkSelect.jsx → demos/examples/TableBulkSelect.tsx} +41 -20
  105. package/src/demos/examples/TableColumnManagement.tsx +486 -0
  106. package/src/demos/examples/TableColumnManagementWithDraggable.tsx +641 -0
  107. package/src/{docs/demos/table-demos/Compact.jsx → demos/examples/TableCompact.tsx} +32 -16
  108. package/src/{docs/demos/table-demos/CompoundExpansion.jsx → demos/examples/TableCompoundExpansion.tsx} +25 -12
  109. package/src/demos/examples/TableEmptyStateDefault.tsx +60 -0
  110. package/src/demos/examples/TableEmptyStateError.tsx +53 -0
  111. package/src/demos/examples/TableEmptyStateLoading.tsx +43 -0
  112. package/src/{docs/demos/table-demos/ExpandCollapseAll.jsx → demos/examples/TableExpandCollapseAll.tsx} +17 -10
  113. package/src/demos/examples/TableFilterable.tsx +394 -0
  114. package/src/{docs/demos/table-demos/SortableResponsive.jsx → demos/examples/TableSortableResponsive.tsx} +29 -27
  115. package/src/{docs/demos/table-demos/StaticBottomPagination.jsx → demos/examples/TableStaticBottomPagination.tsx} +22 -9
  116. package/src/{docs/demos/table-demos/StickyFirstColumn.jsx → demos/examples/TableStickyFirstColumn.tsx} +31 -9
  117. package/src/{docs/demos/table-demos/StickyHeader.jsx → demos/examples/TableStickyHeader.tsx} +3 -3
  118. package/src/demos/index.ts +1 -0
  119. package/src/{docs/demos/table-demos/sampleData.js → demos/sampleData.tsx} +88 -77
  120. package/src/deprecated/components/Table/__tests__/Table.test.tsx +4 -9
  121. package/src/index.ts +1 -0
  122. package/src/docs/demos/Table.md +0 -1620
  123. 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
+ };