1c38b6ca8SAnna Dabrowska<?php 2c38b6ca8SAnna Dabrowska 3c38b6ca8SAnna Dabrowska/** 4c38b6ca8SAnna Dabrowska * DokuWiki Plugin acknowledge (AJAX Action Component) 5c38b6ca8SAnna Dabrowska * 6c38b6ca8SAnna Dabrowska * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 7c38b6ca8SAnna Dabrowska * @author Andreas Gohr, Anna Dabrowska <dokuwiki@cosmocode.de> 8c38b6ca8SAnna Dabrowska */ 9c38b6ca8SAnna Dabrowska 10c38b6ca8SAnna Dabrowskause dokuwiki\Extension\ActionPlugin; 11c38b6ca8SAnna Dabrowskause dokuwiki\Extension\EventHandler; 12c38b6ca8SAnna Dabrowskause dokuwiki\Extension\Event; 13c38b6ca8SAnna Dabrowskause dokuwiki\Form\Form; 14c38b6ca8SAnna Dabrowska 15c38b6ca8SAnna Dabrowskaclass action_plugin_acknowledge_ajax extends ActionPlugin 16c38b6ca8SAnna Dabrowska{ 17c38b6ca8SAnna Dabrowska /** @inheritDoc */ 18c38b6ca8SAnna Dabrowska public function register(EventHandler $controller) 19c38b6ca8SAnna Dabrowska { 20c38b6ca8SAnna Dabrowska $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handleAjaxAcknowledge'); 21c38b6ca8SAnna Dabrowska $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handleAjaxAutocomplete'); 22c38b6ca8SAnna Dabrowska } 23c38b6ca8SAnna Dabrowska 24c38b6ca8SAnna Dabrowska /** 25c38b6ca8SAnna Dabrowska * @param Event $event 26c38b6ca8SAnna Dabrowska * @param $param 27c38b6ca8SAnna Dabrowska */ 28c38b6ca8SAnna Dabrowska public function handleAjaxAcknowledge(Event $event, $param) 29c38b6ca8SAnna Dabrowska { 30c38b6ca8SAnna Dabrowska if ($event->data === 'plugin_acknowledge_acknowledge') { 31c38b6ca8SAnna Dabrowska $event->stopPropagation(); 32c38b6ca8SAnna Dabrowska $event->preventDefault(); 33c38b6ca8SAnna Dabrowska 34c38b6ca8SAnna Dabrowska global $INPUT; 35c38b6ca8SAnna Dabrowska $id = $INPUT->str('id'); 36c38b6ca8SAnna Dabrowska 37c38b6ca8SAnna Dabrowska if (page_exists($id)) { 38c38b6ca8SAnna Dabrowska echo $this->html(); 39c38b6ca8SAnna Dabrowska } 40c38b6ca8SAnna Dabrowska } 41c38b6ca8SAnna Dabrowska } 42c38b6ca8SAnna Dabrowska 43c38b6ca8SAnna Dabrowska /** 44c38b6ca8SAnna Dabrowska * @param Event $event 45c38b6ca8SAnna Dabrowska * @return void 46c38b6ca8SAnna Dabrowska */ 47c38b6ca8SAnna Dabrowska public function handleAjaxAutocomplete(Event $event) 48c38b6ca8SAnna Dabrowska { 49c38b6ca8SAnna Dabrowska if ($event->data === 'plugin_acknowledge_autocomplete') { 50c38b6ca8SAnna Dabrowska if (!checkSecurityToken()) return; 51c38b6ca8SAnna Dabrowska 52c38b6ca8SAnna Dabrowska global $INPUT; 53c38b6ca8SAnna Dabrowska 54c38b6ca8SAnna Dabrowska $event->stopPropagation(); 55c38b6ca8SAnna Dabrowska $event->preventDefault(); 56c38b6ca8SAnna Dabrowska 57c38b6ca8SAnna Dabrowska /** @var helper_plugin_acknowledge $hlp */ 58c38b6ca8SAnna Dabrowska $hlp = $this->loadHelper('acknowledge'); 59c38b6ca8SAnna Dabrowska 60c38b6ca8SAnna Dabrowska $found = []; 61c38b6ca8SAnna Dabrowska 62c38b6ca8SAnna Dabrowska if ($INPUT->has('user')) { 63c38b6ca8SAnna Dabrowska $search = $INPUT->str('user'); 64c38b6ca8SAnna Dabrowska $knownUsers = $hlp->getUsers(); 65c38b6ca8SAnna Dabrowska $found = array_filter($knownUsers, function ($user) use ($search) { 66c38b6ca8SAnna Dabrowska return (strstr(strtolower($user['label']), strtolower($search))) !== false ? $user : null; 67c38b6ca8SAnna Dabrowska }); 68c38b6ca8SAnna Dabrowska } 69c38b6ca8SAnna Dabrowska 70c38b6ca8SAnna Dabrowska if ($INPUT->has('pg')) { 71c38b6ca8SAnna Dabrowska $search = $INPUT->str('pg'); 72c38b6ca8SAnna Dabrowska $pages = ft_pageLookup($search, true); 73c38b6ca8SAnna Dabrowska $found = array_map(function ($id, $title) { 74c38b6ca8SAnna Dabrowska return ['value' => $id, 'label' => $title ?? $id]; 75c38b6ca8SAnna Dabrowska }, array_keys($pages), array_values($pages)); 76c38b6ca8SAnna Dabrowska } 77c38b6ca8SAnna Dabrowska 78c38b6ca8SAnna Dabrowska header('Content-Type: application/json'); 79c38b6ca8SAnna Dabrowska 80c38b6ca8SAnna Dabrowska echo json_encode($found); 81c38b6ca8SAnna Dabrowska } 82c38b6ca8SAnna Dabrowska } 83c38b6ca8SAnna Dabrowska 84c38b6ca8SAnna Dabrowska /** 85c38b6ca8SAnna Dabrowska * Returns the acknowledgment form/confirmation 86c38b6ca8SAnna Dabrowska * 87c38b6ca8SAnna Dabrowska * @return string The HTML to display 88c38b6ca8SAnna Dabrowska */ 89c38b6ca8SAnna Dabrowska protected function html() 90c38b6ca8SAnna Dabrowska { 91c38b6ca8SAnna Dabrowska global $INPUT; 92c38b6ca8SAnna Dabrowska global $USERINFO; 93c38b6ca8SAnna Dabrowska $id = $INPUT->str('id'); 94c38b6ca8SAnna Dabrowska $ackSubmitted = $INPUT->bool('ack'); 95c38b6ca8SAnna Dabrowska $user = $INPUT->server->str('REMOTE_USER'); 96c38b6ca8SAnna Dabrowska if ($id === '' || $user === '') return ''; 97c38b6ca8SAnna Dabrowska 98c38b6ca8SAnna Dabrowska /** @var helper_plugin_acknowledge $helper */ 99c38b6ca8SAnna Dabrowska $helper = plugin_load('helper', 'acknowledge'); 100c38b6ca8SAnna Dabrowska 101c38b6ca8SAnna Dabrowska // only display for users assigned to the page 102c38b6ca8SAnna Dabrowska if (!$helper->isUserAssigned($id, $user, $USERINFO['grps'])) { 103c38b6ca8SAnna Dabrowska return ''; 104c38b6ca8SAnna Dabrowska } 105c38b6ca8SAnna Dabrowska 106*a8303a15SAnna Dabrowska // if the approve plugin is active, only show if the page is approved 107*a8303a15SAnna Dabrowska if ($helper->isBlockedByApprove($id)) { 108*a8303a15SAnna Dabrowska return ''; 109*a8303a15SAnna Dabrowska } 110*a8303a15SAnna Dabrowska 111c38b6ca8SAnna Dabrowska if ($ackSubmitted) { 112c38b6ca8SAnna Dabrowska $helper->saveAcknowledgement($id, $user); 113c38b6ca8SAnna Dabrowska } 114c38b6ca8SAnna Dabrowska 115c38b6ca8SAnna Dabrowska $ack = $helper->hasUserAcknowledged($id, $user); 116c38b6ca8SAnna Dabrowska 117c38b6ca8SAnna Dabrowska $html = '<div class="' . ($ack ? 'ack' : 'noack') . '">'; 118c38b6ca8SAnna Dabrowska $html .= inlineSVG(__DIR__ . '/../admin.svg'); 119c38b6ca8SAnna Dabrowska $html .= '</div>'; 120c38b6ca8SAnna Dabrowska 121c38b6ca8SAnna Dabrowska if ($ack) { 122c38b6ca8SAnna Dabrowska $html .= '<div>'; 123c38b6ca8SAnna Dabrowska $html .= '<h4>'; 124c38b6ca8SAnna Dabrowska $html .= $this->getLang('ackOk'); 125c38b6ca8SAnna Dabrowska $html .= '</h4>'; 126c38b6ca8SAnna Dabrowska $html .= sprintf($this->getLang('ackGranted'), dformat($ack)); 127c38b6ca8SAnna Dabrowska $html .= '</div>'; 128c38b6ca8SAnna Dabrowska } else { 129c38b6ca8SAnna Dabrowska $html .= '<div>'; 130c38b6ca8SAnna Dabrowska $html .= '<h4>' . $this->getLang('ackRequired') . '</h4>'; 131c38b6ca8SAnna Dabrowska $latest = $helper->getLatestUserAcknowledgement($id, $user); 132c38b6ca8SAnna Dabrowska if ($latest) { 133c38b6ca8SAnna Dabrowska $html .= '<a href="' 134c38b6ca8SAnna Dabrowska . wl($id, ['do' => 'diff', 'at' => $latest], false, '&') . '">' 135c38b6ca8SAnna Dabrowska . sprintf($this->getLang('ackDiff'), dformat($latest)) 136c38b6ca8SAnna Dabrowska . '</a><br>'; 137c38b6ca8SAnna Dabrowska } 138c38b6ca8SAnna Dabrowska 139c38b6ca8SAnna Dabrowska $form = new Form(['id' => 'ackForm']); 140c38b6ca8SAnna Dabrowska $form->addCheckbox('ack', $this->getLang('ackText'))->attr('required', 'required'); 141c38b6ca8SAnna Dabrowska $form->addHTML( 142c38b6ca8SAnna Dabrowska '<br><button type="submit" name="acksubmit" id="ack-submit">' 143c38b6ca8SAnna Dabrowska . $this->getLang('ackButton') 144c38b6ca8SAnna Dabrowska . '</button>' 145c38b6ca8SAnna Dabrowska ); 146c38b6ca8SAnna Dabrowska 147c38b6ca8SAnna Dabrowska $html .= $form->toHTML(); 148c38b6ca8SAnna Dabrowska $html .= '</div>'; 149c38b6ca8SAnna Dabrowska } 150c38b6ca8SAnna Dabrowska 151c38b6ca8SAnna Dabrowska return $html; 152c38b6ca8SAnna Dabrowska } 153c38b6ca8SAnna Dabrowska} 154