From e254ada588f047fc137484343ca03361e55dff6b Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期一, 03 三月 2025 10:27:17 +0800 Subject: [PATCH] Merge branch 'dev' of http://47.97.1.152:5880/r/wms-master into dev --- rsf-admin/src/page/basicInfo/whMat/index.jsx | 15 + rsf-admin/src/page/basicInfo/whMat/mySearchInput.jsx | 21 + rsf-admin/src/page/basicInfo/whMat/WhMatList.jsx | 237 ++++++++++++++++++ rsf-admin/src/page/basicInfo/whMat/whMatCreate.jsx | 327 +++++++++++++++++++++++++ rsf-admin/src/i18n/zh.js | 10 rsf-admin/src/i18n/en.js | 8 rsf-admin/src/page/ResourceContent.js | 3 rsf-admin/src/page/basicInfo/whMat/WhMatListAside.jsx | 86 ++++++ rsf-admin/src/page/basicInfo/whMat/warehouse.jsx | 34 ++ rsf-admin/src/page/loc/LocList.jsx | 2 10 files changed, 738 insertions(+), 5 deletions(-) diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js index 78925e2..6d08aaa 100644 --- a/rsf-admin/src/i18n/en.js +++ b/rsf-admin/src/i18n/en.js @@ -135,7 +135,7 @@ companys: 'Companys', serialRuleItem: 'SerialRuleItem', serialRule: 'SerialRule', - + whMat: 'Warehouse Mat', }, table: { field: { @@ -450,7 +450,11 @@ batchRole: 'batch role', } }, - + whMat: { + title: { + add: 'add', + } + }, }, form: { matnr: { diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js index 071f90f..c33f935 100644 --- a/rsf-admin/src/i18n/zh.js +++ b/rsf-admin/src/i18n/zh.js @@ -135,7 +135,7 @@ companys: '寰�鏉ヤ紒涓�', serialRuleItem: '缂栫爜瑙勫垯瀛愯〃', serialRule: '缂栫爜瑙勫垯', - + whMat: '搴撳尯鐗╂枡鍏崇郴', }, table: { field: { @@ -388,6 +388,7 @@ currValue: "褰撳墠娴佹按鍙�", lastCode: "鏈�杩戠敓鎴愮紪鐮�", }, + } }, page: { @@ -450,7 +451,12 @@ control: '鎺у埗灞炴��', batchRole: '鎵规瑙勫垯', } - } + }, + whMat: { + title: { + add: '娣诲姞', + } + }, }, form: { matnr: { diff --git a/rsf-admin/src/page/ResourceContent.js b/rsf-admin/src/page/ResourceContent.js index 5a97f65..d8753d0 100644 --- a/rsf-admin/src/page/ResourceContent.js +++ b/rsf-admin/src/page/ResourceContent.js @@ -26,6 +26,7 @@ import companys from './basicInfo/companys'; import serialRuleItem from './serialRuleItem'; import serialRule from './serialRule'; +import whMat from './basicInfo/whMat'; const ResourceContent = (node) => { @@ -74,6 +75,8 @@ return serialRuleItem; case 'serialRule': return serialRule; + case 'whMat': + return whMat; default: return { list: ListGuesser, diff --git a/rsf-admin/src/page/basicInfo/whMat/WhMatList.jsx b/rsf-admin/src/page/basicInfo/whMat/WhMatList.jsx new file mode 100644 index 0000000..1085ed2 --- /dev/null +++ b/rsf-admin/src/page/basicInfo/whMat/WhMatList.jsx @@ -0,0 +1,237 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { Box, Card, CardContent, LinearProgress, TextField, Button, Typography } from "@mui/material"; +import * as Icons from '@mui/icons-material'; +import { List, useTranslate, useListContext, Title, } from "react-admin"; +import WhMatListAside from "./WhMatListAside"; +import { RichTreeView } from "@mui/x-tree-view/RichTreeView"; +import { TreeItem2 } from "@mui/x-tree-view/TreeItem2"; +import request from '@/utils/request'; +import { Add, Edit, Delete, Padding, Save } from '@mui/icons-material'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; +import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; +import RefreshIcon from '@mui/icons-material/Refresh'; +import { useTreeItem2Utils } from '@mui/x-tree-view/hooks'; +import WhMatCreate from "./whMatCreate"; + +// const RESOURCE = 'dept'; +const TITLE = 'menu.whMat'; + +const WhMatListContent = () => { + const translate = useTranslate(); + const [searchVal, setSearchVal] = useState(''); + const [createDialog, setCreateDialog] = React.useState(false); + const [editRecord, setEditRecord] = React.useState(null); + const treeData = [ + { + id: '19', + label: '鍗婃垚鍝�', + secondaryLabel: 'RM001', + editable: true, + children: [ + { + id: 'grid-community', primaryText: '鍗婃垚鍝�', + secondaryText: 'RM001', label: '@mui/x-data-grid', editable: true, children: [ + { + id: 'grid-community22', primaryText: '鍗婃垚鍝�', + secondaryText: 'RM001', label: '@mui/x-data-grid', editable: true + },] + }, + { + id: 'grid-pro', primaryText: '鍗婃垚鍝�', + secondaryText: 'RM001', label: '@mui/x-data-grid-pro', editable: true + }, + { + id: 'grid-premium', primaryText: '鍗婃垚鍝�', + secondaryText: 'RM001', label: '@mui/x-data-grid-premium', editable: true + }, + ], + }, + { + id: '18', + label: '鍘熸潗鏂�', + primaryText: '鍗婃垚鍝�', + secondaryText: 'RM001', + }, + { + id: 'charts', + label: 'Charts', + primaryText: '鍗婃垚鍝�', + secondaryText: 'RM001', + children: [{ + id: 'charts-community', primaryText: '鍗婃垚鍝�', + secondaryText: 'RM001', label: '@mui/x-charts' + }], + }, + { + id: 'tree-view', + label: 'Tree View', + primaryText: '鍗婃垚鍝�', + secondaryLabel: 'RM001', + children: [{ + id: 'tree-view-community', primaryText: '鍗婃垚鍝�', + secondaryText: 'RM001', label: '@mui/x-tree-view' + }], + }, + { + id: 'tree-view2', + label: 'Tree View3', + primaryText: '鍗婃垚鍝�', + secondaryText: 'RM001', + children: [{ + id: 'tree-view-community1', primaryText: '鍗婃垚鍝�', + secondaryText: 'RM001', label: '@mui/x-tree-view' + }], + }, + ]; + const handleNodeSelect = (event, nodeId) => { + console.log('Selected Node ID:', nodeId); + // 鍦ㄨ繖閲屽彲浠ユ牴鎹� nodeId 鏇存柊涓诲唴瀹瑰尯鍩� + }; + const handleSearch = () => { + console.log('Search Input:', selectedOption); + }; + + + const CustomCheckbox = React.forwardRef(function CustomCheckbox(props, ref) { + return <input type="checkbox" ref={ref} {...props} />; + }); + function CustomLabel({ children, className, secondaryLabel }) { + return ( + <Box display={"flex"} alignItems={"end"}> + <Typography fontWeight={500}>{children}</Typography> + <Box width={10}></Box> + {secondaryLabel && ( + <Typography variant="caption" color="secondary"> + {secondaryLabel} + </Typography> + )} + </Box> + ); + } + const CustomTreeItem = React.forwardRef(function CustomTreeItem(props, ref) { + const { publicAPI } = useTreeItem2Utils({ + itemId: props.itemId, + children: props.children, + }); + + const item = publicAPI.getItem(props.itemId); + + return ( + <TreeItem2 + {...props} + ref={ref} + slots={{ + label: CustomLabel, + }} + slotProps={{ + label: { secondaryLabel: item?.secondaryLabel || '' }, + }} + + /> + ); + }); + + const isLoading = false; + + React.useEffect(() => { + request.post('/matnrGroup/tree', {}) + .then(res => { + if (res?.data?.code === 200) { + let data = res.data.data; + console.log(data); + + } else { + notify(res.data.msg); + } + }) + .catch(error => { + notify('Error fetching tree data'); + }); + }, [searchVal]) + + const handleAdd = () => { + setCreateDialog(true); + }; + + return ( + <> + <Box sx={{ mt: 1, mr: 3, display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}> + <WhMatCreate + editRecord={editRecord} + open={createDialog} + setOpen={setCreateDialog} + /> + <Box + width={300} + mb={1} + > + <TextField + label={translate('ra.action.search')} + value={searchVal} + onChange={(e) => handleInput(e.target.value)} + /> + </Box> + <Box> + <Button + variant="outlined" + color="primary" + startIcon={<Add />} + onClick={handleAdd} + > + {translate('ra.action.add')} + </Button> + <Button + variant="outlined" + color="error" + startIcon={<Delete />} + sx={{ ml: 1 }} + > + {translate('ra.action.delete')} + </Button> + <Button + variant="outlined" + color="primary" + sx={{ ml: 1 }} + startIcon={<Save />} + > + {translate('ra.action.save')} + </Button> + </Box> + </Box> + + <Card> + <CardContent> + <RichTreeView + defaultExpandedItems={['grid', 'pickers']} + checkboxSelection + items={treeData} + slots={{ item: CustomTreeItem }} + onItemClick={handleNodeSelect} // 鐩戝惉鑺傜偣鐐瑰嚮浜嬩欢 + /> + </CardContent> + </Card> + </> + ) +} + +const WhMatList = () => { + const translate = useTranslate(); + return ( + <> + <Box sx={{ + display: 'flex', + marginBottom: 24 + }}> + <Title title={TITLE} /> + <Box> + <WhMatListAside /> + </Box> + <Box sx={{ flexGrow: 1 }}> + <WhMatListContent /> + </Box> + </Box> + </> + + ) +} +export default WhMatList; \ No newline at end of file diff --git a/rsf-admin/src/page/basicInfo/whMat/WhMatListAside.jsx b/rsf-admin/src/page/basicInfo/whMat/WhMatListAside.jsx new file mode 100644 index 0000000..fc0c510 --- /dev/null +++ b/rsf-admin/src/page/basicInfo/whMat/WhMatListAside.jsx @@ -0,0 +1,86 @@ +import React, { useState, useRef, useEffect, useMemo, useCallback } from "react"; +import { Card, useTheme, List, CardContent, Input, InputAdornment, IconButton, TextField } from "@mui/material"; +import { useForm } from 'react-hook-form'; +import Warehouse from "./warehouse"; +import { Filter, SearchInput, useListContext,useTranslate } from 'react-admin'; +import request from '@/utils/request'; + +const WhMatListAside = () => { + const theme = useTheme(); + const translate = useTranslate(); + const [searchVal, setSearchVal] = useState(''); + const { control, getValues } = useForm(); + const [map, setMap] = useState([ + { + id: 1, + name: '浠撳簱1', + code: 'WH1', + icon: 'Warehouse', + locCount: 350, + }, + { + id: 2, + name: '浠撳簱2', + code: 'WH1', + icon: 'Warehouse', + locCount: 237, + }, + { + id: 3, + name: '浠撳簱3', + code: 'WH1', + icon: 'Warehouse', + locCount: 590, + } + ]); + + const handleInput = (value) => { + console.log(value); + setSearchVal(value); + } + React.useEffect(() => { + request.post('/matnrGroup/tree', {}) + .then(res => { + if (res?.data?.code === 200) { + let data = res.data.data; + console.log(data); + + } else { + notify(res.data.msg); + } + }) + .catch(error => { + notify('Error fetching tree data'); + }); + }, [searchVal]) + + return ( + <Card + sx={{ + order: -1, + mr: 2, + mt: 4, + width: 250 + }} + > + <CardContent> + <div> + <TextField + label={translate('ra.action.search')} + value={searchVal} + onChange={(e) => handleInput(e.target.value)} + + /> + </div> + <List> + {map.map(record => ( + <Warehouse key={record.id} record={record} /> + ))} + </List> + </CardContent> + + </Card> + ) +} + +export default WhMatListAside; \ No newline at end of file diff --git a/rsf-admin/src/page/basicInfo/whMat/index.jsx b/rsf-admin/src/page/basicInfo/whMat/index.jsx new file mode 100644 index 0000000..c8034ce --- /dev/null +++ b/rsf-admin/src/page/basicInfo/whMat/index.jsx @@ -0,0 +1,15 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + ListGuesser, + EditGuesser, + ShowGuesser, +} from "react-admin"; + +import WhMatList from "./WhMatList"; + +export default { + list: WhMatList, + recordRepresentation: (record) => { + return `${record.name}` + } +}; \ No newline at end of file diff --git a/rsf-admin/src/page/basicInfo/whMat/mySearchInput.jsx b/rsf-admin/src/page/basicInfo/whMat/mySearchInput.jsx new file mode 100644 index 0000000..92e46b1 --- /dev/null +++ b/rsf-admin/src/page/basicInfo/whMat/mySearchInput.jsx @@ -0,0 +1,21 @@ +import React, { useState, useRef, useEffect, useMemo, useCallback } from "react"; +import { Card, useTheme, List, CardContent, Input, InputAdornment, IconButton, TextField } from "@mui/material"; +import { useForm } from 'react-hook-form'; +import Warehouse from "./warehouse"; +import { Filter, SearchInput } from 'react-admin'; + + +export const MySearchInput = (props) => { + const [searchTerm, setSearchTerm] = useState(''); + + return ( + <> + <TextField + label="Search" + value={searchTerm} + onChange={(e) => setSearchTerm(e.target.value)} + /> + {/* <Button onClick={handleSearch}>Search</Button> */} + </> + ) +} \ No newline at end of file diff --git a/rsf-admin/src/page/basicInfo/whMat/warehouse.jsx b/rsf-admin/src/page/basicInfo/whMat/warehouse.jsx new file mode 100644 index 0000000..25494bc --- /dev/null +++ b/rsf-admin/src/page/basicInfo/whMat/warehouse.jsx @@ -0,0 +1,34 @@ +import { ListItem, ListItemIcon, ListItemText, ListItemButton, Box, ListItemSecondaryAction } from "@mui/material"; +import React, { useState, useRef, useEffect, useMemo } from "react"; +import * as Icons from '@mui/icons-material'; + +const Warehouse = (props) => { + const { record } = props; + const IconComponent = Icons[record.icon]; + return ( + <Box sx={{padding: '5px'}}> + <ListItem disablePadding> + <ListItemButton > + <ListItemIcon sx={{ minWidth: '30px' }}> + <IconComponent /> + </ListItemIcon> + <ListItemText primary={record.name} /> + <ListItemSecondaryAction> + <Box + component="span" + sx={{ + marginRight: '1em', + color: 'text.primary', + }} + > + {record.locCount} + </Box> + </ListItemSecondaryAction> + </ListItemButton> + </ListItem> + </Box> + ) +} + + +export default Warehouse; \ No newline at end of file diff --git a/rsf-admin/src/page/basicInfo/whMat/whMatCreate.jsx b/rsf-admin/src/page/basicInfo/whMat/whMatCreate.jsx new file mode 100644 index 0000000..9276214 --- /dev/null +++ b/rsf-admin/src/page/basicInfo/whMat/whMatCreate.jsx @@ -0,0 +1,327 @@ +import React, { useState, useRef, useEffect, useMemo } from "react"; +import { + CreateBase, + Form, + useTranslate, + Toolbar, + SaveButton, + TextInput, + required, + NumberInput, +} from 'react-admin'; +import { + Dialog, + DialogActions, + DialogContent, + DialogTitle, + Stack, + Grid, + Box, + TableRow, + IconButton, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + Paper, + Checkbox +} from '@mui/material'; +import DialogCloseButton from "@/page/components/DialogCloseButton"; +import { styled } from '@mui/material/styles'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; +import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; + + +const columns = [ + { + id: 'checkbox', + label: 1, + align: 'center', + minWidth: 50, + }, + { + id: 'name', + label: 'table.field.dept.name', + minWidth: 170, + }, + { + id: 'fullName', + label: 'table.field.dept.fullName', + minWidth: 170, + }, + { + id: 'leader', + label: 'table.field.dept.leader', + minWidth: 170, + }, + { + id: 'updateTime', + label: 'common.field.updateTime', + minWidth: 170, + format: (val) => { + return new Date(val).toLocaleString(); + } + }, +]; + +const WhMatCreate = (props) => { + const translate = useTranslate(); + const { editRecord, open, setOpen, callback, resource } = props; + + const handleClose = (event, reason) => { + if (reason !== "backdropClick") { + setOpen(false); + } + }; + + const onSubmit = (data) => { + const _params = { ...data }; + }; + + return ( + <> + <CreateBase> + <Dialog + open={open} + onClose={handleClose} + aria-labelledby="form-dialog-title" + fullWidth + disableRestoreFocus + maxWidth="lg" // 'xs' | 'sm' | 'md' | 'lg' | 'xl' + > + <Form record={editRecord} onSubmit={onSubmit}> + <DialogTitle id="form-dialog-title" sx={{ + position: 'sticky', + top: 0, + backgroundColor: 'background.paper', + zIndex: 1000 + }} + > + {editRecord ? translate('update.title') : translate('create.title')} + <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}> + <DialogCloseButton onClose={handleClose} /> + </Box> + </DialogTitle> + <DialogContent sx={{ mt: 2 }}> + <WhMatCreateContent /> + </DialogContent> + <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}> + <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }} > + <SaveButton /> + </Toolbar> + </DialogActions> + </Form> + </Dialog> + </CreateBase> + </> + ); +}; +const StyledTableRow = styled(TableRow)(({ theme }) => ({ + '& .MuiButtonBase-root': { + padding: '0px 8px' + } +})); + +const StyledTableCell = styled(TableCell)(({ theme }) => ({ + overflow: 'hidden', + textOverflow: 'ellipsis', + whiteSpace: 'nowrap', + maxWidth: 600, +})); + +const TreeTableRow = (props) => { + const { row, depth = 0, openNodes, setOpenNodes, onEdit, onDelete } = props; + const isOpen = openNodes[row.id] || false; + const [checked, setChecked] = useState(false); + const toggleNode = (id) => { + setOpenNodes(prevState => ({ ...prevState, [id]: !prevState[id] })); + }; + return ( + <React.Fragment> + <StyledTableRow hover tabIndex={-1} key={row.id}> + <StyledTableCell sx={{ padding: 0, width: 60 }}> + {row.children && ( + <IconButton + aria-label="expand row" + size="small" + style={{ paddingLeft: (depth * 16) }} + onClick={() => toggleNode(row.id)} + > + {isOpen ? <KeyboardArrowDownIcon /> : <KeyboardArrowRightIcon />} + </IconButton> + )} + </StyledTableCell> + <StyledTableCell key="checkbox" align="center" style={{ paddingLeft: (depth * 16 + 16) }}> + <Checkbox + checked={row.checked} + onChange={() => {row.checked = !row.checked;}} + /> + </StyledTableCell> + {columns.map((column, idx) => { + if (column.id !== 'actions' && column.id !== 'checkbox') { + const value = row[column.id]; + return ( + <> + <StyledTableCell + key={column.id} + align={column.align || 'left'} + style={{ paddingLeft: idx === 0 && (depth * 16 + 16) }} + onClick={() => toggleNode(row.id)} + > + {column.format ? column.format(value) : value} + </StyledTableCell> + </> + + ) + } + })} + {/* <StyledTableCell> + <Tooltip title="Edit"> + <IconButton onClick={() => onEdit(row)}> + <Edit /> + </IconButton> + </Tooltip> + <Tooltip title="Delete"> + <IconButton onClick={() => onDelete(row)}> + <Delete /> + </IconButton> + </Tooltip> + </StyledTableCell> */} + </StyledTableRow> + {row.children && isOpen && ( + row.children.map((child) => ( + <TreeTableRow + key={child.id} + row={child} + depth={depth + 1} + openNodes={openNodes} + setOpenNodes={setOpenNodes} + /> + )) + )} + </React.Fragment> + ); +}; + +const WhMatCreateContent = (props) => { + const translate = useTranslate(); + const [treeData, setTreeData] = useState([ + { + id: 1, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, checked: false, children: [ + { + id: 29, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: [ + { id: 30, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 31, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 32, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 33, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 34, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 35, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + ] + }, + { id: 24, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 25, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 26, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 27, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 28, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + + ] + }, + { id: 2, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 3, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 4, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 5, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 6, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 7, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 8, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 9, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 10, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 11, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 12, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 13, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 14, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 15, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 16, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 17, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 18, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 19, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 20, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 21, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 22, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + { id: 23, name: 'root', fullName: '鏍硅妭鐐�', leader: 'admin', sort: 1, children: null }, + + + ]); + const [openNodes, setOpenNodes] = React.useState({}); + + return ( + <> + <Grid container rowSpacing={2} columnSpacing={2}> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.dept.name" + source="name" + parse={v => v} + validate={required()} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.dept.fullName" + source="fullName" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <TextInput + label="table.field.dept.leader" + source="leader" + parse={v => v} + /> + </Grid> + <Grid item xs={6} display="flex" gap={1}> + <NumberInput + label="table.field.dept.sort" + source="sort" + /> + </Grid> + + </Grid> + <TableContainer component={Paper}> + <Table size="small"> + <TableHead> + <TableRow> + <StyledTableCell sx={{ padding: 0, width: 60 }} /> + {columns.map((column, idx) => ( + <StyledTableCell + key={idx} + align={column.align || 'left'} + style={{ + minWidth: column.minWidth + }} + > + {typeof column.label === 'string' ? translate(column.label) : <Checkbox />} + </StyledTableCell> + ))} + </TableRow> + </TableHead> + <TableBody> + {treeData && treeData.length > 0 && ( + treeData.map((row) => ( + <TreeTableRow + key={row.id} + row={row} + openNodes={openNodes} + setOpenNodes={setOpenNodes} + /> + )) + )} + </TableBody> + </Table> + </TableContainer> + </> + + ); +}; + +export default WhMatCreate; \ No newline at end of file diff --git a/rsf-admin/src/page/loc/LocList.jsx b/rsf-admin/src/page/loc/LocList.jsx index cb58548..1392d7d 100644 --- a/rsf-admin/src/page/loc/LocList.jsx +++ b/rsf-admin/src/page/loc/LocList.jsx @@ -134,7 +134,7 @@ omit={['id', 'createTime', 'createBy', 'memo']} > <NumberField source="id" /> - <NumberField source="warehouseId$" label="table.field.loc.warehouseId" />, + <NumberField source="warehouseId$" label="table.field.loc.warehouseId" /> <NumberField source="areaId$" label="table.field.loc.areaId" /> <TextField source="code" label="table.field.loc.code" /> <TextField source="type" label="table.field.loc.type" /> -- Gitblit v1.9.1