From 65953b12f9d667c54049c34050d39bf90556585c Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期五, 21 二月 2025 17:08:39 +0800
Subject: [PATCH] Merge branch 'dev' of http://47.97.1.152:5880/r/wms-master into dev
---
rsf-admin/src/page/basicInfo/warehouse/WarehouseList.jsx | 10
rsf-admin/src/page/basicInfo/matnr/MatnrListAside.jsx | 40 ++
rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupPanel.jsx | 2
rsf-admin/src/page/basicInfo/warehouse/WarehousePanel.jsx | 2
rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx | 6
rsf-admin/src/page/basicInfo/shipper/index.jsx | 0
rsf-admin/src/page/basicInfo/warehouse/index.jsx | 0
rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupEdit.jsx | 181 ++++++++++++
rsf-admin/src/page/basicInfo/shipper/ShipperEdit.jsx | 8
rsf-admin/src/page/basicInfo/matnr/MatnrPanel.jsx | 2
rsf-admin/src/page/basicInfo/shipper/ShipperCreate.jsx | 6
rsf-admin/src/page/basicInfo/warehouse/WarehouseCreate.jsx | 6
rsf-admin/src/page/ResourceContent.js | 8
rsf-admin/src/page/basicInfo/warehouse/WarehouseEdit.jsx | 8
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrGroupController.java | 2
rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupList copy.jsx | 10
rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupList.jsx | 339 ++++++++++++++++++++++++
rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx | 8
/dev/null | 104 -------
rsf-admin/src/page/basicInfo/shipper/ShipperList.jsx | 10
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/MatnrGroup.java | 4
rsf-admin/src/page/basicInfo/shipper/ShipperPanel.jsx | 2
rsf-admin/src/page/basicInfo/matnrGroup/index.jsx | 0
rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx | 17
rsf-admin/src/page/basicInfo/matnr/index.jsx | 0
rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupCreate.jsx | 6
26 files changed, 619 insertions(+), 162 deletions(-)
diff --git a/rsf-admin/src/page/ResourceContent.js b/rsf-admin/src/page/ResourceContent.js
index 4f8c9b4..d91a310 100644
--- a/rsf-admin/src/page/ResourceContent.js
+++ b/rsf-admin/src/page/ResourceContent.js
@@ -14,10 +14,10 @@
import user from './system/user';
import operationRecord from './system/operationRecord';
import customer from './customer';
-import shipper from './shipper';
-import matnr from './matnr';
-import matnrGroup from './matnrGroup';
-import warehouse from './warehouse';
+import shipper from './basicInfo/shipper';
+import matnr from './basicInfo/matnr';
+import matnrGroup from './basicInfo/matnrGroup';
+import warehouse from './basicInfo/warehouse';
import warehouseAreas from './warehouseAreas';
import loc from './loc';
import container from './container';
diff --git a/rsf-admin/src/page/matnr/MatnrCreate.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx
similarity index 98%
rename from rsf-admin/src/page/matnr/MatnrCreate.jsx
rename to rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx
index 0d7a4cc..7d92209 100644
--- a/rsf-admin/src/page/matnr/MatnrCreate.jsx
+++ b/rsf-admin/src/page/basicInfo/matnr/MatnrCreate.jsx
@@ -27,9 +27,9 @@
Grid,
Box,
} from '@mui/material';
-import DialogCloseButton from "../components/DialogCloseButton";
-import StatusSelectInput from "../components/StatusSelectInput";
-import MemoInput from "../components/MemoInput";
+import DialogCloseButton from "@/page/components/DialogCloseButton";
+import StatusSelectInput from "@/page/components/StatusSelectInput";
+import MemoInput from "@/page/components/MemoInput";
const MatnrCreate = (props) => {
const { open, setOpen } = props;
diff --git a/rsf-admin/src/page/matnr/MatnrEdit.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx
similarity index 97%
rename from rsf-admin/src/page/matnr/MatnrEdit.jsx
rename to rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx
index 237e49b..49e84ab 100644
--- a/rsf-admin/src/page/matnr/MatnrEdit.jsx
+++ b/rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx
@@ -24,10 +24,10 @@
import { Stack, Grid, Box, Typography } from '@mui/material';
import * as Common from '@/utils/common';
import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
-import EditBaseAside from "../components/EditBaseAside";
-import CustomerTopToolBar from "../components/EditTopToolBar";
-import MemoInput from "../components/MemoInput";
-import StatusSelectInput from "../components/StatusSelectInput";
+import EditBaseAside from "@/page/components/EditBaseAside";
+import CustomerTopToolBar from "@/page/components/EditTopToolBar";
+import MemoInput from "@/page/components/MemoInput";
+import StatusSelectInput from "@/page/components/StatusSelectInput";
const FormToolbar = () => {
const { getValues } = useFormContext();
diff --git a/rsf-admin/src/page/matnr/MatnrList.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx
similarity index 93%
rename from rsf-admin/src/page/matnr/MatnrList.jsx
rename to rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx
index 9c8e8f3..47c7b15 100644
--- a/rsf-admin/src/page/matnr/MatnrList.jsx
+++ b/rsf-admin/src/page/basicInfo/matnr/MatnrList.jsx
@@ -36,14 +36,14 @@
import { styled } from '@mui/material/styles';
import MatnrCreate from "./MatnrCreate";
import MatnrPanel from "./MatnrPanel";
-import EmptyData from "../components/EmptyData";
-import MyCreateButton from "../components/MyCreateButton";
-import MyExportButton from '../components/MyExportButton';
-import PageDrawer from "../components/PageDrawer";
-import MyField from "../components/MyField";
+import EmptyData from "@/page/components/EmptyData";
+import MyCreateButton from "@/page/components/MyCreateButton";
+import MyExportButton from '@/page/components/MyExportButton';
+import PageDrawer from "@/page/components/PageDrawer";
+import MyField from "@/page/components/MyField";
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import * as Common from '@/utils/common';
-import ImportButton from "../components/ImportButton";
+import ImportButton from "@/page/components/ImportButton";
import MatListAside from './MatnrListAside';
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
@@ -143,7 +143,10 @@
rowClick={(id, resource, record) => false}
expand={() => <MatnrPanel />}
expandSingle={true}
- omit={['id', 'createTime', 'createBy', 'memo']}
+ omit={['id','shipperId','erpCode','spec','model','weight','color','size','describle'
+ ,'nromNum','unit','purchaseUnit','stockUnit','stockLeval','isLabelMange','safeQty'
+ ,'minQty','maxQty','stagn','valid','validWarn','flagCheck','updateTime', 'updateBy'
+ , 'createTime', 'createBy', 'memo']}
>
<NumberField source="id" />
<TextField source="name" label="table.field.matnr.name" />
diff --git a/rsf-admin/src/page/matnr/MatnrListAside.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrListAside.jsx
similarity index 79%
rename from rsf-admin/src/page/matnr/MatnrListAside.jsx
rename to rsf-admin/src/page/basicInfo/matnr/MatnrListAside.jsx
index f7cffc8..e9a9147 100644
--- a/rsf-admin/src/page/matnr/MatnrListAside.jsx
+++ b/rsf-admin/src/page/basicInfo/matnr/MatnrListAside.jsx
@@ -3,7 +3,15 @@
import {
SavedQueriesList,
FilterLiveSearch,
- useListContext,
+ useNotify,
+ FilterList,
+ FilterListItem,
+ useStore,
+ FilterFormInput,
+ FilterLiveForm,
+ TextInput,
+ useGetList,
+ useListContext
} from 'react-admin';
import BookmarkIcon from '@mui/icons-material/BookmarkBorder';
import { Box, Typography, Card, CardContent, useTheme, TextField } from '@mui/material';
@@ -15,9 +23,32 @@
const MatListAside = () => {
const theme = useTheme();
+ const notify = useNotify();
const { setFilters } = useListContext(); // 鑾峰彇鍒楄〃涓婁笅鏂�
const [selectedOption, setSelectedOption] = useState(null);
- const treeData = [
+ const [treeData, setTreeData] = useState([]);
+
+ useEffect(() => {
+ request.post('/matnrGroup/tree')
+ .then(res => {
+ console.log('Tree Data:', res);
+ if (res?.data?.code === 200) {
+ setTreeData(res.data.data);
+ } else {
+ notify(res.data.msg);
+ }
+ })
+ .catch(error => {
+ notify('Error fetching tree data');
+ });
+
+
+
+ },[]);
+
+
+
+ const treeData1 = [
{
id: '19',
label: '鍗婃垚鍝� ',
@@ -56,6 +87,9 @@
setFilters({ groupId: nodeId });
// 鍦ㄨ繖閲屽彲浠ユ牴鎹� nodeId 鏇存柊涓诲唴瀹瑰尯鍩�
};
+ const handleSearch = () => {
+ console.log('Search Input:', selectedOption);
+ };
const CustomCheckbox = React.forwardRef(function CustomCheckbox(props, ref) {
@@ -89,7 +123,7 @@
>
<CardContent>
<SavedQueriesList icon={<BookmarkIcon />} />
- <FilterLiveSearch source='condition' hiddenLabel />
+ <FilterLiveSearch source="condition" />
<RichTreeView
defaultExpandedItems={['grid', 'pickers']}
expansionTrigger="iconContainer"
diff --git a/rsf-admin/src/page/matnr/MatnrPanel.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrPanel.jsx
similarity index 98%
rename from rsf-admin/src/page/matnr/MatnrPanel.jsx
rename to rsf-admin/src/page/basicInfo/matnr/MatnrPanel.jsx
index 9951914..ebf9a95 100644
--- a/rsf-admin/src/page/matnr/MatnrPanel.jsx
+++ b/rsf-admin/src/page/basicInfo/matnr/MatnrPanel.jsx
@@ -4,7 +4,7 @@
useTranslate,
useRecordContext,
} from 'react-admin';
-import PanelTypography from "../components/PanelTypography";
+import PanelTypography from "@/page/components/PanelTypography";
import * as Common from '@/utils/common'
const MatnrPanel = () => {
diff --git a/rsf-admin/src/page/matnr/index.jsx b/rsf-admin/src/page/basicInfo/matnr/index.jsx
similarity index 100%
rename from rsf-admin/src/page/matnr/index.jsx
rename to rsf-admin/src/page/basicInfo/matnr/index.jsx
diff --git a/rsf-admin/src/page/matnrGroup/MatnrGroupCreate.jsx b/rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupCreate.jsx
similarity index 95%
rename from rsf-admin/src/page/matnrGroup/MatnrGroupCreate.jsx
rename to rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupCreate.jsx
index 3344309..0146f24 100644
--- a/rsf-admin/src/page/matnrGroup/MatnrGroupCreate.jsx
+++ b/rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupCreate.jsx
@@ -27,9 +27,9 @@
Grid,
Box,
} from '@mui/material';
-import DialogCloseButton from "../components/DialogCloseButton";
-import StatusSelectInput from "../components/StatusSelectInput";
-import MemoInput from "../components/MemoInput";
+import DialogCloseButton from "@/page/components/DialogCloseButton";
+import StatusSelectInput from "@/page/components/StatusSelectInput";
+import MemoInput from "@/page/components/MemoInput";
const MatnrGroupCreate = (props) => {
const { open, setOpen } = props;
diff --git a/rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupEdit.jsx b/rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupEdit.jsx
new file mode 100644
index 0000000..206a847
--- /dev/null
+++ b/rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupEdit.jsx
@@ -0,0 +1,181 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+ CreateBase,
+ useTranslate,
+ TextInput,
+ NumberInput,
+ BooleanInput,
+ DateInput,
+ SaveButton,
+ SelectInput,
+ ReferenceInput,
+ ReferenceArrayInput,
+ AutocompleteInput,
+ Toolbar,
+ required,
+ useNotify,
+ Form,
+ useUpdate,
+ useCreate,
+ useCreateContext,
+ Labeled,
+ NumberField,
+ useRecordContext,
+ DeleteButton,
+} from 'react-admin';
+import {
+ Dialog,
+ DialogActions,
+ DialogContent,
+ DialogTitle,
+ Stack,
+ Grid,
+ Box,
+} from '@mui/material';
+import DialogCloseButton from "@/page/components/DialogCloseButton";
+import TreeSelectInput from "@/page/components/TreeSelectInput";
+import { useWatch, useFormContext } from "react-hook-form";
+import * as Common from '@/utils/common';
+import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
+import EditBaseAside from "@/page/components/EditBaseAside";
+import CustomerTopToolBar from "@/page/components/EditTopToolBar";
+import MemoInput from "@/page/components/MemoInput";
+import StatusSelectInput from "@/page/components/StatusSelectInput";
+
+
+const EditContent = ({ editRecord }) => {
+ const { resource } = useCreateContext();
+ return (
+ <Grid container rowSpacing={2} columnSpacing={2}>
+ <Grid item xs={6} display="flex" gap={1}>
+ <TreeSelectInput
+ label="table.field.matnrGroup.parentId"
+ value={editRecord?.parentId}
+ isTranslate
+ resource={resource}
+ />
+ </Grid>
+ <Grid item xs={6} display="flex" gap={1}>
+ <TextInput
+ label="table.field.matnrGroup.name"
+ source="name"
+ parse={v => v}
+ validate={required()}
+ />
+ </Grid>
+ <Grid item xs={6} display="flex" gap={1}>
+ <TextInput
+ label="table.field.matnrGroup.code"
+ source="code"
+ parse={v => v}
+ />
+ </Grid>
+ </Grid>
+ )
+}
+
+const MatnrGroupEdit = (props) => {
+ const { editRecord, open, setOpen, callback, resource } = props;
+
+ const translate = useTranslate();
+ const notify = useNotify();
+
+ const [update] = useUpdate();
+ const [create] = useCreate();
+
+ const handleClose = (event, reason) => {
+ if (reason !== "backdropClick") {
+ setOpen(false);
+ }
+ };
+
+ const handleSuccess = async (data) => {
+ setOpen(false);
+ callback();
+ notify('common.response.success', { type: 'info' });
+ };
+
+ const handleError = async (data) => {
+ notify('common.response.fail', { type: 'error' });
+ };
+
+ const onSubmit = (data) => {
+ const _params = { ...data };
+ if (editRecord) {
+ if (_params.parentId === editRecord.id) {
+ notify('common.response.dataError', { type: 'error' });
+ return;
+ }
+ update(
+ resource,
+ {
+ id: editRecord.id,
+ data: _params,
+ },
+ {
+ onSuccess: () => {
+ handleSuccess();
+ },
+ onError: (error) => {
+ handleError();
+ },
+ }
+ );
+ } else {
+ create(
+ resource,
+ { data: _params },
+ {
+ onSuccess: () => {
+ handleSuccess();
+ },
+ onError: (error) => {
+ handleError();
+ },
+ }
+ );
+ }
+ };
+
+ return (
+ <>
+ <CreateBase>
+ <Dialog
+ open={open}
+ onClose={handleClose}
+ aria-labelledby="form-dialog-title"
+ fullWidth
+ disableRestoreFocus
+ maxWidth="md" // '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 }}>
+ <EditContent
+ editRecord={editRecord}
+ />
+ </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>
+ </>
+ )
+}
+
+export default MatnrGroupEdit;
diff --git a/rsf-admin/src/page/matnrGroup/MatnrGroupList.jsx b/rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupList copy.jsx
similarity index 94%
rename from rsf-admin/src/page/matnrGroup/MatnrGroupList.jsx
rename to rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupList copy.jsx
index 7a34054..b7ee747 100644
--- a/rsf-admin/src/page/matnrGroup/MatnrGroupList.jsx
+++ b/rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupList copy.jsx
@@ -36,11 +36,11 @@
import { styled } from '@mui/material/styles';
import MatnrGroupCreate from "./MatnrGroupCreate";
import MatnrGroupPanel from "./MatnrGroupPanel";
-import EmptyData from "../components/EmptyData";
-import MyCreateButton from "../components/MyCreateButton";
-import MyExportButton from '../components/MyExportButton';
-import PageDrawer from "../components/PageDrawer";
-import MyField from "../components/MyField";
+import EmptyData from "@/page/components/EmptyData";
+import MyCreateButton from "@/page/components/MyCreateButton";
+import MyExportButton from '@/page/components/MyExportButton';
+import PageDrawer from "@/page/components/PageDrawer";
+import MyField from "@/page/components/MyField";
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import * as Common from '@/utils/common';
diff --git a/rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupList.jsx b/rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupList.jsx
new file mode 100644
index 0000000..8436018
--- /dev/null
+++ b/rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupList.jsx
@@ -0,0 +1,339 @@
+import React from 'react';
+import {
+ Title,
+ useTranslate,
+ useNotify,
+ useRedirect,
+ useRefresh,
+ useDelete,
+} from 'react-admin';
+import { styled } from '@mui/material/styles';
+import {
+ Box,
+ Collapse,
+ IconButton,
+ Table,
+ TableBody,
+ TableCell,
+ TableContainer,
+ TableHead,
+ TableRow,
+ Paper,
+ Card,
+ Typography,
+ TextField,
+ Tooltip,
+ Button,
+ Chip,
+ LinearProgress,
+} from '@mui/material';
+import { Add, Edit, Delete } 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 request from '@/utils/request';
+import MatnrGroupEdit from "./MatnrGroupEdit";
+import * as Icons from '@mui/icons-material';
+
+const RESOURCE = 'matnrGroup';
+const TITLE = 'menu.matnrGroup';
+
+const columns = [
+ {
+ id: 'name',
+ label: 'table.field.matnrGroup.name',
+ minWidth: 200,
+ },
+ {
+ id: 'code',
+ label: 'table.field.matnrGroup.code',
+ minWidth: 80,
+ },
+ {
+ id: 'parentId',
+ label: 'table.field.matnrGroup.parentId',
+ minWidth: 100,
+ }
+];
+
+const getIconComponent = (iconStr) => {
+ return Icons[iconStr] || null;
+};
+
+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 translate = useTranslate();
+
+ const toggleNode = (id) => {
+ setOpenNodes(prevState => ({ ...prevState, [id]: !prevState[id] }));
+ };
+
+ const isOpen = openNodes[row.id] || false;
+
+ return (
+ <React.Fragment>
+ <StyledTableRow hover tabIndex={-1} key={row.id}>
+ <StyledTableCell sx={{ padding: 0 }}>
+ {row.children && (
+ <IconButton
+ aria-label="expand row"
+ size="small"
+ onClick={() => toggleNode(row.id)}
+ >
+ {isOpen ? <KeyboardArrowDownIcon /> : <KeyboardArrowRightIcon />}
+ </IconButton>
+ )}
+ </StyledTableCell>
+ {columns.map((column, idx) => {
+ if (column.id !== 'actions') {
+ let value = row[column.id];
+ if (column.id === 'name' && row['type'] === 0) {
+ value = translate(value);
+ }
+ return (
+ <StyledTableCell
+ key={column.id}
+ align={column.align || 'left'}
+ style={{
+ paddingLeft: idx === 0 && (depth * 16 + 16),
+ opacity: column.id === 'icon' && .6
+ }}
+ 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}
+ onEdit={onEdit}
+ onDelete={onDelete}
+ openNodes={openNodes}
+ setOpenNodes={setOpenNodes}
+ />
+ ))
+ )}
+ </React.Fragment>
+ );
+};
+
+const MatnrGroupList = () => {
+ const translate = useTranslate();
+ const notify = useNotify();
+ const redirect = useRedirect();
+ const refresh = useRefresh();
+ const [deleteOne] = useDelete();
+
+ const [treeData, setTreeData] = React.useState(null);
+ const [filter, setFilter] = React.useState("");
+ const [createDialog, setCreateDialog] = React.useState(false);
+ const [editRecord, setEditRecord] = React.useState(null);
+ const [openNodes, setOpenNodes] = React.useState({});
+ const [expandAll, setExpandAll] = React.useState(false);
+
+ const http = async () => {
+ const res = await request.post(RESOURCE + '/tree', {
+ condition: filter
+ });
+ if (res?.data?.code === 200) {
+ setTreeData(res.data.data);
+ } else {
+ notify(res.data.msg);
+ }
+ }
+
+ React.useEffect(() => {
+ http();
+ }, [filter]);
+
+ const handleRefresh = () => {
+ http();
+ };
+
+ const handleAdd = () => {
+ setEditRecord(null);
+ setCreateDialog(true);
+ };
+
+ const handleEdit = (node) => {
+ setEditRecord(node);
+ setCreateDialog(true);
+ };
+
+ const handleDelete = (node) => {
+ if (window.confirm(translate('ra.message.delete_content'))) {
+ deleteOne(
+ RESOURCE,
+ { id: node.id },
+ {
+ onSuccess: () => {
+ handleRefresh();
+ notify('Department deleted successfully', { type: 'info', messageArgs: { _: 'Department deleted successfully' } });
+ },
+ onError: (error) => {
+ notify(`Error: ${error.message}`, { type: 'warning', messageArgs: { _: `Error: ${error.message}` } });
+ },
+ }
+ );
+ }
+ };
+
+ const toggleExpandAll = () => {
+ setExpandAll(prevExpandAll => {
+ const newExpandAll = !prevExpandAll;
+ const newOpenNodes = {};
+ const updateOpenNodes = (nodes) => {
+ nodes.forEach(node => {
+ newOpenNodes[node.id] = newExpandAll;
+ if (node.children) {
+ updateOpenNodes(node.children);
+ }
+ });
+ };
+ updateOpenNodes(treeData);
+ setOpenNodes(newOpenNodes);
+ return newExpandAll;
+ });
+ };
+
+ return (
+ <div>
+ <MatnrGroupEdit
+ editRecord={editRecord}
+ open={createDialog}
+ setOpen={setCreateDialog}
+ callback={() => {
+ handleRefresh();
+ }}
+ resource={RESOURCE}
+ />
+ <Title title={TITLE} />
+ <Box sx={{ mt: 2, mr: 3, mb: 1, display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
+ <Box width={300} >
+ <Button
+ variant="outlined"
+ color="primary"
+ startIcon={expandAll ? <KeyboardArrowDownIcon /> : <KeyboardArrowRightIcon />}
+ onClick={toggleExpandAll}
+ sx={{ ml: 1 }}
+ >
+ {expandAll ? translate('common.action.collapseAll') : translate('common.action.expandAll')}
+ </Button>
+ {/* <TextField
+ label="Search"
+ value={filter}
+ onChange={({ target }) => {
+ setFilter(target.value)
+ }}
+ variant="filled"
+ size="small"
+ margin="dense"
+ fullWidth
+ /> */}
+ </Box>
+ <Box>
+ <Button
+ variant="outlined"
+ color="primary"
+ startIcon={<RefreshIcon />}
+ onClick={handleRefresh}
+ sx={{ ml: 1 }}
+ >
+ {translate('ra.action.refresh')}
+ </Button>
+ <Button
+ variant="outlined"
+ color="primary"
+ startIcon={<Add />}
+ onClick={handleAdd}
+ sx={{ ml: 1 }}
+ >
+ {translate('ra.action.add')}
+ </Button>
+ </Box>
+ </Box>
+ <Card sx={{
+ position: 'relative',
+ }}>
+ {!treeData && (
+ <LinearProgress
+ sx={{
+ height: "3px",
+ position: 'absolute',
+ top: 0,
+ left: 0,
+ right: 0,
+ }}
+ />
+ )}
+ <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
+ }}
+ >
+ {translate(column.label)}
+ </StyledTableCell>
+ ))}
+ </TableRow>
+ </TableHead>
+ <TableBody>
+ {treeData && treeData.length > 0 && (
+ treeData.map((row) => (
+ <TreeTableRow
+ key={row.id}
+ row={row}
+ onEdit={handleEdit}
+ onDelete={handleDelete}
+ openNodes={openNodes}
+ setOpenNodes={setOpenNodes}
+ />
+ ))
+ )}
+ </TableBody>
+ </Table>
+ </TableContainer>
+ </Card>
+ </div>
+ );
+}
+
+export default MatnrGroupList;
diff --git a/rsf-admin/src/page/matnrGroup/MatnrGroupPanel.jsx b/rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupPanel.jsx
similarity index 97%
rename from rsf-admin/src/page/matnrGroup/MatnrGroupPanel.jsx
rename to rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupPanel.jsx
index f704804..c00591c 100644
--- a/rsf-admin/src/page/matnrGroup/MatnrGroupPanel.jsx
+++ b/rsf-admin/src/page/basicInfo/matnrGroup/MatnrGroupPanel.jsx
@@ -4,7 +4,7 @@
useTranslate,
useRecordContext,
} from 'react-admin';
-import PanelTypography from "../components/PanelTypography";
+import PanelTypography from "@/page/components/PanelTypography";
import * as Common from '@/utils/common'
const MatnrGroupPanel = () => {
diff --git a/rsf-admin/src/page/matnrGroup/index.jsx b/rsf-admin/src/page/basicInfo/matnrGroup/index.jsx
similarity index 100%
rename from rsf-admin/src/page/matnrGroup/index.jsx
rename to rsf-admin/src/page/basicInfo/matnrGroup/index.jsx
diff --git a/rsf-admin/src/page/shipper/ShipperCreate.jsx b/rsf-admin/src/page/basicInfo/shipper/ShipperCreate.jsx
similarity index 95%
rename from rsf-admin/src/page/shipper/ShipperCreate.jsx
rename to rsf-admin/src/page/basicInfo/shipper/ShipperCreate.jsx
index d4e07fd..b45fd01 100644
--- a/rsf-admin/src/page/shipper/ShipperCreate.jsx
+++ b/rsf-admin/src/page/basicInfo/shipper/ShipperCreate.jsx
@@ -27,9 +27,9 @@
Grid,
Box,
} from '@mui/material';
-import DialogCloseButton from "../components/DialogCloseButton";
-import StatusSelectInput from "../components/StatusSelectInput";
-import MemoInput from "../components/MemoInput";
+import DialogCloseButton from "@/page/components/DialogCloseButton";
+import StatusSelectInput from "@/page/components/StatusSelectInput";
+import MemoInput from "@/page/components/MemoInput";
const ShipperCreate = (props) => {
const { open, setOpen } = props;
diff --git a/rsf-admin/src/page/shipper/ShipperEdit.jsx b/rsf-admin/src/page/basicInfo/shipper/ShipperEdit.jsx
similarity index 91%
rename from rsf-admin/src/page/shipper/ShipperEdit.jsx
rename to rsf-admin/src/page/basicInfo/shipper/ShipperEdit.jsx
index 7b6b543..e81f51e 100644
--- a/rsf-admin/src/page/shipper/ShipperEdit.jsx
+++ b/rsf-admin/src/page/basicInfo/shipper/ShipperEdit.jsx
@@ -24,10 +24,10 @@
import { Stack, Grid, Box, Typography } from '@mui/material';
import * as Common from '@/utils/common';
import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
-import EditBaseAside from "../components/EditBaseAside";
-import CustomerTopToolBar from "../components/EditTopToolBar";
-import MemoInput from "../components/MemoInput";
-import StatusSelectInput from "../components/StatusSelectInput";
+import EditBaseAside from "@/page/components/EditBaseAside";
+import CustomerTopToolBar from "@/page/components/EditTopToolBar";
+import MemoInput from "@/page/components/MemoInput";
+import StatusSelectInput from "@/page/components/StatusSelectInput";
const FormToolbar = () => {
const { getValues } = useFormContext();
diff --git a/rsf-admin/src/page/shipper/ShipperList.jsx b/rsf-admin/src/page/basicInfo/shipper/ShipperList.jsx
similarity index 94%
rename from rsf-admin/src/page/shipper/ShipperList.jsx
rename to rsf-admin/src/page/basicInfo/shipper/ShipperList.jsx
index f97ca55..facfcd5 100644
--- a/rsf-admin/src/page/shipper/ShipperList.jsx
+++ b/rsf-admin/src/page/basicInfo/shipper/ShipperList.jsx
@@ -36,11 +36,11 @@
import { styled } from '@mui/material/styles';
import ShipperCreate from "./ShipperCreate";
import ShipperPanel from "./ShipperPanel";
-import EmptyData from "../components/EmptyData";
-import MyCreateButton from "../components/MyCreateButton";
-import MyExportButton from '../components/MyExportButton';
-import PageDrawer from "../components/PageDrawer";
-import MyField from "../components/MyField";
+import EmptyData from "@/page/components/EmptyData";
+import MyCreateButton from "@/page/components/MyCreateButton";
+import MyExportButton from '@/page/components/MyExportButton';
+import PageDrawer from "@/page/components/PageDrawer";
+import MyField from "@/page/components/MyField";
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import * as Common from '@/utils/common';
diff --git a/rsf-admin/src/page/shipper/ShipperPanel.jsx b/rsf-admin/src/page/basicInfo/shipper/ShipperPanel.jsx
similarity index 97%
rename from rsf-admin/src/page/shipper/ShipperPanel.jsx
rename to rsf-admin/src/page/basicInfo/shipper/ShipperPanel.jsx
index 1f57cf0..f548e14 100644
--- a/rsf-admin/src/page/shipper/ShipperPanel.jsx
+++ b/rsf-admin/src/page/basicInfo/shipper/ShipperPanel.jsx
@@ -4,7 +4,7 @@
useTranslate,
useRecordContext,
} from 'react-admin';
-import PanelTypography from "../components/PanelTypography";
+import PanelTypography from "@/page/components/PanelTypography";
import * as Common from '@/utils/common'
const ShipperPanel = () => {
diff --git a/rsf-admin/src/page/shipper/index.jsx b/rsf-admin/src/page/basicInfo/shipper/index.jsx
similarity index 100%
rename from rsf-admin/src/page/shipper/index.jsx
rename to rsf-admin/src/page/basicInfo/shipper/index.jsx
diff --git a/rsf-admin/src/page/warehouse/WarehouseCreate.jsx b/rsf-admin/src/page/basicInfo/warehouse/WarehouseCreate.jsx
similarity index 97%
rename from rsf-admin/src/page/warehouse/WarehouseCreate.jsx
rename to rsf-admin/src/page/basicInfo/warehouse/WarehouseCreate.jsx
index 5eb2bf9..b2127b6 100644
--- a/rsf-admin/src/page/warehouse/WarehouseCreate.jsx
+++ b/rsf-admin/src/page/basicInfo/warehouse/WarehouseCreate.jsx
@@ -27,9 +27,9 @@
Grid,
Box,
} from '@mui/material';
-import DialogCloseButton from "../components/DialogCloseButton";
-import StatusSelectInput from "../components/StatusSelectInput";
-import MemoInput from "../components/MemoInput";
+import DialogCloseButton from "@/page/components/DialogCloseButton";
+import StatusSelectInput from "@/page/components/StatusSelectInput";
+import MemoInput from "@/page/components/MemoInput";
const WarehouseCreate = (props) => {
const { open, setOpen } = props;
diff --git a/rsf-admin/src/page/warehouse/WarehouseEdit.jsx b/rsf-admin/src/page/basicInfo/warehouse/WarehouseEdit.jsx
similarity index 95%
rename from rsf-admin/src/page/warehouse/WarehouseEdit.jsx
rename to rsf-admin/src/page/basicInfo/warehouse/WarehouseEdit.jsx
index 7c53724..5e83d70 100644
--- a/rsf-admin/src/page/warehouse/WarehouseEdit.jsx
+++ b/rsf-admin/src/page/basicInfo/warehouse/WarehouseEdit.jsx
@@ -24,10 +24,10 @@
import { Stack, Grid, Box, Typography } from '@mui/material';
import * as Common from '@/utils/common';
import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
-import EditBaseAside from "../components/EditBaseAside";
-import CustomerTopToolBar from "../components/EditTopToolBar";
-import MemoInput from "../components/MemoInput";
-import StatusSelectInput from "../components/StatusSelectInput";
+import EditBaseAside from "@/page/components/EditBaseAside";
+import CustomerTopToolBar from "@/page/components/EditTopToolBar";
+import MemoInput from "@/page/components/MemoInput";
+import StatusSelectInput from "@/page/components/StatusSelectInput";
const FormToolbar = () => {
const { getValues } = useFormContext();
diff --git a/rsf-admin/src/page/warehouse/WarehouseList.jsx b/rsf-admin/src/page/basicInfo/warehouse/WarehouseList.jsx
similarity index 95%
rename from rsf-admin/src/page/warehouse/WarehouseList.jsx
rename to rsf-admin/src/page/basicInfo/warehouse/WarehouseList.jsx
index 2c902fd..233fce1 100644
--- a/rsf-admin/src/page/warehouse/WarehouseList.jsx
+++ b/rsf-admin/src/page/basicInfo/warehouse/WarehouseList.jsx
@@ -36,11 +36,11 @@
import { styled } from '@mui/material/styles';
import WarehouseCreate from "./WarehouseCreate";
import WarehousePanel from "./WarehousePanel";
-import EmptyData from "../components/EmptyData";
-import MyCreateButton from "../components/MyCreateButton";
-import MyExportButton from '../components/MyExportButton';
-import PageDrawer from "../components/PageDrawer";
-import MyField from "../components/MyField";
+import EmptyData from "@/page/components/EmptyData";
+import MyCreateButton from "@/page/components/MyCreateButton";
+import MyExportButton from '@/page/components/MyExportButton';
+import PageDrawer from "@/page/components/PageDrawer";
+import MyField from "@/page/components/MyField";
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import * as Common from '@/utils/common';
diff --git a/rsf-admin/src/page/warehouse/WarehousePanel.jsx b/rsf-admin/src/page/basicInfo/warehouse/WarehousePanel.jsx
similarity index 98%
rename from rsf-admin/src/page/warehouse/WarehousePanel.jsx
rename to rsf-admin/src/page/basicInfo/warehouse/WarehousePanel.jsx
index acb6e40..b1fc42f 100644
--- a/rsf-admin/src/page/warehouse/WarehousePanel.jsx
+++ b/rsf-admin/src/page/basicInfo/warehouse/WarehousePanel.jsx
@@ -4,7 +4,7 @@
useTranslate,
useRecordContext,
} from 'react-admin';
-import PanelTypography from "../components/PanelTypography";
+import PanelTypography from "@/page/components/PanelTypography";
import * as Common from '@/utils/common'
const WarehousePanel = () => {
diff --git a/rsf-admin/src/page/warehouse/index.jsx b/rsf-admin/src/page/basicInfo/warehouse/index.jsx
similarity index 100%
rename from rsf-admin/src/page/warehouse/index.jsx
rename to rsf-admin/src/page/basicInfo/warehouse/index.jsx
diff --git a/rsf-admin/src/page/matnrGroup/MatnrGroupEdit.jsx b/rsf-admin/src/page/matnrGroup/MatnrGroupEdit.jsx
deleted file mode 100644
index 8240f0c..0000000
--- a/rsf-admin/src/page/matnrGroup/MatnrGroupEdit.jsx
+++ /dev/null
@@ -1,104 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import {
- Edit,
- SimpleForm,
- FormDataConsumer,
- useTranslate,
- TextInput,
- NumberInput,
- BooleanInput,
- DateInput,
- SelectInput,
- ReferenceInput,
- ReferenceArrayInput,
- AutocompleteInput,
- SaveButton,
- Toolbar,
- Labeled,
- NumberField,
- required,
- useRecordContext,
- DeleteButton,
-} from 'react-admin';
-import { useWatch, useFormContext } from "react-hook-form";
-import { Stack, Grid, Box, Typography } from '@mui/material';
-import * as Common from '@/utils/common';
-import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
-import EditBaseAside from "../components/EditBaseAside";
-import CustomerTopToolBar from "../components/EditTopToolBar";
-import MemoInput from "../components/MemoInput";
-import StatusSelectInput from "../components/StatusSelectInput";
-
-const FormToolbar = () => {
- const { getValues } = useFormContext();
-
- return (
- <Toolbar sx={{ justifyContent: 'space-between' }}>
- <SaveButton />
- <DeleteButton mutationMode="optimistic" />
- </Toolbar>
- )
-}
-
-const MatnrGroupEdit = () => {
- const translate = useTranslate();
-
- return (
- <Edit
- redirect="list"
- mutationMode={EDIT_MODE}
- actions={<CustomerTopToolBar />}
- aside={<EditBaseAside />}
- >
- <SimpleForm
- shouldUnregister
- warnWhenUnsavedChanges
- toolbar={<FormToolbar />}
- mode="onTouched"
- defaultValues={{}}
- // validate={(values) => { }}
- >
- <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
- <Grid item xs={12} md={8}>
- <Typography variant="h6" gutterBottom>
- {translate('common.edit.title.main')}
- </Typography>
- <Stack direction='row' gap={2}>
- <TextInput
- label="table.field.matnrGroup.name"
- source="name"
- parse={v => v}
- validate={required()}
- />
- </Stack>
- <Stack direction='row' gap={2}>
- <TextInput
- label="table.field.matnrGroup.code"
- source="code"
- parse={v => v}
- validate={required()}
- />
- </Stack>
- <Stack direction='row' gap={2}>
- <NumberInput
- label="table.field.matnrGroup.parentId"
- source="parentId"
- />
- </Stack>
-
- </Grid>
- <Grid item xs={12} md={4}>
- <Typography variant="h6" gutterBottom>
- {translate('common.edit.title.common')}
- </Typography>
- <StatusSelectInput />
- <Box mt="2em" />
- <MemoInput />
- </Grid>
- </Grid>
- </SimpleForm>
- </Edit >
- )
-}
-
-export default MatnrGroupEdit;
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrGroupController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrGroupController.java
index a1ba42a..bde419b 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrGroupController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatnrGroupController.java
@@ -106,7 +106,7 @@
}
@PreAuthorize("hasAuthority('manager:matnrGroup:list')")
- @GetMapping("/matnrGroup/tree")
+ @PostMapping("/matnrGroup/tree")
public R tree() {
List<MatnrGroup> matnrs = matnrGroupService.list(new LambdaQueryWrapper<>());
List<MatnrGroup> treeData = Utils.toTreeData(matnrs, 0L, MatnrGroup::getParentId, MatnrGroup::getId, MatnrGroup::setChildren);
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/MatnrGroup.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/MatnrGroup.java
index acb2845..30f8dad 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/MatnrGroup.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/MatnrGroup.java
@@ -196,4 +196,8 @@
}
}
+ public String getLabel(){
+ return this.name;
+ }
+
}
--
Gitblit v1.9.1