import { useCallback, useEffect, useMemo, useState } from 'react';
import { Box, Typography, Checkbox, styled } from '@mui/material';
import {
CheckIcon,
CheckedIcon,
IndeterminateIcon,
} from '../../IconsForTable/icons';
import { ROLES_NAME_ID } from '../../../../constants/constants';
import { createFilterData } from '../../utils/filters';
import {
ROLES_ID_RUSSIAN_NAME_ARRAY as ROLES,
ROLES_ID_NAME,
} from '../../../../constants/constants';
import SelectWithOptions from '../../components/SelectWithOptions';
import RowActionsMenu from './RowActionMenu';
import DepartmentCell from './DepartmentCell';
import StyledTable from '../../components/StyledTable/StyledTable';
const StyledCheckbox = styled(Checkbox)({
padding: '0',
svg: {
width: '1rem',
height: '1rem',
},
});
const UserTable = ({
data = [],
onEdit,
onEditSsp,
onDelete,
filterString,
ssp,
roleId,
onRoleChange,
onSelectedUsers,
selectedUsersId,
// Пропсы высоты
maxHeight = 'calc(100vh - 17rem)',
loading = false,
}) => {
const [selectedUsers, setSelectedUsers] = useState(new Set());
useEffect(() => {
setSelectedUsers(selectedUsersId);
}, [selectedUsersId]);
const filteredData = useMemo(() => {
const filterFunc = createFilterData({
search: filterString,
ssp_id: ssp?.id,
role_id: roleId,
});
return data.filter(filterFunc);
}, [data, filterString, ssp, roleId]);
const handleEditSsp = useCallback(
(user) => {
if (user) {
onEditSsp?.(user);
}
},
[onEditSsp],
);
const handleEdit = (user) => {
if (user) {
onEdit?.(user);
}
};
const handleDelete = (user) => {
if (user) {
onDelete?.(user);
}
};
const handleSelectUser = useCallback(
(userId) => {
const newSelectedUsers = new Set(selectedUsers);
if (newSelectedUsers.has(userId)) {
newSelectedUsers.delete(userId);
} else {
newSelectedUsers.add(userId);
}
setSelectedUsers(newSelectedUsers);
onSelectedUsers(newSelectedUsers);
},
[selectedUsers, onSelectedUsers],
);
const handleSelectAll = useCallback(() => {
if (selectedUsers.size === filteredData.length) {
setSelectedUsers(new Set());
onSelectedUsers(new Set());
} else {
const userIds = new Set(filteredData.map((user) => user.id));
setSelectedUsers(userIds);
onSelectedUsers(userIds);
}
}, [filteredData, selectedUsers.size]);
const handleRoleChange = useCallback(
(user, role) => {
user.role_id = ROLES_NAME_ID[role];
onRoleChange(user);
},
[onRoleChange],
);
const columns = useMemo(
() => [
{
id: 'selection',
header: (
0
}
indeterminate={
selectedUsers.size > 0 &&
selectedUsers.size < filteredData.length
}
onChange={handleSelectAll}
size="small"
icon={}
checkedIcon={}
indeterminateIcon={}
/>
),
Cell: ({ row }) => (
handleSelectUser(row.original.id)}
size="16"
icon={}
checkedIcon={}
/>
),
muiTableHeadCellProps: {
sx: {
boxSizing: 'border-box',
width: '2.75rem',
minWidth: '2.75rem',
maxWidth: '2.75rem',
},
},
muiTableBodyCellProps: {
sx: {
boxSizing: 'border-box',
width: '2.75rem',
minWidth: '2.75rem',
maxWidth: '2.75rem',
},
},
enableEditing: false,
enableSorting: false,
enableColumnFilter: false,
enableColumnActions: false,
enableHiding: false,
},
{
accessorKey: 'id',
header: 'ID',
size: 50,
enableHiding: false,
enableEditing: false,
enableColumnActions: false,
},
{
accessorKey: 'user_info',
header: 'Пользователь',
muiTableHeadCellProps: {
sx: {
boxSizing: 'border-box',
width: '26.75rem',
minWidth: '26.75rem',
maxWidth: '26.75rem',
},
},
muiTableBodyCellProps: {
sx: {
boxSizing: 'border-box',
width: '26.75rem',
minWidth: '26.75rem',
maxWidth: '26.75rem',
},
},
Cell: ({ row }) => (
{row.original.full_name}
{row.original.email}
),
enableEditing: false,
enableColumnActions: false,
},
{
accessorKey: 'role_id',
header: 'Роль',
muiTableHeadCellProps: {
sx: {
boxSizing: 'border-box',
width: '18.75rem',
minWidth: '18.75rem',
maxWidth: '18.75rem',
},
},
muiTableBodyCellProps: {
sx: {
boxSizing: 'border-box',
width: '18.75rem',
minWidth: '18.75rem',
maxWidth: '18.75rem',
},
},
Cell: ({ cell, row }) => (
{
handleRoleChange(row.original, ROLES_ID_NAME[selectedId]);
}}
/>
),
enableColumnActions: false,
},
{
accessorKey: 'org_units',
header: 'Подразделения',
muiTableHeadCellProps: {
sx: {
boxSizing: 'border-box',
width: '40.75rem',
minWidth: '40.75rem',
maxWidth: '40.75rem',
},
},
muiTableBodyCellProps: {
sx: {
boxSizing: 'border-box',
width: '40.75rem',
minWidth: '40.75rem',
maxWidth: '40.75rem',
},
},
Cell: ({ cell, row }) => (
),
enableColumnActions: false,
},
],
[
selectedUsers,
filteredData.length,
handleSelectAll,
handleSelectUser,
handleRoleChange,
handleEditSsp,
],
);
return (
(
)}
positionActionsColumn="last"
// Начальное состояние
initialState={{
columnVisibility: { id: false },
}}
tableOptions={{
displayColumnDefOptions: {
'mrt-row-actions': {
header: '',
},
},
}}
/>
);
};
export default UserTable;