yuang-framework-ui-pc
Version:
yuang-framework-ui-pc Library
219 lines (218 loc) • 6.34 kB
JavaScript
;
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const vue = require("vue");
const hook = require("../utils/hook");
const printContainerId = "ele-printer-container";
const printFrameId = "ele-printer-iframe";
const printingClass = "ele-printing";
let printIdNum = 0;
function mergeOptions(options, userOptions) {
if (options == null) {
return userOptions;
}
return Object.assign({}, options, userOptions);
}
function getPrintContainer() {
const container = document.getElementById(printContainerId);
if (container) {
return container;
}
const elem = document.createElement("div");
elem.id = printContainerId;
document.body.appendChild(elem);
return elem;
}
function getOptionCss(opt) {
const css = ["@page {"];
if (opt.margin != null && opt.margin !== "") {
const v = typeof opt.margin === "number" ? opt.margin + "px" : opt.margin;
css.push(`margin: ${v};`);
}
if (opt.direction != null && opt.direction !== "") {
css.push(`size: ${opt.direction};`);
}
if (opt.orientation != null && opt.orientation !== "") {
css.push(`page-orientation: ${opt.orientation};`);
}
css.push("}");
return css.join(" ");
}
function removePrintFrame() {
const pFrame = document.getElementById(printFrameId);
if (pFrame) {
if (pFrame.parentNode) {
pFrame.parentNode.removeChild(pFrame);
}
const url = pFrame.getAttribute("src");
if (url) {
try {
window.URL.revokeObjectURL(url);
} catch (e) {
console.error(e);
}
}
}
}
function getPrintFrame() {
removePrintFrame();
const elem = document.createElement("iframe");
elem.id = printFrameId;
elem.style.width = "66px";
elem.style.height = "66px";
elem.style.position = "fixed";
elem.style.left = "-666px";
elem.style.top = "-666px";
document.body.appendChild(elem);
elem.focus();
return elem;
}
function doPrintOnFrame(opt, printId) {
var _a;
const pFrame = getPrintFrame();
const pWin = pFrame.contentWindow;
if (!pWin) {
return;
}
pWin.focus();
const pDoc = pFrame.contentDocument || pWin.document;
if (!pDoc) {
return;
}
const container = getPrintContainer();
Array.from(
container.querySelectorAll('input[type="text"], input[type="number"]')
).forEach((el) => {
el.setAttribute("value", el.value);
});
pDoc.open();
const printOption = opt.options ? `JSON.parse('${JSON.stringify(opt.options)}')` : "";
const optHtml = `
<style type="text/css" media="print">
${getOptionCss(opt)}
</style>
<script>
const $html = document.querySelector('html');
if($html && $html.classList && $html.classList.add) {
$html.classList.add('${printingClass}');
}
window.onload = function() {
if(${opt.title == null ? 0 : 1}) {
document.title = '${opt.title}';
}
window.print(${printOption});
window.parent.postMessage('elePrintDone_${printId}', '*');
};
<\/script>
`;
const html = ((_a = document.querySelector("html")) == null ? void 0 : _a.outerHTML) || "";
const content = html.replace(/<script/g, '<textarea style="display:none;" ').replace(/<\/script>/g, "</textarea>").replace(/<\/html>/, optHtml + "</html>");
pDoc.write("<!DOCTYPE html>" + content);
pDoc.close();
return pWin;
}
function usePrinter(done) {
printIdNum++;
const printId = printIdNum;
const [startPrintTimer] = hook.useTimer(500);
const doPrint = (option, target) => {
if (target === "_iframe") {
doPrintOnFrame(option, printId);
return;
}
const $html = document.querySelector("html");
if (!$html) {
done && done();
return;
}
$html.classList.add(printingClass);
const elem = document.createElement("style");
elem.setAttribute("type", "text/css");
elem.setAttribute("media", "print");
elem.innerHTML = getOptionCss(option);
document.body.appendChild(elem);
const title = document.title;
if (option.title != null && option.title !== "") {
document.title = option.title;
}
window.print(option.options);
startPrintTimer(() => {
$html.classList.remove(printingClass);
document.body.removeChild(elem);
if (option.title != null) {
document.title = title;
}
done && done();
});
};
const handleMessage = (e) => {
if (e.data === `elePrintDone_${printId}`) {
startPrintTimer(() => {
removePrintFrame();
done && done();
});
}
};
vue.onBeforeUnmount(() => {
window.removeEventListener("message", handleMessage);
});
window.addEventListener("message", handleMessage);
return doPrint;
}
function printPdf(option) {
const pFrame = getPrintFrame();
pFrame.onload = () => {
const url = pFrame.getAttribute("src");
if (!url) {
return;
}
pFrame.focus();
try {
pFrame.contentWindow && pFrame.contentWindow.print(option.options);
option.done && option.done();
window.URL.revokeObjectURL(url);
return;
} catch (e) {
console.error(e);
}
if (!option.arraybuffer && option.url) {
window.URL.revokeObjectURL(url);
window.open(option.url);
} else {
window.open(url);
}
option.done && option.done();
};
const doPrint = (buffer) => {
const blob = new window.Blob([buffer], { type: "application/pdf" });
if (window.navigator && window.navigator["msSaveOrOpenBlob"]) {
window.navigator["msSaveOrOpenBlob"](blob, "print.pdf");
option.done && option.done();
return;
}
pFrame.setAttribute("src", window.URL.createObjectURL(blob));
};
if (option.arraybuffer) {
doPrint(option.arraybuffer);
return;
}
if (option.url) {
const req = new window.XMLHttpRequest();
req.open("GET", option.url, true);
req.responseType = "arraybuffer";
req.onload = () => {
if ([200, 201].indexOf(req.status) !== -1) {
doPrint(req.response);
return;
}
option.error && option.error(req.status, req.statusText);
};
req.send();
}
}
exports.getPrintContainer = getPrintContainer;
exports.mergeOptions = mergeOptions;
exports.printContainerId = printContainerId;
exports.printFrameId = printFrameId;
exports.printPdf = printPdf;
exports.printingClass = printingClass;
exports.usePrinter = usePrinter;