fleet/frontend/pages/hosts/ManageHostsPage/components/EditColumnsModal/EditColumnsModal.jsx
Gabe Hernandez d0ded91d0b partial implementation of user table with generic table and new create user form (#500)
* use new data table in user manage page'

* remove default empty array hiddenColumns props, was causing render performance problems

* remove unused tooltip in hostcontainer

* add search to user manage table

* add query params to user GET requests

* move createUserForm closer to user management page

* starting to implement create user modal

* starting to add team checking functionality to create user

* styling of select team form

* changing logic for selectedTeamsForm, simplifying

* updated SelectedTeamsForm to handle own state and pass back relevant state to parent

* created reusable infobanner component and use it in osquery options page

* use infobanner in createuserform

* create new Radio component and use in createuserform

* create new Radio component and use in createuserform

* added new radio buttons to createUserForm

* finish custom radio button styling

* finish styling of radio in createUserForm

* fix and add entities/users#loadAll tests

* remove unneeded tests and updated broken ones on UserManagementPage

* remove unused modules
2021-03-31 11:58:29 -07:00

93 lines
2.8 KiB
JavaScript

import React, { useState } from 'react';
import PropTypes from 'prop-types';
import Checkbox from '../../../../../components/forms/fields/Checkbox';
import Button from '../../../../../components/buttons/Button';
const useCheckboxListStateManagement = (allColumns, hiddenColumns) => {
const [columnItems, setColumnItems] = useState(() => {
return allColumns.map((column) => {
return {
name: column.title,
accessor: column.accessor,
isChecked: !hiddenColumns.includes(column.accessor),
disableHidden: column.disableHidden,
};
});
});
const updateColumnItems = (columnAccessor) => {
setColumnItems((prevState) => {
const selectedColumn = columnItems.find(column => column.accessor === columnAccessor);
const updatedColumn = {
...selectedColumn,
isChecked: !selectedColumn.isChecked,
};
// this is replacing the column object with the updatedColumn we just created.
const newState = prevState.map((currentColumn) => {
return currentColumn.accessor === columnAccessor ? updatedColumn : currentColumn;
});
return newState;
});
};
return [columnItems, updateColumnItems];
};
const getHiddenColumns = (columns) => {
return columns.filter(column => !column.isChecked)
.map(column => column.accessor);
};
const EditColumnsModal = (props) => {
const { columns, hiddenColumns, onSaveColumns, onCancelColumns } = props;
const [columnItems, updateColumnItems] = useCheckboxListStateManagement(columns, hiddenColumns);
return (
<div className={'edit-column-modal'}>
<p>Choose which columns you see</p>
<div className={'modal-items'}>
{columnItems.map((column) => {
if (column.disableHidden) return null;
return (
<div key={column.accessor}>
<Checkbox
name={column.name}
value={column.isChecked}
onChange={() => updateColumnItems(column.accessor)}
>
<span>{column.name}</span>
</Checkbox>
</div>
);
})}
</div>
<div className={'button-actions'}>
<Button
onClick={onCancelColumns}
variant={'inverse'}
>
Cancel
</Button>
<Button
className={'save-button'}
onClick={() => onSaveColumns(getHiddenColumns(columnItems))}
variant={'default'}
>
Save
</Button>
</div>
</div>
);
};
EditColumnsModal.propTypes = {
columns: PropTypes.arrayOf(PropTypes.object), // TODO: create proper interface for this
hiddenColumns: PropTypes.arrayOf(PropTypes.string),
onSaveColumns: PropTypes.func,
onCancelColumns: PropTypes.func,
};
export default EditColumnsModal;