vue-html-2-paper
Version:
Vue mixin for printing html elements to paper.
95 lines (77 loc) • 2.5 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 (Vue, options = {}) {
Vue.prototype.$htmlToPaper = (el, localOptions, cb = () => true) => {
let defaultName = '_blank',
defaultSpecs = ['fullscreen=yes','titlebar=yes', 'scrollbars=yes'],
defaultReplace = true,
defaultStyles = [],
defaultAutoClose = false
let {
name = defaultName,
specs = defaultSpecs,
replace = defaultReplace,
styles = defaultStyles,
autoClose = defaultAutoClose
} = 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) autoClose=localOptions.autoClose;
}
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>${window.document.title}</title>
</head>
<body>
${element.innerHTML}
</body>
</html>
`);
addStyles(win, styles);
setTimeout(() => {
win.document.close();
win.focus();
win.print();
if(autoClose === true){
setTimeout(function () {win.close();}, 10);
}
cb();
}, 1000);
return win;
};
},
};
exports.default = VueHtmlToPaper;