xref: /plugin/acknowledge/action.php (revision 5773dd375a3cbf135e65b74d1b5793a79b587f9e)
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
9*5773dd37SAnna 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     *
24*5773dd37SAnna Dabrowska     * FIXME do we track ALL pages? or do we check for assignments?
25*5773dd37SAnna Dabrowska     *
26ef3ab392SAndreas Gohr     * Store page last modified date
27ef3ab392SAndreas Gohr     * Handle page deletions
28ef3ab392SAndreas Gohr     * Remove assignments on page save, they get readded on rendering if needed
294d6d17d0SAndreas Gohr     *
30ef3ab392SAndreas Gohr     * @param Doku_Event $event
31ef3ab392SAndreas Gohr     * @param $param
324d6d17d0SAndreas Gohr     */
33ef3ab392SAndreas Gohr    public function handlePageSave(Doku_Event $event, $param)
344d6d17d0SAndreas Gohr    {
35ef3ab392SAndreas Gohr        /** @var helper_plugin_acknowledge $helper */
36ef3ab392SAndreas Gohr        $helper = plugin_load('helper', 'acknowledge');
37ef3ab392SAndreas Gohr
38ef3ab392SAndreas Gohr        if ($event->data['changeType'] === DOKU_CHANGE_TYPE_DELETE) {
39ef3ab392SAndreas Gohr            $helper->removePage($event->data['id']);
40ef3ab392SAndreas Gohr        } elseif ($event->data['changeType'] !== DOKU_CHANGE_TYPE_MINOR_EDIT) {
41ef3ab392SAndreas Gohr            $helper->storePageDate($event->data['id'], $event->data['newRevision']);
424d6d17d0SAndreas Gohr        }
434d6d17d0SAndreas Gohr
44ef3ab392SAndreas Gohr        $helper->clearAssignments($event->data['id']);
45ef3ab392SAndreas Gohr    }
46ef3ab392SAndreas Gohr
47ef3ab392SAndreas Gohr    /**
48ef3ab392SAndreas Gohr     * @param Doku_Event $event
49ef3ab392SAndreas Gohr     * @param $param
50ef3ab392SAndreas Gohr     */
51ef3ab392SAndreas Gohr    public function handleAjax(Doku_Event $event, $param)
52ef3ab392SAndreas Gohr    {
53*5773dd37SAnna Dabrowska        if ($event->data === 'plugin_acknowledge_assign') {
54ef3ab392SAndreas Gohr            echo $this->html();
55ef3ab392SAndreas Gohr            $event->stopPropagation();
56ef3ab392SAndreas Gohr            $event->preventDefault();
57ef3ab392SAndreas Gohr        }
58ef3ab392SAndreas Gohr    }
59ef3ab392SAndreas Gohr
60ef3ab392SAndreas Gohr    /**
61ef3ab392SAndreas Gohr     * Returns the acknowledgment form/confirmation
62ef3ab392SAndreas Gohr     *
63ef3ab392SAndreas Gohr     * @return string The HTML to display
64ef3ab392SAndreas Gohr     */
65ef3ab392SAndreas Gohr    protected function html()
66ef3ab392SAndreas Gohr    {
67ef3ab392SAndreas Gohr        global $INPUT;
68ef3ab392SAndreas Gohr        global $USERINFO;
69ef3ab392SAndreas Gohr        $id = $INPUT->str('id');
70*5773dd37SAnna Dabrowska        $ackSubmitted = $INPUT->str('ack') === 'true';
71ef3ab392SAndreas Gohr        $user = $INPUT->server->str('REMOTE_USER');
72ef3ab392SAndreas Gohr        if ($id === '' || $user === '') return '';
73ef3ab392SAndreas Gohr
74ef3ab392SAndreas Gohr        /** @var helper_plugin_acknowledge $helper */
75ef3ab392SAndreas Gohr        $helper = plugin_load('helper', 'acknowledge');
76ef3ab392SAndreas Gohr
77*5773dd37SAnna Dabrowska        if ($ackSubmitted) {
78*5773dd37SAnna Dabrowska            $helper->saveAcknowledgement($id, $user);
79*5773dd37SAnna Dabrowska        }
80*5773dd37SAnna Dabrowska
81ef3ab392SAndreas Gohr        $html = '';
82ef3ab392SAndreas Gohr
83ef3ab392SAndreas Gohr        $ack = $helper->hasUserAcknowledged($id, $user);
84ef3ab392SAndreas Gohr        if ($ack) {
85ef3ab392SAndreas Gohr
86ef3ab392SAndreas Gohr            $html .= '<div>';
87*5773dd37SAnna Dabrowska            $html .= $this->getLang('ackGranted') . sprintf('%s', dformat($ack));
88ef3ab392SAndreas Gohr            $html .= '</div>';
89ef3ab392SAndreas Gohr        } elseif ($helper->isUserAssigned($id, $user, $USERINFO['grps'])) {
90*5773dd37SAnna Dabrowska            $form = new Form(['id' => 'ackForm']);
91*5773dd37SAnna Dabrowska            $form->addCheckbox('ack');
92*5773dd37SAnna Dabrowska            $form->addLabel($this->getLang('ackText'), 'ack');
93*5773dd37SAnna Dabrowska            $form->addHTML('<button type="submit" name="acksubmit" id="ack-submit">Acknowledge</button>');
94*5773dd37SAnna Dabrowska
95*5773dd37SAnna Dabrowska            // attach submit listener to the newly injected form
96*5773dd37SAnna Dabrowska            $inlineScript = '<script>';
97*5773dd37SAnna Dabrowska            $inlineScript .= '
98*5773dd37SAnna Dabrowska                jQuery("#ackForm").submit(function(event) {
99*5773dd37SAnna Dabrowska                    event.preventDefault();
100*5773dd37SAnna Dabrowska                    var $form = jQuery( this ),
101*5773dd37SAnna Dabrowska                        ack = $form.find( "input[name=\'ack\']" )[0];
102*5773dd37SAnna Dabrowska
103*5773dd37SAnna Dabrowska                    jQuery(".plugin-acknowledge").load(
104*5773dd37SAnna Dabrowska                        DOKU_BASE + "lib/exe/ajax.php",
105*5773dd37SAnna Dabrowska                        {
106*5773dd37SAnna Dabrowska                            call: "plugin_acknowledge_html",
107*5773dd37SAnna Dabrowska                            id: JSINFO.id,
108*5773dd37SAnna Dabrowska                            ack: ack.checked
109*5773dd37SAnna Dabrowska                        }
110*5773dd37SAnna Dabrowska                    );
111*5773dd37SAnna Dabrowska                });
112*5773dd37SAnna Dabrowska            ';
113*5773dd37SAnna Dabrowska            $inlineScript .= '</script>';
114*5773dd37SAnna Dabrowska
115ef3ab392SAndreas Gohr            $html .= '<div>';
116*5773dd37SAnna Dabrowska            $html .= $this->getLang('ackRequired') . ':<br>';
117*5773dd37SAnna Dabrowska            $html .= $form->toHTML();
118*5773dd37SAnna Dabrowska            $html .= $inlineScript;
119ef3ab392SAndreas Gohr            $html .= '</div>';
120ef3ab392SAndreas Gohr        }
121ef3ab392SAndreas Gohr
122ef3ab392SAndreas Gohr        return $html;
123ef3ab392SAndreas Gohr    }
1244d6d17d0SAndreas Gohr}
125