summaryrefslogtreecommitdiffstats
path: root/public/js/layout-plugins/page-breaker.js
blob: bdf04ecd22fcbbb51c1841fe5f3640ae24977a62 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/* Icinga PDF Export | (c) 2021 Icinga GmbH | GPLv2 */

"use strict";

(() => {
    Layout.registerPlugin('page-breaker', () => {
        let pageBreaksFor = document.querySelector('[data-pdfexport-page-breaks-at]');
        if (! pageBreaksFor) {
            return;
        }

        let pageBreaksAt = pageBreaksFor.dataset.pdfexportPageBreaksAt;
        if (! pageBreaksAt) {
            return;
        }

        let contentHeight = document.body.dataset.contentHeight;
        let items = Array.from(pageBreaksFor.querySelectorAll(':scope > ' + pageBreaksAt));

        let remainingHeight = contentHeight;
        items.forEach((item, i) => {
            let requiredHeight;
            if (i < items.length - 1) {
                requiredHeight = items[i + 1].getBoundingClientRect().top - item.getBoundingClientRect().top;
            } else {
                requiredHeight = item.parentElement.getBoundingClientRect().bottom - item.getBoundingClientRect().top;
            }

            if (remainingHeight < requiredHeight) {
                if (!! item.previousElementSibling) {
                    item.previousElementSibling.style.pageBreakAfter = 'always';
                    item.previousElementSibling.classList.add('page-break-follows');
                } else {
                    item.style.pageBreakAfter = 'always';
                    item.classList.add('page-break-follows');
                }

                remainingHeight = contentHeight;
            }

            remainingHeight -= requiredHeight;
        });
    });
})();