xref: /plugin/acknowledge/action.php (revision cfdacc6aa653c54967dcdc5175d6eaf5dd54939e)
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');
19f09444ffSAndreas Gohr        $controller->register_hook('PLUGIN_SQLITE_DATABASE_UPGRADE', 'AFTER', $this, 'handleUpgrade');
204d6d17d0SAndreas Gohr    }
214d6d17d0SAndreas Gohr
224d6d17d0SAndreas Gohr    /**
23ef3ab392SAndreas Gohr     * Manage page meta data
244d6d17d0SAndreas Gohr     *
25ef3ab392SAndreas Gohr     * Store page last modified date
26ef3ab392SAndreas Gohr     * Handle page deletions
27f09444ffSAndreas Gohr     * Handle page creations
284d6d17d0SAndreas Gohr     *
29ef3ab392SAndreas Gohr     * @param Doku_Event $event
30ef3ab392SAndreas Gohr     * @param $param
314d6d17d0SAndreas Gohr     */
32ef3ab392SAndreas Gohr    public function handlePageSave(Doku_Event $event, $param)
334d6d17d0SAndreas Gohr    {
34ef3ab392SAndreas Gohr        /** @var helper_plugin_acknowledge $helper */
35ef3ab392SAndreas Gohr        $helper = plugin_load('helper', 'acknowledge');
36ef3ab392SAndreas Gohr
37ef3ab392SAndreas Gohr        if ($event->data['changeType'] === DOKU_CHANGE_TYPE_DELETE) {
38f09444ffSAndreas Gohr            $helper->removePage($event->data['id']); // this cascades to assignments
39ef3ab392SAndreas Gohr        } elseif ($event->data['changeType'] !== DOKU_CHANGE_TYPE_MINOR_EDIT) {
405dee13f7SAnna Dabrowska            $helper->storePageDate($event->data['id'], $event->data['newRevision'], $event->data['newContent']);
414d6d17d0SAndreas Gohr        }
424d6d17d0SAndreas Gohr
43f09444ffSAndreas Gohr        // Remove page assignees here because the syntax might have been removed
44f09444ffSAndreas Gohr        // they are readded on metadata rendering if still there
45f09444ffSAndreas Gohr        $helper->clearPageAssignments($event->data['id']);
46f09444ffSAndreas Gohr
47f09444ffSAndreas Gohr        if ($event->data['changeType'] === DOKU_CHANGE_TYPE_CREATE) {
48f09444ffSAndreas Gohr            // new pages need to have their auto assignments updated based on the existing patterns
49f09444ffSAndreas Gohr            $helper->setAutoAssignees($event->data['id']);
50f09444ffSAndreas Gohr        }
51ef3ab392SAndreas Gohr    }
52ef3ab392SAndreas Gohr
53ef3ab392SAndreas Gohr    /**
54ef3ab392SAndreas Gohr     * @param Doku_Event $event
55ef3ab392SAndreas Gohr     * @param $param
56ef3ab392SAndreas Gohr     */
57ef3ab392SAndreas Gohr    public function handleAjax(Doku_Event $event, $param)
58ef3ab392SAndreas Gohr    {
595773dd37SAnna Dabrowska        if ($event->data === 'plugin_acknowledge_assign') {
60ef3ab392SAndreas Gohr            $event->stopPropagation();
61ef3ab392SAndreas Gohr            $event->preventDefault();
62*cfdacc6aSAnna Dabrowska
63*cfdacc6aSAnna Dabrowska            global $INPUT;
64*cfdacc6aSAnna Dabrowska            $id = $INPUT->str('id');
65*cfdacc6aSAnna Dabrowska
66*cfdacc6aSAnna Dabrowska            if (page_exists($id)) {
67*cfdacc6aSAnna Dabrowska                echo $this->html();
68*cfdacc6aSAnna Dabrowska            }
69ef3ab392SAndreas Gohr        }
70ef3ab392SAndreas Gohr    }
71ef3ab392SAndreas Gohr
72ef3ab392SAndreas Gohr    /**
73f09444ffSAndreas Gohr     * Handle Migration events
74f09444ffSAndreas Gohr     *
75f09444ffSAndreas Gohr     * @param Doku_Event $event
76f09444ffSAndreas Gohr     * @param $param
77f09444ffSAndreas Gohr     * @return void
78f09444ffSAndreas Gohr     */
79f09444ffSAndreas Gohr    public function handleUpgrade(Doku_Event $event, $param)
80f09444ffSAndreas Gohr    {
81f09444ffSAndreas Gohr        if ($event->data['sqlite']->getAdapter()->getDbname() !== 'acknowledgement') {
82f09444ffSAndreas Gohr            return;
83f09444ffSAndreas Gohr        }
84f09444ffSAndreas Gohr        $to = $event->data['to'];
85f09444ffSAndreas Gohr        if ($to !== 3) return; // only handle upgrade to version 3
86f09444ffSAndreas Gohr
87f09444ffSAndreas Gohr        /** @var helper_plugin_acknowledge $helper */
88f09444ffSAndreas Gohr        $helper = plugin_load('helper', 'acknowledge');
89f09444ffSAndreas Gohr        $helper->updatePageIndex();
90f09444ffSAndreas Gohr    }
91f09444ffSAndreas Gohr
92f09444ffSAndreas Gohr    /**
93ef3ab392SAndreas Gohr     * Returns the acknowledgment form/confirmation
94ef3ab392SAndreas Gohr     *
95ef3ab392SAndreas Gohr     * @return string The HTML to display
96ef3ab392SAndreas Gohr     */
97ef3ab392SAndreas Gohr    protected function html()
98ef3ab392SAndreas Gohr    {
99ef3ab392SAndreas Gohr        global $INPUT;
100ef3ab392SAndreas Gohr        global $USERINFO;
101ef3ab392SAndreas Gohr        $id = $INPUT->str('id');
1022d63bbe3SAnna Dabrowska        $ackSubmitted = $INPUT->bool('ack');
103ef3ab392SAndreas Gohr        $user = $INPUT->server->str('REMOTE_USER');
104ef3ab392SAndreas Gohr        if ($id === '' || $user === '') return '';
105ef3ab392SAndreas Gohr
106ef3ab392SAndreas Gohr        /** @var helper_plugin_acknowledge $helper */
107ef3ab392SAndreas Gohr        $helper = plugin_load('helper', 'acknowledge');
108ef3ab392SAndreas Gohr
10935bc8beaSAndreas Gohr        // only display for users assigned to the page
11035bc8beaSAndreas Gohr        if (!$helper->isUserAssigned($id, $user, $USERINFO['grps'])) {
11135bc8beaSAndreas Gohr            return '';
11235bc8beaSAndreas Gohr        }
11335bc8beaSAndreas Gohr
1145773dd37SAnna Dabrowska        if ($ackSubmitted) {
1155773dd37SAnna Dabrowska            $helper->saveAcknowledgement($id, $user);
1165773dd37SAnna Dabrowska        }
1175773dd37SAnna Dabrowska
118ef3ab392SAndreas Gohr        $ack = $helper->hasUserAcknowledged($id, $user);
119209df5deSAndreas Gohr
120209df5deSAndreas Gohr        $html = '<div class="' . ($ack ? 'ack' : 'noack') . '">';
121209df5deSAndreas Gohr        $html .= inlineSVG(__DIR__ . '/admin.svg');
122209df5deSAndreas Gohr        $html .= '</div>';
123209df5deSAndreas Gohr
124ef3ab392SAndreas Gohr        if ($ack) {
125ef3ab392SAndreas Gohr            $html .= '<div>';
126209df5deSAndreas Gohr            $html .= '<h4>';
127209df5deSAndreas Gohr            $html .= $this->getLang('ackOk');
128209df5deSAndreas Gohr            $html .= '</h4>';
129209df5deSAndreas Gohr            $html .= sprintf($this->getLang('ackGranted'), dformat($ack));
130ef3ab392SAndreas Gohr            $html .= '</div>';
13135bc8beaSAndreas Gohr        } else {
132ef3ab392SAndreas Gohr            $html .= '<div>';
133209df5deSAndreas Gohr            $html .= '<h4>' . $this->getLang('ackRequired') . '</h4>';
134d9a8334dSAnna Dabrowska            $latest = $helper->getLatestUserAcknowledgement($id, $user);
135d9a8334dSAnna Dabrowska            if ($latest) {
136d9a8334dSAnna Dabrowska                $html .= '<a href="'
137d9a8334dSAnna Dabrowska                    . wl($id, ['do' => 'diff', 'at' => $latest], false, '&') . '">'
138d9a8334dSAnna Dabrowska                    . sprintf($this->getLang('ackDiff'), dformat($latest))
139d9a8334dSAnna Dabrowska                    . '</a><br>';
140d9a8334dSAnna Dabrowska            }
141d9a8334dSAnna Dabrowska
142209df5deSAndreas Gohr            $form = new Form(['id' => 'ackForm']);
143209df5deSAndreas Gohr            $form->addCheckbox('ack', $this->getLang('ackText'))->attr('required', 'required');
144209df5deSAndreas Gohr            $form->addHTML('<br><button type="submit" name="acksubmit" id="ack-submit">' . $this->getLang('ackButton') . '</button>');
145209df5deSAndreas Gohr
1465773dd37SAnna Dabrowska            $html .= $form->toHTML();
147ef3ab392SAndreas Gohr            $html .= '</div>';
148ef3ab392SAndreas Gohr        }
149ef3ab392SAndreas Gohr
150ef3ab392SAndreas Gohr        return $html;
151ef3ab392SAndreas Gohr    }
1524d6d17d0SAndreas Gohr}
153