Project

General

Profile

Download (5.35 KB) Statistics
| Branch: | Tag: | Revision:
import React, { useState } from 'react';
import PropTypes from 'prop-types';
import { TableComposable, Thead, Tbody, Tr, Th } from '@patternfly/react-table';
import {
Toolbar,
ToolbarContent,
ToolbarItem,
Button,
Spinner,
SearchInput,
} from '@patternfly/react-core';
import { translate as __ } from '../../../../common/I18n';
import { ParametersTableRow } from './TableRow';
import { columnNames, HOST_PARAM } from './ParametersConstants';
import Pagination from '../../../Pagination';
import { useForemanSettings } from '../../../../Root/Context/ForemanContext';
import './Parameters.scss';
import { STATUS } from '../../../../constants';
import { useTableSort } from '../../../PF4/Helpers/useTableSort';

export const ParametersTable = ({
status,
hostId,
allParameters,
editHostsPermission,
}) => {
const [editingRow, setEditingRow] = useState(-1);
const { perPage: settingsPerPage } = useForemanSettings() || {};
const [page, setPage] = useState(1);
const [perPage, setPerPage] = useState(settingsPerPage);
const [showNewRow, setShowNewRow] = useState(false);
const [search, setSearch] = useState('');

const { pfSortParams, activeSortDirection } = useTableSort({
allColumns: Object.values(columnNames),
columnsToSortParams: {
[columnNames.name]: 'name',
},
initialSortColumnName: 'Name',
onSort: (_event, index, direction) => {
setParameters(sortedParams(direction).slice(0, perPage));
setPage(1);
},
});

const sortedParams = (
direction = activeSortDirection,
params = allParameters
) =>
[...params].sort((a, b) => {
if (direction === 'asc') {
return a.name.localeCompare(b.name);
}
return b.name.localeCompare(a.name);
});
const [parameters, setParameters] = useState(
sortedParams().slice(0, settingsPerPage)
);
const onPaginationChange = ({ page: newPage, per_page: newPerPage }) => {
setPage(newPage);
setPerPage(newPerPage);
setParameters(
sortedParams().slice((newPage - 1) * newPerPage, newPage * newPerPage)
);
};
const onSearch = newSearch => {
setSearch(newSearch);
setParameters(
sortedParams(
activeSortDirection,
allParameters.filter(param => param.name.includes(newSearch))
).slice(0, settingsPerPage)
);
};
return (
<>
<Toolbar ouiaId="parameters-table-toolbar">
<ToolbarContent>
<ToolbarItem variant="search-filter">
<SearchInput
placeholder={__('Find by name')}
value={search}
onChange={setSearch}
onSearch={onSearch}
onClear={() => {
setSearch('');
onSearch('');
}}
/>
</ToolbarItem>
<ToolbarItem>
<Button ouiaId="add-parameter" onClick={() => setShowNewRow(true)}>
{__('Add parameter')}
</Button>
</ToolbarItem>
<ToolbarItem>
{status === STATUS.PENDING && <Spinner loading size="sm" />}
</ToolbarItem>
<ToolbarItem variant="pagination">
<Pagination
variant="top"
itemCount={allParameters.length}
onChange={onPaginationChange}
updateParamsByUrl={false}
page={page}
perPage={perPage}
/>
</ToolbarItem>
</ToolbarContent>
</Toolbar>
<TableComposable
ouiaId="parameters-table"
id="parameters-table"
aria-label="Parameters table"
variant="compact"
>
<Thead>
<Tr ouiaId="parameters-table-header">
<Th sort={pfSortParams(columnNames.name)}>{columnNames.name}</Th>
<Th>{columnNames.type}</Th>
<Th>{columnNames.value}</Th>
<Th>{columnNames.source}</Th>
<Th />
</Tr>
</Thead>
<Tbody>
{showNewRow && (
<ParametersTableRow
key="new-parameter"
param={{
associated_type: HOST_PARAM,
name: '',
parameter_type: 'string',
value: '',
id: -1,
'hidden_value?': false,
}}
rowIndex={-2}
editingRow={editingRow}
setEditingRow={() => setShowNewRow(false)}
hostId={hostId}
editHostsPermission={editHostsPermission}
isNew
/>
)}
{parameters.map((param, rowIndex) => (
<ParametersTableRow
key={`${rowIndex}-${param.name}`}
param={param}
rowIndex={rowIndex}
editingRow={editingRow}
setEditingRow={setEditingRow}
hostId={hostId}
editHostsPermission={editHostsPermission}
/>
))}
</Tbody>
</TableComposable>
<Pagination
variant="bottom"
itemCount={allParameters.length}
onChange={onPaginationChange}
updateParamsByUrl={false}
page={page}
perPage={perPage}
/>
</>
);
};

ParametersTable.propTypes = {
status: PropTypes.string,
hostId: PropTypes.number.isRequired,
allParameters: PropTypes.array,
editHostsPermission: PropTypes.bool.isRequired,
};

ParametersTable.defaultProps = {
status: STATUS.PENDING,
allParameters: [],
};
(4-4/8)