xref: /plugin/bpmnio/script/bpmnio_render.js (revision c4f02a6e87d8a7e5a5592838ccca7b7221b9de2e)
1function extractXml(data) {
2    return decodeURIComponent(escape(window.atob(data)));
3}
4
5async function renderDiagram(xml, container, viewer, computeSizeFn) {
6    try {
7        const result = await viewer.importXML(xml);
8        const { warnings } = result;
9        console.log(warnings);
10
11        const size = computeSizeFn(viewer);
12        container.style.height = `${size.height}px`;
13        container.style.width = `max(100%,${size.width}px)`;
14    } catch (err) {
15        container.textContent = err;
16        console.log(err.message, err.warnings);
17    }
18}
19
20function computeBpmnDiagramSize(viewer) {
21    const canvas = viewer.get("canvas");
22    const bboxViewport = canvas.getActiveLayer().getBBox();
23    const bboxSvg = canvas.getSize();
24    canvas.viewbox({
25        x: bboxViewport.x,
26        y: bboxViewport.y,
27        width: bboxSvg.width,
28        height: bboxSvg.height,
29    });
30    return {
31        width: bboxViewport.width,
32        height: bboxViewport.height,
33    };
34}
35
36function computeDmnDiagramSize(viewer) {
37    // fetch currently active view
38    const activeView = viewer.getActiveView();
39
40    // apply initial logic in DRD view
41    if (activeView.type === "drd") {
42        const activeEditor = viewer.getActiveViewer();
43
44        // access active editor components
45        const canvas = activeEditor.get("canvas");
46
47        const bboxViewport = canvas.getActiveLayer().getBBox();
48        const bboxSvg = canvas.getSize();
49        canvas.viewbox({
50            x: bboxViewport.x,
51            y: bboxViewport.y,
52            width: bboxSvg.width,
53            height: bboxSvg.height,
54        });
55        return {
56            width: bboxViewport.width,
57            height: bboxViewport.height,
58        };
59    }
60    return {
61        width: 600,
62        height: 32,
63    };
64}
65
66async function renderBpmnDiagram(xml, container) {
67    const BpmnViewer = window.BpmnJS;
68    const viewer = new BpmnViewer({ container });
69
70    renderDiagram(xml, container, viewer, computeBpmnDiagramSize);
71}
72
73async function renderDmnDiagram(xml, container) {
74    const DmnViewer = window.DmnJS;
75    const viewer = new DmnViewer({ container });
76
77    renderDiagram(xml, container, viewer, computeDmnDiagramSize);
78}
79
80function safeRender(tag, fn) {
81    try {
82        const root = jQuery(tag);
83        const container = root.find(".bpmn_js_container")[0];
84        // avoid double rendering
85        if (container.children?.length > 0) return;
86
87        const data = root.find(".bpmn_js_data")[0];
88        const xml = extractXml(data.textContent);
89
90        fn(xml, container);
91    } catch (err) {
92        console.warn(err.message);
93    }
94}
95
96jQuery(document).ready(function () {
97    jQuery("div[id^=__bpmn_js_]").each((_, tag) =>
98        safeRender(tag, renderBpmnDiagram)
99    );
100    jQuery("div[id^=__dmn_js_]").each((_, tag) =>
101        safeRender(tag, renderDmnDiagram)
102    );
103});
104