xref: /plugin/bpmnio/action/editor.php (revision 36b712d809a9afeda77eb7dba8abf621818208c9)
1<?php
2
3/**
4 * @license    See LICENSE file
5 */
6
7// See help:
8// * https://www.dokuwiki.org/devel:section_editor
9// * https://www.dokuwiki.org/devel:releases:refactor2021
10use dokuwiki\Extension\ActionPlugin;
11use dokuwiki\Extension\EventHandler;
12use dokuwiki\Extension\Event;
13use dokuwiki\Form\Form;
14use dokuwiki\Utf8;
15
16class action_plugin_bpmnio_editor extends ActionPlugin
17{
18    private function loadLinkProcessor(): void
19    {
20        require_once __DIR__ . '/../inc/link_processor.php';
21    }
22
23    public function register(EventHandler $controller): void
24    {
25        $controller->register_hook('HTML_SECEDIT_BUTTON', 'BEFORE', $this, 'sectionEditButton');
26        $controller->register_hook('EDIT_FORM_ADDTEXTAREA', 'BEFORE', $this, 'handleForm');
27        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handlePost');
28        $controller->register_hook('FORM_EDIT_OUTPUT', 'BEFORE', $this, 'handleFormEditOutput');
29    }
30
31    public function handleFormEditOutput(Event $event)
32    {
33    }
34
35    public function sectionEditButton(Event $event)
36    {
37        if ($this->shallIgnore($event)) {
38            return;
39        }
40
41        $event->data['name'] = $this->getLang('edit_diagram');
42    }
43
44    public function handleForm(Event $event)
45    {
46        if ($this->shallIgnore($event)) {
47            return;
48        }
49
50        global $TEXT;
51        global $RANGE;
52        global $INPUT;
53
54        if (!$RANGE) {
55            // section editing failed, use default editor instead
56            $event->data['target'] = 'section';
57            return;
58        }
59
60        $event->stopPropagation();
61        $event->preventDefault();
62
63        /** @var Doku_Form $form */
64        $form = &$event->data['form'];
65        $data = base64_encode($TEXT);
66        $this->loadLinkProcessor();
67        $payload = plugin_bpmnio_link_processor::buildPayload($TEXT);
68        $renderData = base64_encode($payload['xml']);
69        $linkData = base64_encode(json_encode($payload['links']));
70
71        $type = 'bpmn';
72        if ($event->data['target'] === 'plugin_bpmnio_dmn') {
73            $type = 'dmn';
74        }
75
76        $form->setHiddenField('plugin_bpmnio_data', $data);
77        $form->setHiddenField('plugin_bpmnio_links', $linkData);
78        $form->addHTML(<<<HTML
79            <div class="plugin-bpmnio" id="plugin_bpmnio__{$type}_editor">
80                <div class="{$type}_js_data">{$renderData}</div>
81                <div class="{$type}_js_links">{$linkData}</div>
82                <div class="{$type}_js_canvas">
83                    <div class="{$type}_js_container"></div>
84                </div>
85            </div>
86            HTML);
87
88        // used during previews
89        $form->setHiddenField('target', "plugin_bpmnio_{$type}");
90        $form->setHiddenField('range', $RANGE);
91    }
92
93    public function handlePost(Event $event)
94    {
95        global $TEXT;
96        global $INPUT;
97
98        if (!$INPUT->post->has('plugin_bpmnio_data')) {
99            return;
100        }
101
102        $TEXT = base64_decode($INPUT->post->str('plugin_bpmnio_data'));
103    }
104
105    private function shallIgnore(Event $event)
106    {
107        if ($event->data['target'] === 'plugin_bpmnio_bpmn') {
108            return false;
109        }
110        if ($event->data['target'] === 'plugin_bpmnio_dmn') {
111            return false;
112        }
113        return true;
114    }
115}
116