import React, { useState, useEffect } from "react"; 
 | 
import { 
 | 
    Dialog, 
 | 
    DialogActions, 
 | 
    DialogContent, 
 | 
    DialogTitle, 
 | 
    Stack, 
 | 
    Grid, 
 | 
    TextField, 
 | 
    Box, 
 | 
    Button, 
 | 
    Paper, 
 | 
    styled 
 | 
} from '@mui/material'; 
 | 
  
 | 
import { EDIT_MODE, DEFAULT_START_PAGE, DEFAULT_PAGE_SIZE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting'; 
 | 
import DialogCloseButton from "../../components/DialogCloseButton"; 
 | 
import { useTranslate, useNotify, useRefresh } from 'react-admin'; 
 | 
import TreeSelectInput from "@/page/components/TreeSelectInput"; 
 | 
import QueryStatsIcon from '@mui/icons-material/QueryStats'; 
 | 
import SaveIcon from '@mui/icons-material/Save'; 
 | 
import { DataGrid } from '@mui/x-data-grid'; 
 | 
import request from '@/utils/request'; 
 | 
  
 | 
const SelectMatnrInfo = (props) => { 
 | 
    const { open, setOpen, data, setData } = props; 
 | 
    const translate = useTranslate(); 
 | 
    const refresh = useRefresh(); 
 | 
    const notify = useNotify(); 
 | 
  
 | 
    const handleClose = (event, reason) => { 
 | 
        if (reason !== "backdropClick") { 
 | 
            setOpen(false); 
 | 
        } 
 | 
    }; 
 | 
  
 | 
    const [page, setPage] = useState({ page: DEFAULT_START_PAGE, pageSize: DEFAULT_PAGE_SIZE }); 
 | 
    const [selectedRows, setSelectedRows] = useState([]); 
 | 
    const [isLoading, setIsLoading] = useState(false); 
 | 
    const [tableData, setTableData] = useState([]); 
 | 
    const [formData, setFormData] = useState({}); 
 | 
    const [dyFields, setDyFields] = useState([]); 
 | 
    const [rowCount, setRowCount] = useState(0); 
 | 
    const handleChange = (e) => { 
 | 
        const { name, value } = e.target; 
 | 
        setFormData(() => ({ 
 | 
            [name]: value 
 | 
        })); 
 | 
    }; 
 | 
  
 | 
    const reset = () => { 
 | 
        setFormData({ 
 | 
            name: null, 
 | 
            code: null, 
 | 
        }) 
 | 
    } 
 | 
  
 | 
    const handleSubmit = () => { 
 | 
        const hasarr = data.map(el => +el.id) 
 | 
        const selectedData = selectedRows.filter(item => !hasarr.includes(item)).map(id => (tableData.find(row => row.id === id))); 
 | 
        const value = selectedData.map((el => { 
 | 
            const dynamicFields = dyFields.reduce((acc, item) => { 
 | 
                acc[item.fields] = el['extendFields']?.[item.fields] || ''; 
 | 
                return acc; 
 | 
            }, {}); 
 | 
            return { 
 | 
                id: el.id, 
 | 
                matnrId: el.id, 
 | 
                maktx: el.name, 
 | 
                matnrCode: el.code, 
 | 
                batch: el.splrBatch, 
 | 
                unit: el.stockUnit || '', 
 | 
                spec: el.spec, 
 | 
                model: el.model, 
 | 
                fieldsIndex: el.fieldsIndex, 
 | 
                purUnit: el.purchaseUnit || '', 
 | 
                ...dynamicFields 
 | 
            } 
 | 
        })) 
 | 
        setData([...data, ...value]); 
 | 
        setOpen(false); 
 | 
        reset(); 
 | 
    }; 
 | 
  
 | 
    const getData = async () => { 
 | 
        setIsLoading(true) 
 | 
        const res = await request.post(`/matnr/page`, { 
 | 
            ...formData, 
 | 
            current: page?.page, 
 | 
            pageSize: page?.pageSize, 
 | 
            orderBy: "create_time desc" 
 | 
        }); 
 | 
        if (res?.data?.code === 200) { 
 | 
            setTableData(res.data.data.records); 
 | 
            setRowCount(res.data?.data?.total); 
 | 
        } else { 
 | 
            notify(res.data.msg); 
 | 
        } 
 | 
        setIsLoading(false) 
 | 
    }; 
 | 
  
 | 
    useEffect(() => { 
 | 
        getData(); 
 | 
    }, [open, page]); 
 | 
  
 | 
    const handleSearch = () => { 
 | 
        getData() 
 | 
    }; 
 | 
  
 | 
    return ( 
 | 
        <Dialog 
 | 
            open={open} 
 | 
            onClose={handleClose} 
 | 
            aria-labelledby="form-dialog-title" 
 | 
            fullWidth 
 | 
            disableRestoreFocus 
 | 
            maxWidth="lg" 
 | 
        > 
 | 
            <DialogTitle id="form-dialog-title" sx={{ 
 | 
                position: 'sticky', 
 | 
                top: 0, 
 | 
                backgroundColor: 'background.paper', 
 | 
                zIndex: 1000 
 | 
            }}> 
 | 
                {translate("common.action.newAddMats")} 
 | 
                <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}> 
 | 
                    <DialogCloseButton onClose={handleClose} /> 
 | 
                </Box> 
 | 
            </DialogTitle> 
 | 
            <DialogContent sx={{ mt: 2, }}> 
 | 
                <Box component="form" onSubmit={handleSubmit} sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}> 
 | 
                    <Grid container spacing={2}> 
 | 
                        <Grid item md={3}> 
 | 
                            <TextField 
 | 
                                label={translate('table.field.matnr.name')} 
 | 
                                name="name" 
 | 
                                value={formData.name} 
 | 
                                onChange={handleChange} 
 | 
                                size="small" 
 | 
                            /> 
 | 
                        </Grid> 
 | 
                        <Grid item md={3}> 
 | 
                            <TextField 
 | 
                                label={translate('table.field.matnr.code')} 
 | 
                                name="code" 
 | 
                                value={formData.code} 
 | 
                                onChange={handleChange} 
 | 
                                size="small" 
 | 
                            /> 
 | 
                        </Grid> 
 | 
                        <Grid item md={3} sx={{display: "flex", margin: 2}}> 
 | 
                            <Button variant="contained" onClick={handleSearch} startIcon={<QueryStatsIcon />}>{translate("toolbar.query")}</Button> 
 | 
                        </Grid> 
 | 
                    </Grid> 
 | 
                </Box> 
 | 
                <Box sx={{ mt: 2, height: 400, width: '100%' }}> 
 | 
                    <AsnWareModalTable 
 | 
                        tableData={tableData} 
 | 
                        setTableData={setTableData} 
 | 
                        dyFields={dyFields} 
 | 
                        page={page} 
 | 
                        rowCount={rowCount} 
 | 
                        setPage={setPage} 
 | 
                        isLoading={isLoading} 
 | 
                        setDyFields={setDyFields} 
 | 
                        selectedRows={selectedRows} 
 | 
                        setSelectedRows={setSelectedRows} 
 | 
                    /> 
 | 
                </Box> 
 | 
            </DialogContent> 
 | 
            <DialogActions sx={{ position: 'sticky', bottom: 1, backgroundColor: 'background.paper', zIndex: 1000 }}> 
 | 
                <Box sx={{ width: '100%', display: 'flex', justifyContent: 'flex-end' }}> 
 | 
                    <Button onClick={handleSubmit} variant="contained" startIcon={<SaveIcon />}> 
 | 
                        {translate('toolbar.confirm')} 
 | 
                    </Button> 
 | 
                </Box> 
 | 
            </DialogActions> 
 | 
        </Dialog> 
 | 
    ); 
 | 
}; 
 | 
  
 | 
export default SelectMatnrInfo; 
 | 
  
 | 
const AsnWareModalTable = ({ tableData, setTableData, page, isLoading, pageSize, setPage, rowCount, selectedRows, setSelectedRows, dyFields, setDyFields }) => { 
 | 
    const translate = useTranslate(); 
 | 
    const notify = useNotify(); 
 | 
  
 | 
    const [columns, setColumns] = useState([ 
 | 
        // { field: 'id', headerName: 'ID', width: 100 }, 
 | 
        { field: 'name', headerName: translate('table.field.matnr.name'), width: 300 }, 
 | 
        { field: 'code', headerName: translate('table.field.matnr.code'), width: 200 }, 
 | 
        { field: 'groupId$', headerName: translate('table.field.matnr.groupId'), width: 100 }, 
 | 
        { field: 'spec', headerName: translate('table.field.matnr.spec'), width: 100 }, 
 | 
        { field: 'model', headerName: translate('table.field.matnr.model'), width: 100 }, 
 | 
        { field: 'weight', headerName: translate('table.field.matnr.weight'), width: 100 }, 
 | 
        { field: 'describle', headerName: translate('table.field.matnr.describle'), width: 100 }, 
 | 
        { field: 'nromNum', headerName: translate('table.field.matnr.nromNum'), width: 100 }, 
 | 
        { field: 'unit', headerName: translate('table.field.matnr.unit'), width: 100 }, 
 | 
        { field: 'purchaseUnit', headerName: translate('table.field.matnr.purUnit'), width: 100 }, 
 | 
        { field: 'stockUnit', headerName: translate('table.field.matnr.stockUnit'), width: 100 }, 
 | 
        { field: 'stockLeval$', headerName: translate('table.field.matnr.stockLevel'), width: 100, sortable: false }, 
 | 
    ]) 
 | 
  
 | 
  
 | 
    const handleSelectionChange = (ids) => { 
 | 
        setSelectedRows(ids) 
 | 
    }; 
 | 
  
 | 
    useEffect(() => { 
 | 
        getDynamicFields(); 
 | 
    }, []); 
 | 
  
 | 
    const getDynamicFields = async () => { 
 | 
        const { 
 | 
            data: { code, data, msg }, 
 | 
        } = await request.get("/fields/enable/list"); 
 | 
        if (code === 200) { 
 | 
            const cols = data.map(el => ({ 
 | 
                field: el.fields, 
 | 
                headerName: el.fieldsAlise, 
 | 
                minWidth: 100, 
 | 
                flex: 1, 
 | 
                editable: el.unique, 
 | 
                valueGetter: (value, row) => { 
 | 
                    return row.extendFields?.[el.fields] || ''; 
 | 
                }, 
 | 
            })) 
 | 
            setDyFields(data) 
 | 
            setColumns([...columns, ...cols]) 
 | 
        } else { 
 | 
            notify(msg); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    return ( 
 | 
        <div style={{ height: 400, width: '100%' }}> 
 | 
            <DataGrid 
 | 
                size="small" 
 | 
                rows={tableData} 
 | 
                columns={columns} 
 | 
                checkboxSelection 
 | 
                onRowSelectionModelChange={handleSelectionChange} 
 | 
                selectionModel={selectedRows} 
 | 
                disableColumnMenu={true} 
 | 
                disableColumnSorting 
 | 
                disableMultipleColumnsSorting 
 | 
                rowCount={rowCount} 
 | 
                paginationMode="server" 
 | 
                paginationModel={page} 
 | 
                onPaginationModelChange={setPage} 
 | 
                loading={isLoading} 
 | 
                slotProps={{ 
 | 
                    loadingOverlay: { 
 | 
                        variant: 'linear-progress', 
 | 
                        noRowsVariant: 'linear-progress', 
 | 
                    }, 
 | 
                }} 
 | 
            /> 
 | 
        </div> 
 | 
    ); 
 | 
}; 
 |