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) { 39ef3ab392SAndreas Gohr $helper->storePageDate($event->data['id'], $event->data['newRevision']); 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'); 685773dd37SAnna Dabrowska $ackSubmitted = $INPUT->str('ack') === 'true'; 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 $html = ''; 80ef3ab392SAndreas Gohr 81ef3ab392SAndreas Gohr $ack = $helper->hasUserAcknowledged($id, $user); 82ef3ab392SAndreas Gohr if ($ack) { 83ef3ab392SAndreas Gohr 84ef3ab392SAndreas Gohr $html .= '<div>'; 855773dd37SAnna Dabrowska $html .= $this->getLang('ackGranted') . sprintf('%s', dformat($ack)); 86ef3ab392SAndreas Gohr $html .= '</div>'; 87ef3ab392SAndreas Gohr } elseif ($helper->isUserAssigned($id, $user, $USERINFO['grps'])) { 885773dd37SAnna Dabrowska $form = new Form(['id' => 'ackForm']); 89*8858b588SAnna Dabrowska $form->addCheckbox('ack')->attr('required', 'required'); 905773dd37SAnna Dabrowska $form->addLabel($this->getLang('ackText'), 'ack'); 9174126d4bSAnna Dabrowska $form->addHTML('<br><button type="submit" name="acksubmit" id="ack-submit">'. $this->getLang('ackButton') .'</button>'); 92ef3ab392SAndreas Gohr $html .= '<div>'; 935773dd37SAnna Dabrowska $html .= $this->getLang('ackRequired') . ':<br>'; 945773dd37SAnna Dabrowska $html .= $form->toHTML(); 95ef3ab392SAndreas Gohr $html .= '</div>'; 96ef3ab392SAndreas Gohr } 97ef3ab392SAndreas Gohr 98ef3ab392SAndreas Gohr return $html; 99ef3ab392SAndreas Gohr } 1004d6d17d0SAndreas Gohr} 101