xref: /plugin/approve/admin.php (revision 1b552e8770c2762b98667d8e9f261a9c379a4ec6)
1*1b552e87SSzymon Olewniczak<?php
2*1b552e87SSzymon Olewniczak/**
3*1b552e87SSzymon Olewniczak * DokuWiki Plugin watchcycle (Admin Component)
4*1b552e87SSzymon Olewniczak *
5*1b552e87SSzymon Olewniczak * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
6*1b552e87SSzymon Olewniczak * @author  Szymon Olewniczak <dokuwiki@cosmocode.de>
7*1b552e87SSzymon Olewniczak */
8*1b552e87SSzymon Olewniczak
9*1b552e87SSzymon Olewniczak// must be run within Dokuwiki
10*1b552e87SSzymon Olewniczakif (!defined('DOKU_INC')) {
11*1b552e87SSzymon Olewniczak    die();
12*1b552e87SSzymon Olewniczak}
13*1b552e87SSzymon Olewniczak
14*1b552e87SSzymon Olewniczakclass admin_plugin_approve extends DokuWiki_Admin_Plugin
15*1b552e87SSzymon Olewniczak{
16*1b552e87SSzymon Olewniczak
17*1b552e87SSzymon Olewniczak    /** @var helper_plugin_sqlite */
18*1b552e87SSzymon Olewniczak    protected $sqlite;
19*1b552e87SSzymon Olewniczak
20*1b552e87SSzymon Olewniczak    /** @var helper_plugin_approve */
21*1b552e87SSzymon Olewniczak    protected $helper;
22*1b552e87SSzymon Olewniczak
23*1b552e87SSzymon Olewniczak    /**
24*1b552e87SSzymon Olewniczak     * @return helper_plugin_sqlite
25*1b552e87SSzymon Olewniczak     */
26*1b552e87SSzymon Olewniczak    protected function sqlite() {
27*1b552e87SSzymon Olewniczak        if (!$this->sqlite) {
28*1b552e87SSzymon Olewniczak            /** @var helper_plugin_approve_db $db_helper */
29*1b552e87SSzymon Olewniczak            $db_helper = plugin_load('helper', 'approve_db');
30*1b552e87SSzymon Olewniczak            $this->sqlite = $db_helper->getDB();
31*1b552e87SSzymon Olewniczak        }
32*1b552e87SSzymon Olewniczak        return $this->sqlite;
33*1b552e87SSzymon Olewniczak    }
34*1b552e87SSzymon Olewniczak
35*1b552e87SSzymon Olewniczak    /**
36*1b552e87SSzymon Olewniczak     * @return helper_plugin_approve
37*1b552e87SSzymon Olewniczak     */
38*1b552e87SSzymon Olewniczak    protected function helper() {
39*1b552e87SSzymon Olewniczak        if (!$this->helper) {
40*1b552e87SSzymon Olewniczak            $helper = plugin_load('helper', 'approve');
41*1b552e87SSzymon Olewniczak            $this->helper = $helper;
42*1b552e87SSzymon Olewniczak        }
43*1b552e87SSzymon Olewniczak        return $this->helper;
44*1b552e87SSzymon Olewniczak    }
45*1b552e87SSzymon Olewniczak
46*1b552e87SSzymon Olewniczak    /**
47*1b552e87SSzymon Olewniczak     * @return int sort number in admin menu
48*1b552e87SSzymon Olewniczak     */
49*1b552e87SSzymon Olewniczak    public function getMenuSort()
50*1b552e87SSzymon Olewniczak    {
51*1b552e87SSzymon Olewniczak        return 1;
52*1b552e87SSzymon Olewniczak    }
53*1b552e87SSzymon Olewniczak
54*1b552e87SSzymon Olewniczak    /**
55*1b552e87SSzymon Olewniczak     * Should carry out any processing required by the plugin.
56*1b552e87SSzymon Olewniczak     */
57*1b552e87SSzymon Olewniczak    public function handle()
58*1b552e87SSzymon Olewniczak    {
59*1b552e87SSzymon Olewniczak        /* @var Input */
60*1b552e87SSzymon Olewniczak        global $INPUT;
61*1b552e87SSzymon Olewniczak        global $lang;
62*1b552e87SSzymon Olewniczak
63*1b552e87SSzymon Olewniczak        $action = $INPUT->str('action');
64*1b552e87SSzymon Olewniczak        $updated = [];
65*1b552e87SSzymon Olewniczak        if ($action == 'save_config') {
66*1b552e87SSzymon Olewniczak            $res = $this->sqlite()->query('SELECT key, value FROM config');
67*1b552e87SSzymon Olewniczak            $config_options = $this->sqlite()->res2arr($res);
68*1b552e87SSzymon Olewniczak            foreach ($config_options as $option) {
69*1b552e87SSzymon Olewniczak                $key = $option['key'];
70*1b552e87SSzymon Olewniczak                $value = $option['value'];
71*1b552e87SSzymon Olewniczak                $new_value = $INPUT->str($key);
72*1b552e87SSzymon Olewniczak
73*1b552e87SSzymon Olewniczak                if ($value != $new_value) {
74*1b552e87SSzymon Olewniczak                    $updated[$key] = $new_value;
75*1b552e87SSzymon Olewniczak                    $this->sqlite()->query('UPDATE config SET value=? WHERE key=?', $new_value, $key);
76*1b552e87SSzymon Olewniczak                }
77*1b552e87SSzymon Olewniczak            }
78*1b552e87SSzymon Olewniczak
79*1b552e87SSzymon Olewniczak            if (array_key_exists('no_apr_namespaces', $updated)) {
80*1b552e87SSzymon Olewniczak                $res = $this->sqlite()->query('SELECT page, hidden FROM page');
81*1b552e87SSzymon Olewniczak                $pages = $this->sqlite()->res2arr($res);
82*1b552e87SSzymon Olewniczak                foreach ($pages as $page) {
83*1b552e87SSzymon Olewniczak                    $id = $page['page'];
84*1b552e87SSzymon Olewniczak                    $hidden = $page['hidden'];
85*1b552e87SSzymon Olewniczak                    $in_hidden_namespace = $this->helper()->in_hidden_namespace($id, $updated['no_apr_namespaces']);
86*1b552e87SSzymon Olewniczak                    $new_hidden = $in_hidden_namespace ? '1' : '0';
87*1b552e87SSzymon Olewniczak
88*1b552e87SSzymon Olewniczak                    if ($hidden != $new_hidden) {
89*1b552e87SSzymon Olewniczak                        $this->sqlite()->query('UPDATE page SET hidden=? WHERE page=?', $new_hidden, $id);
90*1b552e87SSzymon Olewniczak                    }
91*1b552e87SSzymon Olewniczak                }
92*1b552e87SSzymon Olewniczak            }
93*1b552e87SSzymon Olewniczak            msg($this->getLang('admin updated'), 1);
94*1b552e87SSzymon Olewniczak        }
95*1b552e87SSzymon Olewniczak    }
96*1b552e87SSzymon Olewniczak
97*1b552e87SSzymon Olewniczak    /**
98*1b552e87SSzymon Olewniczak     * Render HTML output, e.g. helpful text and a form
99*1b552e87SSzymon Olewniczak     */
100*1b552e87SSzymon Olewniczak    public function html()
101*1b552e87SSzymon Olewniczak    {
102*1b552e87SSzymon Olewniczak        global $lang;
103*1b552e87SSzymon Olewniczak
104*1b552e87SSzymon Olewniczak        global $ID;
105*1b552e87SSzymon Olewniczak        /* @var Input */
106*1b552e87SSzymon Olewniczak        global $INPUT;
107*1b552e87SSzymon Olewniczak
108*1b552e87SSzymon Olewniczak        ptln('<h1>' . $this->getLang('menu') . '</h1>');
109*1b552e87SSzymon Olewniczak
110*1b552e87SSzymon Olewniczak        ptln('<div id="plugin__approve_admin">');
111*1b552e87SSzymon Olewniczak
112*1b552e87SSzymon Olewniczak        $res = $this->sqlite()->query('SELECT key, value FROM config');
113*1b552e87SSzymon Olewniczak        $config_options = $this->sqlite()->res2arr($res);
114*1b552e87SSzymon Olewniczak
115*1b552e87SSzymon Olewniczak        $form = new \dokuwiki\Form\Form();
116*1b552e87SSzymon Olewniczak        $form->setHiddenField('action', 'save_config');
117*1b552e87SSzymon Olewniczak        $form->addFieldsetOpen($this->getLang('admin settings'));
118*1b552e87SSzymon Olewniczak        $form->addHTML('<table>');
119*1b552e87SSzymon Olewniczak        foreach ($config_options as $option) {
120*1b552e87SSzymon Olewniczak            $key = $option['key'];
121*1b552e87SSzymon Olewniczak            $value = $option['value'];
122*1b552e87SSzymon Olewniczak
123*1b552e87SSzymon Olewniczak            $id = "plugin__approve_config_$key";
124*1b552e87SSzymon Olewniczak
125*1b552e87SSzymon Olewniczak            $input = new \dokuwiki\Form\InputElement('text', $key);
126*1b552e87SSzymon Olewniczak            $input->id($id);
127*1b552e87SSzymon Olewniczak
128*1b552e87SSzymon Olewniczak            $form->addHTML('<tr>');
129*1b552e87SSzymon Olewniczak
130*1b552e87SSzymon Olewniczak            $form->addHTML('<td>');
131*1b552e87SSzymon Olewniczak            $label = $this->getLang("admin config $key");
132*1b552e87SSzymon Olewniczak            $form->addHTML("<label for=\"$id\">$label</label>");
133*1b552e87SSzymon Olewniczak            $form->addHTML('</td>');
134*1b552e87SSzymon Olewniczak
135*1b552e87SSzymon Olewniczak
136*1b552e87SSzymon Olewniczak            $form->addHTML('<td>');
137*1b552e87SSzymon Olewniczak
138*1b552e87SSzymon Olewniczak            $input->val($value);
139*1b552e87SSzymon Olewniczak            $form->addElement($input);
140*1b552e87SSzymon Olewniczak            $form->addHTML('</td>');
141*1b552e87SSzymon Olewniczak
142*1b552e87SSzymon Olewniczak            $form->addHTML('</tr>');
143*1b552e87SSzymon Olewniczak        }
144*1b552e87SSzymon Olewniczak        $form->addHTML('</table>');
145*1b552e87SSzymon Olewniczak        $form->addButton('', $lang['btn_save']);
146*1b552e87SSzymon Olewniczak
147*1b552e87SSzymon Olewniczak        $form->addFieldsetClose();
148*1b552e87SSzymon Olewniczak
149*1b552e87SSzymon Olewniczak
150*1b552e87SSzymon Olewniczak        ptln($form->toHTML());
151*1b552e87SSzymon Olewniczak
152*1b552e87SSzymon Olewniczak        return;
153*1b552e87SSzymon Olewniczak
154*1b552e87SSzymon Olewniczak        $form = new \dokuwiki\Form\Form();
155*1b552e87SSzymon Olewniczak        $filter_input = new \dokuwiki\Form\InputElement('text', 'filter');
156*1b552e87SSzymon Olewniczak        $filter_input->attr('placeholder', $this->getLang('search page'));
157*1b552e87SSzymon Olewniczak        $form->addElement($filter_input);
158*1b552e87SSzymon Olewniczak
159*1b552e87SSzymon Olewniczak        $form->addButton('', $this->getLang('btn filter'));
160*1b552e87SSzymon Olewniczak
161*1b552e87SSzymon Olewniczak        $form->addHTML('<label class="outdated">');
162*1b552e87SSzymon Olewniczak        $form->addCheckbox('outdated');
163*1b552e87SSzymon Olewniczak        $form->addHTML($this->getLang('show outdated only'));
164*1b552e87SSzymon Olewniczak        $form->addHTML('</label>');
165*1b552e87SSzymon Olewniczak
166*1b552e87SSzymon Olewniczak
167*1b552e87SSzymon Olewniczak        ptln($form->toHTML());
168*1b552e87SSzymon Olewniczak        ptln('<table>');
169*1b552e87SSzymon Olewniczak        ptln('<tr>');
170*1b552e87SSzymon Olewniczak        $headers = ['page', 'maintainer', 'cycle', 'current', 'uptodate'];
171*1b552e87SSzymon Olewniczak        foreach ($headers as $header) {
172*1b552e87SSzymon Olewniczak            $lang = $this->getLang("h $header");
173*1b552e87SSzymon Olewniczak            $param = [
174*1b552e87SSzymon Olewniczak                'do' => 'admin',
175*1b552e87SSzymon Olewniczak                'page' => 'watchcycle',
176*1b552e87SSzymon Olewniczak                'sortby' => $header,
177*1b552e87SSzymon Olewniczak            ];
178*1b552e87SSzymon Olewniczak            $icon = '';
179*1b552e87SSzymon Olewniczak            if ($INPUT->str('sortby') == $header) {
180*1b552e87SSzymon Olewniczak                if ($INPUT->int('desc') == 0) {
181*1b552e87SSzymon Olewniczak                    $param['desc'] = 1;
182*1b552e87SSzymon Olewniczak                    $icon = '↑';
183*1b552e87SSzymon Olewniczak                } else {
184*1b552e87SSzymon Olewniczak                    $param['desc'] = 0;
185*1b552e87SSzymon Olewniczak                    $icon = '↓';
186*1b552e87SSzymon Olewniczak                }
187*1b552e87SSzymon Olewniczak            }
188*1b552e87SSzymon Olewniczak            $href = wl($ID, $param);
189*1b552e87SSzymon Olewniczak
190*1b552e87SSzymon Olewniczak            ptln('<th><a href="' . $href . '">' . $icon . ' ' . $lang . '</a></th>');
191*1b552e87SSzymon Olewniczak        }
192*1b552e87SSzymon Olewniczak        $q = 'SELECT page, maintainer, cycle, DAYS_AGO(last_maintainer_rev) AS current, uptodate FROM watchcycle';
193*1b552e87SSzymon Olewniczak        $where = [];
194*1b552e87SSzymon Olewniczak        $q_args = [];
195*1b552e87SSzymon Olewniczak        if ($INPUT->str('filter') != '') {
196*1b552e87SSzymon Olewniczak            $where[] = 'page LIKE ?';
197*1b552e87SSzymon Olewniczak            $q_args[] = '%' . $INPUT->str('filter') . '%';
198*1b552e87SSzymon Olewniczak        }
199*1b552e87SSzymon Olewniczak        if ($INPUT->has('outdated')) {
200*1b552e87SSzymon Olewniczak            $where[] = 'uptodate=0';
201*1b552e87SSzymon Olewniczak        }
202*1b552e87SSzymon Olewniczak
203*1b552e87SSzymon Olewniczak        if (count($where) > 0) {
204*1b552e87SSzymon Olewniczak            $q .= ' WHERE ';
205*1b552e87SSzymon Olewniczak            $q .= implode(' AND ', $where);
206*1b552e87SSzymon Olewniczak        }
207*1b552e87SSzymon Olewniczak
208*1b552e87SSzymon Olewniczak        if ($INPUT->has('sortby') && in_array($INPUT->str('sortby'), $headers)) {
209*1b552e87SSzymon Olewniczak            $q .= ' ORDER BY ' . $INPUT->str('sortby');
210*1b552e87SSzymon Olewniczak            if ($INPUT->int('desc') == 1) {
211*1b552e87SSzymon Olewniczak                $q .= ' DESC';
212*1b552e87SSzymon Olewniczak            }
213*1b552e87SSzymon Olewniczak        }
214*1b552e87SSzymon Olewniczak
215*1b552e87SSzymon Olewniczak        $res = $sqlite->query($q, $q_args);
216*1b552e87SSzymon Olewniczak        while ($row = $sqlite->res2row($res)) {
217*1b552e87SSzymon Olewniczak            ptln('<tr>');
218*1b552e87SSzymon Olewniczak            ptln('<td><a href="' . wl($row['page']) . '" class="wikilink1">' . $row['page'] . '</a></td>');
219*1b552e87SSzymon Olewniczak            ptln('<td>' . $row['maintainer'] . '</td>');
220*1b552e87SSzymon Olewniczak            ptln('<td>' . $row['cycle'] . '</td>');
221*1b552e87SSzymon Olewniczak            ptln('<td>' . $row['current'] . '</td>');
222*1b552e87SSzymon Olewniczak            $icon = $row['uptodate'] == 1 ? '✓' : '✕';
223*1b552e87SSzymon Olewniczak            ptln('<td>' . $icon . '</td>');
224*1b552e87SSzymon Olewniczak            ptln('</tr>');
225*1b552e87SSzymon Olewniczak        }
226*1b552e87SSzymon Olewniczak
227*1b552e87SSzymon Olewniczak        ptln('</tr>');
228*1b552e87SSzymon Olewniczak        ptln('</table>');
229*1b552e87SSzymon Olewniczak
230*1b552e87SSzymon Olewniczak        ptln('</div>');
231*1b552e87SSzymon Olewniczak    }
232*1b552e87SSzymon Olewniczak}
233*1b552e87SSzymon Olewniczak
234*1b552e87SSzymon Olewniczak// vim:ts=4:sw=4:et:
235