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