import { Fragment, useEffect, useState } from 'react'; import { Button, Content, DataList, DataListCheck, DataListItem, DataListItemRow, DataListCell, DataListItemCells, Label, Toolbar, ToolbarContent, ToolbarItem, MenuToggle, Modal, ModalHeader, ModalBody, ModalFooter, OverflowMenu, OverflowMenuGroup, OverflowMenuItem, PageSection, Pagination, PaginationVariant } from '@patternfly/react-core'; import { Table, TableText, Thead, Tr, Th, Tbody, Td } from '@patternfly/react-table'; import FilterIcon from '@patternfly/react-icons/dist/esm/icons/filter-icon'; import RhMicronsSortDownLargeToSmallIcon from '@patternfly/react-icons/dist/esm/icons/rh-microns-sort-down-large-to-small-icon'; import { DashboardWrapper } from '@patternfly/react-table/dist/esm/demos/DashboardWrapper'; import { capitalize } from '@patternfly/react-table/src/components/Table/utils/utils'; import { rows, columns, SampleDataRow } from '@patternfly/react-table/dist/esm/demos/sampleData'; export const TableColumnManagement: React.FunctionComponent = () => { const defaultColumns = columns; const defaultRows = rows; const [filters, setFilters] = useState([]); const [filteredColumns, setFilteredColumns] = useState([]); const [filteredRows, setFilteredRows] = useState([]); const [managedColumns, setManagedColumns] = useState(defaultColumns); const [managedRows, setManagedRows] = useState(defaultRows); const [isModalOpen, setIsModalOpen] = useState(false); const [checkedState, setCheckedState] = useState(Array(columns.length).fill(true)); const [page, setPage] = useState(1); const [perPage, setPerPage] = useState(10); const [paginatedRows, setPaginatedRows] = useState(rows); const matchCheckboxNameToColumn = (name: string): string => { switch (name) { case 'check1': return 'Servers'; case 'check2': return 'Threads'; case 'check3': return 'Applications'; case 'check4': return 'Workspaces'; case 'check5': return 'Status'; case 'check6': return 'Location'; case 'check7': return 'Last Modified'; case 'check8': return 'URL'; default: return ''; } }; const matchSelectedColumnNameToAttr = (name: string): string => { switch (name) { case 'Servers': return 'name'; case 'Threads': return 'threads'; case 'Applications': return 'applications'; case 'Workspaces': return 'workspaces'; case 'Status': return 'status'; case 'Location': return 'location'; case 'Last Modified': return 'lastModified'; case 'URL': return 'url'; default: return ''; } }; // Pagination logic const handleSetPage = ( _evt: MouseEvent | React.MouseEvent | React.KeyboardEvent, newPage: number ) => { setPage(newPage); }; const handlePerPageSelect = ( _evt: MouseEvent | React.MouseEvent | React.KeyboardEvent, newPerPage: number ) => { setPerPage(newPerPage); }; const renderPagination = (variant: 'top' | 'bottom' | PaginationVariant, isCompact: boolean) => ( ); useEffect(() => { setPaginatedRows(managedRows.slice((page - 1) * perPage, page * perPage - 1)); }, [managedRows, page, perPage]); // Removes attribute from each node object in Data.jsx const removePropFromObject = (object: any, keys: string[]): any => keys.reduce((obj, prop) => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const { [prop]: _, ...keep } = obj; return keep; }, object); // Filters columns out of table that are not selected in the column management modal const filterData = (checked: boolean, name: string) => { const selectedColumn = matchSelectedColumnNameToAttr(name); const filteredRows: SampleDataRow[] = []; if (checked) { const updatedFilters = filters.filter((item) => item !== selectedColumn); // Only show the names of columns that were selected in the modal const filteredColumns = defaultColumns.filter( (column) => !updatedFilters.includes(matchSelectedColumnNameToAttr(column)) ); // Remove the attributes (i.e. "columns") that were not selected defaultRows.forEach((item) => filteredRows.push(removePropFromObject(item, updatedFilters))); setFilters(updatedFilters); setFilteredColumns(filteredColumns); setFilteredRows(filteredRows); } else { const updatedFilters = filters; updatedFilters.push(selectedColumn); // Only show the names of columns that were selected in the modal const filteredColumns = managedColumns.filter( (column) => !filters.includes(matchSelectedColumnNameToAttr(column)) ); // Remove the attributes (i.e. "columns") that were not selected managedRows.forEach((item) => filteredRows.push(removePropFromObject(item, updatedFilters))); setFilters(updatedFilters); setFilteredColumns(filteredColumns); setFilteredRows(filteredRows); } }; const unfilterAllData = () => { setFilters([]); setFilteredColumns(defaultColumns); setFilteredRows(defaultRows); }; const handleChange = (event: React.FormEvent, checked: boolean) => { const target = event.currentTarget; const value = target.type === 'checkbox' ? target.checked : target.value; // Remove any columns from the table that aren't checked filterData(checked, matchCheckboxNameToColumn(target.name)); const checkedIndex: number = columns.findIndex((element) => element === matchCheckboxNameToColumn(target.name)); const updatedCheckedState: boolean[] = [...checkedState]; updatedCheckedState[checkedIndex] = value as boolean; setCheckedState(updatedCheckedState); }; const handleModalToggle = (_event: React.MouseEvent | KeyboardEvent) => { setIsModalOpen(!isModalOpen); }; const onSave = () => { setManagedColumns(filteredColumns); setManagedRows(filteredRows); setPaginatedRows(filteredRows); setIsModalOpen(!isModalOpen); }; const selectAllColumns = () => { unfilterAllData(); setCheckedState(Array(columns.length).fill(true)); }; const renderModal = () => (

Selected categories will be displayed in the table.

} /> ]} /> ]} /> ]} /> ]} /> ]} /> ]} /> ]} /> ]} />
); const renderLabel = (labelText: string): React.JSX.Element => { switch (labelText) { case 'Running': return ; case 'Stopped': return ; case 'Needs maintenance': return ; case 'Down': return ; default: return <>; } }; const toolbarItems = ( }>Name } /> {renderPagination('top', false)} ); return ( {toolbarItems} {managedColumns.map((column, columnIndex) => ( ))} {paginatedRows.map((row, rowIndex) => ( <> {Object.entries(row).map(([key, value], idx) => // eslint-disable-next-line no-nested-ternary key === 'status' ? ( ) : key === 'url' ? ( ) : ( ) )} ))}
{column}
{renderLabel(value as string)} {row.url} {value as string}
{renderPagination('bottom', false)} {renderModal()}
); };