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