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 9*5773dd37SAnna 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 * 24*5773dd37SAnna Dabrowska * FIXME do we track ALL pages? or do we check for assignments? 25*5773dd37SAnna 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 { 53*5773dd37SAnna 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'); 70*5773dd37SAnna 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 77*5773dd37SAnna Dabrowska if ($ackSubmitted) { 78*5773dd37SAnna Dabrowska $helper->saveAcknowledgement($id, $user); 79*5773dd37SAnna Dabrowska } 80*5773dd37SAnna Dabrowska 81ef3ab392SAndreas Gohr $html = ''; 82ef3ab392SAndreas Gohr 83ef3ab392SAndreas Gohr $ack = $helper->hasUserAcknowledged($id, $user); 84ef3ab392SAndreas Gohr if ($ack) { 85ef3ab392SAndreas Gohr 86ef3ab392SAndreas Gohr $html .= '<div>'; 87*5773dd37SAnna Dabrowska $html .= $this->getLang('ackGranted') . sprintf('%s', dformat($ack)); 88ef3ab392SAndreas Gohr $html .= '</div>'; 89ef3ab392SAndreas Gohr } elseif ($helper->isUserAssigned($id, $user, $USERINFO['grps'])) { 90*5773dd37SAnna Dabrowska $form = new Form(['id' => 'ackForm']); 91*5773dd37SAnna Dabrowska $form->addCheckbox('ack'); 92*5773dd37SAnna Dabrowska $form->addLabel($this->getLang('ackText'), 'ack'); 93*5773dd37SAnna Dabrowska $form->addHTML('<button type="submit" name="acksubmit" id="ack-submit">Acknowledge</button>'); 94*5773dd37SAnna Dabrowska 95*5773dd37SAnna Dabrowska // attach submit listener to the newly injected form 96*5773dd37SAnna Dabrowska $inlineScript = '<script>'; 97*5773dd37SAnna Dabrowska $inlineScript .= ' 98*5773dd37SAnna Dabrowska jQuery("#ackForm").submit(function(event) { 99*5773dd37SAnna Dabrowska event.preventDefault(); 100*5773dd37SAnna Dabrowska var $form = jQuery( this ), 101*5773dd37SAnna Dabrowska ack = $form.find( "input[name=\'ack\']" )[0]; 102*5773dd37SAnna Dabrowska 103*5773dd37SAnna Dabrowska jQuery(".plugin-acknowledge").load( 104*5773dd37SAnna Dabrowska DOKU_BASE + "lib/exe/ajax.php", 105*5773dd37SAnna Dabrowska { 106*5773dd37SAnna Dabrowska call: "plugin_acknowledge_html", 107*5773dd37SAnna Dabrowska id: JSINFO.id, 108*5773dd37SAnna Dabrowska ack: ack.checked 109*5773dd37SAnna Dabrowska } 110*5773dd37SAnna Dabrowska ); 111*5773dd37SAnna Dabrowska }); 112*5773dd37SAnna Dabrowska '; 113*5773dd37SAnna Dabrowska $inlineScript .= '</script>'; 114*5773dd37SAnna Dabrowska 115ef3ab392SAndreas Gohr $html .= '<div>'; 116*5773dd37SAnna Dabrowska $html .= $this->getLang('ackRequired') . ':<br>'; 117*5773dd37SAnna Dabrowska $html .= $form->toHTML(); 118*5773dd37SAnna Dabrowska $html .= $inlineScript; 119ef3ab392SAndreas Gohr $html .= '</div>'; 120ef3ab392SAndreas Gohr } 121ef3ab392SAndreas Gohr 122ef3ab392SAndreas Gohr return $html; 123ef3ab392SAndreas Gohr } 1244d6d17d0SAndreas Gohr} 125