xref: /plugin/bpmnio/action/editor.php (revision d4abf4f00ed385621d0aefbc15088975099af248)
1c4f02a6eSJaap de Haan<?php
2*d4abf4f0SJaap 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
12*d4abf4f0SJaap de Haanuse dokuwiki\Form\Form;
13*d4abf4f0SJaap de Haanuse dokuwiki\Utf8;
14*d4abf4f0SJaap 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');
20*d4abf4f0SJaap de Haan
21*d4abf4f0SJaap de Haan        $controller->register_hook('EDIT_FORM_ADDTEXTAREA', 'BEFORE', $this, 'handle_form');
22*d4abf4f0SJaap de Haan        $controller->register_hook('HTML_EDIT_FORMSELECTION', 'BEFORE', $this, 'handle_form');
23*d4abf4f0SJaap de Haan
24*d4abf4f0SJaap 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
34*d4abf4f0SJaap de Haan    function handle_form(Doku_Event $event)
35*d4abf4f0SJaap de Haan    {
36*d4abf4f0SJaap de Haan        if ($this->_shall_ignore($event)) return;
37*d4abf4f0SJaap de Haan
38*d4abf4f0SJaap de Haan        global $TEXT;
39*d4abf4f0SJaap de Haan        global $RANGE;
40*d4abf4f0SJaap de Haan        global $INPUT;
41*d4abf4f0SJaap de Haan
42*d4abf4f0SJaap de Haan        if (!$RANGE) {
43*d4abf4f0SJaap de Haan            // section editing failed, use default editor instead
44*d4abf4f0SJaap de Haan            $event->data['target'] = 'section';
45*d4abf4f0SJaap de Haan            return;
46*d4abf4f0SJaap de Haan        }
47*d4abf4f0SJaap de Haan
48*d4abf4f0SJaap de Haan        $event->stopPropagation();
49*d4abf4f0SJaap de Haan        $event->preventDefault();
50*d4abf4f0SJaap de Haan
51*d4abf4f0SJaap de Haan        $form = &$event->data['form'];
52*d4abf4f0SJaap de Haan        $data = base64_encode($TEXT);
53*d4abf4f0SJaap de Haan
54*d4abf4f0SJaap de Haan        $this->_addHidden($form, 'plugin_bpmnio_data', $data);
55*d4abf4f0SJaap de Haan        $this->_addHTML($form, <<<HTML
56*d4abf4f0SJaap de Haan            <div class="plugin-bpmnio" id="plugin_bpmnio__editor">
57*d4abf4f0SJaap de Haan                <div class="bpmn_js_data">{$data}</div>
58*d4abf4f0SJaap de Haan                <div class="bpmn_js_canvas">
59*d4abf4f0SJaap de Haan                    <div class="bpmn_js_container"></div>
60*d4abf4f0SJaap de Haan                </div>
61*d4abf4f0SJaap de Haan                </div>
62*d4abf4f0SJaap de Haan            </div>
63*d4abf4f0SJaap de Haan            HTML);
64*d4abf4f0SJaap de Haan
65*d4abf4f0SJaap de Haan        // used during previews
66*d4abf4f0SJaap de Haan        $this->_addHidden($form, 'target', 'plugin_bpmnio');
67*d4abf4f0SJaap de Haan        $this->_addHidden($form, 'range', $RANGE);
68*d4abf4f0SJaap de Haan    }
69*d4abf4f0SJaap de Haan
70*d4abf4f0SJaap de Haan    function handle_post(Doku_Event $event)
71*d4abf4f0SJaap de Haan    {
72*d4abf4f0SJaap de Haan        global $TEXT;
73*d4abf4f0SJaap de Haan        global $INPUT;
74*d4abf4f0SJaap de Haan
75*d4abf4f0SJaap de Haan        if (!$INPUT->post->has('plugin_bpmnio_data')) return;
76*d4abf4f0SJaap de Haan
77*d4abf4f0SJaap de Haan        $TEXT = base64_decode($INPUT->post->str('plugin_bpmnio_data'));
78*d4abf4f0SJaap de Haan    }
79*d4abf4f0SJaap de Haan
80*d4abf4f0SJaap de Haan    private function _addHidden($form, $field, $data)
81*d4abf4f0SJaap de Haan    {
82*d4abf4f0SJaap de Haan        if (is_a($form, Form::class)) { // $event->name is EDIT_FORM_ADDTEXTAREA
83*d4abf4f0SJaap de Haan            $form->setHiddenField($field, $data);
84*d4abf4f0SJaap de Haan        } else { // $event->name is HTML_EDIT_FORMSELECTION
85*d4abf4f0SJaap de Haan            $form->addHidden($field, $data);
86*d4abf4f0SJaap de Haan        }
87*d4abf4f0SJaap de Haan    }
88*d4abf4f0SJaap de Haan
89*d4abf4f0SJaap de Haan    private function _addHTML($form, $data)
90*d4abf4f0SJaap de Haan    {
91*d4abf4f0SJaap de Haan        $form->addHTML($data);
92*d4abf4f0SJaap de Haan    }
93*d4abf4f0SJaap de Haan
94c4f02a6eSJaap de Haan    private function _shall_ignore(Doku_Event $event)
95c4f02a6eSJaap de Haan    {
96c4f02a6eSJaap de Haan        if ($event->data['target'] !== 'plugin_bpmnio')
97c4f02a6eSJaap de Haan            return true;
98c4f02a6eSJaap de Haan        return false;
99c4f02a6eSJaap de Haan    }
100c4f02a6eSJaap de Haan}
101