vxe-table-demonic
Version:
一个基于 vue 的 PC 端表单/表格组件,支持增删改查、虚拟列表、虚拟树、懒加载、快捷菜单、数据校验、树形结构、打印导出、表单渲染、数据分页、弹窗、自定义模板、渲染器、JSON 配置式...
192 lines (191 loc) • 8.26 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createFrame = createFrame;
exports.createHtmlPage = createHtmlPage;
exports.getExportBlobByContent = getExportBlobByContent;
exports.handlePrint = handlePrint;
exports.saveLocalFile = exports.readLocalFile = void 0;
var _xeUtils = _interopRequireDefault(require("xe-utils"));
var _conf = _interopRequireDefault(require("../../v-x-e-table/src/conf"));
var _vXETable = require("../../v-x-e-table");
var _dom = require("../../tools/dom");
var _utils = require("../../tools/utils");
var _log = require("../../tools/log");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// 导入
var fileForm;
var fileInput;
// 打印
var printFrame;
// 默认导出或打印的 HTML 样式
var defaultHtmlStyle = 'body{margin:0;padding: 0 1px;color:#333333;font-size:14px;font-family:"Microsoft YaHei",微软雅黑,"MicrosoftJhengHei",华文细黑,STHeiti,MingLiu}body *{-webkit-box-sizing:border-box;box-sizing:border-box}.vxe-table{border-collapse:collapse;text-align:left;border-spacing:0}.vxe-table:not(.is--print){table-layout:fixed}.vxe-table,.vxe-table th,.vxe-table td,.vxe-table td{border-color:#D0D0D0;border-style:solid;border-width:0}.vxe-table.is--print{width:100%}.border--default,.border--full,.border--outer{border-top-width:1px}.border--default,.border--full,.border--outer{border-left-width:1px}.border--outer,.border--default th,.border--default td,.border--full th,.border--full td,.border--outer th,.border--inner th,.border--inner td{border-bottom-width:1px}.border--default,.border--outer,.border--full th,.border--full td{border-right-width:1px}.border--default th,.border--full th,.border--outer th{background-color:#f8f8f9}.vxe-table td>div,.vxe-table th>div{padding:.5em .4em}.col--center{text-align:center}.col--right{text-align:right}.vxe-table:not(.is--print) .col--ellipsis>div{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-break:break-all}.vxe-table--tree-node{text-align:left}.vxe-table--tree-node-wrapper{position:relative}.vxe-table--tree-icon-wrapper{position:absolute;top:50%;width:1em;height:1em;text-align:center;-webkit-transform:translateY(-50%);transform:translateY(-50%);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer}.vxe-table--tree-unfold-icon,.vxe-table--tree-fold-icon{position:absolute;width:0;height:0;border-style:solid;border-width:.5em;border-right-color:transparent;border-bottom-color:transparent}.vxe-table--tree-unfold-icon{left:.3em;top:0;border-left-color:#939599;border-top-color:transparent}.vxe-table--tree-fold-icon{left:0;top:.3em;border-left-color:transparent;border-top-color:#939599}.vxe-table--tree-cell{display:block;padding-left:1.5em}.vxe-table input[type="checkbox"]{margin:0}.vxe-table input[type="checkbox"],.vxe-table input[type="radio"],.vxe-table input[type="checkbox"]+span,.vxe-table input[type="radio"]+span{vertical-align:middle;padding-left:0.4em}';
function createFrame() {
var frame = document.createElement('iframe');
frame.className = 'vxe-table--print-frame';
return frame;
}
function getExportBlobByContent(content, options) {
return new Blob([content], {
type: "text/".concat(options.type, ";charset=utf-8;")
});
}
function createHtmlPage(opts, content) {
var style = opts.style;
return ['<!DOCTYPE html><html>', '<head>', '<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no,minimal-ui">', "<title>".concat(opts.sheetName, "</title>"), "<style>".concat(defaultHtmlStyle, "</style>"), style ? "<style>".concat(style, "</style>") : '', '</head>', "<body>".concat(content, "</body>"), '</html>'].join('');
}
/**
* 读取本地文件
* @param {*} options 参数
*/
var readLocalFile = function (options) {
var opts = Object.assign({}, options);
if (!fileForm) {
fileForm = document.createElement('form');
fileInput = document.createElement('input');
fileForm.className = 'vxe-table--file-form';
fileInput.name = 'file';
fileInput.type = 'file';
fileForm.appendChild(fileInput);
document.body.appendChild(fileForm);
}
return new Promise(function (resolve, reject) {
var types = opts.types || [];
var isAllType = !types.length || types.some(function (type) {
return type === '*';
});
fileInput.multiple = !!opts.multiple;
fileInput.accept = isAllType ? '' : ".".concat(types.join(', .'));
fileInput.onchange = function (evnt) {
var files = evnt.target.files;
var file = files[0];
var errType = '';
// 校验类型
if (!isAllType) {
for (var fIndex = 0; fIndex < files.length; fIndex++) {
var type = (0, _utils.parseFile)(files[fIndex]).type;
if (!_xeUtils.default.includes(types, type)) {
errType = type;
break;
}
}
}
if (!errType) {
resolve({
status: true,
files: files,
file: file
});
} else {
if (opts.message !== false) {
// 检测弹窗模块
if (process.env.NODE_ENV === 'development') {
if (!_vXETable.VXETable.modal) {
(0, _log.errLog)('vxe.error.reqModule', ['Modal']);
}
}
_vXETable.VXETable.modal.message({
content: _conf.default.i18n('vxe.error.notType', [errType]),
status: 'error'
});
}
var params = {
status: false,
files: files,
file: file
};
reject(params);
}
};
fileForm.reset();
fileInput.click();
});
};
exports.readLocalFile = readLocalFile;
function removePrintFrame() {
if (printFrame) {
if (printFrame.parentNode) {
try {
printFrame.contentDocument.write('');
} catch (e) {}
printFrame.parentNode.removeChild(printFrame);
}
printFrame = null;
}
}
function appendPrintFrame() {
if (!printFrame.parentNode) {
document.body.appendChild(printFrame);
}
}
function afterPrintEvent() {
requestAnimationFrame(removePrintFrame);
}
function handlePrint($xetable, opts, content) {
if (content === void 0) {
content = '';
}
var beforePrintMethod = opts.beforePrintMethod;
if (beforePrintMethod) {
content = beforePrintMethod({
content: content,
options: opts,
$table: $xetable
}) || '';
}
content = createHtmlPage(opts, content);
var blob = getExportBlobByContent(content, opts);
if (_dom.browse.msie) {
removePrintFrame();
printFrame = createFrame();
appendPrintFrame();
printFrame.contentDocument.write(content);
printFrame.contentDocument.execCommand('print');
} else {
if (!printFrame) {
printFrame = createFrame();
printFrame.onload = function (evnt) {
if (evnt.target.src) {
evnt.target.contentWindow.onafterprint = afterPrintEvent;
evnt.target.contentWindow.print();
}
};
}
appendPrintFrame();
printFrame.src = URL.createObjectURL(blob);
}
}
/**
* 保存文件到本地
* @param {*} options 参数
*/
var saveLocalFile = function (options) {
var filename = options.filename,
type = options.type,
content = options.content;
var name = "".concat(filename, ".").concat(type);
if (window.Blob) {
var blob = content instanceof Blob ? content : getExportBlobByContent(_xeUtils.default.toValueString(content), options);
if (navigator.msSaveBlob) {
navigator.msSaveBlob(blob, name);
} else {
var url_1 = URL.createObjectURL(blob);
var linkElem_1 = document.createElement('a');
linkElem_1.target = '_blank';
linkElem_1.download = name;
linkElem_1.href = url_1;
document.body.appendChild(linkElem_1);
linkElem_1.click();
requestAnimationFrame(function () {
if (linkElem_1.parentNode) {
linkElem_1.parentNode.removeChild(linkElem_1);
}
URL.revokeObjectURL(url_1);
});
}
return Promise.resolve();
}
return Promise.reject(new Error((0, _log.getLog)('vxe.error.notExp')));
};
exports.saveLocalFile = saveLocalFile;