From 14ed8541238c6e96dbbc3a6e5719de62d89a1dde Mon Sep 17 00:00:00 2001 From: ChengLei Shao Date: Mon, 24 Feb 2025 16:18:17 +0800 Subject: [PATCH] chore: import action (#6269) --- .../src/client/ImportModal.tsx | 38 ++++++++++++++++--- .../src/client/useImportAction.ts | 4 +- .../src/locale/zh-CN.json | 10 ++++- 3 files changed, 44 insertions(+), 8 deletions(-) diff --git a/packages/plugins/@nocobase/plugin-action-import/src/client/ImportModal.tsx b/packages/plugins/@nocobase/plugin-action-import/src/client/ImportModal.tsx index 3fcc4a22f2..cadf6b5dcf 100644 --- a/packages/plugins/@nocobase/plugin-action-import/src/client/ImportModal.tsx +++ b/packages/plugins/@nocobase/plugin-action-import/src/client/ImportModal.tsx @@ -11,7 +11,7 @@ import { ExclamationCircleFilled, LoadingOutlined } from '@ant-design/icons'; import { css } from '@nocobase/client'; import { Button, Modal, Space, Spin } from 'antd'; import { saveAs } from 'file-saver'; -import React from 'react'; +import React, { useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { NAMESPACE } from './constants'; import { useImportContext } from './context'; @@ -25,6 +25,7 @@ export const ImportModal = (props: any) => { const { t } = useTranslation(NAMESPACE); const { importModalVisible, importStatus, importResult, setImportModalVisible } = useImportContext(); const { data: fileData, meta } = importResult ?? {}; + const doneHandler = () => { setImportModalVisible(false); }; @@ -33,6 +34,34 @@ export const ImportModal = (props: any) => { const blob = new Blob([arrayBuffer], { type: 'application/x-xls' }); saveAs(blob, `fail.xlsx`); }; + + const renderResult = (importResult) => { + if (!importResult) { + return null; + } + + const { data, meta } = importResult; + if (meta) { + return t('{{successCount}} records have been successfully imported', { + ...(meta ?? {}), + }); + } + const stats = data; + const parts = [ + `${t('Total records')}: ${stats.total || 0}`, + `${t('Successfully imported')}: ${stats.success || 0}`, + ]; + + if (stats.skipped > 0) { + parts.push(`${t('Skipped')}: ${stats.skipped}`); + } + + if (stats.updated > 0) { + parts.push(`${t('Updated')}: ${stats.updated}`); + } + + return parts.join(', '); + }; return ( { {importStatus === ImportStatus.IMPORTED && ( -

- {t('{{successCount}} records have been successfully imported', { - ...(meta ?? {}), - })} -

+ +

{renderResult(importResult)}

{meta?.failureCount > 0 && ( diff --git a/packages/plugins/@nocobase/plugin-action-import/src/client/useImportAction.ts b/packages/plugins/@nocobase/plugin-action-import/src/client/useImportAction.ts index 2803efafaa..8678922e7b 100644 --- a/packages/plugins/@nocobase/plugin-action-import/src/client/useImportAction.ts +++ b/packages/plugins/@nocobase/plugin-action-import/src/client/useImportAction.ts @@ -173,6 +173,8 @@ export const useImportStartAction = () => { ); } + const importMode = importSchema?.['x-action-settings']?.importMode || 'auto'; + setVisible(false); setImportModalVisible(true); setImportStatus(ImportStatus.IMPORTING); @@ -181,13 +183,13 @@ export const useImportStartAction = () => { const { data } = await (newResource as any).importXlsx( { values: formData, + mode: importMode, }, { timeout: 10 * 60 * 1000, }, ); - setImportResult(data); form.reset(); if (!data.data.taskId) { diff --git a/packages/plugins/@nocobase/plugin-action-import/src/locale/zh-CN.json b/packages/plugins/@nocobase/plugin-action-import/src/locale/zh-CN.json index 58ff89d88d..5b9fdbbc0c 100644 --- a/packages/plugins/@nocobase/plugin-action-import/src/locale/zh-CN.json +++ b/packages/plugins/@nocobase/plugin-action-import/src/locale/zh-CN.json @@ -39,5 +39,13 @@ "Header mismatch at column {{column}}: expected \"{{expected}}\", but got \"{{actual}}\"": "第 {{column}} 列的表头不匹配:预期 \"{{expected}}\",实际是 \"{{actual}}\"", "No data to import": "没有数据可导入", "Failed to import row {{row}}, {{message}}, row data: {{data}}": "导入第 {{row}} 行失败,{{message}},行数据:{{data}}", - "import-error": "导入第 {{rowIndex}} 行失败,行数据:{{rowData}}, 原因:{{causeMessage}}" + "import-error": "导入第 {{rowIndex}} 行失败,行数据:{{rowData}}, 原因:{{causeMessage}}", + "Import completed": "导入完成:{{success}} 条记录已导入,{{updated}} 条记录已更新,{{skipped}} 条记录已跳过,共 {{total}} 条记录", + "Successfully imported": "成功导入", + "Updated records": "已更新记录", + "Skipped records": "已跳过记录", + "Total records": "总记录数", + "View result": "查看结果", + "ImportResult": "已导入 {{success}} 条,更新 {{updated}} 条,跳过 {{skipped}} 条,共 {{total}} 条", + "Task result": "任务结果" }