14d6d17d0SAndreas Gohr<?php 23b76424dSannda 34d6d17d0SAndreas Gohr/** 44d6d17d0SAndreas Gohr * DokuWiki Plugin acknowledge (Action Component) 54d6d17d0SAndreas Gohr * 64d6d17d0SAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 74d6d17d0SAndreas Gohr * @author Andreas Gohr, Anna Dabrowska <dokuwiki@cosmocode.de> 84d6d17d0SAndreas Gohr */ 94d6d17d0SAndreas Gohr 103b76424dSanndause dokuwiki\Extension\ActionPlugin; 113b76424dSanndause dokuwiki\Extension\EventHandler; 123b76424dSanndause dokuwiki\Extension\Event; 135773dd37SAnna Dabrowskause dokuwiki\Form\Form; 144d6d17d0SAndreas Gohr 153b76424dSanndaclass action_plugin_acknowledge extends ActionPlugin 164d6d17d0SAndreas Gohr{ 17ef3ab392SAndreas Gohr /** @inheritDoc */ 183b76424dSannda public function register(EventHandler $controller) 194d6d17d0SAndreas Gohr { 20ef3ab392SAndreas Gohr $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'handlePageSave'); 21ef3ab392SAndreas Gohr $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handleAjax'); 22f09444ffSAndreas Gohr $controller->register_hook('PLUGIN_SQLITE_DATABASE_UPGRADE', 'AFTER', $this, 'handleUpgrade'); 234d6d17d0SAndreas Gohr } 244d6d17d0SAndreas Gohr 254d6d17d0SAndreas Gohr /** 26ef3ab392SAndreas Gohr * Manage page meta data 274d6d17d0SAndreas Gohr * 28ef3ab392SAndreas Gohr * Store page last modified date 29ef3ab392SAndreas Gohr * Handle page deletions 30f09444ffSAndreas Gohr * Handle page creations 314d6d17d0SAndreas Gohr * 323b76424dSannda * @param Event $event 33ef3ab392SAndreas Gohr * @param $param 344d6d17d0SAndreas Gohr */ 353b76424dSannda public function handlePageSave(Event $event, $param) 364d6d17d0SAndreas Gohr { 37ef3ab392SAndreas Gohr /** @var helper_plugin_acknowledge $helper */ 38ef3ab392SAndreas Gohr $helper = plugin_load('helper', 'acknowledge'); 39ef3ab392SAndreas Gohr 40ef3ab392SAndreas Gohr if ($event->data['changeType'] === DOKU_CHANGE_TYPE_DELETE) { 41f09444ffSAndreas Gohr $helper->removePage($event->data['id']); // this cascades to assignments 42ef3ab392SAndreas Gohr } elseif ($event->data['changeType'] !== DOKU_CHANGE_TYPE_MINOR_EDIT) { 435dee13f7SAnna Dabrowska $helper->storePageDate($event->data['id'], $event->data['newRevision'], $event->data['newContent']); 444d6d17d0SAndreas Gohr } 454d6d17d0SAndreas Gohr 46f09444ffSAndreas Gohr // Remove page assignees here because the syntax might have been removed 47f09444ffSAndreas Gohr // they are readded on metadata rendering if still there 48f09444ffSAndreas Gohr $helper->clearPageAssignments($event->data['id']); 49f09444ffSAndreas Gohr 50f09444ffSAndreas Gohr if ($event->data['changeType'] === DOKU_CHANGE_TYPE_CREATE) { 51f09444ffSAndreas Gohr // new pages need to have their auto assignments updated based on the existing patterns 52f09444ffSAndreas Gohr $helper->setAutoAssignees($event->data['id']); 53f09444ffSAndreas Gohr } 54ef3ab392SAndreas Gohr } 55ef3ab392SAndreas Gohr 56ef3ab392SAndreas Gohr /** 573b76424dSannda * @param Event $event 58ef3ab392SAndreas Gohr * @param $param 59ef3ab392SAndreas Gohr */ 603b76424dSannda public function handleAjax(Event $event, $param) 61ef3ab392SAndreas Gohr { 625773dd37SAnna Dabrowska if ($event->data === 'plugin_acknowledge_assign') { 63ef3ab392SAndreas Gohr $event->stopPropagation(); 64ef3ab392SAndreas Gohr $event->preventDefault(); 65cfdacc6aSAnna Dabrowska 66cfdacc6aSAnna Dabrowska global $INPUT; 67cfdacc6aSAnna Dabrowska $id = $INPUT->str('id'); 68cfdacc6aSAnna Dabrowska 69cfdacc6aSAnna Dabrowska if (page_exists($id)) { 70cfdacc6aSAnna Dabrowska echo $this->html(); 71cfdacc6aSAnna Dabrowska } 72ef3ab392SAndreas Gohr } 73ef3ab392SAndreas Gohr } 74ef3ab392SAndreas Gohr 75ef3ab392SAndreas Gohr /** 76f09444ffSAndreas Gohr * Handle Migration events 77f09444ffSAndreas Gohr * 783b76424dSannda * @param Event $event 79f09444ffSAndreas Gohr * @param $param 80f09444ffSAndreas Gohr * @return void 81f09444ffSAndreas Gohr */ 823b76424dSannda public function handleUpgrade(Event $event, $param) 83f09444ffSAndreas Gohr { 84f09444ffSAndreas Gohr if ($event->data['sqlite']->getAdapter()->getDbname() !== 'acknowledgement') { 85f09444ffSAndreas Gohr return; 86f09444ffSAndreas Gohr } 87f09444ffSAndreas Gohr $to = $event->data['to']; 88f09444ffSAndreas Gohr if ($to !== 3) return; // only handle upgrade to version 3 89f09444ffSAndreas Gohr 90f09444ffSAndreas Gohr /** @var helper_plugin_acknowledge $helper */ 91f09444ffSAndreas Gohr $helper = plugin_load('helper', 'acknowledge'); 92f09444ffSAndreas Gohr $helper->updatePageIndex(); 93f09444ffSAndreas Gohr } 94f09444ffSAndreas Gohr 95f09444ffSAndreas Gohr /** 96ef3ab392SAndreas Gohr * Returns the acknowledgment form/confirmation 97ef3ab392SAndreas Gohr * 98ef3ab392SAndreas Gohr * @return string The HTML to display 99ef3ab392SAndreas Gohr */ 100ef3ab392SAndreas Gohr protected function html() 101ef3ab392SAndreas Gohr { 102ef3ab392SAndreas Gohr global $INPUT; 103ef3ab392SAndreas Gohr global $USERINFO; 104ef3ab392SAndreas Gohr $id = $INPUT->str('id'); 1052d63bbe3SAnna Dabrowska $ackSubmitted = $INPUT->bool('ack'); 106ef3ab392SAndreas Gohr $user = $INPUT->server->str('REMOTE_USER'); 107ef3ab392SAndreas Gohr if ($id === '' || $user === '') return ''; 108ef3ab392SAndreas Gohr 109ef3ab392SAndreas Gohr /** @var helper_plugin_acknowledge $helper */ 110ef3ab392SAndreas Gohr $helper = plugin_load('helper', 'acknowledge'); 111ef3ab392SAndreas Gohr 11235bc8beaSAndreas Gohr // only display for users assigned to the page 11335bc8beaSAndreas Gohr if (!$helper->isUserAssigned($id, $user, $USERINFO['grps'])) { 11435bc8beaSAndreas Gohr return ''; 11535bc8beaSAndreas Gohr } 11635bc8beaSAndreas Gohr 1175773dd37SAnna Dabrowska if ($ackSubmitted) { 1185773dd37SAnna Dabrowska $helper->saveAcknowledgement($id, $user); 1195773dd37SAnna Dabrowska } 1205773dd37SAnna Dabrowska 121ef3ab392SAndreas Gohr $ack = $helper->hasUserAcknowledged($id, $user); 122209df5deSAndreas Gohr 123209df5deSAndreas Gohr $html = '<div class="' . ($ack ? 'ack' : 'noack') . '">'; 124209df5deSAndreas Gohr $html .= inlineSVG(__DIR__ . '/admin.svg'); 125209df5deSAndreas Gohr $html .= '</div>'; 126209df5deSAndreas Gohr 127ef3ab392SAndreas Gohr if ($ack) { 128ef3ab392SAndreas Gohr $html .= '<div>'; 129209df5deSAndreas Gohr $html .= '<h4>'; 130209df5deSAndreas Gohr $html .= $this->getLang('ackOk'); 131209df5deSAndreas Gohr $html .= '</h4>'; 132209df5deSAndreas Gohr $html .= sprintf($this->getLang('ackGranted'), dformat($ack)); 133ef3ab392SAndreas Gohr $html .= '</div>'; 13435bc8beaSAndreas Gohr } else { 135ef3ab392SAndreas Gohr $html .= '<div>'; 136209df5deSAndreas Gohr $html .= '<h4>' . $this->getLang('ackRequired') . '</h4>'; 137d9a8334dSAnna Dabrowska $latest = $helper->getLatestUserAcknowledgement($id, $user); 138d9a8334dSAnna Dabrowska if ($latest) { 139d9a8334dSAnna Dabrowska $html .= '<a href="' 140d9a8334dSAnna Dabrowska . wl($id, ['do' => 'diff', 'at' => $latest], false, '&') . '">' 141d9a8334dSAnna Dabrowska . sprintf($this->getLang('ackDiff'), dformat($latest)) 142d9a8334dSAnna Dabrowska . '</a><br>'; 143d9a8334dSAnna Dabrowska } 144d9a8334dSAnna Dabrowska 145209df5deSAndreas Gohr $form = new Form(['id' => 'ackForm']); 146209df5deSAndreas Gohr $form->addCheckbox('ack', $this->getLang('ackText'))->attr('required', 'required'); 147*ba917e33SAnna Dabrowska $form->addHTML( 148*ba917e33SAnna Dabrowska '<br><button type="submit" name="acksubmit" id="ack-submit">' 149*ba917e33SAnna Dabrowska . $this->getLang('ackButton') 150*ba917e33SAnna Dabrowska . '</button>' 151*ba917e33SAnna Dabrowska ); 152209df5deSAndreas Gohr 1535773dd37SAnna Dabrowska $html .= $form->toHTML(); 154ef3ab392SAndreas Gohr $html .= '</div>'; 155ef3ab392SAndreas Gohr } 156ef3ab392SAndreas Gohr 157ef3ab392SAndreas Gohr return $html; 158ef3ab392SAndreas Gohr } 1594d6d17d0SAndreas Gohr} 160