rsf-admin/src/page/basicInfo/loc/LocList.jsx | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
rsf-admin/src/page/basicInfo/loc/LocListAside.jsx | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
rsf-admin/src/page/basicInfo/loc/LocList.jsx
@@ -55,6 +55,8 @@ import request from '@/utils/request'; import DiscountIcon from '@mui/icons-material/Discount'; import LinkIcon from '@mui/icons-material/Link'; import InitModal from "./InitModal"; import LocListAside from "./LocListAside"; const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ '& .css-1vooibu-MuiSvgIcon-root': { @@ -139,7 +141,7 @@ const [createDialog, setCreateDialog] = useState(false); const [drawerVal, setDrawerVal] = useState(false); const [initDialog, setInitDialog] = useState(false); return ( <Box display="flex"> @@ -153,7 +155,33 @@ marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0, }} title={"menu.loc"} empty={<EmptyData onClick={() => { setCreateDialog(true) }} />} empty={<EmptyData children={ <Box sx={{ gap: 2, display: 'flex' }}> <Button variant="contained" color="primary" sx={{ fontSize: '1em', mt: 2 }} onClick={() => { setCreateDialog(true) }}> {translate('create.empty.button')} </Button> <Button variant="contained" color="primary" sx={{ fontSize: '1em', mt: 2 }} onClick={() => { setInitDialog(true) }}> {translate('toolbar.locInit')} </Button> </Box> } onClick={() => { }} />} filters={filters} sort={{ field: "create_time", order: "desc" }} actions={( @@ -166,6 +194,7 @@ </TopToolbar> )} perPage={DEFAULT_PAGE_SIZE} aside={<LocListAside />} > <StyledDatagrid preferenceKey='loc' @@ -232,6 +261,11 @@ setDrawerVal={setDrawerVal} > </PageDrawer> <InitModal open={initDialog} setOpen={setInitDialog} /> </Box> ) } @@ -272,6 +306,7 @@ const [createDialog, setCreateDialog] = useState(false); return ( <> <Button onClick={() => setCreateDialog(true)} label={"toolbar.batch"}> rsf-admin/src/page/basicInfo/loc/LocListAside.jsx
New file @@ -0,0 +1,125 @@ import React, { useState, useRef, useEffect, useMemo, useCallback } from "react"; import request from '@/utils/request'; import { SavedQueriesList, FilterLiveSearch, useNotify, useListContext, SearchInput } from 'react-admin'; import BookmarkIcon from '@mui/icons-material/BookmarkBorder'; import { Box, Typography, Card, CardContent, useTheme, Input } from '@mui/material'; import { RichTreeView } from "@mui/x-tree-view/RichTreeView"; import { TreeItem2 } from "@mui/x-tree-view/TreeItem2"; import { useTreeViewApiRef } from '@mui/x-tree-view/hooks'; const LocListAside = () => { const theme = useTheme(); const notify = useNotify(); const { setFilters } = useListContext(); // 获取列表上下文 const [selectedOption, setSelectedOption] = useState(null); const [treeData, setTreeData] = useState([]); const [defaultIds, setDefaultIds] = useState(['65']); const [condition, setCondition] = useState(''); const haveChildren = (item) => { if (Array.isArray(item)) { return item.map((k) => haveChildren(k)); } if (item && typeof item === 'object') { if (item.id !== undefined) { item.id = item.id.toString(); } if (item.children && Array.isArray(item.children)) { item.children = haveChildren(item.children); } } return item; }; useEffect(() => { http() }, [condition]); const http = () => { request.post('/matnrGroup/tree', { condition }) .then(res => { if (res?.data?.code === 200) { let data = res.data.data; let items = haveChildren(data) setTreeData(items) setDefaultIds([items.at(0).id]) } else { notify(res.data.msg); } }) .catch(error => { notify('Error fetching tree data'); }); } const handleNodeSelect = (event, nodeId) => { console.log(nodeId); // setFilters({ groupId: nodeId }); }; const handleSearch = (e) => { setCondition(e.target.value) }; const apiRef = useTreeViewApiRef(); const CustomCheckbox = React.forwardRef(function CustomCheckbox(props, ref) { return <input type="checkbox" ref={ref} {...props} />; }); const CustomTreeItem = React.forwardRef(function CustomTreeItem(props, ref) { return ( <TreeItem2 {...props} ref={ref} slots={{ checkbox: CustomCheckbox, }} /> ); }); return ( <Card sx={{ order: -1, mr: 2, mt: 8, alignSelf: 'flex-start', border: theme.palette.mode === 'light' && '1px solid #e0e0e3', width: 250, minWidth: 150, height: `100%`, }} > <CardContent> {/* <Input placeholder="搜索库位" sx={{ '--Input-focused': 1, marginBottom: '10px' }} onChange={handleSearch} /> */} <RichTreeView defaultExpandedItems={defaultIds} expansionTrigger="iconContainer" items={treeData} slots={CustomTreeItem} apiRef={apiRef} onItemClick={handleNodeSelect} // 监听节点点击事件 /> </CardContent> </Card> ) } export default LocListAside; rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx
@@ -196,7 +196,7 @@ <NumberField key="stagn" source="stagn" label="table.field.matnr.stagn" />, <NumberField key="valid" source="valid" label="table.field.matnr.valid" />, <NumberField key="validWarn" source="validWarn" label="table.field.matnr.validWarn" />, <NumberField key="flagCheck" source="flagCheck" label="table.field.matnr.flagCheck" />, <BooleanField key="flagCheck" source="flagCheck" label="table.field.matnr.flagCheck" sortable={false} />, <ReferenceField key="updateBy" source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}> <TextField source="nickname" /> </ReferenceField>,