rsf-admin/src/i18n/en.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
rsf-admin/src/i18n/zh.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
rsf-admin/src/page/basicInfo/matnr/MatnrListAside.jsx | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
rsf-admin/src/page/basicInfo/warehouse/WarehouseCreate.jsx | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
rsf-admin/src/i18n/en.js
@@ -425,6 +425,20 @@ }, }, }, matnr: { title: { basic: 'basic info', control: 'control', batchRole: 'batch role', } }, }, form: { matnr: { shipper: 'shipper is required', groupId: 'groupId is required', } } }; rsf-admin/src/i18n/zh.js
@@ -1,3 +1,4 @@ import { s } from "motion/react-client"; import chineseMessages from "./core/chineseMessages"; const customChineseMessages = { @@ -425,6 +426,20 @@ }, }, }, matnr: { title: { basic: '基础属性', control: '控制属性', batchRole: '批次规则', } } }, form: { matnr: { name: '物料名称不能为空', shipper: '货主不能为空', groupId: '分组不能为空', } } }; rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx
@@ -26,16 +26,53 @@ Stack, Grid, Box, Tabs, Tab, } from '@mui/material'; import PropTypes from 'prop-types'; import DialogCloseButton from "@/page/components/DialogCloseButton"; import StatusSelectInput from "@/page/components/StatusSelectInput"; import MemoInput from "@/page/components/MemoInput"; import { tr } from "date-fns/locale"; function CustomTabPanel(props) { const { children, value, index, ...other } = props; return ( <div role="tabpanel" hidden={value !== index} id={`simple-tabpanel-${index}`} aria-labelledby={`simple-tab-${index}`} {...other} > {value === index && <Box sx={{ p: 3 }}>{children}</Box>} </div> ); } CustomTabPanel.propTypes = { children: PropTypes.node, index: PropTypes.number.isRequired, value: PropTypes.number.isRequired, }; function a11yProps(index) { return { id: `simple-tab-${index}`, 'aria-controls': `simple-tabpanel-${index}`, }; } const MatnrCreate = (props) => { const { open, setOpen } = props; const translate = useTranslate(); const notify = useNotify(); const [value, setValue] = React.useState(0); const handleChange = (event, newValue) => { setValue(newValue); }; const handleClose = (event, reason) => { if (reason !== "backdropClick") { @@ -50,6 +87,19 @@ const handleError = async (error) => { notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } }); }; const validateForm = (values) => { const errors = {}; if (!values.shipperId) { errors.shipperId = translate('form.matnr.shipper'); } if (!values.groupId) { errors.groupId = translate('form.matnr.groupId'); } if (!values.name) { errors.name = translate('form.matnr.name'); } return errors; }; return ( @@ -69,7 +119,7 @@ disableRestoreFocus maxWidth="md" // 'xs' | 'sm' | 'md' | 'lg' | 'xl' > <Form> <Form validate={validateForm}> <DialogTitle id="form-dialog-title" sx={{ position: 'sticky', top: 0, @@ -83,206 +133,231 @@ </Box> </DialogTitle> <DialogContent sx={{ mt: 2 }}> <Grid container rowSpacing={2} columnSpacing={2}> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.name" source="name" parse={v => v} autoFocus /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.code" source="code" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <ReferenceInput source="shipperId" reference="shipper" > <AutocompleteInput label="table.field.matnr.shipperId" optionText="name" filterToQuery={(val) => ({ name: val })} <Tabs value={value} onChange={handleChange} aria-label="basic tabs example"> <Tab label={translate('page.matnr.title.basic')} {...a11yProps(0)} /> <Tab label={translate('page.matnr.title.control')} {...a11yProps(1)} /> <Tab label={translate('page.matnr.title.batchRole')} {...a11yProps(2)} /> </Tabs> <CustomTabPanel value={value} index={0}> <Grid container rowSpacing={2} columnSpacing={2}> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.name" validate={[required()]} source="name" parse={v => v} autoFocus /> </ReferenceInput> </Grid> <Grid item xs={6} display="flex" gap={1}> <ReferenceInput source="groupId" reference="matnrGroup" > <AutocompleteInput label="table.field.matnr.groupId" optionText="code" filterToQuery={(val) => ({ code: val })} </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.code" required source="code" parse={v => v} /> </ReferenceInput> </Grid> <Grid item xs={6} display="flex" gap={1}> <ReferenceInput source="rglarId" reference="rglarId" > <AutocompleteInput label="table.field.matnr.rglarId" optionText="code" filterToQuery={(val) => ({ code: val })} </Grid> <Grid item xs={6} display="flex" gap={1}> <ReferenceInput source="shipperId" reference="shipper" > <AutocompleteInput label="table.field.matnr.shipperId" optionText="name" validate={[required()]} filterToQuery={(val) => ({ name: val })} /> </ReferenceInput> </Grid> <Grid item xs={6} display="flex" gap={1}> <ReferenceInput source="groupId" reference="matnrGroup" > <AutocompleteInput label="table.field.matnr.groupId" optionText="code" validate={[required()]} filterToQuery={(val) => ({ code: val })} /> </ReferenceInput> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.erpCode" source="erpCode" required parse={v => v} /> </ReferenceInput> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.erpCode" source="erpCode" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.spec" source="spec" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.model" source="model" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.weight" source="weight" /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.color" source="color" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.size" source="size" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.describle" source="describle" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.nromNum" source="nromNum" /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.unit" source="unit" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.purUnit" source="purchaseUnit" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.stockUnit" source="stockUnit" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <SelectInput label="table.field.matnr.stockLevel" source="stockLevel" choices={[ { id: 0, name: ' A' }, { id: 1, name: ' B' }, { id: 2, name: 'C' }, ]} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <SelectInput label="table.field.matnr.isLabelMange" source="isLabelMange" choices={[ { id: 0, name: ' 否' }, { id: 1, name: ' 是' }, ]} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.safeQty" source="safeQty" /> </Grid> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.minQty" source="minQty" /> </Grid> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.maxQty" source="maxQty" /> </Grid> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.stagn" source="stagn" /> </Grid> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.valid" source="valid" /> </Grid> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.validWarn" source="validWarn" /> </Grid> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.flagCheck" source="flagCheck" /> </Grid> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.spec" source="spec" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.model" source="model" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.weight" source="weight" /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.color" source="color" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.size" source="size" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.describle" source="describle" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.nromNum" source="nromNum" /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.unit" source="unit" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.purUnit" source="purchaseUnit" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.stockUnit" source="stockUnit" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <SelectInput label="table.field.matnr.stockLevel" source="stockLevel" choices={[ { id: 0, name: ' A' }, { id: 1, name: ' B' }, { id: 2, name: 'C' }, ]} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <SelectInput label="table.field.matnr.isLabelMange" source="isLabelMange" choices={[ { id: 0, name: ' 否' }, { id: 1, name: ' 是' }, ]} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <StatusSelectInput /> <Grid item xs={6} display="flex" gap={1}> <StatusSelectInput /> </Grid> <Grid item xs={12} display="flex" gap={1}> <Stack direction="column" spacing={1} width={'100%'}> <MemoInput /> </Stack> </Grid> </Grid> <Grid item xs={12} display="flex" gap={1}> <Stack direction="column" spacing={1} width={'100%'}> <MemoInput /> </Stack> </CustomTabPanel> <CustomTabPanel value={value} index={1}> <Grid container rowSpacing={2} columnSpacing={2}> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.safeQty" source="safeQty" /> </Grid> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.minQty" source="minQty" /> </Grid> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.maxQty" source="maxQty" /> </Grid> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.stagn" source="stagn" /> </Grid> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.valid" source="valid" /> </Grid> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.validWarn" source="validWarn" /> </Grid> <Grid item xs={6} display="flex" gap={1}> <SelectInput label="table.field.matnr.flagCheck" source="flagCheck" choices={[ { id: 0, name: ' 否' }, { id: 1, name: ' 是' }, ]} /> </Grid> </Grid> </Grid> </CustomTabPanel> <CustomTabPanel value={value} index={2}> <Grid container rowSpacing={2} columnSpacing={2}> <Grid item xs={6} display="flex" gap={1}> <ReferenceInput source="rglarId" reference="rglarId" > <AutocompleteInput label="table.field.matnr.rglarId" optionText="code" filterToQuery={(val) => ({ code: val })} /> </ReferenceInput> </Grid> </Grid> </CustomTabPanel> </DialogContent> <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}> <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }} > rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx
@@ -20,8 +20,9 @@ useRecordContext, DeleteButton, } from 'react-admin'; import PropTypes from 'prop-types'; import { useWatch, useFormContext } from "react-hook-form"; import { Stack, Grid, Box, Typography } from '@mui/material'; import { Stack, Grid, Box, Typography, Tabs, Tab, } from '@mui/material'; import * as Common from '@/utils/common'; import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting'; import EditBaseAside from "@/page/components/EditBaseAside"; @@ -31,7 +32,6 @@ const FormToolbar = () => { const { getValues } = useFormContext(); return ( <Toolbar sx={{ justifyContent: 'space-between' }}> <SaveButton /> @@ -40,9 +40,51 @@ ) } function CustomTabPanel(props) { const { children, value, index, ...other } = props; return ( <div role="tabpanel" hidden={value !== index} id={`simple-tabpanel-${index}`} aria-labelledby={`simple-tab-${index}`} {...other} > {value === index && <Box sx={{ p: 3 }}>{children}</Box>} </div> ); } CustomTabPanel.propTypes = { children: PropTypes.node, index: PropTypes.number.isRequired, value: PropTypes.number.isRequired, }; function a11yProps(index) { return { id: `simple-tab-${index}`, 'aria-controls': `simple-tabpanel-${index}`, }; } const MatnrEdit = () => { const translate = useTranslate(); const [value, setValue] = React.useState(0); const handleChange = (event, newValue) => { setValue(newValue); }; const validateForm = (values) => { const errors = {}; if (!values.shipperId) { errors.shipperId = translate('form.matnr.shipper'); } if (!values.groupId) { errors.groupId = translate('form.matnr.groupId'); } return errors; }; return ( <Edit redirect="list" @@ -56,210 +98,232 @@ toolbar={<FormToolbar />} mode="onTouched" defaultValues={{}} validate={validateForm} // validate={(values) => { }} > <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}> <Grid item xs={12} md={8}> <Grid container width={{ xs: '20%', xl: '80%' }} rowSpacing={3} columnSpacing={3}> <Grid item xs={12} md={10}> <Typography variant="h6" gutterBottom> {translate('common.edit.title.main')} </Typography> <Stack direction='row' gap={2}> <TextInput label="table.field.matnr.name" source="name" parse={v => v} autoFocus /> </Stack> <Stack direction='row' gap={2}> <TextInput label="table.field.matnr.code" source="code" parse={v => v} /> </Stack> <Stack direction='row' gap={2}> <ReferenceInput source="shipperId" reference="shipper" perPage={REFERENCE_INPUT_PAGESIZE} > <AutocompleteInput label="table.field.matnr.shipperId" optionText="name" filterToQuery={(val) => ({ name: val })} /> </ReferenceInput> </Stack> <Stack direction='row' gap={2}> <ReferenceInput source="groupId" reference="matnrGroup" perPage={REFERENCE_INPUT_PAGESIZE} > <AutocompleteInput label="table.field.matnr.groupId" optionText="code" filterToQuery={(val) => ({ code: val })} /> </ReferenceInput> </Stack> <Stack direction='row' gap={2}> <ReferenceInput source="rglarId" reference="rglarId" perPage={REFERENCE_INPUT_PAGESIZE} > <AutocompleteInput label="table.field.matnr.rglarId" optionText="code" filterToQuery={(val) => ({ code: val })} /> </ReferenceInput> </Stack> <Stack direction='row' gap={2}> <TextInput label="table.field.matnr.erpCode" source="erpCode" parse={v => v} /> </Stack> <Stack direction='row' gap={2}> <TextInput label="table.field.matnr.spec" source="spec" parse={v => v} /> </Stack> <Stack direction='row' gap={2}> <TextInput label="table.field.matnr.model" source="model" parse={v => v} /> </Stack> <Stack direction='row' gap={2}> <NumberInput label="table.field.matnr.weight" source="weight" /> </Stack> <Stack direction='row' gap={2}> <TextInput label="table.field.matnr.color" source="color" parse={v => v} /> </Stack> <Stack direction='row' gap={2}> <TextInput label="table.field.matnr.size" source="size" parse={v => v} /> </Stack> <Stack direction='row' gap={2}> <TextInput label="table.field.matnr.describle" source="describle" parse={v => v} /> </Stack> <Stack direction='row' gap={2}> <NumberInput label="table.field.matnr.nromNum" source="nromNum" /> </Stack> <Stack direction='row' gap={2}> <TextInput label="table.field.matnr.unit" source="unit" parse={v => v} /> </Stack> <Stack direction='row' gap={2}> <TextInput label="table.field.matnr.purUnit" source="purUnit" parse={v => v} /> </Stack> <Stack direction='row' gap={2}> <TextInput label="table.field.matnr.stockUnit" source="stockUnit" parse={v => v} /> </Stack> <Stack direction='row' gap={2}> <SelectInput label="table.field.matnr.stockLevel" source="stockLevel" choices={[ { id: 0, name: ' A' }, { id: 1, name: ' B' }, { id: 2, name: 'C' }, ]} validate={required()} /> </Stack> <Stack direction='row' gap={2}> <SelectInput label="table.field.matnr.isLabelMange" source="isLabelMange" choices={[ { id: 0, name: ' 否' }, { id: 1, name: ' 是' }, ]} validate={required()} /> </Stack> <Stack direction='row' gap={2}> <NumberInput label="table.field.matnr.safeQty" source="safeQty" /> </Stack> <Stack direction='row' gap={2}> <NumberInput label="table.field.matnr.minQty" source="minQty" /> </Stack> <Stack direction='row' gap={2}> <NumberInput label="table.field.matnr.maxQty" source="maxQty" /> </Stack> <Stack direction='row' gap={2}> <NumberInput label="table.field.matnr.stagn" source="stagn" /> </Stack> <Stack direction='row' gap={2}> <NumberInput label="table.field.matnr.valid" source="valid" /> </Stack> <Stack direction='row' gap={2}> <NumberInput label="table.field.matnr.validWarn" source="validWarn" /> </Stack> <Stack direction='row' gap={2}> <NumberInput label="table.field.matnr.flagCheck" source="flagCheck" /> </Stack> <Tabs value={value} onChange={handleChange} aria-label="basic tabs example"> <Tab label={translate('page.matnr.title.basic')} {...a11yProps(0)} /> <Tab label={translate('page.matnr.title.control')} {...a11yProps(1)} /> <Tab label={translate('page.matnr.title.batchRole')} {...a11yProps(2)} /> </Tabs> <CustomTabPanel value={value} index={0}> <Grid container rowSpacing={2} columnSpacing={2}> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.name" source="name" parse={v => v} required autoFocus /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.code" source="code" required parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <ReferenceInput source="shipperId" reference="shipper" perPage={REFERENCE_INPUT_PAGESIZE} > <AutocompleteInput validate={[required()]} label="table.field.matnr.shipperId" optionText="name" filterToQuery={(val) => ({ name: val })} /> </ReferenceInput> </Grid> <Grid item xs={6} display="flex" gap={1}> <ReferenceInput source="groupId" reference="matnrGroup" perPage={REFERENCE_INPUT_PAGESIZE} > <AutocompleteInput label="table.field.matnr.groupId" optionText="code" validate={[required()]} filterToQuery={(val) => ({ code: val })} /> </ReferenceInput> </Grid> <Grid item xs={6} display="flex" gap={1}> <ReferenceInput source="rglarId" reference="rglarId" perPage={REFERENCE_INPUT_PAGESIZE} > <AutocompleteInput label="table.field.matnr.rglarId" optionText="code" filterToQuery={(val) => ({ code: val })} /> </ReferenceInput> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.erpCode" source="erpCode" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.spec" source="spec" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.weight" source="weight" /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.color" source="color" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.size" source="size" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.describle" source="describle" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.nromNum" source="nromNum" /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.unit" source="unit" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.purUnit" source="purUnit" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <TextInput label="table.field.matnr.stockUnit" source="stockUnit" parse={v => v} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <SelectInput label="table.field.matnr.stockLevel" source="stockLevel" choices={[ { id: 0, name: ' A' }, { id: 1, name: ' B' }, { id: 2, name: 'C' }, ]} validate={required()} /> </Grid> <Grid item xs={6} display="flex" gap={1}> <SelectInput label="table.field.matnr.isLabelMange" source="isLabelMange" choices={[ { id: 0, name: ' 否' }, { id: 1, name: ' 是' }, ]} validate={required()} /> </Grid> </Grid> </CustomTabPanel> <CustomTabPanel value={value} index={1}> <Grid container rowSpacing={2} columnSpacing={2}> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.safeQty" source="safeQty" /> </Grid> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.minQty" source="minQty" /> </Grid> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.maxQty" source="maxQty" /> </Grid> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.stagn" source="stagn" /> </Grid> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.validWarn" source="validWarn" /> </Grid> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.valid" source="valid" /> </Grid> </Grid> </CustomTabPanel> <CustomTabPanel value={value} index={2}> <Grid container rowSpacing={2} columnSpacing={2}> <Grid item xs={6} display="flex" gap={1}> <NumberInput label="table.field.matnr.flagCheck" source="flagCheck" /> </Grid> </Grid> </CustomTabPanel> </Grid> <Grid item xs={12} md={4}> <Grid item xs={12} md={2}> <Typography variant="h6" gutterBottom> {translate('common.edit.title.common')} </Typography> rsf-admin/src/page/basicInfo/matnr/MatnrListAside.jsx
@@ -18,13 +18,41 @@ const { setFilters } = useListContext(); // 获取列表上下文 const [selectedOption, setSelectedOption] = useState(null); const [treeData, setTreeData] = useState([]); const trees = [] const haveChildren = (item) => { // 如果 item 是一个数组,遍历数组中的每个元素 if (Array.isArray(item)) { return item.map((k) => haveChildren(k)); } // 如果 item 是一个对象 if (item && typeof item === 'object') { // 将 id 转换为字符串 if (item.id !== undefined) { item.id = item.id.toString(); } // 如果存在 children,递归处理 children if (item.children && Array.isArray(item.children)) { item.children = haveChildren(item.children); } } return item; }; useEffect(() => { request.post('/matnrGroup/tree') .then(res => { console.log('Tree Data:', res); if (res?.data?.code === 200) { setTreeData(res.data.data); let data = res.data.data; // for (let k of data) { // k.id = k.id.toString(); // } let items = haveChildren(data) setTreeData(items) console.log('Tree Data:', items); } else { notify(res.data.msg); } @@ -32,10 +60,10 @@ .catch(error => { notify('Error fetching tree data'); }); },[]); }, []); @@ -79,7 +107,7 @@ // 在这里可以根据 nodeId 更新主内容区域 }; const handleSearch = () => { console.log('Search Input:', selectedOption); console.log('Search Input:', selectedOption); }; @@ -114,12 +142,12 @@ > <CardContent> <SavedQueriesList icon={<BookmarkIcon />} /> <FilterLiveSearch source="condition" /> <FilterLiveSearch source="condition" /> <RichTreeView defaultExpandedItems={['grid', 'pickers']} expansionTrigger="iconContainer" items={ treeData } slots={ CustomTreeItem } items={treeData} slots={CustomTreeItem} onItemClick={handleNodeSelect} // 监听节点点击事件 /> rsf-admin/src/page/basicInfo/warehouse/WarehouseCreate.jsx
@@ -88,6 +88,7 @@ <TextInput label="table.field.warehouse.name" source="name" required parse={v => v} autoFocus /> @@ -103,6 +104,7 @@ <TextInput label="table.field.warehouse.factory" source="factory" required parse={v => v} /> </Grid> @@ -110,6 +112,7 @@ <TextInput label="table.field.warehouse.address" source="address" required parse={v => v} /> </Grid>