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    public function register(EventHandler $controller)
19    {
20        $controller->register_hook('HTML_SECEDIT_BUTTON', 'BEFORE', $this, 'sectionEditButton');
21        $controller->register_hook('EDIT_FORM_ADDTEXTAREA', 'BEFORE', $this, 'handleForm');
22        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handlePost');
23        $controller->register_hook('FORM_EDIT_OUTPUT', 'BEFORE', $this, 'handleFormEditOutput');
24    }
25
26    public function handleFormEditOutput(Event $event)
27    {
28        /** @var Doku_Form $form */
29        $form = &$event->data;
30
31        $previewButtonPosition = $form->findPositionByAttribute('id', 'edbtn__preview');
32        if ($previewButtonPosition !== false) {
33            $form->removeElement($previewButtonPosition);
34        }
35    }
36
37    public function sectionEditButton(Event $event)
38    {
39        if ($this->shallIgnore($event)) return;
40
41        $event->data['name'] = $this->getLang('edit_diagram');
42    }
43
44    public function handleForm(Event $event)
45    {
46        if ($this->shallIgnore($event)) return;
47
48        global $TEXT;
49        global $RANGE;
50        global $INPUT;
51
52        if (!$RANGE) {
53            // section editing failed, use default editor instead
54            $event->data['target'] = 'section';
55            return;
56        }
57
58        $event->stopPropagation();
59        $event->preventDefault();
60
61        /** @var Doku_Form $form */
62        $form = &$event->data['form'];
63        $data = base64_encode($TEXT);
64
65        $type = 'bpmn';
66        if ($event->data['target'] === 'plugin_bpmnio_dmn')
67            $type = 'dmn';
68
69        $form->setHiddenField('plugin_bpmnio_data', $data);
70        $form->addHTML(<<<HTML
71            <div class="plugin-bpmnio" id="plugin_bpmnio__{$type}_editor">
72                <div class="{$type}_js_data">{$data}</div>
73                <div class="{$type}_js_canvas">
74                    <div class="{$type}_js_container"></div>
75                </div>
76                </div>
77            </div>
78            HTML);
79
80        // used during previews
81        $form->setHiddenField('target', "plugin_bpmnio_{$type}");
82        $form->setHiddenField('range', $RANGE);
83    }
84
85    public function handlePost(Event $event)
86    {
87        global $TEXT;
88        global $INPUT;
89
90        if (!$INPUT->post->has('plugin_bpmnio_data')) return;
91
92        $TEXT = base64_decode($INPUT->post->str('plugin_bpmnio_data'));
93    }
94
95    private function shallIgnore(Event $event)
96    {
97        if ($event->data['target'] === 'plugin_bpmnio_bpmn')
98            return false;
99        if ($event->data['target'] === 'plugin_bpmnio_dmn')
100            return false;
101        return true;
102    }
103}
104