From 6e5ff559023efd2d24fdca2adcb7268d06420e46 Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期二, 24 三月 2026 15:38:34 +0800
Subject: [PATCH] #打印+导出
---
rsf-admin/src/page/components/MyExportButton.jsx | 87 +++++++++++++++++++++++++------------------
1 files changed, 51 insertions(+), 36 deletions(-)
diff --git a/rsf-admin/src/page/components/MyExportButton.jsx b/rsf-admin/src/page/components/MyExportButton.jsx
index a684e47..1e132f1 100644
--- a/rsf-admin/src/page/components/MyExportButton.jsx
+++ b/rsf-admin/src/page/components/MyExportButton.jsx
@@ -1,5 +1,4 @@
import * as React from "react";
-import { useCallback } from "react";
import DownloadIcon from "@mui/icons-material/GetApp";
import {
Button,
@@ -8,6 +7,11 @@
useListContext,
useUnselectAll,
} from "react-admin";
+import { useListReportActionParams } from "./listReport/useListReportOutput";
+import {
+ downloadBlobFile,
+ resolveReportMeta,
+} from "./listReport/listReportUtils";
const MyExportButton = (props) => {
const {
@@ -18,62 +22,73 @@
icon = defaultIcon,
exporter: customExporter,
meta,
+ reportConfig,
+ onExport,
+ loading = false,
+ filename,
...rest
} = props;
const { filter, selectedIds, filterValues, resource, sort, total } = useListContext();
+ const { visibleColumns, params } = useListReportActionParams(reportConfig, { ids });
const unSelect = useUnselectAll(resource);
const dataProvider = useDataProvider();
const notify = useNotify();
- const handleClick =
- // useCallback(
- (event) => {
- dataProvider
- .export(resource, {
+ const handleClick = async (event) => {
+ try {
+ const hasReportConfig = Boolean(reportConfig?.resource && Array.isArray(reportConfig?.columns));
+ if (hasReportConfig) {
+ const actionParams = {
+ ...params,
+ columns: visibleColumns,
+ };
+ if (typeof onExport === "function") {
+ await onExport(actionParams, event);
+ } else {
+ const resolvedResource = reportConfig.resource || params.resource;
+ const response = await dataProvider.export(resolvedResource, {
+ sort: actionParams.sort,
+ ids: actionParams.ids,
+ filter: actionParams.filter
+ ? { ...actionParams.filterValues, ...actionParams.filter }
+ : actionParams.filterValues,
+ pagination: { page: 1, perPage: maxResults },
+ meta,
+ columns: visibleColumns,
+ reportMeta: resolveReportMeta(reportConfig, actionParams),
+ });
+ downloadBlobFile(
+ response,
+ filename || reportConfig.exportFileName || `${resolvedResource}.xlsx`,
+ );
+ }
+ } else {
+ const response = await dataProvider.export(resource, {
sort,
- ids: selectedIds,
+ ids: ids ?? selectedIds,
filter: filter ? { ...filterValues, ...filter } : filterValues,
pagination: { page: 1, perPage: maxResults },
meta,
- })
- .then((res) => {
- const url = window.URL.createObjectURL(
- new Blob([res.data], { type: res.headers["content-type"] }),
- );
- const link = document.createElement("a");
- link.href = url;
- link.setAttribute("download", `${resource}.xlsx`);
- document.body.appendChild(link);
- link.click();
- link.remove();
- unSelect();
- })
- .catch((error) => {
- console.error(error);
- notify("ra.notification.http_error", { type: "error" });
});
+ downloadBlobFile(response, filename || `${resource}.xlsx`);
+ }
+ unSelect();
if (typeof onClick === "function") {
onClick(event);
}
+ } catch (error) {
+ console.error(error);
+ notify("ra.notification.http_error", { type: "error" });
}
- // [
- // dataProvider,
- // filter,
- // filterValues,
- // maxResults,
- // notify,
- // onClick,
- // resource,
- // sort,
- // meta,
- // ],
- // );
+ };
+
+ const disabled = total === 0 || loading || (reportConfig?.columns && visibleColumns.length === 0);
return (
<Button
onClick={handleClick}
label={label}
- disabled={total === 0}
+ disabled={disabled}
{...sanitizeRestProps(rest)}
>
{icon}
--
Gitblit v1.9.1