xref: /plugin/bpmnio/action/editor.php (revision f0ae282c3779e06e155947d72c1b64061690001d)
1c4f02a6eSJaap de Haan<?php
2d4abf4f0SJaap de Haan
3c4f02a6eSJaap de Haan/**
4c4f02a6eSJaap de Haan * @license    See LICENSE file
5c4f02a6eSJaap de Haan * @author     Jaap de Haan <jaap.dehaan@color-of-code.de>
6c4f02a6eSJaap de Haan */
7c4f02a6eSJaap de Haan
8c4f02a6eSJaap de Haan// See help:
9c4f02a6eSJaap de Haan// * https://www.dokuwiki.org/devel:section_editor
10c4f02a6eSJaap de Haan// * https://www.dokuwiki.org/devel:releases:refactor2021
11c4f02a6eSJaap de Haan
12d4abf4f0SJaap de Haanuse dokuwiki\Form\Form;
13d4abf4f0SJaap de Haanuse dokuwiki\Utf8;
14d4abf4f0SJaap de Haan
15c4f02a6eSJaap de Haanclass action_plugin_bpmnio_editor extends DokuWiki_Action_Plugin
16c4f02a6eSJaap de Haan{
17c4f02a6eSJaap de Haan    public function register(Doku_Event_Handler $controller)
18c4f02a6eSJaap de Haan    {
19c4f02a6eSJaap de Haan        $controller->register_hook('HTML_SECEDIT_BUTTON', 'BEFORE', $this, 'secedit_button');
20d4abf4f0SJaap de Haan
21d4abf4f0SJaap de Haan        $controller->register_hook('EDIT_FORM_ADDTEXTAREA', 'BEFORE', $this, 'handle_form');
22d4abf4f0SJaap de Haan        $controller->register_hook('HTML_EDIT_FORMSELECTION', 'BEFORE', $this, 'handle_form');
23d4abf4f0SJaap de Haan
24d4abf4f0SJaap de Haan        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_post');
25c4f02a6eSJaap de Haan    }
26c4f02a6eSJaap de Haan
27c4f02a6eSJaap de Haan    function secedit_button(Doku_Event $event)
28c4f02a6eSJaap de Haan    {
29c4f02a6eSJaap de Haan        if ($this->_shall_ignore($event)) return;
30c4f02a6eSJaap de Haan
31c4f02a6eSJaap de Haan        $event->data['name'] = $this->getLang('edit_diagram');
32c4f02a6eSJaap de Haan    }
33c4f02a6eSJaap de Haan
34d4abf4f0SJaap de Haan    function handle_form(Doku_Event $event)
35d4abf4f0SJaap de Haan    {
36d4abf4f0SJaap de Haan        if ($this->_shall_ignore($event)) return;
37d4abf4f0SJaap de Haan
38d4abf4f0SJaap de Haan        global $TEXT;
39d4abf4f0SJaap de Haan        global $RANGE;
40d4abf4f0SJaap de Haan        global $INPUT;
41d4abf4f0SJaap de Haan
42d4abf4f0SJaap de Haan        if (!$RANGE) {
43d4abf4f0SJaap de Haan            // section editing failed, use default editor instead
44d4abf4f0SJaap de Haan            $event->data['target'] = 'section';
45d4abf4f0SJaap de Haan            return;
46d4abf4f0SJaap de Haan        }
47d4abf4f0SJaap de Haan
48d4abf4f0SJaap de Haan        $event->stopPropagation();
49d4abf4f0SJaap de Haan        $event->preventDefault();
50d4abf4f0SJaap de Haan
51d4abf4f0SJaap de Haan        $form = &$event->data['form'];
52d4abf4f0SJaap de Haan        $data = base64_encode($TEXT);
53d4abf4f0SJaap de Haan
54*f0ae282cSJaap de Haan        $type = 'bpmn';
55*f0ae282cSJaap de Haan        if ($event->data['target'] === 'plugin_bpmnio_dmn')
56*f0ae282cSJaap de Haan            $type = 'dmn';
57*f0ae282cSJaap de Haan
58d4abf4f0SJaap de Haan        $this->_addHidden($form, 'plugin_bpmnio_data', $data);
59d4abf4f0SJaap de Haan        $this->_addHTML($form, <<<HTML
60*f0ae282cSJaap de Haan            <div class="plugin-bpmnio" id="plugin_bpmnio__{$type}_editor">
61*f0ae282cSJaap de Haan                <div class="{$type}_js_data">{$data}</div>
62*f0ae282cSJaap de Haan                <div class="{$type}_js_canvas">
63*f0ae282cSJaap de Haan                    <div class="{$type}_js_container"></div>
64d4abf4f0SJaap de Haan                </div>
65d4abf4f0SJaap de Haan                </div>
66d4abf4f0SJaap de Haan            </div>
67d4abf4f0SJaap de Haan            HTML);
68d4abf4f0SJaap de Haan
69d4abf4f0SJaap de Haan        // used during previews
70*f0ae282cSJaap de Haan        $this->_addHidden($form, 'target', "plugin_bpmnio_{$type}");
71d4abf4f0SJaap de Haan        $this->_addHidden($form, 'range', $RANGE);
72d4abf4f0SJaap de Haan    }
73d4abf4f0SJaap de Haan
74d4abf4f0SJaap de Haan    function handle_post(Doku_Event $event)
75d4abf4f0SJaap de Haan    {
76d4abf4f0SJaap de Haan        global $TEXT;
77d4abf4f0SJaap de Haan        global $INPUT;
78d4abf4f0SJaap de Haan
79d4abf4f0SJaap de Haan        if (!$INPUT->post->has('plugin_bpmnio_data')) return;
80d4abf4f0SJaap de Haan
81d4abf4f0SJaap de Haan        $TEXT = base64_decode($INPUT->post->str('plugin_bpmnio_data'));
82d4abf4f0SJaap de Haan    }
83d4abf4f0SJaap de Haan
84d4abf4f0SJaap de Haan    private function _addHidden($form, $field, $data)
85d4abf4f0SJaap de Haan    {
86d4abf4f0SJaap de Haan        if (is_a($form, Form::class)) { // $event->name is EDIT_FORM_ADDTEXTAREA
87d4abf4f0SJaap de Haan            $form->setHiddenField($field, $data);
88d4abf4f0SJaap de Haan        } else { // $event->name is HTML_EDIT_FORMSELECTION
89d4abf4f0SJaap de Haan            $form->addHidden($field, $data);
90d4abf4f0SJaap de Haan        }
91d4abf4f0SJaap de Haan    }
92d4abf4f0SJaap de Haan
93d4abf4f0SJaap de Haan    private function _addHTML($form, $data)
94d4abf4f0SJaap de Haan    {
95d4abf4f0SJaap de Haan        $form->addHTML($data);
96d4abf4f0SJaap de Haan    }
97d4abf4f0SJaap de Haan
98c4f02a6eSJaap de Haan    private function _shall_ignore(Doku_Event $event)
99c4f02a6eSJaap de Haan    {
100*f0ae282cSJaap de Haan        if ($event->data['target'] === 'plugin_bpmnio_bpmn')
101c4f02a6eSJaap de Haan            return false;
102*f0ae282cSJaap de Haan        if ($event->data['target'] === 'plugin_bpmnio_dmn')
103*f0ae282cSJaap de Haan            return false;
104*f0ae282cSJaap de Haan        return true;
105c4f02a6eSJaap de Haan    }
106c4f02a6eSJaap de Haan}
107