import { useContext, useEffect, useState } from 'react'; import { makeStyles, Theme, Chip } from '@material-ui/core'; import { useTranslation } from 'react-i18next'; import { UserHttp } from '@/http/User'; import AttuGrid from '@/components/grid/Grid'; import { ColDefinitionsType, ToolBarConfig } from '@/components/grid/Types'; import { DeleteRoleParams, RoleData } from './Types'; import DeleteTemplate from '@/components/customDialog/DeleteDialogTemplate'; import { rootContext } from '@/context'; import { useNavigationHook } from '@/hooks'; import { ALL_ROUTER_TYPES } from '@/router/Types'; import UpdateRoleDialog from './UpdateRoleDialog'; const useStyles = makeStyles((theme: Theme) => ({ wrapper: { height: `calc(100vh - 160px)`, }, chip: { marginRight: theme.spacing(0.5), }, })); const Roles = () => { useNavigationHook(ALL_ROUTER_TYPES.USER); const classes = useStyles(); const [roles, setRoles] = useState([]); const [selectedRole, setSelectedRole] = useState([]); const { setDialog, handleCloseDialog, openSnackBar } = useContext(rootContext); const { t: successTrans } = useTranslation('success'); const { t: userTrans } = useTranslation('user'); const { t: btnTrans } = useTranslation('btn'); const { t: dialogTrans } = useTranslation('dialog'); const fetchRoles = async () => { const roles = await UserHttp.getRoles(); setSelectedRole([]); setRoles( roles.results.map((v: any) => ({ name: v.role.name, privilegeContent: ( <> {v.entities.map((e: any) => { return ( ); })} ), privileges: v.entities.map((e: any) => ({ roleName: v.role.name, object: e.object.name, objectName: e.object_name, privilegeName: e.grantor.privilege.name, })), })) ); }; const onUpdate = async (data: { isEditing: boolean }) => { fetchRoles(); openSnackBar(successTrans('create', { name: userTrans('role') })); handleCloseDialog(); }; const handleDelete = async (force?: boolean) => { for (const role of selectedRole) { const param: DeleteRoleParams = { roleName: role.name, force, }; await UserHttp.deleteRole(param); } openSnackBar(successTrans('delete', { name: userTrans('role') })); fetchRoles(); handleCloseDialog(); }; const toolbarConfigs: ToolBarConfig[] = [ { label: userTrans('role'), onClick: () => { setDialog({ open: true, type: 'custom', params: { component: ( ), }, }); }, icon: 'add', }, { type: 'iconBtn', label: userTrans('editRole'), onClick: async () => { setDialog({ open: true, type: 'custom', params: { component: ( ), }, }); }, icon: 'edit', disabled: () => selectedRole.length === 0 || selectedRole.length > 1 || selectedRole.findIndex(v => v.name === 'admin') > -1 || selectedRole.findIndex(v => v.name === 'public') > -1, disabledTooltip: userTrans('disableEditRolePrivilegeTip'), }, { type: 'iconBtn', onClick: () => { setDialog({ open: true, type: 'custom', params: { component: ( ), }, }); }, label: '', disabled: () => selectedRole.length === 0 || selectedRole.findIndex(v => v.name === 'admin') > -1 || selectedRole.findIndex(v => v.name === 'public') > -1, disabledTooltip: userTrans('deleteTip'), icon: 'delete', }, ]; const colDefinitions: ColDefinitionsType[] = [ { id: 'name', align: 'left', disablePadding: false, label: userTrans('role'), }, { id: 'privilegeContent', align: 'left', disablePadding: false, label: userTrans('privileges'), }, ]; const handleSelectChange = (value: RoleData[]) => { setSelectedRole(value); }; useEffect(() => { fetchRoles(); }, []); return (
); }; export default Roles;