UNPKG

oda-framework

Version:

It's an ES Progressive Framework based on the technology of Web Components and designed especially for creating custom UI/UX of any complexity for web and cross-platform PWA mobile applications.

74 lines (64 loc) 2.4 kB
export const PrintElements = (function () { const hideFromPrintClass = "pe-no-print"; const preservePrintClass = "pe-preserve-print"; const preserveAncestorClass = "pe-preserve-ancestor"; const bodyElementName = "BODY"; const _hide = function (element) { if (!element.classList.contains(preservePrintClass)) { element.classList.add(hideFromPrintClass); } } const _preserve = function (element, isStartingElement) { element.classList.remove(hideFromPrintClass); element.classList.add(preservePrintClass); if (!isStartingElement) { element.classList.add(preserveAncestorClass); } } const _clean = function (element) { element.classList.remove(hideFromPrintClass); element.classList.remove(preservePrintClass); element.classList.remove(preserveAncestorClass); } const _walkSiblings = function (element, callback) { let sibling = element.previousElementSibling; while (sibling) { callback(sibling); sibling = sibling.previousElementSibling; } sibling = element.nextElementSibling; while (sibling) { callback(sibling); sibling = sibling.nextElementSibling; } } const _attachPrintClasses = function (element, isStartingElement) { _preserve(element, isStartingElement); _walkSiblings(element, _hide); } const _cleanup = function (element, isStartingElement) { _clean(element); _walkSiblings(element, _clean); } const _walkTree = function (element, callback) { let currentElement = element; callback(currentElement, true); currentElement = currentElement.parentElement; while (currentElement && currentElement.nodeName !== bodyElementName) { callback(currentElement, false); currentElement = currentElement.parentElement; } } const _print = function (elements) { for (let i = 0; i < elements.length; i++) { _walkTree(elements[i], _attachPrintClasses); } window.print(); for (let i = 0; i < elements.length; i++) { _walkTree(elements[i], _cleanup); } } return { print: _print } })()