zhou zhou
2026-01-10 24bee1a669c3f01f4c3ce7c6f4f4e2e37fe3dfe2
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;