xref: /plugin/acknowledge/action.php (revision 3b76424d6eb7c7bbbc55197a36eab33cd6e9cf20)
14d6d17d0SAndreas Gohr<?php
2*3b76424dSannda
34d6d17d0SAndreas Gohr/**
44d6d17d0SAndreas Gohr * DokuWiki Plugin acknowledge (Action Component)
54d6d17d0SAndreas Gohr *
64d6d17d0SAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
74d6d17d0SAndreas Gohr * @author  Andreas Gohr, Anna Dabrowska <dokuwiki@cosmocode.de>
84d6d17d0SAndreas Gohr */
94d6d17d0SAndreas Gohr
10*3b76424dSanndause dokuwiki\Extension\ActionPlugin;
11*3b76424dSanndause dokuwiki\Extension\EventHandler;
12*3b76424dSanndause dokuwiki\Extension\Event;
135773dd37SAnna Dabrowskause dokuwiki\Form\Form;
144d6d17d0SAndreas Gohr
15*3b76424dSanndaclass action_plugin_acknowledge extends ActionPlugin
164d6d17d0SAndreas Gohr{
17ef3ab392SAndreas Gohr    /** @inheritDoc */
18*3b76424dSannda    public function register(EventHandler $controller)
194d6d17d0SAndreas Gohr    {
20ef3ab392SAndreas Gohr        $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'handlePageSave');
21ef3ab392SAndreas Gohr        $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handleAjax');
22f09444ffSAndreas Gohr        $controller->register_hook('PLUGIN_SQLITE_DATABASE_UPGRADE', 'AFTER', $this, 'handleUpgrade');
234d6d17d0SAndreas Gohr    }
244d6d17d0SAndreas Gohr
254d6d17d0SAndreas Gohr    /**
26ef3ab392SAndreas Gohr     * Manage page meta data
274d6d17d0SAndreas Gohr     *
28ef3ab392SAndreas Gohr     * Store page last modified date
29ef3ab392SAndreas Gohr     * Handle page deletions
30f09444ffSAndreas Gohr     * Handle page creations
314d6d17d0SAndreas Gohr     *
32*3b76424dSannda     * @param Event $event
33ef3ab392SAndreas Gohr     * @param $param
344d6d17d0SAndreas Gohr     */
35*3b76424dSannda    public function handlePageSave(Event $event, $param)
364d6d17d0SAndreas Gohr    {
37ef3ab392SAndreas Gohr        /** @var helper_plugin_acknowledge $helper */
38ef3ab392SAndreas Gohr        $helper = plugin_load('helper', 'acknowledge');
39ef3ab392SAndreas Gohr
40ef3ab392SAndreas Gohr        if ($event->data['changeType'] === DOKU_CHANGE_TYPE_DELETE) {
41f09444ffSAndreas Gohr            $helper->removePage($event->data['id']); // this cascades to assignments
42ef3ab392SAndreas Gohr        } elseif ($event->data['changeType'] !== DOKU_CHANGE_TYPE_MINOR_EDIT) {
435dee13f7SAnna Dabrowska            $helper->storePageDate($event->data['id'], $event->data['newRevision'], $event->data['newContent']);
444d6d17d0SAndreas Gohr        }
454d6d17d0SAndreas Gohr
46f09444ffSAndreas Gohr        // Remove page assignees here because the syntax might have been removed
47f09444ffSAndreas Gohr        // they are readded on metadata rendering if still there
48f09444ffSAndreas Gohr        $helper->clearPageAssignments($event->data['id']);
49f09444ffSAndreas Gohr
50f09444ffSAndreas Gohr        if ($event->data['changeType'] === DOKU_CHANGE_TYPE_CREATE) {
51f09444ffSAndreas Gohr            // new pages need to have their auto assignments updated based on the existing patterns
52f09444ffSAndreas Gohr            $helper->setAutoAssignees($event->data['id']);
53f09444ffSAndreas Gohr        }
54ef3ab392SAndreas Gohr    }
55ef3ab392SAndreas Gohr
56ef3ab392SAndreas Gohr    /**
57*3b76424dSannda     * @param Event $event
58ef3ab392SAndreas Gohr     * @param $param
59ef3ab392SAndreas Gohr     */
60*3b76424dSannda    public function handleAjax(Event $event, $param)
61ef3ab392SAndreas Gohr    {
625773dd37SAnna Dabrowska        if ($event->data === 'plugin_acknowledge_assign') {
63ef3ab392SAndreas Gohr            $event->stopPropagation();
64ef3ab392SAndreas Gohr            $event->preventDefault();
65cfdacc6aSAnna Dabrowska
66cfdacc6aSAnna Dabrowska            global $INPUT;
67cfdacc6aSAnna Dabrowska            $id = $INPUT->str('id');
68cfdacc6aSAnna Dabrowska
69cfdacc6aSAnna Dabrowska            if (page_exists($id)) {
70cfdacc6aSAnna Dabrowska                echo $this->html();
71cfdacc6aSAnna Dabrowska            }
72ef3ab392SAndreas Gohr        }
73ef3ab392SAndreas Gohr    }
74ef3ab392SAndreas Gohr
75ef3ab392SAndreas Gohr    /**
76f09444ffSAndreas Gohr     * Handle Migration events
77f09444ffSAndreas Gohr     *
78*3b76424dSannda     * @param Event $event
79f09444ffSAndreas Gohr     * @param $param
80f09444ffSAndreas Gohr     * @return void
81f09444ffSAndreas Gohr     */
82*3b76424dSannda    public function handleUpgrade(Event $event, $param)
83f09444ffSAndreas Gohr    {
84f09444ffSAndreas Gohr        if ($event->data['sqlite']->getAdapter()->getDbname() !== 'acknowledgement') {
85f09444ffSAndreas Gohr            return;
86f09444ffSAndreas Gohr        }
87f09444ffSAndreas Gohr        $to = $event->data['to'];
88f09444ffSAndreas Gohr        if ($to !== 3) return; // only handle upgrade to version 3
89f09444ffSAndreas Gohr
90f09444ffSAndreas Gohr        /** @var helper_plugin_acknowledge $helper */
91f09444ffSAndreas Gohr        $helper = plugin_load('helper', 'acknowledge');
92f09444ffSAndreas Gohr        $helper->updatePageIndex();
93f09444ffSAndreas Gohr    }
94f09444ffSAndreas Gohr
95f09444ffSAndreas Gohr    /**
96ef3ab392SAndreas Gohr     * Returns the acknowledgment form/confirmation
97ef3ab392SAndreas Gohr     *
98ef3ab392SAndreas Gohr     * @return string The HTML to display
99ef3ab392SAndreas Gohr     */
100ef3ab392SAndreas Gohr    protected function html()
101ef3ab392SAndreas Gohr    {
102ef3ab392SAndreas Gohr        global $INPUT;
103ef3ab392SAndreas Gohr        global $USERINFO;
104ef3ab392SAndreas Gohr        $id = $INPUT->str('id');
1052d63bbe3SAnna Dabrowska        $ackSubmitted = $INPUT->bool('ack');
106ef3ab392SAndreas Gohr        $user = $INPUT->server->str('REMOTE_USER');
107ef3ab392SAndreas Gohr        if ($id === '' || $user === '') return '';
108ef3ab392SAndreas Gohr
109ef3ab392SAndreas Gohr        /** @var helper_plugin_acknowledge $helper */
110ef3ab392SAndreas Gohr        $helper = plugin_load('helper', 'acknowledge');
111ef3ab392SAndreas Gohr
11235bc8beaSAndreas Gohr        // only display for users assigned to the page
11335bc8beaSAndreas Gohr        if (!$helper->isUserAssigned($id, $user, $USERINFO['grps'])) {
11435bc8beaSAndreas Gohr            return '';
11535bc8beaSAndreas Gohr        }
11635bc8beaSAndreas Gohr
1175773dd37SAnna Dabrowska        if ($ackSubmitted) {
1185773dd37SAnna Dabrowska            $helper->saveAcknowledgement($id, $user);
1195773dd37SAnna Dabrowska        }
1205773dd37SAnna Dabrowska
121ef3ab392SAndreas Gohr        $ack = $helper->hasUserAcknowledged($id, $user);
122209df5deSAndreas Gohr
123209df5deSAndreas Gohr        $html = '<div class="' . ($ack ? 'ack' : 'noack') . '">';
124209df5deSAndreas Gohr        $html .= inlineSVG(__DIR__ . '/admin.svg');
125209df5deSAndreas Gohr        $html .= '</div>';
126209df5deSAndreas Gohr
127ef3ab392SAndreas Gohr        if ($ack) {
128ef3ab392SAndreas Gohr            $html .= '<div>';
129209df5deSAndreas Gohr            $html .= '<h4>';
130209df5deSAndreas Gohr            $html .= $this->getLang('ackOk');
131209df5deSAndreas Gohr            $html .= '</h4>';
132209df5deSAndreas Gohr            $html .= sprintf($this->getLang('ackGranted'), dformat($ack));
133ef3ab392SAndreas Gohr            $html .= '</div>';
13435bc8beaSAndreas Gohr        } else {
135ef3ab392SAndreas Gohr            $html .= '<div>';
136209df5deSAndreas Gohr            $html .= '<h4>' . $this->getLang('ackRequired') . '</h4>';
137d9a8334dSAnna Dabrowska            $latest = $helper->getLatestUserAcknowledgement($id, $user);
138d9a8334dSAnna Dabrowska            if ($latest) {
139d9a8334dSAnna Dabrowska                $html .= '<a href="'
140d9a8334dSAnna Dabrowska                    . wl($id, ['do' => 'diff', 'at' => $latest], false, '&') . '">'
141d9a8334dSAnna Dabrowska                    . sprintf($this->getLang('ackDiff'), dformat($latest))
142d9a8334dSAnna Dabrowska                    . '</a><br>';
143d9a8334dSAnna Dabrowska            }
144d9a8334dSAnna Dabrowska
145209df5deSAndreas Gohr            $form = new Form(['id' => 'ackForm']);
146209df5deSAndreas Gohr            $form->addCheckbox('ack', $this->getLang('ackText'))->attr('required', 'required');
147209df5deSAndreas Gohr            $form->addHTML('<br><button type="submit" name="acksubmit" id="ack-submit">' . $this->getLang('ackButton') . '</button>');
148209df5deSAndreas Gohr
1495773dd37SAnna Dabrowska            $html .= $form->toHTML();
150ef3ab392SAndreas Gohr            $html .= '</div>';
151ef3ab392SAndreas Gohr        }
152ef3ab392SAndreas Gohr
153ef3ab392SAndreas Gohr        return $html;
154ef3ab392SAndreas Gohr    }
1554d6d17d0SAndreas Gohr}
156