1b81b1128SSzymon Olewniczak<?php 2b81b1128SSzymon Olewniczak 3b81b1128SSzymon Olewniczak// must be run within DokuWiki 4b81b1128SSzymon Olewniczakif(!defined('DOKU_INC')) die(); 5b81b1128SSzymon Olewniczak 6b81b1128SSzymon Olewniczak 7b81b1128SSzymon Olewniczakclass syntax_plugin_approve_table extends DokuWiki_Syntax_Plugin { 8b81b1128SSzymon Olewniczak 9*c7d53eabSSzymon Olewniczak protected $states = ['approved', 'draft', 'ready for approval']; 10*c7d53eabSSzymon Olewniczak// 11*c7d53eabSSzymon Olewniczak// public function __construct() { 12*c7d53eabSSzymon Olewniczak// $this->states = [$this->getConf('sum approved'), 13*c7d53eabSSzymon Olewniczak// $this->getConf('sum ready for approval'), 14*c7d53eabSSzymon Olewniczak// $this->getConf('sum draft')]; 15*c7d53eabSSzymon Olewniczak// } 16b81b1128SSzymon Olewniczak 17b81b1128SSzymon Olewniczak function getType() { 18b81b1128SSzymon Olewniczak return 'substition'; 19b81b1128SSzymon Olewniczak } 20b81b1128SSzymon Olewniczak 21b81b1128SSzymon Olewniczak function getSort() { 22b81b1128SSzymon Olewniczak return 20; 23b81b1128SSzymon Olewniczak } 24b81b1128SSzymon Olewniczak 25b81b1128SSzymon Olewniczak function PType() { 26b81b1128SSzymon Olewniczak return 'block'; 27b81b1128SSzymon Olewniczak } 28b81b1128SSzymon Olewniczak 29b81b1128SSzymon Olewniczak function connectTo($mode) { 30b81b1128SSzymon Olewniczak $this->Lexer->addSpecialPattern('----+ *approve table *-+\n.*?----+', $mode,'plugin_approve_table'); 31b81b1128SSzymon Olewniczak } 32b81b1128SSzymon Olewniczak 33b81b1128SSzymon Olewniczak function handle($match, $state, $pos, Doku_Handler $handler){ 34b81b1128SSzymon Olewniczak $lines = explode("\n", $match); 35b81b1128SSzymon Olewniczak array_shift($lines); 36b81b1128SSzymon Olewniczak array_pop($lines); 37b81b1128SSzymon Olewniczak 38b81b1128SSzymon Olewniczak $params = []; 39b81b1128SSzymon Olewniczak foreach ($lines as $line) { 40b81b1128SSzymon Olewniczak $pair = explode(':', $line, 2); 41b81b1128SSzymon Olewniczak if (count($pair) < 2) { 42b81b1128SSzymon Olewniczak continue; 43b81b1128SSzymon Olewniczak } 44b81b1128SSzymon Olewniczak $key = trim($pair[0]); 45b81b1128SSzymon Olewniczak $value = trim($pair[1]); 46b81b1128SSzymon Olewniczak if ($key == 'states') { 47b81b1128SSzymon Olewniczak $value = array_map('trim', explode(',', $value)); 48b81b1128SSzymon Olewniczak //normalize 49b81b1128SSzymon Olewniczak $value = array_map('strtolower', $value); 50b81b1128SSzymon Olewniczak $value = array_map('ucfirst', $value); 51b81b1128SSzymon Olewniczak foreach ($value as $state) { 5299eaf3e2SSzymon Olewniczak if (!in_array($state, $this->states)) { 53b81b1128SSzymon Olewniczak msg('approve plugin: unknown state "'.$state.'" should be: ' . 5499eaf3e2SSzymon Olewniczak implode(', ', $this->states), -1); 55b81b1128SSzymon Olewniczak return false; 56b81b1128SSzymon Olewniczak } 57b81b1128SSzymon Olewniczak } 58b81b1128SSzymon Olewniczak } elseif($key == 'filter' && preg_match($value, null) === false) { 59b81b1128SSzymon Olewniczak msg('approve plugin: invalid filter regex', -1); 60b81b1128SSzymon Olewniczak return false; 615f33cda2SSzymon Olewniczak } elseif ($key == 'summarize') { 625f33cda2SSzymon Olewniczak $value = $value == '0' ? false : true; 63*c7d53eabSSzymon Olewniczak } elseif ($key == 'namespace') { 64*c7d53eabSSzymon Olewniczak $value = trim(cleanID($value), ':'); 65b81b1128SSzymon Olewniczak } 66b81b1128SSzymon Olewniczak $params[$key] = $value; 67b81b1128SSzymon Olewniczak } 68b81b1128SSzymon Olewniczak return $params; 69b81b1128SSzymon Olewniczak } 70b81b1128SSzymon Olewniczak 71b81b1128SSzymon Olewniczak function render($mode, Doku_Renderer $renderer, $params) { 72b81b1128SSzymon Olewniczak global $conf; 73*c7d53eabSSzymon Olewniczak /** @var DokuWiki_Auth_Plugin $auth */ 74*c7d53eabSSzymon Olewniczak global $auth; 75b81b1128SSzymon Olewniczak 76b81b1128SSzymon Olewniczak if ($mode != 'xhtml') return false; 77b81b1128SSzymon Olewniczak if ($params === false) return false; 78b81b1128SSzymon Olewniczak 79*c7d53eabSSzymon Olewniczak /** @var \helper_plugin_ireadit_db $db_helper */ 80*c7d53eabSSzymon Olewniczak $db_helper = plugin_load('helper', 'approve_db'); 81*c7d53eabSSzymon Olewniczak $sqlite = $db_helper->getDB(); 824474ed8aSSzymon Olewniczak 83b81b1128SSzymon Olewniczak $defaults = [ 84b81b1128SSzymon Olewniczak 'namespace' => '', 85b81b1128SSzymon Olewniczak 'filter' => false, 8699eaf3e2SSzymon Olewniczak 'states' => $this->states, 875f33cda2SSzymon Olewniczak 'summarize' => true, 88b81b1128SSzymon Olewniczak ]; 89b81b1128SSzymon Olewniczak 90b81b1128SSzymon Olewniczak $params = array_replace($defaults, $params); 91b81b1128SSzymon Olewniczak 92*c7d53eabSSzymon Olewniczak $q = "SELECT page.page, page.maintainer, revision.rev, revision.approved, revision.approved_by, 93*c7d53eabSSzymon Olewniczak revision.ready_for_approval, revision.ready_for_approval_by, 94*c7d53eabSSzymon Olewniczak LENGTH(page.page) - LENGTH(REPLACE(page.page, ':', '')) AS colons 95*c7d53eabSSzymon Olewniczak FROM page INNER JOIN revision ON page.page = revision.page 96*c7d53eabSSzymon Olewniczak WHERE page.hidden = 0 AND revision.current=1 AND page.page LIKE ? ESCAPE '_' 97*c7d53eabSSzymon Olewniczak ORDER BY colons, page.page"; 98*c7d53eabSSzymon Olewniczak $res = $sqlite->query($q, $params['namespace'].'%'); 99*c7d53eabSSzymon Olewniczak $pages = $sqlite->res2arr($res); 100b81b1128SSzymon Olewniczak 101b81b1128SSzymon Olewniczak // Output Table 102b81b1128SSzymon Olewniczak $renderer->doc .= '<table><tr>'; 103b81b1128SSzymon Olewniczak $renderer->doc .= '<th>' . $this->getLang('hdr_page') . '</th>'; 104b81b1128SSzymon Olewniczak $renderer->doc .= '<th>' . $this->getLang('hdr_state') . '</th>'; 105b81b1128SSzymon Olewniczak $renderer->doc .= '<th>' . $this->getLang('hdr_updated') . '</th>'; 106*c7d53eabSSzymon Olewniczak $renderer->doc .= '<th>' . $this->getLang('hdr_maintainer') . '</th>'; 107b81b1128SSzymon Olewniczak $renderer->doc .= '</tr>'; 108b81b1128SSzymon Olewniczak 109b81b1128SSzymon Olewniczak 110b81b1128SSzymon Olewniczak $all_approved = 0; 111b81b1128SSzymon Olewniczak $all_approved_ready = 0; 112b81b1128SSzymon Olewniczak $all = 0; 113b81b1128SSzymon Olewniczak 114*c7d53eabSSzymon Olewniczak $curNS = ''; 115b81b1128SSzymon Olewniczak foreach($pages as $page) { 116*c7d53eabSSzymon Olewniczak $id = $page['page']; 117*c7d53eabSSzymon Olewniczak $maintainer = $page['maintainer']; 118*c7d53eabSSzymon Olewniczak $rev = $page['rev']; 119*c7d53eabSSzymon Olewniczak $approved = strtotime($page['approved']); 120*c7d53eabSSzymon Olewniczak $approved_by = $page['approved_by']; 121*c7d53eabSSzymon Olewniczak $ready_for_approval = strtotime($page['ready_for_approval']); 122*c7d53eabSSzymon Olewniczak $ready_for_approval_by = $page['ready_for_approval_by']; 123b81b1128SSzymon Olewniczak 124*c7d53eabSSzymon Olewniczak $pageNS = getNS($id); 125*c7d53eabSSzymon Olewniczak 126*c7d53eabSSzymon Olewniczak if($pageNS != '' && $pageNS != $curNS) { 127*c7d53eabSSzymon Olewniczak $curNS = $pageNS; 128*c7d53eabSSzymon Olewniczak 129*c7d53eabSSzymon Olewniczak $renderer->doc .= '<tr><td colspan="4"><a href="'; 130*c7d53eabSSzymon Olewniczak $renderer->doc .= wl($curNS); 131b81b1128SSzymon Olewniczak $renderer->doc .= '">'; 132*c7d53eabSSzymon Olewniczak $renderer->doc .= $curNS; 133b81b1128SSzymon Olewniczak $renderer->doc .= '</a> '; 134b81b1128SSzymon Olewniczak $renderer->doc .= '</td></tr>'; 135b81b1128SSzymon Olewniczak } 136b81b1128SSzymon Olewniczak 137b81b1128SSzymon Olewniczak $all += 1; 138*c7d53eabSSzymon Olewniczak if ($approved) { 139b81b1128SSzymon Olewniczak $class = 'plugin__approve_green'; 140b81b1128SSzymon Olewniczak $state = $this->getLang('approved'); 141*c7d53eabSSzymon Olewniczak $date = $approved; 142*c7d53eabSSzymon Olewniczak $by = $approved_by; 143*c7d53eabSSzymon Olewniczak 144b81b1128SSzymon Olewniczak $all_approved += 1; 145*c7d53eabSSzymon Olewniczak } elseif ($this->getConf('ready_for_approval') && $ready_for_approval) { 146b81b1128SSzymon Olewniczak $class = 'plugin__approve_ready'; 147b81b1128SSzymon Olewniczak $state = $this->getLang('marked_approve_ready'); 148*c7d53eabSSzymon Olewniczak $date = $ready_for_approval; 149*c7d53eabSSzymon Olewniczak $by = $ready_for_approval_by; 150*c7d53eabSSzymon Olewniczak 151b81b1128SSzymon Olewniczak $all_approved_ready += 1; 152*c7d53eabSSzymon Olewniczak } else { 153*c7d53eabSSzymon Olewniczak $class = 'plugin__approve_red'; 154*c7d53eabSSzymon Olewniczak $state = $this->getLang('draft'); 155*c7d53eabSSzymon Olewniczak $date = $rev; 156*c7d53eabSSzymon Olewniczak $by = p_get_metadata($id, 'last_change user'); 157b81b1128SSzymon Olewniczak } 158b81b1128SSzymon Olewniczak 159b81b1128SSzymon Olewniczak $renderer->doc .= '<tr class="'.$class.'">'; 160b81b1128SSzymon Olewniczak $renderer->doc .= '<td><a href="'; 161*c7d53eabSSzymon Olewniczak $renderer->doc .= wl($id); 162b81b1128SSzymon Olewniczak $renderer->doc .= '">'; 163*c7d53eabSSzymon Olewniczak if ($conf['useheading'] == '1') { 164*c7d53eabSSzymon Olewniczak $heading = p_get_first_heading($id); 165b81b1128SSzymon Olewniczak if ($heading != '') { 166b81b1128SSzymon Olewniczak $renderer->doc .= $heading; 167b81b1128SSzymon Olewniczak } else { 168*c7d53eabSSzymon Olewniczak $renderer->doc .= $id; 169b81b1128SSzymon Olewniczak } 170b81b1128SSzymon Olewniczak } else { 171*c7d53eabSSzymon Olewniczak $renderer->doc .= $id; 172b81b1128SSzymon Olewniczak } 173b81b1128SSzymon Olewniczak 174b81b1128SSzymon Olewniczak $renderer->doc .= '</a></td><td>'; 175*c7d53eabSSzymon Olewniczak $renderer->doc .= '<strong>'.$state. '</strong> '; 176*c7d53eabSSzymon Olewniczak 177*c7d53eabSSzymon Olewniczak $user = $auth->getUserData($by); 178*c7d53eabSSzymon Olewniczak if ($user) { 179*c7d53eabSSzymon Olewniczak $renderer->doc .= $this->getLang('by'). ' ' . $user['name']; 180*c7d53eabSSzymon Olewniczak } 181b81b1128SSzymon Olewniczak $renderer->doc .= '</td><td>'; 182*c7d53eabSSzymon Olewniczak $renderer->doc .= '<a href="' . wl($id) . '">' . dformat($date) . '</a>';; 183*c7d53eabSSzymon Olewniczak $renderer->doc .= '</td><td>'; 184*c7d53eabSSzymon Olewniczak if ($maintainer) { 185*c7d53eabSSzymon Olewniczak $user = $auth->getUserData($maintainer); 186*c7d53eabSSzymon Olewniczak if ($user) { 187*c7d53eabSSzymon Olewniczak $renderer->doc .= $user['name']; 188*c7d53eabSSzymon Olewniczak } else { 189*c7d53eabSSzymon Olewniczak $renderer->doc .= $maintainer; 190*c7d53eabSSzymon Olewniczak } 191*c7d53eabSSzymon Olewniczak } else { 192*c7d53eabSSzymon Olewniczak $renderer->doc .= '---'; 193*c7d53eabSSzymon Olewniczak } 194b81b1128SSzymon Olewniczak $renderer->doc .= '</td></tr>'; 195b81b1128SSzymon Olewniczak } 196b81b1128SSzymon Olewniczak 1975f33cda2SSzymon Olewniczak if ($params['summarize']) { 198*c7d53eabSSzymon Olewniczak if($this->getConf('ready_for_approval')) { 199b81b1128SSzymon Olewniczak $renderer->doc .= '<tr><td><strong>'; 200b81b1128SSzymon Olewniczak $renderer->doc .= $this->getLang('all_approved_ready'); 201b81b1128SSzymon Olewniczak $renderer->doc .= '</strong></td>'; 202b81b1128SSzymon Olewniczak 203*c7d53eabSSzymon Olewniczak $renderer->doc .= '<td colspan="3">'; 204b81b1128SSzymon Olewniczak $percent = 0; 205b81b1128SSzymon Olewniczak if($all > 0) { 206b81b1128SSzymon Olewniczak $percent = $all_approved_ready * 100 / $all; 207b81b1128SSzymon Olewniczak } 208b81b1128SSzymon Olewniczak $renderer->doc .= $all_approved_ready . ' / ' . $all . sprintf(" (%.0f%%)", $percent); 209b81b1128SSzymon Olewniczak $renderer->doc .= '</td></tr>'; 210b81b1128SSzymon Olewniczak } 211b81b1128SSzymon Olewniczak 212b81b1128SSzymon Olewniczak $renderer->doc .= '<tr><td><strong>'; 213b81b1128SSzymon Olewniczak $renderer->doc .= $this->getLang('all_approved'); 214b81b1128SSzymon Olewniczak $renderer->doc .= '</strong></td>'; 215b81b1128SSzymon Olewniczak 216*c7d53eabSSzymon Olewniczak $renderer->doc .= '<td colspan="3">'; 217b81b1128SSzymon Olewniczak $percent = 0; 218b81b1128SSzymon Olewniczak if($all > 0) { 219b81b1128SSzymon Olewniczak $percent = $all_approved * 100 / $all; 220b81b1128SSzymon Olewniczak } 221b81b1128SSzymon Olewniczak $renderer->doc .= $all_approved . ' / ' . $all . sprintf(" (%.0f%%)", $percent); 222b81b1128SSzymon Olewniczak $renderer->doc .= '</td></tr>'; 2235f33cda2SSzymon Olewniczak } 224b81b1128SSzymon Olewniczak 225b81b1128SSzymon Olewniczak $renderer->doc .= '</table>'; 226b81b1128SSzymon Olewniczak return true; 227b81b1128SSzymon Olewniczak } 228b81b1128SSzymon Olewniczak} 229