|
@@ -1,20 +1,23 @@
|
|
-import React, { useContext, useEffect, useState } from 'react';
|
|
|
|
-import { makeStyles, Theme } from '@material-ui/core';
|
|
|
|
|
|
+import { useContext, useEffect, useState } from 'react';
|
|
|
|
+import { makeStyles, Theme, Chip } from '@material-ui/core';
|
|
import { useTranslation } from 'react-i18next';
|
|
import { useTranslation } from 'react-i18next';
|
|
import { UserHttp } from '@/http/User';
|
|
import { UserHttp } from '@/http/User';
|
|
import AttuGrid from '@/components/grid/Grid';
|
|
import AttuGrid from '@/components/grid/Grid';
|
|
import { ColDefinitionsType, ToolBarConfig } from '@/components/grid/Types';
|
|
import { ColDefinitionsType, ToolBarConfig } from '@/components/grid/Types';
|
|
-import { CreateRoleParams, DeleteRoleParams, RoleData } from './Types';
|
|
|
|
|
|
+import { DeleteRoleParams, RoleData } from './Types';
|
|
import DeleteTemplate from '@/components/customDialog/DeleteDialogTemplate';
|
|
import DeleteTemplate from '@/components/customDialog/DeleteDialogTemplate';
|
|
import { rootContext } from '@/context/Root';
|
|
import { rootContext } from '@/context/Root';
|
|
import { useNavigationHook } from '@/hooks/Navigation';
|
|
import { useNavigationHook } from '@/hooks/Navigation';
|
|
import { ALL_ROUTER_TYPES } from '@/router/Types';
|
|
import { ALL_ROUTER_TYPES } from '@/router/Types';
|
|
-import CreateRole from './CreateRole';
|
|
|
|
|
|
+import UpdateRoleDialog from './UpdateRoleDialog';
|
|
|
|
|
|
const useStyles = makeStyles((theme: Theme) => ({
|
|
const useStyles = makeStyles((theme: Theme) => ({
|
|
wrapper: {
|
|
wrapper: {
|
|
height: `calc(100vh - 160px)`,
|
|
height: `calc(100vh - 160px)`,
|
|
},
|
|
},
|
|
|
|
+ chip: {
|
|
|
|
+ marginRight: theme.spacing(0.5),
|
|
|
|
+ },
|
|
}));
|
|
}));
|
|
|
|
|
|
const Roles = () => {
|
|
const Roles = () => {
|
|
@@ -32,21 +35,46 @@ const Roles = () => {
|
|
|
|
|
|
const fetchRoles = async () => {
|
|
const fetchRoles = async () => {
|
|
const roles = await UserHttp.getRoles();
|
|
const roles = await UserHttp.getRoles();
|
|
-
|
|
|
|
- setRoles(roles.results.map((v: any) => ({ name: v.role.name })));
|
|
|
|
|
|
+ setSelectedRole([]);
|
|
|
|
+
|
|
|
|
+ setRoles(
|
|
|
|
+ roles.results.map((v: any) => ({
|
|
|
|
+ name: v.role.name,
|
|
|
|
+ privilegeContent: (
|
|
|
|
+ <>
|
|
|
|
+ {v.entities.map((e: any) => {
|
|
|
|
+ return (
|
|
|
|
+ <Chip
|
|
|
|
+ className={classes.chip}
|
|
|
|
+ size="small"
|
|
|
|
+ label={e.grantor.privilege.name}
|
|
|
|
+ variant="outlined"
|
|
|
|
+ />
|
|
|
|
+ );
|
|
|
|
+ })}
|
|
|
|
+ </>
|
|
|
|
+ ),
|
|
|
|
+ privileges: v.entities.map((e: any) => ({
|
|
|
|
+ roleName: v.role.name,
|
|
|
|
+ object: e.object.name,
|
|
|
|
+ objectName: e.object_name,
|
|
|
|
+ privilegeName: e.grantor.privilege.name,
|
|
|
|
+ })),
|
|
|
|
+ }))
|
|
|
|
+ );
|
|
};
|
|
};
|
|
|
|
|
|
- const handleCreate = async (data: CreateRoleParams) => {
|
|
|
|
- await UserHttp.createRole(data);
|
|
|
|
|
|
+ const onUpdate = async (data: { isEditing: boolean }) => {
|
|
fetchRoles();
|
|
fetchRoles();
|
|
openSnackBar(successTrans('create', { name: userTrans('role') }));
|
|
openSnackBar(successTrans('create', { name: userTrans('role') }));
|
|
handleCloseDialog();
|
|
handleCloseDialog();
|
|
};
|
|
};
|
|
|
|
|
|
- const handleDelete = async () => {
|
|
|
|
|
|
+ const handleDelete = async (force?: boolean) => {
|
|
for (const role of selectedRole) {
|
|
for (const role of selectedRole) {
|
|
const param: DeleteRoleParams = {
|
|
const param: DeleteRoleParams = {
|
|
roleName: role.name,
|
|
roleName: role.name,
|
|
|
|
+ force,
|
|
};
|
|
};
|
|
await UserHttp.deleteRole(param);
|
|
await UserHttp.deleteRole(param);
|
|
}
|
|
}
|
|
@@ -65,8 +93,8 @@ const Roles = () => {
|
|
type: 'custom',
|
|
type: 'custom',
|
|
params: {
|
|
params: {
|
|
component: (
|
|
component: (
|
|
- <CreateRole
|
|
|
|
- handleCreate={handleCreate}
|
|
|
|
|
|
+ <UpdateRoleDialog
|
|
|
|
+ onUpdate={onUpdate}
|
|
handleClose={handleCloseDialog}
|
|
handleClose={handleCloseDialog}
|
|
/>
|
|
/>
|
|
),
|
|
),
|
|
@@ -76,6 +104,33 @@ const Roles = () => {
|
|
icon: 'add',
|
|
icon: 'add',
|
|
},
|
|
},
|
|
|
|
|
|
|
|
+ {
|
|
|
|
+ type: 'iconBtn',
|
|
|
|
+ label: userTrans('editRole'),
|
|
|
|
+ onClick: async () => {
|
|
|
|
+ setDialog({
|
|
|
|
+ open: true,
|
|
|
|
+ type: 'custom',
|
|
|
|
+ params: {
|
|
|
|
+ component: (
|
|
|
|
+ <UpdateRoleDialog
|
|
|
|
+ role={selectedRole[0]}
|
|
|
|
+ onUpdate={onUpdate}
|
|
|
|
+ handleClose={handleCloseDialog}
|
|
|
|
+ />
|
|
|
|
+ ),
|
|
|
|
+ },
|
|
|
|
+ });
|
|
|
|
+ },
|
|
|
|
+ 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',
|
|
type: 'iconBtn',
|
|
onClick: () => {
|
|
onClick: () => {
|
|
@@ -89,6 +144,7 @@ const Roles = () => {
|
|
title={dialogTrans('deleteTitle', { type: userTrans('role') })}
|
|
title={dialogTrans('deleteTitle', { type: userTrans('role') })}
|
|
text={userTrans('deleteWarning')}
|
|
text={userTrans('deleteWarning')}
|
|
handleDelete={handleDelete}
|
|
handleDelete={handleDelete}
|
|
|
|
+ forceDelLabel={userTrans('forceDelLabel')}
|
|
/>
|
|
/>
|
|
),
|
|
),
|
|
},
|
|
},
|
|
@@ -97,9 +153,9 @@ const Roles = () => {
|
|
label: '',
|
|
label: '',
|
|
disabled: () =>
|
|
disabled: () =>
|
|
selectedRole.length === 0 ||
|
|
selectedRole.length === 0 ||
|
|
- selectedRole.findIndex(v => v.name === 'root') > -1,
|
|
|
|
|
|
+ selectedRole.findIndex(v => v.name === 'admin') > -1 ||
|
|
|
|
+ selectedRole.findIndex(v => v.name === 'public') > -1,
|
|
disabledTooltip: userTrans('deleteTip'),
|
|
disabledTooltip: userTrans('deleteTip'),
|
|
-
|
|
|
|
icon: 'delete',
|
|
icon: 'delete',
|
|
},
|
|
},
|
|
];
|
|
];
|
|
@@ -111,6 +167,13 @@ const Roles = () => {
|
|
disablePadding: false,
|
|
disablePadding: false,
|
|
label: userTrans('role'),
|
|
label: userTrans('role'),
|
|
},
|
|
},
|
|
|
|
+
|
|
|
|
+ {
|
|
|
|
+ id: 'privilegeContent',
|
|
|
|
+ align: 'left',
|
|
|
|
+ disablePadding: false,
|
|
|
|
+ label: userTrans('privileges'),
|
|
|
|
+ },
|
|
];
|
|
];
|
|
|
|
|
|
const handleSelectChange = (value: RoleData[]) => {
|
|
const handleSelectChange = (value: RoleData[]) => {
|