|  |  | 
 |  |  | import React, { useState, useRef, useEffect, useMemo } from "react"; | 
 |  |  | import { | 
 |  |  |     CreateBase, | 
 |  |  |     Form, | 
 |  |  |     useTranslate, | 
 |  |  |     Toolbar, | 
 |  |  |     SaveButton, | 
 |  |  |     TextInput, | 
 |  |  |     ReferenceInput, | 
 |  |  |     AutocompleteInput, | 
 |  |  |     required, | 
 |  |  |     NumberInput, | 
 |  |  | } from 'react-admin'; | 
 |  |  |   CreateBase, | 
 |  |  |   Form, | 
 |  |  |   useTranslate, | 
 |  |  |   Toolbar, | 
 |  |  |   SaveButton, | 
 |  |  |   TextInput, | 
 |  |  |   ReferenceInput, | 
 |  |  |   AutocompleteInput, | 
 |  |  |   required, | 
 |  |  |   NumberInput, | 
 |  |  | } from "react-admin"; | 
 |  |  | import { | 
 |  |  |     Dialog, | 
 |  |  |     DialogActions, | 
 |  |  |     DialogContent, | 
 |  |  |     DialogTitle, | 
 |  |  |     Stack, | 
 |  |  |     Grid, | 
 |  |  |     Box, | 
 |  |  |     TableRow, | 
 |  |  |     IconButton, | 
 |  |  |     Table, | 
 |  |  |     TableBody, | 
 |  |  |     TableCell, | 
 |  |  |     TableContainer, | 
 |  |  |     TableHead, | 
 |  |  |     Paper, | 
 |  |  |     Checkbox, | 
 |  |  |     Button | 
 |  |  | } from '@mui/material'; | 
 |  |  |   Dialog, | 
 |  |  |   DialogActions, | 
 |  |  |   DialogContent, | 
 |  |  |   DialogTitle, | 
 |  |  |   Stack, | 
 |  |  |   Grid, | 
 |  |  |   Box, | 
 |  |  |   TableRow, | 
 |  |  |   IconButton, | 
 |  |  |   Table, | 
 |  |  |   TableBody, | 
 |  |  |   TableCell, | 
 |  |  |   TableContainer, | 
 |  |  |   TableHead, | 
 |  |  |   Paper, | 
 |  |  |   Checkbox, | 
 |  |  |   Button, | 
 |  |  | } 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'; | 
 |  |  | import { styled } from "@mui/material/styles"; | 
 |  |  | import KeyboardArrowDownIcon from "@mui/icons-material/KeyboardArrowDown"; | 
 |  |  | import KeyboardArrowRightIcon from "@mui/icons-material/KeyboardArrowRight"; | 
 |  |  | import { Search } from "@mui/icons-material"; | 
 |  |  | import { tr } from "date-fns/locale"; | 
 |  |  |  | 
 |  |  | import WhTable from "./whTable"; | 
 |  |  |  | 
 |  |  | const columns = [ | 
 |  |  |     { | 
 |  |  |         id: 'matnrCode', | 
 |  |  |         label: 'table.field.whMat.matnrCode', | 
 |  |  |         minWidth: 160, | 
 |  |  |     }, | 
 |  |  |     { | 
 |  |  |         id: 'matnrName', | 
 |  |  |         label: 'table.field.whMat.matnrName', | 
 |  |  |     }, | 
 |  |  |     { | 
 |  |  |         id: 'matnrGroupId', | 
 |  |  |         label: 'table.field.whMat.matnrGroupId', | 
 |  |  |     }, | 
 |  |  |     { | 
 |  |  |         id: 'spec', | 
 |  |  |         label: 'table.field.whMat.spec', | 
 |  |  |     }, | 
 |  |  |     { | 
 |  |  |         id: 'color', | 
 |  |  |         label: 'table.field.whMat.color', | 
 |  |  |     }, | 
 |  |  |     { | 
 |  |  |         id: 'size', | 
 |  |  |         label: 'table.field.whMat.size', | 
 |  |  |     }, | 
 |  |  |     { | 
 |  |  |         id: 'minWeight', | 
 |  |  |         label: 'table.field.whMat.minWeight', | 
 |  |  |     }, | 
 |  |  |     { | 
 |  |  |         id: 'maxWeight', | 
 |  |  |         label: 'table.field.whMat.maxWeight', | 
 |  |  |     }, | 
 |  |  |   { | 
 |  |  |     id: "matnrCode", | 
 |  |  |     label: "table.field.whMat.matnrCode", | 
 |  |  |     minWidth: 160, | 
 |  |  |   }, | 
 |  |  |   { | 
 |  |  |     id: "matnrName", | 
 |  |  |     label: "table.field.whMat.matnrName", | 
 |  |  |   }, | 
 |  |  |   { | 
 |  |  |     id: "matnrGroupId", | 
 |  |  |     label: "table.field.whMat.matnrGroupId", | 
 |  |  |   }, | 
 |  |  |   { | 
 |  |  |     id: "spec", | 
 |  |  |     label: "table.field.whMat.spec", | 
 |  |  |   }, | 
 |  |  |   { | 
 |  |  |     id: "color", | 
 |  |  |     label: "table.field.whMat.color", | 
 |  |  |   }, | 
 |  |  |   { | 
 |  |  |     id: "size", | 
 |  |  |     label: "table.field.whMat.size", | 
 |  |  |   }, | 
 |  |  |   { | 
 |  |  |     id: "minWeight", | 
 |  |  |     label: "table.field.whMat.minWeight", | 
 |  |  |   }, | 
 |  |  |   { | 
 |  |  |     id: "maxWeight", | 
 |  |  |     label: "table.field.whMat.maxWeight", | 
 |  |  |   }, | 
 |  |  | ]; | 
 |  |  |  | 
 |  |  | const WhMatCreate = (props) => { | 
 |  |  |     const translate = useTranslate(); | 
 |  |  |     const { editRecord, open, setOpen, callback, resource } = props; | 
 |  |  |   const translate = useTranslate(); | 
 |  |  |   const { editRecord, open, setOpen, callback, resource } = props; | 
 |  |  |  | 
 |  |  |     const handleClose = (event, reason) => { | 
 |  |  |         if (reason !== "backdropClick") { | 
 |  |  |             setOpen(false); | 
 |  |  |         } | 
 |  |  |     }; | 
 |  |  |   const handleClose = (event, reason) => { | 
 |  |  |     if (reason !== "backdropClick") { | 
 |  |  |       setOpen(false); | 
 |  |  |     } | 
 |  |  |   }; | 
 |  |  |  | 
 |  |  |     const onSubmit = (data) => { | 
 |  |  |         const _params = { ...data }; | 
 |  |  |     }; | 
 |  |  |   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> | 
 |  |  |         </> | 
 |  |  |     ); | 
 |  |  |   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 0px' | 
 |  |  |     } | 
 |  |  |   "& .MuiButtonBase-root": { | 
 |  |  |     padding: "0px 0px", | 
 |  |  |   }, | 
 |  |  | })); | 
 |  |  |  | 
 |  |  | const StyledTableCell = styled(TableCell)(({ theme }) => ({ | 
 |  |  |     '& .MuiButtonBase-root': { | 
 |  |  |         padding: '0px 0px' | 
 |  |  |     }, | 
 |  |  |     overflow: 'hidden', | 
 |  |  |     textOverflow: 'ellipsis', | 
 |  |  |     whiteSpace: 'nowrap', | 
 |  |  |     maxWidth: 600, | 
 |  |  |   "& .MuiButtonBase-root": { | 
 |  |  |     padding: "0px 0px", | 
 |  |  |   }, | 
 |  |  |   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: 20 }}> | 
 |  |  |                     {row.children && ( | 
 |  |  |                         <IconButton | 
 |  |  |                             aria-label="expand row" | 
 |  |  |                             size="small" | 
 |  |  |                             style={{ marginLeft: (depth * 16 + 8) }} | 
 |  |  |                             onClick={() => toggleNode(row.id)} | 
 |  |  |                         > | 
 |  |  |                             {isOpen ? <KeyboardArrowDownIcon /> : <KeyboardArrowRightIcon />} | 
 |  |  |                         </IconButton> | 
 |  |  |                     )} | 
 |  |  |   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: 20 }}> | 
 |  |  |           {row.children && ( | 
 |  |  |             <IconButton | 
 |  |  |               aria-label="expand row" | 
 |  |  |               size="small" | 
 |  |  |               style={{ marginLeft: depth * 16 + 8 }} | 
 |  |  |               onClick={() => toggleNode(row.id)} | 
 |  |  |             > | 
 |  |  |               {isOpen ? <KeyboardArrowDownIcon /> : <KeyboardArrowRightIcon />} | 
 |  |  |             </IconButton> | 
 |  |  |           )} | 
 |  |  |         </StyledTableCell> | 
 |  |  |         <StyledTableCell style={{ paddingLeft: depth * 16 + 16 }}> | 
 |  |  |           <Checkbox | 
 |  |  |             key={row.id} | 
 |  |  |             checked={row.checked} | 
 |  |  |           // onChange={() => { row.checked = !row.checked; }} | 
 |  |  |           /> | 
 |  |  |         </StyledTableCell> | 
 |  |  |         {columns.map((column, idx) => { | 
 |  |  |           if (column.id !== "actions") { | 
 |  |  |             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 style={{ paddingLeft: (depth * 16 + 16) }}> | 
 |  |  |                     <Checkbox | 
 |  |  |                         key={row.id} | 
 |  |  |                         checked={row.checked} | 
 |  |  |                         // onChange={() => { row.checked = !row.checked; }} | 
 |  |  |                     /> | 
 |  |  |                 </StyledTableCell> | 
 |  |  |                 {columns.map((column, idx) => { | 
 |  |  |                     if (column.id !== 'actions') { | 
 |  |  |                         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> | 
 |  |  |                             </> | 
 |  |  |  | 
 |  |  |                         ) | 
 |  |  |                     } | 
 |  |  |                 })} | 
 |  |  |             </StyledTableRow> | 
 |  |  |             {row.children && isOpen && ( | 
 |  |  |                 row.children.map((child) => ( | 
 |  |  |                     <TreeTableRow | 
 |  |  |                         key={child.id} | 
 |  |  |                         row={child} | 
 |  |  |                         depth={depth + 1} | 
 |  |  |                         openNodes={openNodes} | 
 |  |  |                         setOpenNodes={setOpenNodes} | 
 |  |  |                     /> | 
 |  |  |                 )) | 
 |  |  |             )} | 
 |  |  |         </React.Fragment> | 
 |  |  |     ); | 
 |  |  |               </> | 
 |  |  |             ); | 
 |  |  |           } | 
 |  |  |         })} | 
 |  |  |       </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 [selAll, setSelAll] = useState(false); | 
 |  |  |     const [treeData, setTreeData] = useState([ | 
 |  |  |   const translate = useTranslate(); | 
 |  |  |   const [selAll, setSelAll] = useState(false); | 
 |  |  |   const [treeData, setTreeData] = useState([ | 
 |  |  |     { | 
 |  |  |       id: 1, | 
 |  |  |       matnrCode: "root1", | 
 |  |  |       matnrName: "根节点", | 
 |  |  |       matnrGroupId: "admin", | 
 |  |  |       sort: 1, | 
 |  |  |       checked: false, | 
 |  |  |       children: [ | 
 |  |  |         { | 
 |  |  |             id: 1, matnrCode: 'root1', matnrName: '根节点', matnrGroupId: 'admin', sort: 1, checked: false, children: [ | 
 |  |  |                 { | 
 |  |  |                     id: 29, matnrCode: 'root29', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: [ | 
 |  |  |                         { id: 30, matnrCode: 'root30', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |                         { id: 31, matnrCode: 'root31', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |                         { id: 32, matnrCode: 'root32', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |                         { id: 33, matnrCode: 'root33', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |                         { id: 34, matnrCode: 'root34', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |                         { id: 35, matnrCode: 'root35', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |                     ] | 
 |  |  |                 }, | 
 |  |  |                 { id: 24, matnrCode: 'root24', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |                 { id: 25, matnrCode: 'root25', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |                 { id: 26, matnrCode: 'root26', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |                 { id: 27, matnrCode: 'root27', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |                 { id: 28, matnrCode: 'root28', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |  | 
 |  |  |             ] | 
 |  |  |           id: 29, | 
 |  |  |           matnrCode: "root29", | 
 |  |  |           fullName: "根节点", | 
 |  |  |           leader: "admin", | 
 |  |  |           sort: 1, | 
 |  |  |           checked: false, | 
 |  |  |           children: [ | 
 |  |  |             { | 
 |  |  |               id: 30, | 
 |  |  |               matnrCode: "root30", | 
 |  |  |               fullName: "根节点", | 
 |  |  |               leader: "admin", | 
 |  |  |               sort: 1, | 
 |  |  |               checked: false, | 
 |  |  |               children: null, | 
 |  |  |             }, | 
 |  |  |             { | 
 |  |  |               id: 31, | 
 |  |  |               matnrCode: "root31", | 
 |  |  |               fullName: "根节点", | 
 |  |  |               leader: "admin", | 
 |  |  |               sort: 1, | 
 |  |  |               checked: false, | 
 |  |  |               children: null, | 
 |  |  |             }, | 
 |  |  |             { | 
 |  |  |               id: 32, | 
 |  |  |               matnrCode: "root32", | 
 |  |  |               fullName: "根节点", | 
 |  |  |               leader: "admin", | 
 |  |  |               sort: 1, | 
 |  |  |               checked: false, | 
 |  |  |               children: null, | 
 |  |  |             }, | 
 |  |  |             { | 
 |  |  |               id: 33, | 
 |  |  |               matnrCode: "root33", | 
 |  |  |               fullName: "根节点", | 
 |  |  |               leader: "admin", | 
 |  |  |               sort: 1, | 
 |  |  |               checked: false, | 
 |  |  |               children: null, | 
 |  |  |             }, | 
 |  |  |             { | 
 |  |  |               id: 34, | 
 |  |  |               matnrCode: "root34", | 
 |  |  |               fullName: "根节点", | 
 |  |  |               leader: "admin", | 
 |  |  |               sort: 1, | 
 |  |  |               checked: false, | 
 |  |  |               children: null, | 
 |  |  |             }, | 
 |  |  |             { | 
 |  |  |               id: 35, | 
 |  |  |               matnrCode: "root35", | 
 |  |  |               fullName: "根节点", | 
 |  |  |               leader: "admin", | 
 |  |  |               sort: 1, | 
 |  |  |               checked: false, | 
 |  |  |               children: null, | 
 |  |  |             }, | 
 |  |  |           ], | 
 |  |  |         }, | 
 |  |  |         { id: 2, matnrCode: 'root2', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |         { id: 3, matnrCode: 'root3', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |         { id: 4, matnrCode: 'root4', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |         { id: 5, matnrCode: 'root5', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |         { id: 6, matnrCode: 'root6', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |         { id: 7, matnrCode: 'root', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |         { id: 8, matnrCode: 'root', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |         { id: 9, matnrCode: 'root', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |         { id: 10, matnrCode: 'root', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |         { id: 11, matnrCode: 'root', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |         { id: 12, matnrCode: 'root', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |         { id: 13, matnrCode: 'root', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |         { id: 14, matnrCode: 'root', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |         { id: 15, matnrCode: 'root', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |         { id: 16, matnrCode: 'root', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |         { id: 17, matnrCode: 'root', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |         { id: 18, matnrCode: 'root', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |         { id: 19, matnrCode: 'root', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |         { id: 20, matnrCode: 'root', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |         { id: 21, matnrCode: 'root', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |         { id: 22, matnrCode: 'root', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |         { id: 23, matnrCode: 'root', fullName: '根节点', leader: 'admin', sort: 1, checked: false, children: null }, | 
 |  |  |         { | 
 |  |  |           id: 24, | 
 |  |  |           matnrCode: "root24", | 
 |  |  |           fullName: "根节点", | 
 |  |  |           leader: "admin", | 
 |  |  |           sort: 1, | 
 |  |  |           checked: false, | 
 |  |  |           children: null, | 
 |  |  |         }, | 
 |  |  |         { | 
 |  |  |           id: 25, | 
 |  |  |           matnrCode: "root25", | 
 |  |  |           fullName: "根节点", | 
 |  |  |           leader: "admin", | 
 |  |  |           sort: 1, | 
 |  |  |           checked: false, | 
 |  |  |           children: null, | 
 |  |  |         }, | 
 |  |  |         { | 
 |  |  |           id: 26, | 
 |  |  |           matnrCode: "root26", | 
 |  |  |           fullName: "根节点", | 
 |  |  |           leader: "admin", | 
 |  |  |           sort: 1, | 
 |  |  |           checked: false, | 
 |  |  |           children: null, | 
 |  |  |         }, | 
 |  |  |         { | 
 |  |  |           id: 27, | 
 |  |  |           matnrCode: "root27", | 
 |  |  |           fullName: "根节点", | 
 |  |  |           leader: "admin", | 
 |  |  |           sort: 1, | 
 |  |  |           checked: false, | 
 |  |  |           children: null, | 
 |  |  |         }, | 
 |  |  |         { | 
 |  |  |           id: 28, | 
 |  |  |           matnrCode: "root28", | 
 |  |  |           fullName: "根节点", | 
 |  |  |           leader: "admin", | 
 |  |  |           sort: 1, | 
 |  |  |           checked: false, | 
 |  |  |           children: null, | 
 |  |  |         }, | 
 |  |  |       ], | 
 |  |  |     }, | 
 |  |  |     { | 
 |  |  |       id: 2, | 
 |  |  |       matnrCode: "root2", | 
 |  |  |       fullName: "根节点", | 
 |  |  |       leader: "admin", | 
 |  |  |       sort: 1, | 
 |  |  |       checked: false, | 
 |  |  |       children: null, | 
 |  |  |     }, | 
 |  |  |     { | 
 |  |  |       id: 3, | 
 |  |  |       matnrCode: "root3", | 
 |  |  |       fullName: "根节点", | 
 |  |  |       leader: "admin", | 
 |  |  |       sort: 1, | 
 |  |  |       checked: false, | 
 |  |  |       children: null, | 
 |  |  |     }, | 
 |  |  |     { | 
 |  |  |       id: 4, | 
 |  |  |       matnrCode: "root4", | 
 |  |  |       fullName: "根节点", | 
 |  |  |       leader: "admin", | 
 |  |  |       sort: 1, | 
 |  |  |       checked: false, | 
 |  |  |       children: null, | 
 |  |  |     }, | 
 |  |  |   ]); | 
 |  |  |   const [openNodes, setOpenNodes] = React.useState({}); | 
 |  |  |  | 
 |  |  |   const handleSearch = () => { | 
 |  |  |     console.log("handleSearch"); | 
 |  |  |   }; | 
 |  |  |   const selectAll = () => { | 
 |  |  |     selAll ? setSelAll(false) : setSelAll(true); | 
 |  |  |   }; | 
 |  |  |  | 
 |  |  |     ]); | 
 |  |  |     const [openNodes, setOpenNodes] = React.useState({}); | 
 |  |  |  | 
 |  |  |     const handleSearch = () => { | 
 |  |  |         console.log('handleSearch'); | 
 |  |  |     } | 
 |  |  |     const selectAll = () => { | 
 |  |  |         selAll ? setSelAll(false) : setSelAll(true); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     useEffect(() => { | 
 |  |  |         console.log(selAll); | 
 |  |  |  | 
 |  |  |         const setAllChecked = (nodes, checked) => { | 
 |  |  |             nodes.forEach(node => { | 
 |  |  |                 node.checked = !checked; | 
 |  |  |                 if (node.children) { | 
 |  |  |                     setAllChecked(node.children, checked); | 
 |  |  |                 } | 
 |  |  |             }); | 
 |  |  |         }; | 
 |  |  |  | 
 |  |  |         if (selAll) { | 
 |  |  |             setAllChecked(treeData, true);  | 
 |  |  |         } else { | 
 |  |  |             setAllChecked(treeData, false);  | 
 |  |  |   useEffect(() => { | 
 |  |  |     const setAllChecked = (nodes, checked) => { | 
 |  |  |       nodes.forEach((node) => { | 
 |  |  |         node.checked = !checked; | 
 |  |  |         if (node.children) { | 
 |  |  |           setAllChecked(node.children, checked); | 
 |  |  |         } | 
 |  |  |     }, [selAll]); | 
 |  |  |       }); | 
 |  |  |     }; | 
 |  |  |  | 
 |  |  |     return ( | 
 |  |  |         <> | 
 |  |  |             <Grid container rowSpacing={2} columnSpacing={2}> | 
 |  |  |                 <Grid item xs={3} display="flex" gap={1}> | 
 |  |  |                     <TextInput | 
 |  |  |                         label="table.field.whMat.matnrCode" | 
 |  |  |                         source="matnrCode" | 
 |  |  |                     /> | 
 |  |  |                 </Grid> | 
 |  |  |                 <Grid item xs={3} display="flex" gap={1}> | 
 |  |  |                     <TextInput | 
 |  |  |                         label="table.field.whMat.matnrName" | 
 |  |  |                         source="matnrName" | 
 |  |  |                     /> | 
 |  |  |                 </Grid> | 
 |  |  |                 <Grid item xs={3} display="flex" gap={1}> | 
 |  |  |                     <ReferenceInput | 
 |  |  |                         source="groupId" | 
 |  |  |                         reference="matnrGroup" | 
 |  |  |                     > | 
 |  |  |                         <AutocompleteInput | 
 |  |  |                             label="table.field.whMat.matnrGroupId" | 
 |  |  |                             optionText="name" | 
 |  |  |                             filterToQuery={(val) => ({ name: val })} | 
 |  |  |                         /> | 
 |  |  |                     </ReferenceInput> | 
 |  |  |                 </Grid> | 
 |  |  |                 <Grid item xs={3} display="flex" gap={1}> | 
 |  |  |                     <TextInput | 
 |  |  |                         label="table.field.whMat.spec" | 
 |  |  |                         source="spec" | 
 |  |  |                     /> | 
 |  |  |                 </Grid> | 
 |  |  |     if (selAll) { | 
 |  |  |       setAllChecked(treeData, true); | 
 |  |  |     } else { | 
 |  |  |       setAllChecked(treeData, false); | 
 |  |  |     } | 
 |  |  |   }, [selAll]); | 
 |  |  |  | 
 |  |  |                 <Grid item xs={3} display="flex" gap={1}> | 
 |  |  |                     <TextInput | 
 |  |  |                         label="table.field.whMat.color" | 
 |  |  |                         source="color" | 
 |  |  |                     /> | 
 |  |  |                 </Grid> | 
 |  |  |                 <Grid item xs={3} display="flex" gap={1}> | 
 |  |  |                     <TextInput | 
 |  |  |                         label="table.field.whMat.size" | 
 |  |  |                         source="size" | 
 |  |  |                     /> | 
 |  |  |                 </Grid> | 
 |  |  |                 <Grid item xs={3} display="flex" gap={1}> | 
 |  |  |                     <TextInput | 
 |  |  |                         label="table.field.whMat.minWeight" | 
 |  |  |                         source="minWeight" | 
 |  |  |                     /> | 
 |  |  |                 </Grid> | 
 |  |  |                 <Grid item xs={3} display="flex" gap={1}> | 
 |  |  |                     <TextInput | 
 |  |  |                         label="table.field.whMat.maxWeight" | 
 |  |  |                         source="maxWeight" | 
 |  |  |                     /> | 
 |  |  |                 </Grid> | 
 |  |  |             </Grid> | 
 |  |  |             <Box sx={{ mt: 2, mb: 2 }}> | 
 |  |  |                 <Stack direction="row" spacing={1} justifyContent="flex-end"> | 
 |  |  |                     <Button | 
 |  |  |                         variant="outlined" | 
 |  |  |                         color="primary" | 
 |  |  |                         startIcon={<Search />} | 
 |  |  |                         onClick={handleSearch} | 
 |  |  |                     > | 
 |  |  |                         {translate('ra.action.search')} | 
 |  |  |                     </Button> | 
 |  |  |                 </Stack> | 
 |  |  |             </Box> | 
 |  |  |             <TableContainer component={Paper}> | 
 |  |  |                 <Table size="small"> | 
 |  |  |                     <TableHead> | 
 |  |  |                         <TableRow> | 
 |  |  |                             <StyledTableCell sx={{ padding: 0, width: 0 }} /> | 
 |  |  |                             <StyledTableCell sx={{ width: 0 }} > | 
 |  |  |                                 <Checkbox checked={selAll} onClick={selectAll} /> | 
 |  |  |                             </StyledTableCell> | 
 |  |  |                             {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} | 
 |  |  |                                     openNodes={openNodes} | 
 |  |  |                                     setOpenNodes={setOpenNodes} | 
 |  |  |                                 /> | 
 |  |  |                             )) | 
 |  |  |                         )} | 
 |  |  |                     </TableBody> | 
 |  |  |                 </Table> | 
 |  |  |             </TableContainer> | 
 |  |  |         </> | 
 |  |  |   const [treeDatas, setTreeDatas] = useState([ | 
 |  |  |     { | 
 |  |  |       id: 1, | 
 |  |  |       matnrCode: "root1", | 
 |  |  |       matnrName: "根节点", | 
 |  |  |       matnrGroupId: "admin", | 
 |  |  |       sort: 1, | 
 |  |  |       checked: false, | 
 |  |  |       children: [ | 
 |  |  |         { | 
 |  |  |           id: 29, | 
 |  |  |           matnrCode: "root29", | 
 |  |  |           fullName: "根节点", | 
 |  |  |           leader: "admin", | 
 |  |  |           sort: 1, | 
 |  |  |           checked: false, | 
 |  |  |           children: [ | 
 |  |  |             { | 
 |  |  |               id: 30, | 
 |  |  |               matnrCode: "root30", | 
 |  |  |               fullName: "根节点", | 
 |  |  |               leader: "admin", | 
 |  |  |               sort: 1, | 
 |  |  |               checked: false, | 
 |  |  |               children: null, | 
 |  |  |             }, | 
 |  |  |             { | 
 |  |  |               id: 31, | 
 |  |  |               matnrCode: "root31", | 
 |  |  |               fullName: "根节点", | 
 |  |  |               leader: "admin", | 
 |  |  |               sort: 1, | 
 |  |  |               checked: false, | 
 |  |  |               children: null, | 
 |  |  |             }, | 
 |  |  |             { | 
 |  |  |               id: 32, | 
 |  |  |               matnrCode: "root32", | 
 |  |  |               fullName: "根节点", | 
 |  |  |               leader: "admin", | 
 |  |  |               sort: 1, | 
 |  |  |               checked: false, | 
 |  |  |               children: null, | 
 |  |  |             }, | 
 |  |  |             { | 
 |  |  |               id: 33, | 
 |  |  |               matnrCode: "root33", | 
 |  |  |               fullName: "根节点", | 
 |  |  |               leader: "admin", | 
 |  |  |               sort: 1, | 
 |  |  |               checked: false, | 
 |  |  |               children: null, | 
 |  |  |             }, | 
 |  |  |             { | 
 |  |  |               id: 34, | 
 |  |  |               matnrCode: "root34", | 
 |  |  |               fullName: "根节点", | 
 |  |  |               leader: "admin", | 
 |  |  |               sort: 1, | 
 |  |  |               checked: false, | 
 |  |  |               children: null, | 
 |  |  |             }, | 
 |  |  |             { | 
 |  |  |               id: 35, | 
 |  |  |               matnrCode: "root35", | 
 |  |  |               fullName: "根节点", | 
 |  |  |               leader: "admin", | 
 |  |  |               sort: 1, | 
 |  |  |               checked: false, | 
 |  |  |               children: null, | 
 |  |  |             }, | 
 |  |  |           ], | 
 |  |  |         }, | 
 |  |  |         { | 
 |  |  |           id: 24, | 
 |  |  |           matnrCode: "root24", | 
 |  |  |           fullName: "根节点", | 
 |  |  |           leader: "admin", | 
 |  |  |           sort: 1, | 
 |  |  |           checked: false, | 
 |  |  |           children: null, | 
 |  |  |         }, | 
 |  |  |         { | 
 |  |  |           id: 25, | 
 |  |  |           matnrCode: "root25", | 
 |  |  |           fullName: "根节点", | 
 |  |  |           leader: "admin", | 
 |  |  |           sort: 1, | 
 |  |  |           checked: false, | 
 |  |  |           children: null, | 
 |  |  |         }, | 
 |  |  |         { | 
 |  |  |           id: 26, | 
 |  |  |           matnrCode: "root26", | 
 |  |  |           fullName: "根节点", | 
 |  |  |           leader: "admin", | 
 |  |  |           sort: 1, | 
 |  |  |           checked: false, | 
 |  |  |           children: null, | 
 |  |  |         }, | 
 |  |  |         { | 
 |  |  |           id: 27, | 
 |  |  |           matnrCode: "root27", | 
 |  |  |           fullName: "根节点", | 
 |  |  |           leader: "admin", | 
 |  |  |           sort: 1, | 
 |  |  |           checked: false, | 
 |  |  |           children: null, | 
 |  |  |         }, | 
 |  |  |         { | 
 |  |  |           id: 28, | 
 |  |  |           matnrCode: "root28", | 
 |  |  |           fullName: "根节点", | 
 |  |  |           leader: "admin", | 
 |  |  |           sort: 1, | 
 |  |  |           checked: false, | 
 |  |  |           children: null, | 
 |  |  |         }, | 
 |  |  |       ], | 
 |  |  |     }, | 
 |  |  |     { | 
 |  |  |       id: 2, | 
 |  |  |       matnrCode: "root2", | 
 |  |  |       fullName: "根节点", | 
 |  |  |       leader: "admin", | 
 |  |  |       sort: 1, | 
 |  |  |       checked: false, | 
 |  |  |       children: null, | 
 |  |  |     }, | 
 |  |  |     { | 
 |  |  |       id: 3, | 
 |  |  |       matnrCode: "root3", | 
 |  |  |       fullName: "根节点", | 
 |  |  |       leader: "admin", | 
 |  |  |       sort: 1, | 
 |  |  |       checked: false, | 
 |  |  |       children: null, | 
 |  |  |     }, | 
 |  |  |     { | 
 |  |  |       id: 4, | 
 |  |  |       matnrCode: "root4", | 
 |  |  |       fullName: "根节点", | 
 |  |  |       leader: "admin", | 
 |  |  |       sort: 1, | 
 |  |  |       checked: false, | 
 |  |  |       children: null, | 
 |  |  |     }, | 
 |  |  |   ]); | 
 |  |  |  | 
 |  |  |     ); | 
 |  |  |   return ( | 
 |  |  |     <> | 
 |  |  |       <Grid container rowSpacing={2} columnSpacing={2}> | 
 |  |  |         <Grid item xs={3} display="flex" gap={1}> | 
 |  |  |           <TextInput label="table.field.whMat.matnrCode" source="matnrCode" /> | 
 |  |  |         </Grid> | 
 |  |  |         <Grid item xs={3} display="flex" gap={1}> | 
 |  |  |           <TextInput label="table.field.whMat.matnrName" source="matnrName" /> | 
 |  |  |         </Grid> | 
 |  |  |         <Grid item xs={3} display="flex" gap={1}> | 
 |  |  |           <ReferenceInput source="groupId" reference="matnrGroup"> | 
 |  |  |             <AutocompleteInput | 
 |  |  |               label="table.field.whMat.matnrGroupId" | 
 |  |  |               optionText="name" | 
 |  |  |               filterToQuery={(val) => ({ name: val })} | 
 |  |  |             /> | 
 |  |  |           </ReferenceInput> | 
 |  |  |         </Grid> | 
 |  |  |         <Grid item xs={3} display="flex" gap={1}> | 
 |  |  |           <TextInput label="table.field.whMat.spec" source="spec" /> | 
 |  |  |         </Grid> | 
 |  |  |  | 
 |  |  |         <Grid item xs={3} display="flex" gap={1}> | 
 |  |  |           <TextInput label="table.field.whMat.color" source="color" /> | 
 |  |  |         </Grid> | 
 |  |  |         <Grid item xs={3} display="flex" gap={1}> | 
 |  |  |           <TextInput label="table.field.whMat.size" source="size" /> | 
 |  |  |         </Grid> | 
 |  |  |         <Grid item xs={3} display="flex" gap={1}> | 
 |  |  |           <TextInput label="table.field.whMat.minWeight" source="minWeight" /> | 
 |  |  |         </Grid> | 
 |  |  |         <Grid item xs={3} display="flex" gap={1}> | 
 |  |  |           <TextInput label="table.field.whMat.maxWeight" source="maxWeight" /> | 
 |  |  |         </Grid> | 
 |  |  |       </Grid> | 
 |  |  |       <Box sx={{ mt: 2, mb: 2 }}> | 
 |  |  |         <Stack direction="row" spacing={1} justifyContent="flex-end"> | 
 |  |  |           <Button | 
 |  |  |             variant="outlined" | 
 |  |  |             color="primary" | 
 |  |  |             startIcon={<Search />} | 
 |  |  |             onClick={handleSearch} | 
 |  |  |           > | 
 |  |  |             {translate("ra.action.search")} | 
 |  |  |           </Button> | 
 |  |  |         </Stack> | 
 |  |  |       </Box> | 
 |  |  |       <TableContainer component={Paper}> | 
 |  |  |         <Table size="small"> | 
 |  |  |           <TableHead> | 
 |  |  |             <TableRow> | 
 |  |  |               <StyledTableCell sx={{ padding: 0, width: 0 }} /> | 
 |  |  |               <StyledTableCell sx={{ width: 0 }}> | 
 |  |  |                 <Checkbox checked={selAll} onClick={selectAll} /> | 
 |  |  |               </StyledTableCell> | 
 |  |  |               {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} | 
 |  |  |                   openNodes={openNodes} | 
 |  |  |                   setOpenNodes={setOpenNodes} | 
 |  |  |                 /> | 
 |  |  |               ))} | 
 |  |  |           </TableBody> | 
 |  |  |         </Table> | 
 |  |  |       </TableContainer> | 
 |  |  |       {/* <WhTable data={treeDatas} /> */} | 
 |  |  |     </> | 
 |  |  |   ); | 
 |  |  | }; | 
 |  |  |  | 
 |  |  | export default WhMatCreate; | 
 |  |  | export default WhMatCreate; |