verou
2025-03-25 7a33c97d5741a5d8813035ccde1fa801ec30a179
fix:input disabled不能更新bug
1个文件已添加
5个文件已修改
259 ■■■■■ 已修改文件
rsf-admin/src/page/asnOrder/AsnWareModal.jsx 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/loc/LocList.jsx 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupEdit.jsx 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/system/role/AssignPermissions.jsx 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/warehouseAreas/BatchModal.jsx 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/warehouseAreas/WarehouseAreasList.jsx 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/asnOrder/AsnWareModal.jsx
@@ -128,6 +128,16 @@
                                size="small"
                            />
                        </Grid>
                        <Grid item xs={4}>
                            <TextField
                                label={translate('table.field.matnr.groupId')}
                                name="groupId"
                                value={formData.groupId}
                                onChange={handleChange}
                                variant="outlined"
                                size="small"
                            />
                        </Grid>
                    </Grid>
                </Box>
                <Box sx={{ mt: 2 }}>
rsf-admin/src/page/basicInfo/loc/LocList.jsx
@@ -33,7 +33,7 @@
    DeleteButton,
    useRefresh,
    Button,
    useList
    useList,
} from 'react-admin';
import { Box, Typography, Card, Stack } from '@mui/material';
import { styled } from '@mui/material/styles';
@@ -79,8 +79,30 @@
const filters = [
    <SearchInput source="condition" alwaysOn />,
    <TextInput source="warehouseId$" label="table.field.loc.warehouseId" />,
    <TextInput source="areaId$" label="table.field.loc.areaId" />,
    <ReferenceInput
        source="warehouseId"
        label="table.field.loc.warehouseId"
        reference="warehouse"
        alwaysOn
    >
        <AutocompleteInput
            label="table.field.loc.warehouseId"
            optionText="name"
            filterToQuery={(val) => ({ name: val })}
        />
    </ReferenceInput>,
    <ReferenceInput
        source="areaId"
        label="table.field.loc.areaId"
        reference="warehouseAreas"
        alwaysOn
    >
        <AutocompleteInput
            label="table.field.loc.areaId"
            optionText="name"
            filterToQuery={(val) => ({ name: val })}
        />
    </ReferenceInput>,
    <TextInput source="code" label="table.field.loc.code" />,
    <TextInput source="type" label="table.field.loc.type" />,
    <TextInput source="name" label="table.field.loc.name" />,
rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupEdit.jsx
@@ -61,8 +61,7 @@
    const http = async (val) => {
        const res = await request.post(`/matnrGroup/page`, { id: val });
        const code = res.data.data.records[0].code || ''
        // setpCode(code)
        editRecord.parCode = code;
        editRecord && (editRecord.parCode = code);
        update(code)
    }
    return (
@@ -83,7 +82,7 @@
                    source="parCode"
                    value={editRecord?.parCode}
                    parse={v => v}
                    disabled
                    readOnly
                />
            </Grid>
            <Grid item xs={6} display="flex" gap={1}>
@@ -99,7 +98,7 @@
                    label="table.field.matnrGroup.code"
                    source="code"
                    parse={v => v}
                    disabled={!!editRecord}
                    readOnly={!!editRecord}
                />
            </Grid>
        </Grid>
@@ -134,6 +133,7 @@
    const onSubmit = (data) => {
        const _params = { ...data };
        if (editRecord) {
            debugger
            if (_params.parentId === editRecord.id) {
                notify('common.response.dataError', { type: 'error' });
                return;
rsf-admin/src/page/system/role/AssignPermissions.jsx
@@ -4,7 +4,7 @@
    useNotify,
    TextInput
} from 'react-admin';
import { Box, Button, Card, Stack, CardContent, Skeleton } from '@mui/material';
import { Box, Button, Card, Stack, CardContent, Skeleton, TextField } from '@mui/material';
import { SimpleTreeView, TreeItem, RichTreeView, useTreeViewApiRef } from '@mui/x-tree-view';
import SaveIcon from '@mui/icons-material/Save';
import request from '@/utils/request'
@@ -20,10 +20,15 @@
    const [treeData, setTreeData] = useState([]);
    const [selectedItems, setSelectedItems] = useState([]);
    const [expandedItems, setExpandedItems] = useState([]);
    const [parmas, setParmas] = useState({ condition: '' });
    const toggledItemRef = useRef({});
    const apiRef = useTreeViewApiRef();
    useEffect(() => {
        reload()
    }, [role, originMenuIds])
    const reload = () => {
        setSelectedItems(originMenuIds.map(item => item + ""));
        const transformTree = (treeData) => {
@@ -37,7 +42,7 @@
            })
        }
        const http = async () => {
            const res = await request.post('/menu' + '/tree', { condition: '' });
            const res = await request.post('/menu/tree', parmas);
            if (res?.data?.code === 200) {
                const transformData = transformTree(res.data.data);
                setTreeData(transformData);
@@ -53,7 +58,7 @@
        setTimeout(() => {
            http();
        }, 200);
    }, [role, originMenuIds])
    }
    const getAllItemItemIds = () => {
@@ -157,6 +162,16 @@
        })
    }
    const search = (e) => {
        const value = e.target.value;
        setParmas({
            ...parmas,
            condition: value
        })
        reload()
    }
    return (
        <>
            <Card sx={{
@@ -193,10 +208,11 @@
                        </Box>
                        <Box sx={{
                            display: 'flex',
                            justifyContent: 'flex-start'
                            justifyContent: 'space-between',
                            alignItems: 'center'
                        }}>
                            <Button startIcon={<SaveIcon />} variant="contained" onClick={handleSave}>
                            <TextField sx={{ width: '200px' }} label="搜索菜单" variant="outlined" value={parmas.condition} onChange={(e) => search(e)} />
                            <Button startIcon={<SaveIcon />} size="small" variant="contained" onClick={handleSave} sx={{ height: '40px' }}>
                                {translate('ra.action.save')}
                            </Button>
                        </Box>
rsf-admin/src/page/warehouseAreas/BatchModal.jsx
New file
@@ -0,0 +1,149 @@
import React, { useState, useRef, useEffect, useMemo } from "react";
import {
    CreateBase,
    useTranslate,
    TextInput,
    NumberInput,
    BooleanInput,
    DateInput,
    SaveButton,
    SelectInput,
    ReferenceInput,
    ReferenceArrayInput,
    AutocompleteInput,
    Toolbar,
    required,
    useDataProvider,
    useNotify,
    Form,
    useCreateController,
    useListContext,
    useRefresh,
} from 'react-admin';
import {
    Dialog,
    DialogActions,
    DialogContent,
    DialogTitle,
    Grid,
    TextField,
    Box,
    Button,
    Paper,
    TableContainer,
    Table,
    TableHead,
    TableBody,
    TableRow,
    TableCell,
    Tooltip,
    IconButton,
    styled
} from '@mui/material';
import DialogCloseButton from "../components/DialogCloseButton";
import { useForm, Controller, useWatch, FormProvider, useFormContext } from "react-hook-form";
import SaveIcon from '@mui/icons-material/Save';
import request from '@/utils/request';
import { Add, Edit, Delete } from '@mui/icons-material';
import _ from 'lodash';
import { DataGrid } from '@mui/x-data-grid';
import StatusSelectInput from "../components/StatusSelectInput";
const InitModal = ({ open, setOpen }) => {
    const refresh = useRefresh();
    const translate = useTranslate();
    const notify = useNotify();
    const [formData, setFormData] = useState({
        'status': null
    });
    const { selectedIds, onUnselectItems } = useListContext();
    const handleClose = (event, reason) => {
        if (reason !== "backdropClick") {
            setOpen(false);
            reset()
            refresh();
            onUnselectItems()
        }
    };
    const reset = () => {
        setFormData({
            'status': null
        })
    }
    const handleReset = (e) => {
        e.preventDefault();
    };
    const handleChange = (value, name) => {
        setFormData((prevData) => ({
            ...prevData,
            [name]: value
        }));
    };
    const removeEmptyKeys = (obj) => {
        return _.pickBy(obj, (value) => {
            if (_.isObject(value)) {
                const newObj = removeEmptyKeys(value);
                return !_.isEmpty(newObj);
            }
            return !_.isNil(value) && (_.isNumber(value) ? value !== 0 : !_.isEmpty(value));
        });
    }
    const handleSubmit = async () => {
        const parmas = {
            id: selectedIds,
            matnr: removeEmptyKeys(formData)
        }
        const res = await request.post(`/matnr/modify`, parmas);
        if (res?.data?.code === 200) {
            handleClose()
        } else {
            notify(res.data.msg);
        }
    }
    return (
        <Dialog open={open} maxWidth="md" fullWidth>
            <Form onSubmit={handleSubmit}>
                <DialogCloseButton onClose={handleClose} />
                <DialogTitle>{translate('toolbar.batch')}</DialogTitle>
                <DialogContent sx={{ mt: 2 }}>
                    <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
                        <Grid container spacing={2}>
                            <Grid item xs={4}>
                                <StatusSelectInput
                                    onChange={(e) => handleChange(e.target.value, 'status')}
                                    defaultValue={''}
                                    require={false}
                                />
                            </Grid>
                        </Grid>
                    </Box>
                </DialogContent>
                <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
                    <Box sx={{ width: '100%', display: 'flex', justifyContent: 'space-between' }}>
                        <Button type="submit" variant="contained" startIcon={<SaveIcon />}>
                            {translate('toolbar.confirm')}
                        </Button>
                    </Box>
                </DialogActions>
            </Form>
        </Dialog>
    );
}
export default InitModal;
rsf-admin/src/page/warehouseAreas/WarehouseAreasList.jsx
@@ -31,6 +31,8 @@
    ReferenceArrayInput,
    AutocompleteInput,
    DeleteButton,
    useRefresh,
    Button
} from 'react-admin';
import { Box, Typography, Card, Stack } from '@mui/material';
import { styled } from '@mui/material/styles';
@@ -40,9 +42,10 @@
import MyCreateButton from "../components/MyCreateButton";
import MyExportButton from '../components/MyExportButton';
import PageDrawer from "../components/PageDrawer";
import MyField from "../components/MyField";
import BatchModal from "./BatchModal";
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import * as Common from '@/utils/common';
import EditIcon from '@mui/icons-material/Edit';
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
@@ -132,7 +135,12 @@
            >
                <StyledDatagrid
                    preferenceKey='warehouseAreas'
                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
                    bulkActionButtons={
                        <>
                            <BatchButton />
                            <BulkDeleteButton mutationMode={OPERATE_MODE} />
                        </>
                    }
                    rowClick={(id, resource, record) => false}
                    omit={['id', 'createTime', 'createBy', 'memo']}
                >
@@ -181,3 +189,27 @@
}
export default WarehouseAreasList;
const BatchButton = () => {
    const record = useRecordContext();
    const notify = useNotify();
    const refresh = useRefresh();
    const [createDialog, setCreateDialog] = useState(false);
    return (
        <>
            <Button onClick={() => setCreateDialog(true)} label={"toolbar.batch"}>
                <EditIcon />
            </Button>
            <BatchModal
                open={createDialog}
                setOpen={setCreateDialog}
            />
        </>
    )
}