14d6d17d0SAndreas Gohr<?php 24d6d17d0SAndreas Gohr/** 34d6d17d0SAndreas Gohr * DokuWiki Plugin acknowledge (Action Component) 44d6d17d0SAndreas Gohr * 54d6d17d0SAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 64d6d17d0SAndreas Gohr * @author Andreas Gohr, Anna Dabrowska <dokuwiki@cosmocode.de> 74d6d17d0SAndreas Gohr */ 84d6d17d0SAndreas Gohr 95773dd37SAnna Dabrowskause dokuwiki\Form\Form; 104d6d17d0SAndreas Gohr 114d6d17d0SAndreas Gohrclass action_plugin_acknowledge extends DokuWiki_Action_Plugin 124d6d17d0SAndreas Gohr{ 134d6d17d0SAndreas Gohr 14ef3ab392SAndreas Gohr /** @inheritDoc */ 154d6d17d0SAndreas Gohr public function register(Doku_Event_Handler $controller) 164d6d17d0SAndreas Gohr { 17ef3ab392SAndreas Gohr $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'handlePageSave'); 18ef3ab392SAndreas Gohr $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handleAjax'); 194d6d17d0SAndreas Gohr } 204d6d17d0SAndreas Gohr 214d6d17d0SAndreas Gohr /** 22ef3ab392SAndreas Gohr * Manage page meta data 234d6d17d0SAndreas Gohr * 24ef3ab392SAndreas Gohr * Store page last modified date 25ef3ab392SAndreas Gohr * Handle page deletions 26ef3ab392SAndreas Gohr * Remove assignments on page save, they get readded on rendering if needed 274d6d17d0SAndreas Gohr * 28ef3ab392SAndreas Gohr * @param Doku_Event $event 29ef3ab392SAndreas Gohr * @param $param 304d6d17d0SAndreas Gohr */ 31ef3ab392SAndreas Gohr public function handlePageSave(Doku_Event $event, $param) 324d6d17d0SAndreas Gohr { 33ef3ab392SAndreas Gohr /** @var helper_plugin_acknowledge $helper */ 34ef3ab392SAndreas Gohr $helper = plugin_load('helper', 'acknowledge'); 35ef3ab392SAndreas Gohr 36ef3ab392SAndreas Gohr if ($event->data['changeType'] === DOKU_CHANGE_TYPE_DELETE) { 37ef3ab392SAndreas Gohr $helper->removePage($event->data['id']); 38ef3ab392SAndreas Gohr } elseif ($event->data['changeType'] !== DOKU_CHANGE_TYPE_MINOR_EDIT) { 395dee13f7SAnna Dabrowska $helper->storePageDate($event->data['id'], $event->data['newRevision'], $event->data['newContent']); 404d6d17d0SAndreas Gohr } 414d6d17d0SAndreas Gohr 42ef3ab392SAndreas Gohr $helper->clearAssignments($event->data['id']); 43ef3ab392SAndreas Gohr } 44ef3ab392SAndreas Gohr 45ef3ab392SAndreas Gohr /** 46ef3ab392SAndreas Gohr * @param Doku_Event $event 47ef3ab392SAndreas Gohr * @param $param 48ef3ab392SAndreas Gohr */ 49ef3ab392SAndreas Gohr public function handleAjax(Doku_Event $event, $param) 50ef3ab392SAndreas Gohr { 515773dd37SAnna Dabrowska if ($event->data === 'plugin_acknowledge_assign') { 52ef3ab392SAndreas Gohr echo $this->html(); 53ef3ab392SAndreas Gohr $event->stopPropagation(); 54ef3ab392SAndreas Gohr $event->preventDefault(); 55ef3ab392SAndreas Gohr } 56ef3ab392SAndreas Gohr } 57ef3ab392SAndreas Gohr 58ef3ab392SAndreas Gohr /** 59ef3ab392SAndreas Gohr * Returns the acknowledgment form/confirmation 60ef3ab392SAndreas Gohr * 61ef3ab392SAndreas Gohr * @return string The HTML to display 62ef3ab392SAndreas Gohr */ 63ef3ab392SAndreas Gohr protected function html() 64ef3ab392SAndreas Gohr { 65ef3ab392SAndreas Gohr global $INPUT; 66ef3ab392SAndreas Gohr global $USERINFO; 67ef3ab392SAndreas Gohr $id = $INPUT->str('id'); 682d63bbe3SAnna Dabrowska $ackSubmitted = $INPUT->bool('ack'); 69ef3ab392SAndreas Gohr $user = $INPUT->server->str('REMOTE_USER'); 70ef3ab392SAndreas Gohr if ($id === '' || $user === '') return ''; 71ef3ab392SAndreas Gohr 72ef3ab392SAndreas Gohr /** @var helper_plugin_acknowledge $helper */ 73ef3ab392SAndreas Gohr $helper = plugin_load('helper', 'acknowledge'); 74ef3ab392SAndreas Gohr 755773dd37SAnna Dabrowska if ($ackSubmitted) { 765773dd37SAnna Dabrowska $helper->saveAcknowledgement($id, $user); 775773dd37SAnna Dabrowska } 785773dd37SAnna Dabrowska 79ef3ab392SAndreas Gohr $ack = $helper->hasUserAcknowledged($id, $user); 80*209df5deSAndreas Gohr 81*209df5deSAndreas Gohr $html = '<div class="' . ($ack ? 'ack' : 'noack') . '">'; 82*209df5deSAndreas Gohr $html .= inlineSVG(__DIR__ . '/admin.svg'); 83*209df5deSAndreas Gohr $html .= '</div>'; 84*209df5deSAndreas Gohr 85ef3ab392SAndreas Gohr if ($ack) { 86ef3ab392SAndreas Gohr 87ef3ab392SAndreas Gohr $html .= '<div>'; 88*209df5deSAndreas Gohr $html .= '<h4>'; 89*209df5deSAndreas Gohr $html .= $this->getLang('ackOk'); 90*209df5deSAndreas Gohr $html .= '</h4>'; 91*209df5deSAndreas Gohr $html .= sprintf($this->getLang('ackGranted'), dformat($ack)); 92ef3ab392SAndreas Gohr $html .= '</div>'; 93ef3ab392SAndreas Gohr } elseif ($helper->isUserAssigned($id, $user, $USERINFO['grps'])) { 94*209df5deSAndreas Gohr 95ef3ab392SAndreas Gohr $html .= '<div>'; 96*209df5deSAndreas Gohr $html .= '<h4>' . $this->getLang('ackRequired') . '</h4>'; 97d9a8334dSAnna Dabrowska $latest = $helper->getLatestUserAcknowledgement($id, $user); 98d9a8334dSAnna Dabrowska if ($latest) { 99d9a8334dSAnna Dabrowska $html .= '<a href="' 100d9a8334dSAnna Dabrowska . wl($id, ['do' => 'diff', 'at' => $latest], false, '&') . '">' 101d9a8334dSAnna Dabrowska . sprintf($this->getLang('ackDiff'), dformat($latest)) 102d9a8334dSAnna Dabrowska . '</a><br>'; 103d9a8334dSAnna Dabrowska } 104d9a8334dSAnna Dabrowska 105*209df5deSAndreas Gohr $form = new Form(['id' => 'ackForm']); 106*209df5deSAndreas Gohr $form->addCheckbox('ack', $this->getLang('ackText'))->attr('required', 'required'); 107*209df5deSAndreas Gohr $form->addHTML('<br><button type="submit" name="acksubmit" id="ack-submit">' . $this->getLang('ackButton') . '</button>'); 108*209df5deSAndreas Gohr 1095773dd37SAnna Dabrowska $html .= $form->toHTML(); 110ef3ab392SAndreas Gohr $html .= '</div>'; 111ef3ab392SAndreas Gohr } 112ef3ab392SAndreas Gohr 113ef3ab392SAndreas Gohr return $html; 114ef3ab392SAndreas Gohr } 1154d6d17d0SAndreas Gohr} 116