xref: /plugin/bpmnio/action/editor.php (revision 962d7b81eacf3a5589ab5a5379dff53898ee8445)
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
10
11use dokuwiki\Form\Form;
12use dokuwiki\Utf8;
13
14class action_plugin_bpmnio_editor extends DokuWiki_Action_Plugin
15{
16    public function register(Doku_Event_Handler $controller)
17    {
18        $controller->register_hook('HTML_SECEDIT_BUTTON', 'BEFORE', $this, 'sectionEditButton');
19        $controller->register_hook('EDIT_FORM_ADDTEXTAREA', 'BEFORE', $this, 'handleForm');
20        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handlePost');
21    }
22
23    public function sectionEditButton(Doku_Event $event)
24    {
25        if ($this->shallIgnore($event)) return;
26
27        $event->data['name'] = $this->getLang('edit_diagram');
28    }
29
30    public function handleForm(Doku_Event $event)
31    {
32        if ($this->shallIgnore($event)) return;
33
34        global $TEXT;
35        global $RANGE;
36        global $INPUT;
37
38        if (!$RANGE) {
39            // section editing failed, use default editor instead
40            $event->data['target'] = 'section';
41            return;
42        }
43
44        $event->stopPropagation();
45        $event->preventDefault();
46
47        /** @var Doku_Form $form */
48        $form = &$event->data['form'];
49        $data = base64_encode($TEXT);
50
51        $type = 'bpmn';
52        if ($event->data['target'] === 'plugin_bpmnio_dmn')
53            $type = 'dmn';
54
55        $form->setHiddenField('plugin_bpmnio_data', $data);
56        $form->addHTML(<<<HTML
57            <div class="plugin-bpmnio" id="plugin_bpmnio__{$type}_editor">
58                <div class="{$type}_js_data">{$data}</div>
59                <div class="{$type}_js_canvas">
60                    <div class="{$type}_js_container"></div>
61                </div>
62                </div>
63            </div>
64            HTML);
65
66        // used during previews
67        $form->setHiddenField('target', "plugin_bpmnio_{$type}");
68        $form->setHiddenField('range', $RANGE);
69    }
70
71    public function handlePost(Doku_Event $event)
72    {
73        global $TEXT;
74        global $INPUT;
75
76        if (!$INPUT->post->has('plugin_bpmnio_data')) return;
77
78        $TEXT = base64_decode($INPUT->post->str('plugin_bpmnio_data'));
79    }
80
81    private function shallIgnore(Doku_Event $event)
82    {
83        if ($event->data['target'] === 'plugin_bpmnio_bpmn')
84            return false;
85        if ($event->data['target'] === 'plugin_bpmnio_dmn')
86            return false;
87        return true;
88    }
89}
90