From 7a33c97d5741a5d8813035ccde1fa801ec30a179 Mon Sep 17 00:00:00 2001 From: verou <857149855@qq.com> Date: 星期二, 25 三月 2025 13:51:43 +0800 Subject: [PATCH] fix:input disabled不能更新bug --- rsf-admin/src/page/warehouseAreas/WarehouseAreasList.jsx | 36 ++++++ rsf-admin/src/page/warehouseAreas/BatchModal.jsx | 149 +++++++++++++++++++++++++++++ rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupEdit.jsx | 8 rsf-admin/src/page/asnOrder/AsnWareModal.jsx | 10 ++ rsf-admin/src/page/system/role/AssignPermissions.jsx | 28 ++++- rsf-admin/src/page/basicInfo/loc/LocList.jsx | 28 +++++ 6 files changed, 244 insertions(+), 15 deletions(-) diff --git a/rsf-admin/src/page/asnOrder/AsnWareModal.jsx b/rsf-admin/src/page/asnOrder/AsnWareModal.jsx index 41750a4..52e92f7 100644 --- a/rsf-admin/src/page/asnOrder/AsnWareModal.jsx +++ b/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 }}> diff --git a/rsf-admin/src/page/basicInfo/loc/LocList.jsx b/rsf-admin/src/page/basicInfo/loc/LocList.jsx index 449dc0f..0d2f8e5 100644 --- a/rsf-admin/src/page/basicInfo/loc/LocList.jsx +++ b/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" />, diff --git a/rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupEdit.jsx b/rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupEdit.jsx index b2d9744..9a9b31b 100644 --- a/rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupEdit.jsx +++ b/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; diff --git a/rsf-admin/src/page/system/role/AssignPermissions.jsx b/rsf-admin/src/page/system/role/AssignPermissions.jsx index a70bc66..d9fd08b 100644 --- a/rsf-admin/src/page/system/role/AssignPermissions.jsx +++ b/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> diff --git a/rsf-admin/src/page/warehouseAreas/BatchModal.jsx b/rsf-admin/src/page/warehouseAreas/BatchModal.jsx new file mode 100644 index 0000000..34ebb10 --- /dev/null +++ b/rsf-admin/src/page/warehouseAreas/BatchModal.jsx @@ -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; \ No newline at end of file diff --git a/rsf-admin/src/page/warehouseAreas/WarehouseAreasList.jsx b/rsf-admin/src/page/warehouseAreas/WarehouseAreasList.jsx index ea777c0..a44e1fb 100644 --- a/rsf-admin/src/page/warehouseAreas/WarehouseAreasList.jsx +++ b/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} + /> + </> + + ) +} -- Gitblit v1.9.1