From d6b25d39193f9ad8d3e5cebf5f6b77f1813bd971 Mon Sep 17 00:00:00 2001
From: verou <857149855@qq.com>
Date: 星期三, 26 三月 2025 09:50:16 +0800
Subject: [PATCH] 11

---
 rsf-admin/src/page/basicInfo/loc/LocListAside.jsx |  125 +++++++++++++++++++++++++++++++++++++++++
 rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx  |    2 
 rsf-admin/src/page/basicInfo/loc/LocList.jsx      |   39 ++++++++++++
 3 files changed, 163 insertions(+), 3 deletions(-)

diff --git a/rsf-admin/src/page/basicInfo/loc/LocList.jsx b/rsf-admin/src/page/basicInfo/loc/LocList.jsx
index 0d2f8e5..af7f744 100644
--- a/rsf-admin/src/page/basicInfo/loc/LocList.jsx
+++ b/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"}>
diff --git a/rsf-admin/src/page/basicInfo/loc/LocListAside.jsx b/rsf-admin/src/page/basicInfo/loc/LocListAside.jsx
new file mode 100644
index 0000000..72a68da
--- /dev/null
+++ b/rsf-admin/src/page/basicInfo/loc/LocListAside.jsx
@@ -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;
diff --git a/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx
index 6bfc5ee..2a7d658 100644
--- a/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx
+++ b/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>,

--
Gitblit v1.9.1