From 7a671b62b0a1388c9933a0d9bd698a6eb8b048ed Mon Sep 17 00:00:00 2001 From: whycq <913841844@qq.com> Date: 星期一, 24 二月 2025 14:45:54 +0800 Subject: [PATCH] # --- rsf-admin/src/page/basicInfo/matnr/MatnrListAside.jsx | 46 ++ rsf-admin/src/page/basicInfo/warehouse/WarehouseCreate.jsx | 3 rsf-admin/src/i18n/zh.js | 15 rsf-admin/src/i18n/en.js | 14 rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx | 465 +++++++++++++++----------- rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx | 464 +++++++++++++++----------- 6 files changed, 603 insertions(+), 404 deletions(-) diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js index 0d2fe64..634a934 100644 --- a/rsf-admin/src/i18n/en.js +++ b/rsf-admin/src/i18n/en.js @@ -417,6 +417,20 @@ }, }, }, + matnr: { + title: { + basic: 'basic info', + control: 'control', + batchRole: 'batch role', + } + }, + + }, + form: { + matnr: { + shipper: 'shipper is required', + groupId: 'groupId is required', + } } }; diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js index de93393..afff7b2 100644 --- a/rsf-admin/src/i18n/zh.js +++ b/rsf-admin/src/i18n/zh.js @@ -1,3 +1,4 @@ +import { s } from "motion/react-client"; import chineseMessages from "./core/chineseMessages"; const customChineseMessages = { @@ -429,6 +430,20 @@ }, }, }, + matnr: { + title: { + basic: '鍩虹灞炴��', + control: '鎺у埗灞炴��', + batchRole: '鎵规瑙勫垯', + } + } + }, + form: { + matnr: { + name: '鐗╂枡鍚嶇О涓嶈兘涓虹┖', + shipper: '璐т富涓嶈兘涓虹┖', + groupId: '鍒嗙粍涓嶈兘涓虹┖', + } } }; diff --git a/rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx index 7d92209..6e5f23e 100644 --- a/rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx +++ b/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' }} > diff --git a/rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx index 49e84ab..d90d6ff 100644 --- a/rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx +++ b/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> diff --git a/rsf-admin/src/page/basicInfo/matnr/MatnrListAside.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrListAside.jsx index d61f6a8..5246f3a 100644 --- a/rsf-admin/src/page/basicInfo/matnr/MatnrListAside.jsx +++ b/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} // 鐩戝惉鑺傜偣鐐瑰嚮浜嬩欢 /> diff --git a/rsf-admin/src/page/basicInfo/warehouse/WarehouseCreate.jsx b/rsf-admin/src/page/basicInfo/warehouse/WarehouseCreate.jsx index b2127b6..5b87ef9 100644 --- a/rsf-admin/src/page/basicInfo/warehouse/WarehouseCreate.jsx +++ b/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> -- Gitblit v1.9.1