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