From 24bee1a669c3f01f4c3ce7c6f4f4e2e37fe3dfe2 Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期六, 10 一月 2026 08:34:40 +0800
Subject: [PATCH] #application-dev
---
rsf-admin/src/page/system/role/RoleList.jsx | 193 +++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 173 insertions(+), 20 deletions(-)
diff --git a/rsf-admin/src/page/system/role/RoleList.jsx b/rsf-admin/src/page/system/role/RoleList.jsx
index cdecd51..0c5ea8f 100644
--- a/rsf-admin/src/page/system/role/RoleList.jsx
+++ b/rsf-admin/src/page/system/role/RoleList.jsx
@@ -30,7 +30,8 @@
useNotify,
Button,
} from 'react-admin';
-import { Box, Card, Stack } from '@mui/material';
+import { Box, Card, Stack, Menu, MenuItem, ListItemIcon, ListItemText } from '@mui/material';
+import SecurityIcon from '@mui/icons-material/Security';
import { styled } from '@mui/material/styles';
import RoleCreate from "./RoleCreate";
import RolePanel from "./RolePanel";
@@ -42,8 +43,13 @@
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import * as Common from '@/utils/common';
import AssignPermissions from "./AssignPermissions";
+import AssignPermissionsPda from "./AssignPermissions_pda";
+import AssignPermissionsMatnr from "./AssignPermissions_matnr";
import request from '@/utils/request';
import AssignmentIndIcon from '@mui/icons-material/AssignmentInd';
+import AdUnitsIcon from '@mui/icons-material/AdUnits';
+import ArticleIcon from '@mui/icons-material/Article';
+import { margin } from "@mui/system";
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
'& .css-1vooibu-MuiSvgIcon-root': {
@@ -55,7 +61,7 @@
'& .column-name': {
},
'& .opt': {
- width: 260
+ width: 450
},
}));
@@ -63,7 +69,6 @@
<SearchInput source="condition" alwaysOn />,
<TextInput source="name" label="table.field.role.name" />,
<TextInput source="code" label="table.field.role.code" />,
-
<TextInput label="common.field.memo" source="memo" />,
<SelectInput
label="common.field.status"
@@ -81,10 +86,15 @@
const [createDialog, setCreateDialog] = useState(false);
const [drawerVal, setDrawerVal] = useState(false);
+ const [drawerValPda, setDrawerValPda] = useState(false);
+ const [drawerValMatnr, setDrawerValMatnr] = useState(false);
const [menuIds, setMenuIds] = useState([]);
+ const [authType, setAuthType] = useState(0)
+
const assign = (record) => {
+ setDrawerValPda(false);
request('/role/scope/list', {
method: 'GET',
params: {
@@ -101,6 +111,42 @@
});
}
+ const assignPda = (record) => {
+ setDrawerVal(false);
+ request('/rolePda/scope/list', {
+ method: 'GET',
+ params: {
+ roleId: record.id
+ }
+ }).then((res) => {
+ if (res?.data?.code === 200) {
+ const { data: menuIds } = res.data;
+ setMenuIds(menuIds || []);
+ setDrawerValPda(!!drawerValPda && drawerValPda === record ? null : record);
+ } else {
+ notify(res.data.msg, { type: 'error' });
+ }
+ });
+ }
+
+ const assignMatnr = (record) => {
+ setDrawerVal(false);
+ request('/roleMatnr/scope/list', {
+ method: 'GET',
+ params: {
+ roleId: record.id
+ }
+ }).then((res) => {
+ if (res?.data?.code === 200) {
+ const { data: menuIds } = res.data;
+ setMenuIds(menuIds || []);
+ setDrawerValMatnr(!!drawerValMatnr && drawerValMatnr === record ? null : record);
+ } else {
+ notify(res.data.msg, { type: 'error' });
+ }
+ });
+ }
+
return (
<Box display="flex">
<List
@@ -110,7 +156,7 @@
theme.transitions.create(['all'], {
duration: theme.transitions.duration.enteringScreen,
}),
- marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
+ marginRight: (!!drawerVal || !!drawerValPda || !!drawerValMatnr) ? `${PAGE_DRAWER_WIDTH}px` : 0,
}}
title={"menu.role"}
empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
@@ -130,7 +176,7 @@
preferenceKey='role'
bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
rowClick={(id, resource, record) => false}
- omit={['id', 'createTime', 'memo']}
+ omit={['id', 'createTime', 'memo', 'statusBool']}
>
<NumberField source="id" />
<MyField source="name" label="table.field.role.name"
@@ -146,7 +192,12 @@
<BooleanField source="statusBool" label="common.field.status" sortable={false} />
<TextField source="memo" label="common.field.memo" sortable={false} />
<WrapperField cellClassName="opt" label="common.field.opt">
- <ScopeButton sx={{ padding: '1px', fontSize: '.75rem' }} assign={assign} />
+ <PermissionMenuButton
+ assign={assign}
+ assignPda={assignPda}
+ assignMatnr={assignMatnr}
+ setAuthType={setAuthType}
+ />
<EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
<DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
</WrapperField>
@@ -171,28 +222,130 @@
closeCallback={() => {
setMenuIds([]);
}}
+ authType={authType}
+ />
+ </PageDrawer>
+ <PageDrawer
+ drawerVal={drawerValPda}
+ setDrawerVal={setDrawerValPda}
+ title={!!drawerValPda ? `Scope by ${drawerValPda.code || drawerValPda.name}` : 'Role Detail'}
+ closeCallback={() => {
+ setMenuIds([]);
+ }}
+ >
+ <AssignPermissionsPda
+ role={drawerValPda}
+ originMenuIds={menuIds}
+ setDrawerVal={setDrawerValPda}
+ closeCallback={() => {
+ setMenuIds([]);
+ }}
+ authType={authType}
+ />
+ </PageDrawer>
+ <PageDrawer
+ drawerVal={drawerValMatnr}
+ setDrawerVal={setDrawerValMatnr}
+ title={!!drawerValMatnr ? `Scope by ${drawerValMatnr.code || drawerValMatnr.name}` : 'Role Detail'}
+ closeCallback={() => {
+ setMenuIds([]);
+ }}
+ >
+ <AssignPermissionsMatnr
+ role={drawerValMatnr}
+ originMenuIds={menuIds}
+ setDrawerVal={setDrawerValMatnr}
+ closeCallback={() => {
+ setMenuIds([]);
+ }}
+ authType={authType}
/>
</PageDrawer>
</Box>
)
}
-const ScopeButton = (props) => {
+const PermissionMenuButton = ({ assign, assignPda, assignMatnr, setAuthType }) => {
const record = useRecordContext();
- const { assign, ...rest } = props;
+ const [anchorEl, setAnchorEl] = useState(null);
+ const open = Boolean(anchorEl);
+
+ const handleClick = (event) => {
+ event.stopPropagation();
+ setAnchorEl(event.currentTarget);
+ };
+
+ const handleClose = (event) => {
+ if (event) event.stopPropagation();
+ setAnchorEl(null);
+ };
+
+ const handleWebPermission = (event) => {
+ event.stopPropagation();
+ setAuthType(0);
+ assign(record);
+ handleClose();
+ };
+
+ const handlePdaPermission = (event) => {
+ event.stopPropagation();
+ setAuthType(1);
+ assignPda(record);
+ handleClose();
+ };
+
+ const handleMatnrPermission = (event) => {
+ event.stopPropagation();
+ setAuthType(2);
+ assignMatnr(record);
+ handleClose();
+ };
+
return (
- <Button
- variant="text"
- color="primary"
- startIcon={<AssignmentIndIcon />}
- label="common.action.scope"
- onClick={(event) => {
- event.stopPropagation();
- assign(record);
- }}
- {...rest}
- />
- )
+ <>
+ <Button
+ variant="text"
+ color="primary"
+ startIcon={<SecurityIcon />}
+ label="鏉冮檺"
+ onClick={handleClick}
+ sx={{ marginLeft: '2px', padding: '1px', fontSize: '.75rem' }}
+ />
+ <Menu
+ anchorEl={anchorEl}
+ open={open}
+ onClose={handleClose}
+ onClick={(e) => e.stopPropagation()}
+ anchorOrigin={{
+ vertical: 'bottom',
+ horizontal: 'left',
+ }}
+ transformOrigin={{
+ vertical: 'top',
+ horizontal: 'left',
+ }}
+ >
+ <MenuItem onClick={handleWebPermission}>
+ <ListItemIcon>
+ <AssignmentIndIcon fontSize="small" />
+ </ListItemIcon>
+ <ListItemText>缃戦〉鏉冮檺</ListItemText>
+ </MenuItem>
+ <MenuItem onClick={handlePdaPermission}>
+ <ListItemIcon>
+ <AdUnitsIcon fontSize="small" />
+ </ListItemIcon>
+ <ListItemText>PDA鏉冮檺</ListItemText>
+ </MenuItem>
+ <MenuItem onClick={handleMatnrPermission}>
+ <ListItemIcon>
+ <ArticleIcon fontSize="small" />
+ </ListItemIcon>
+ <ListItemText>鐗╂枡鏉冮檺</ListItemText>
+ </MenuItem>
+ </Menu>
+ </>
+ );
}
export default RoleList;
--
Gitblit v1.9.1