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