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 * 245773dd37SAnna Dabrowska * FIXME do we track ALL pages? or do we check for assignments? 255773dd37SAnna Dabrowska * 26ef3ab392SAndreas Gohr * Store page last modified date 27ef3ab392SAndreas Gohr * Handle page deletions 28ef3ab392SAndreas Gohr * Remove assignments on page save, they get readded on rendering if needed 294d6d17d0SAndreas Gohr * 30ef3ab392SAndreas Gohr * @param Doku_Event $event 31ef3ab392SAndreas Gohr * @param $param 324d6d17d0SAndreas Gohr */ 33ef3ab392SAndreas Gohr public function handlePageSave(Doku_Event $event, $param) 344d6d17d0SAndreas Gohr { 35ef3ab392SAndreas Gohr /** @var helper_plugin_acknowledge $helper */ 36ef3ab392SAndreas Gohr $helper = plugin_load('helper', 'acknowledge'); 37ef3ab392SAndreas Gohr 38ef3ab392SAndreas Gohr if ($event->data['changeType'] === DOKU_CHANGE_TYPE_DELETE) { 39ef3ab392SAndreas Gohr $helper->removePage($event->data['id']); 40ef3ab392SAndreas Gohr } elseif ($event->data['changeType'] !== DOKU_CHANGE_TYPE_MINOR_EDIT) { 41ef3ab392SAndreas Gohr $helper->storePageDate($event->data['id'], $event->data['newRevision']); 424d6d17d0SAndreas Gohr } 434d6d17d0SAndreas Gohr 44ef3ab392SAndreas Gohr $helper->clearAssignments($event->data['id']); 45ef3ab392SAndreas Gohr } 46ef3ab392SAndreas Gohr 47ef3ab392SAndreas Gohr /** 48ef3ab392SAndreas Gohr * @param Doku_Event $event 49ef3ab392SAndreas Gohr * @param $param 50ef3ab392SAndreas Gohr */ 51ef3ab392SAndreas Gohr public function handleAjax(Doku_Event $event, $param) 52ef3ab392SAndreas Gohr { 535773dd37SAnna Dabrowska if ($event->data === 'plugin_acknowledge_assign') { 54ef3ab392SAndreas Gohr echo $this->html(); 55ef3ab392SAndreas Gohr $event->stopPropagation(); 56ef3ab392SAndreas Gohr $event->preventDefault(); 57ef3ab392SAndreas Gohr } 58ef3ab392SAndreas Gohr } 59ef3ab392SAndreas Gohr 60ef3ab392SAndreas Gohr /** 61ef3ab392SAndreas Gohr * Returns the acknowledgment form/confirmation 62ef3ab392SAndreas Gohr * 63ef3ab392SAndreas Gohr * @return string The HTML to display 64ef3ab392SAndreas Gohr */ 65ef3ab392SAndreas Gohr protected function html() 66ef3ab392SAndreas Gohr { 67ef3ab392SAndreas Gohr global $INPUT; 68ef3ab392SAndreas Gohr global $USERINFO; 69ef3ab392SAndreas Gohr $id = $INPUT->str('id'); 705773dd37SAnna Dabrowska $ackSubmitted = $INPUT->str('ack') === 'true'; 71ef3ab392SAndreas Gohr $user = $INPUT->server->str('REMOTE_USER'); 72ef3ab392SAndreas Gohr if ($id === '' || $user === '') return ''; 73ef3ab392SAndreas Gohr 74ef3ab392SAndreas Gohr /** @var helper_plugin_acknowledge $helper */ 75ef3ab392SAndreas Gohr $helper = plugin_load('helper', 'acknowledge'); 76ef3ab392SAndreas Gohr 775773dd37SAnna Dabrowska if ($ackSubmitted) { 785773dd37SAnna Dabrowska $helper->saveAcknowledgement($id, $user); 795773dd37SAnna Dabrowska } 805773dd37SAnna Dabrowska 81ef3ab392SAndreas Gohr $html = ''; 82ef3ab392SAndreas Gohr 83ef3ab392SAndreas Gohr $ack = $helper->hasUserAcknowledged($id, $user); 84ef3ab392SAndreas Gohr if ($ack) { 85ef3ab392SAndreas Gohr 86ef3ab392SAndreas Gohr $html .= '<div>'; 875773dd37SAnna Dabrowska $html .= $this->getLang('ackGranted') . sprintf('%s', dformat($ack)); 88ef3ab392SAndreas Gohr $html .= '</div>'; 89ef3ab392SAndreas Gohr } elseif ($helper->isUserAssigned($id, $user, $USERINFO['grps'])) { 905773dd37SAnna Dabrowska $form = new Form(['id' => 'ackForm']); 915773dd37SAnna Dabrowska $form->addCheckbox('ack'); 925773dd37SAnna Dabrowska $form->addLabel($this->getLang('ackText'), 'ack'); 93*74126d4bSAnna Dabrowska $form->addHTML('<br><button type="submit" name="acksubmit" id="ack-submit">'. $this->getLang('ackButton') .'</button>'); 94ef3ab392SAndreas Gohr $html .= '<div>'; 955773dd37SAnna Dabrowska $html .= $this->getLang('ackRequired') . ':<br>'; 965773dd37SAnna Dabrowska $html .= $form->toHTML(); 97ef3ab392SAndreas Gohr $html .= '</div>'; 98ef3ab392SAndreas Gohr } 99ef3ab392SAndreas Gohr 100ef3ab392SAndreas Gohr return $html; 101ef3ab392SAndreas Gohr } 1024d6d17d0SAndreas Gohr} 103