UNPKG

qt-public-ui

Version:

新设计规范下业务组件库

199 lines 7.55 kB
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator"; import _extends from "@babel/runtime/helpers/esm/extends"; import _regeneratorRuntime from "@babel/runtime/regenerator"; import React, { useState, useEffect, useContext } from 'react'; import { Link } from 'react-router-dom'; import { Popover, Spin } from 'antd'; import { IconSlim as Icon, Frame } from '..'; import { saveAs } from 'file-saver'; import ExportContext from '../UmProvider/exportContext'; import globalContext from '../UmProvider/globalContext'; import { i18n as defaultI18n } from '../utils'; import './style'; var mergeProps = function mergeProps(props, globalProps) { return _extends({}, globalProps, props); }; var resolveBlobError = function resolveBlobError(blob) { return new Promise(function (resolve) { var reader = new FileReader(); reader.onload = function (event) { try { resolve(JSON.parse(event.target.result)); } catch (e) { resolve({}); } }; reader.readAsText(blob); }); }; var clickInFrame = function clickInFrame() { window.top.postMessage({ _type: 'frame:export' }, '*'); }; export var getSuccessTips = function getSuccessTips(i18n) { if (i18n === void 0) { i18n = defaultI18n; } return function (url, inFrame, existed) { if (!url) return '导出成功'; var _click = inFrame ? clickInFrame : function () {}; if (existed) { return /*#__PURE__*/React.createElement("span", { className: "umui-export-hint" }, i18n.get('报表已存在,请前往'), " ", /*#__PURE__*/React.createElement(Link, { to: url, onClick: _click }, i18n.get('报表中心')), " ", i18n.get('查看')); } else { return /*#__PURE__*/React.createElement("span", { className: "umui-export-hint" }, i18n.get('导出成功,请前往'), " ", /*#__PURE__*/React.createElement(Link, { to: url, onClick: _click }, i18n.get('报表中心')), " ", i18n.get('下载')); } }; }; var Export = function Export(props) { var _useContext = useContext(ExportContext), exportConfig = _useContext.exportConfig; var gContext = useContext(globalContext); var i18n = gContext.i18n || defaultI18n; var _mergeProps = mergeProps(props, exportConfig), _mergeProps$placement = _mergeProps.placement, placement = _mergeProps$placement === void 0 ? 'topRight' : _mergeProps$placement, params = _mergeProps.params, exportFn = _mergeProps.exportFn, blobFileName = _mergeProps.blobFileName, children = _mergeProps.children, onExport = _mergeProps.onExport, _mergeProps$reportCen = _mergeProps.reportCenterURL, reportCenterURL = _mergeProps$reportCen === void 0 ? '' : _mergeProps$reportCen, existedCode = _mergeProps.existedCode, _mergeProps$text = _mergeProps.text, text = _mergeProps$text === void 0 ? i18n.get('导出数据') : _mergeProps$text; var _useState = useState(false), visible = _useState[0], setVisible = _useState[1]; var _useState2 = useState(''), tipContent = _useState2[0], setTipContent = _useState2[1]; var _useState3 = useState(false), exporting = _useState3[0], setExporting = _useState3[1]; var _Frame$useFrame = Frame.useFrame(), inFrame = _Frame$useFrame.inFrame; var sendExport = function sendExport() { if (!exportFn) throw ReferenceError('Please set "exportFn" as Axios instance in UmProvider exportConfig props.'); onExport && onExport(); setExporting(true); var alert = function alert(msg) { setTipContent(msg); setVisible(true); }; exportFn(params).then( /*#__PURE__*/function () { var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(resp) { var data, contentType, blob, defaultFileName, filenameStr, matchFilename, exportInfo; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: if (resp.headers) { _context.next = 2; break; } throw TypeError('"exportFn" must return a promise resolved a response with http headers.'); case 2: data = resp.data || { code: -1 }; contentType = resp.headers['content-type']; // 非 application/json 当 blob 处理 if (contentType.includes('application/json')) { _context.next = 12; break; } blob = new Blob([resp.data], { type: contentType }); defaultFileName = 'export.file'; filenameStr = resp.headers['content-disposition']; if (filenameStr) { matchFilename = filenameStr.match(/filename=.+\.[a-zA-Z]+/); if (matchFilename) { defaultFileName = matchFilename[0].replace(/filename=/, ''); } } saveAs(blob, blobFileName || defaultFileName); setExporting(false); return _context.abrupt("return"); case 12: if (!(data instanceof Blob)) { _context.next = 16; break; } _context.next = 15; return resolveBlobError(data); case 15: data = _context.sent; case 16: if (!(data.code === existedCode)) { _context.next = 19; break; } alert(getSuccessTips(i18n)(reportCenterURL, inFrame, true)); return _context.abrupt("return"); case 19: if (data.code === 200) { exportInfo = data.data; if (typeof exportInfo === 'string' && /^(http|ftp)s?:\/\//.test(exportInfo)) { saveAs(data.data); } else if (exportInfo) { alert(getSuccessTips(i18n)(reportCenterURL, inFrame)); } } else { alert(data.msg || data.message || i18n.get('导出失败')); } setExporting(false); case 21: case "end": return _context.stop(); } }, _callee); })); return function (_x) { return _ref.apply(this, arguments); }; }())["catch"](function () { alert(i18n.get('导出失败')); setExporting(false); }); }; useEffect(function () { visible && setTimeout(function () { setTipContent(''); setVisible(false); }, (exportConfig === null || exportConfig === void 0 ? void 0 : exportConfig.popoverHideTime) || 4000); }, [visible]); return /*#__PURE__*/React.createElement(Popover, { visible: visible, content: tipContent, placement: placement }, exporting && !children && /*#__PURE__*/React.createElement(Spin, null), children ? /*#__PURE__*/React.createElement("span", { onClick: function onClick() { return sendExport(); }, style: { pointerEvents: exporting ? 'none' : 'unset' } }, children) : !exporting && /*#__PURE__*/React.createElement("span", { className: "umui-export", onClick: function onClick() { return sendExport(); } }, /*#__PURE__*/React.createElement(Icon, { type: "umicon-export", className: "umicon-export-class" }), text)); }; Export.displayName = 'Export'; export default Export;