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