xref: /plugin/acknowledge/action/ajax.php (revision c38b6ca85313c7f98e013ff1ce06b406d156a85b)
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