qt-public-ui
Version:
新设计规范下业务组件库
199 lines • 7.55 kB
JavaScript
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;