From 1908601b8f30b4df3247fa6de8fc500ed0e0e333 Mon Sep 17 00:00:00 2001 From: luxiaotao1123 <t1341870251@163.com> Date: 星期三, 18 九月 2024 16:29:28 +0800 Subject: [PATCH] # --- zy-acs-flow/src/page/code/ImportModal.jsx | 215 +++++++++++++++++++++++++++++++++++++++++++ zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Code.java | 12 -- zy-acs-flow/src/page/code/CodeList.jsx | 2 zy-acs-flow/src/page/code/ImportButton.jsx | 28 +++++ 4 files changed, 245 insertions(+), 12 deletions(-) diff --git a/zy-acs-flow/src/page/code/CodeList.jsx b/zy-acs-flow/src/page/code/CodeList.jsx index 616543a..2187341 100644 --- a/zy-acs-flow/src/page/code/CodeList.jsx +++ b/zy-acs-flow/src/page/code/CodeList.jsx @@ -42,6 +42,7 @@ import MyField from "../components/MyField"; import { PAGE_DRAWER_WIDTH, OPERATE_MODE } from '@/config/setting'; import * as Common from '@/utils/common'; +import { ImportButton } from './ImportButton' const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ '& .css-1vooibu-MuiSvgIcon-root': { @@ -111,6 +112,7 @@ <FilterButton /> <MyCreateButton onClick={() => { setCreateDialog(true) }} /> <SelectColumnsButton preferenceKey='code' /> + <ImportButton /> <MyExportButton /> </TopToolbar> )} diff --git a/zy-acs-flow/src/page/code/ImportButton.jsx b/zy-acs-flow/src/page/code/ImportButton.jsx new file mode 100644 index 0000000..e23c474 --- /dev/null +++ b/zy-acs-flow/src/page/code/ImportButton.jsx @@ -0,0 +1,28 @@ +import UploadIcon from '@mui/icons-material/Upload'; +import { useState } from 'react'; +import { Button } from 'react-admin'; +// import { ImportModal } from './ImportModal'; + +export const ImportButton = () => { + const [modalOpen, setModalOpen] = useState(false); + + const handleOpenModal = () => { + setModalOpen(true); + }; + + const handleCloseModal = () => { + setModalOpen(false); + }; + + return ( + <> + <Button + startIcon={<UploadIcon />} + label="Import" + onClick={handleOpenModal} + /> + + {/* <ImportModal open={modalOpen} onClose={handleCloseModal} /> */} + </> + ); +}; diff --git a/zy-acs-flow/src/page/code/ImportModal.jsx b/zy-acs-flow/src/page/code/ImportModal.jsx new file mode 100644 index 0000000..bab07e9 --- /dev/null +++ b/zy-acs-flow/src/page/code/ImportModal.jsx @@ -0,0 +1,215 @@ +import { Box, CircularProgress, Stack, Typography } from '@mui/material'; +import Alert from '@mui/material/Alert'; +import Dialog from '@mui/material/Dialog'; +import DialogActions from '@mui/material/DialogActions'; +import DialogContent from '@mui/material/DialogContent'; +import DialogTitle from '@mui/material/DialogTitle'; +import MuiLink from '@mui/material/Link'; +import { + Button, + FileField, + FileInput, + Form, + Toolbar, + useRefresh, +} from 'react-admin'; +import { Link } from 'react-router-dom'; +import { DialogCloseButton } from '../misc/DialogCloseButton'; +import { usePapaParse } from '../misc/usePapaParse'; +import { ContactImportSchema, useContactImport } from './useContactImport'; + +import { MouseEvent, useEffect, useState } from 'react'; +import * as sampleCsv from './contacts_export.csv?raw'; + +const SAMPLE_URL = `data:text/csv;name=crm_contacts_sample.csv;charset=utf-8,${encodeURIComponent(sampleCsv.default)}`; + + +export function ImportModal({ open, onClose }) { + const refresh = useRefresh(); + const { processBatch } = useContactImport(); + const { importer, parseCsv, reset } = usePapaParse<ContactImportSchema>({ + batchSize: 10, + processBatch, + }); + + const [file, setFile] = useState(null); + + useEffect(() => { + if (importer.state === 'complete') { + refresh(); + } + }, [importer.state, refresh]); + + const handleFileChange = (file) => { + setFile(file); + }; + + const startImport = async () => { + if (!file) { + return; + } + + parseCsv(file); + }; + + const handleClose = () => { + reset(); + onClose(); + }; + + const handleReset = (e) => { + e.preventDefault(); + reset(); + }; + + return ( + <Dialog open={open} maxWidth="md" fullWidth> + <DialogCloseButton onClose={handleClose} /> + <DialogTitle>Import</DialogTitle> + <DialogContent> + <Form> + <Stack spacing={2}> + {importer.state === 'running' && ( + <Stack gap={2}> + <Alert + severity="info" + action={ + <Box + sx={{ + display: 'flex', + height: '100%', + alignItems: 'center', + padding: '0', + }} + > + <CircularProgress size={20} /> + </Box> + } + sx={{ + alignItems: 'center', + '& .MuiAlert-action': { + padding: 0, + marginRight: 0, + }, + }} + > + The import is running, please do not close + this tab. + </Alert> + <Typography variant="body2"> + Imported{' '} + <strong> + {importer.importCount} /{' '} + {importer.rowCount} + </strong>{' '} + contacts, with{' '} + <strong>{importer.errorCount}</strong>{' '} + errors. + {importer.remainingTime !== null && ( + <> + {' '} + Estimated remaining time:{' '} + <strong> + {millisecondsToTime( + importer.remainingTime + )} + </strong> + .{' '} + <MuiLink + href="#" + onClick={handleReset} + color="error" + > + Stop import + </MuiLink> + </> + )} + </Typography> + </Stack> + )} + + {importer.state === 'error' && ( + <Alert severity="error"> + Failed to import this file, please make sure + your provided a valid CSV file. + </Alert> + )} + + {importer.state === 'complete' && ( + <Alert severity="success"> + Contacts import complete. Imported{' '} + {importer.importCount} contacts, with{' '} + {importer.errorCount} errors + </Alert> + )} + + {importer.state === 'idle' && ( + <> + <Alert + severity="info" + action={ + <Button + component={Link} + label="Download CSV sample" + color="info" + to={SAMPLE_URL} + download={'crm_contacts_sample.csv'} + /> + } + > + Here is a sample CSV file you can use as a + template + </Alert> + + <FileInput + source="csv" + label="CSV File" + accept={{ 'text/csv': ['.csv'] }} + onChange={handleFileChange} + > + <FileField source="src" title="title" /> + </FileInput> + </> + )} + </Stack> + </Form> + </DialogContent> + <DialogActions + sx={{ + p: 0, + justifyContent: 'flex-start', + }} + > + <Toolbar + sx={{ + width: '100%', + }} + > + {importer.state === 'idle' ? ( + <> + <Button + label="Import" + variant="contained" + onClick={startImport} + disabled={!file} + /> + </> + ) : ( + <Button + label="Close" + onClick={handleClose} + disabled={importer.state === 'running'} + /> + )} + </Toolbar> + </DialogActions> + </Dialog> + ); +} + +function millisecondsToTime(ms) { + var seconds = Math.floor((ms / 1000) % 60); + var minutes = Math.floor((ms / (60 * 1000)) % 60); + + return `${minutes}m ${seconds}s`; +} diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Code.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Code.java index ba22b44..508cbf9 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Code.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Code.java @@ -140,18 +140,6 @@ // null // 澶囨敞 // ); - public String getStatus$(){ - if (null == this.status){ return null; } - switch (this.status){ - case 1: - return "姝e父"; - case 0: - return "鍐荤粨"; - default: - return String.valueOf(this.status); - } - } - public Boolean getCornerBool(){ if (null == this.concer){ return null; } switch (this.concer){ -- Gitblit v1.9.1