xref: /plugin/acknowledge/action.php (revision 209df5def45704c7855bfda4e5fbd3db263cd936)
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
95773dd37SAnna 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     *
24ef3ab392SAndreas Gohr     * Store page last modified date
25ef3ab392SAndreas Gohr     * Handle page deletions
26ef3ab392SAndreas Gohr     * Remove assignments on page save, they get readded on rendering if needed
274d6d17d0SAndreas Gohr     *
28ef3ab392SAndreas Gohr     * @param Doku_Event $event
29ef3ab392SAndreas Gohr     * @param $param
304d6d17d0SAndreas Gohr     */
31ef3ab392SAndreas Gohr    public function handlePageSave(Doku_Event $event, $param)
324d6d17d0SAndreas Gohr    {
33ef3ab392SAndreas Gohr        /** @var helper_plugin_acknowledge $helper */
34ef3ab392SAndreas Gohr        $helper = plugin_load('helper', 'acknowledge');
35ef3ab392SAndreas Gohr
36ef3ab392SAndreas Gohr        if ($event->data['changeType'] === DOKU_CHANGE_TYPE_DELETE) {
37ef3ab392SAndreas Gohr            $helper->removePage($event->data['id']);
38ef3ab392SAndreas Gohr        } elseif ($event->data['changeType'] !== DOKU_CHANGE_TYPE_MINOR_EDIT) {
395dee13f7SAnna Dabrowska            $helper->storePageDate($event->data['id'], $event->data['newRevision'], $event->data['newContent']);
404d6d17d0SAndreas Gohr        }
414d6d17d0SAndreas Gohr
42ef3ab392SAndreas Gohr        $helper->clearAssignments($event->data['id']);
43ef3ab392SAndreas Gohr    }
44ef3ab392SAndreas Gohr
45ef3ab392SAndreas Gohr    /**
46ef3ab392SAndreas Gohr     * @param Doku_Event $event
47ef3ab392SAndreas Gohr     * @param $param
48ef3ab392SAndreas Gohr     */
49ef3ab392SAndreas Gohr    public function handleAjax(Doku_Event $event, $param)
50ef3ab392SAndreas Gohr    {
515773dd37SAnna Dabrowska        if ($event->data === 'plugin_acknowledge_assign') {
52ef3ab392SAndreas Gohr            echo $this->html();
53ef3ab392SAndreas Gohr            $event->stopPropagation();
54ef3ab392SAndreas Gohr            $event->preventDefault();
55ef3ab392SAndreas Gohr        }
56ef3ab392SAndreas Gohr    }
57ef3ab392SAndreas Gohr
58ef3ab392SAndreas Gohr    /**
59ef3ab392SAndreas Gohr     * Returns the acknowledgment form/confirmation
60ef3ab392SAndreas Gohr     *
61ef3ab392SAndreas Gohr     * @return string The HTML to display
62ef3ab392SAndreas Gohr     */
63ef3ab392SAndreas Gohr    protected function html()
64ef3ab392SAndreas Gohr    {
65ef3ab392SAndreas Gohr        global $INPUT;
66ef3ab392SAndreas Gohr        global $USERINFO;
67ef3ab392SAndreas Gohr        $id = $INPUT->str('id');
682d63bbe3SAnna Dabrowska        $ackSubmitted = $INPUT->bool('ack');
69ef3ab392SAndreas Gohr        $user = $INPUT->server->str('REMOTE_USER');
70ef3ab392SAndreas Gohr        if ($id === '' || $user === '') return '';
71ef3ab392SAndreas Gohr
72ef3ab392SAndreas Gohr        /** @var helper_plugin_acknowledge $helper */
73ef3ab392SAndreas Gohr        $helper = plugin_load('helper', 'acknowledge');
74ef3ab392SAndreas Gohr
755773dd37SAnna Dabrowska        if ($ackSubmitted) {
765773dd37SAnna Dabrowska            $helper->saveAcknowledgement($id, $user);
775773dd37SAnna Dabrowska        }
785773dd37SAnna Dabrowska
79ef3ab392SAndreas Gohr        $ack = $helper->hasUserAcknowledged($id, $user);
80*209df5deSAndreas Gohr
81*209df5deSAndreas Gohr        $html = '<div class="' . ($ack ? 'ack' : 'noack') . '">';
82*209df5deSAndreas Gohr        $html .= inlineSVG(__DIR__ . '/admin.svg');
83*209df5deSAndreas Gohr        $html .= '</div>';
84*209df5deSAndreas Gohr
85ef3ab392SAndreas Gohr        if ($ack) {
86ef3ab392SAndreas Gohr
87ef3ab392SAndreas Gohr            $html .= '<div>';
88*209df5deSAndreas Gohr            $html .= '<h4>';
89*209df5deSAndreas Gohr            $html .= $this->getLang('ackOk');
90*209df5deSAndreas Gohr            $html .= '</h4>';
91*209df5deSAndreas Gohr            $html .= sprintf($this->getLang('ackGranted'), dformat($ack));
92ef3ab392SAndreas Gohr            $html .= '</div>';
93ef3ab392SAndreas Gohr        } elseif ($helper->isUserAssigned($id, $user, $USERINFO['grps'])) {
94*209df5deSAndreas Gohr
95ef3ab392SAndreas Gohr            $html .= '<div>';
96*209df5deSAndreas Gohr            $html .= '<h4>' . $this->getLang('ackRequired') . '</h4>';
97d9a8334dSAnna Dabrowska            $latest = $helper->getLatestUserAcknowledgement($id, $user);
98d9a8334dSAnna Dabrowska            if ($latest) {
99d9a8334dSAnna Dabrowska                $html .= '<a href="'
100d9a8334dSAnna Dabrowska                    . wl($id, ['do' => 'diff', 'at' => $latest], false, '&') . '">'
101d9a8334dSAnna Dabrowska                    . sprintf($this->getLang('ackDiff'), dformat($latest))
102d9a8334dSAnna Dabrowska                    . '</a><br>';
103d9a8334dSAnna Dabrowska            }
104d9a8334dSAnna Dabrowska
105*209df5deSAndreas Gohr            $form = new Form(['id' => 'ackForm']);
106*209df5deSAndreas Gohr            $form->addCheckbox('ack', $this->getLang('ackText'))->attr('required', 'required');
107*209df5deSAndreas Gohr            $form->addHTML('<br><button type="submit" name="acksubmit" id="ack-submit">' . $this->getLang('ackButton') . '</button>');
108*209df5deSAndreas Gohr
1095773dd37SAnna Dabrowska            $html .= $form->toHTML();
110ef3ab392SAndreas Gohr            $html .= '</div>';
111ef3ab392SAndreas Gohr        }
112ef3ab392SAndreas Gohr
113ef3ab392SAndreas Gohr        return $html;
114ef3ab392SAndreas Gohr    }
1154d6d17d0SAndreas Gohr}
116