vue-html-to-paper
Version:
Vue mixin for printing html elements to paper.
94 lines (79 loc) • 2.58 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
function addStyles (win, styles) {
styles.forEach(style => {
let link = win.document.createElement('link');
link.setAttribute('rel', 'stylesheet');
link.setAttribute('type', 'text/css');
link.setAttribute('href', style);
win.document.getElementsByTagName('head')[0].appendChild(link);
});
}
function openWindow (url, name, props) {
let windowRef = null;
windowRef = window.open(url, name, props);
if (!windowRef.opener) {
windowRef.opener = self;
}
windowRef.focus();
return windowRef;
}
const VueHtmlToPaper = {
install (app, options = {}) {
app.config.globalProperties.$htmlToPaper = (el, localOptions, cb = () => true) => {
let defaultName = '_blank',
defaultSpecs = ['fullscreen=yes','titlebar=yes', 'scrollbars=yes'],
defaultReplace = true,
defaultStyles = [],
defaultWindowTitle = window.document.title;
let {
name = defaultName,
specs = defaultSpecs,
replace = defaultReplace,
styles = defaultStyles,
autoClose = true,
windowTitle = defaultWindowTitle,
} = options;
// If has localOptions
// TODO: improve logic
if (!!localOptions) {
if (localOptions.name) name = localOptions.name;
if (localOptions.specs) specs = localOptions.specs;
if (localOptions.replace) replace = localOptions.replace;
if (localOptions.styles) styles = localOptions.styles;
if (localOptions.autoClose === false) autoClose = localOptions.autoClose;
if (localOptions.windowTitle) windowTitle = localOptions.windowTitle;
}
specs = !!specs.length ? specs.join(',') : '';
const element = window.document.getElementById(el);
if (!element) {
alert(`Element to print #${el} not found!`);
return;
}
const url = '';
const win = openWindow(url, name, specs);
win.document.write(`
<html>
<head>
<title>${windowTitle || window.document.title}</title>
</head>
<body>
${element.innerHTML}
</body>
</html>
`);
addStyles(win, styles);
setTimeout(() => {
win.focus();
win.print();
console.warn('autoClose', autoClose);
if (autoClose) {
setTimeout(function () {win.close();}, 1);
}
cb();
}, 1000);
return true;
};
},
};
exports.default = VueHtmlToPaper;