1*21913a6dSAnna Dabrowska<?php 2*21913a6dSAnna Dabrowska 3*21913a6dSAnna Dabrowskause dokuwiki\Extension\AdminPlugin; 4*21913a6dSAnna Dabrowska 5*21913a6dSAnna Dabrowska/** 6*21913a6dSAnna Dabrowska * DokuWiki Plugin acknowledge (Admin Component) 7*21913a6dSAnna Dabrowska * 8*21913a6dSAnna Dabrowska * Acknowledgement statistics 9*21913a6dSAnna Dabrowska * 10*21913a6dSAnna Dabrowska * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 11*21913a6dSAnna Dabrowska * @author Anna Dabrowska <dokuwiki@cosmocode.de> 12*21913a6dSAnna Dabrowska */ 13*21913a6dSAnna Dabrowskaclass admin_plugin_acknowledge_stats extends AdminPlugin 14*21913a6dSAnna Dabrowska{ 15*21913a6dSAnna Dabrowska /** @inheritdoc */ 16*21913a6dSAnna Dabrowska public function forAdminOnly() 17*21913a6dSAnna Dabrowska { 18*21913a6dSAnna Dabrowska return false; 19*21913a6dSAnna Dabrowska } 20*21913a6dSAnna Dabrowska 21*21913a6dSAnna Dabrowska /** @inheritDoc */ 22*21913a6dSAnna Dabrowska public function getMenuText($language) 23*21913a6dSAnna Dabrowska { 24*21913a6dSAnna Dabrowska return $this->getLang('menu_stats'); 25*21913a6dSAnna Dabrowska } 26*21913a6dSAnna Dabrowska 27*21913a6dSAnna Dabrowska /** @inheritdoc */ 28*21913a6dSAnna Dabrowska public function handle() 29*21913a6dSAnna Dabrowska { 30*21913a6dSAnna Dabrowska } 31*21913a6dSAnna Dabrowska 32*21913a6dSAnna Dabrowska /** @inheritdoc */ 33*21913a6dSAnna Dabrowska public function html() 34*21913a6dSAnna Dabrowska { 35*21913a6dSAnna Dabrowska global $INPUT; 36*21913a6dSAnna Dabrowska 37*21913a6dSAnna Dabrowska /** @var helper_plugin_acknowledge $helper */ 38*21913a6dSAnna Dabrowska $helper = plugin_load('helper', 'acknowledge'); 39*21913a6dSAnna Dabrowska 40*21913a6dSAnna Dabrowska $ns = trim($INPUT->str('ns'), ':'); 41*21913a6dSAnna Dabrowska 42*21913a6dSAnna Dabrowska echo '<div class="plugin_acknowledgement_admin">'; 43*21913a6dSAnna Dabrowska echo '<h1>' . $this->getLang('menu_stats') . '</h1>'; 44*21913a6dSAnna Dabrowska 45*21913a6dSAnna Dabrowska $stats = $helper->getStatistics($ns); 46*21913a6dSAnna Dabrowska 47*21913a6dSAnna Dabrowska // whole-wiki summary 48*21913a6dSAnna Dabrowska $this->htmlSummary($stats['total']); 49*21913a6dSAnna Dabrowska 50*21913a6dSAnna Dabrowska // back-link to root 51*21913a6dSAnna Dabrowska if ($ns !== '') { 52*21913a6dSAnna Dabrowska echo '<p class="stats-back">' . $this->nsLink('', $this->getLang('statsTotalLink')) . '</p>'; 53*21913a6dSAnna Dabrowska echo '<h2>' . $this->getLang('statsNamespace') . ' ' . $ns . '</h2>'; 54*21913a6dSAnna Dabrowska } 55*21913a6dSAnna Dabrowska 56*21913a6dSAnna Dabrowska if (empty($stats['namespaces'])) { 57*21913a6dSAnna Dabrowska echo '<p>' . $this->getLang('nothingfound') . '</p>'; 58*21913a6dSAnna Dabrowska echo '</div>'; 59*21913a6dSAnna Dabrowska return; 60*21913a6dSAnna Dabrowska } 61*21913a6dSAnna Dabrowska 62*21913a6dSAnna Dabrowska echo '<table>'; 63*21913a6dSAnna Dabrowska echo '<tr>'; 64*21913a6dSAnna Dabrowska echo '<th>' . $this->getLang('statsSubnamespace') . '</th>'; 65*21913a6dSAnna Dabrowska echo '<th>' . $this->getLang('statsAcked') . '</th>'; 66*21913a6dSAnna Dabrowska echo '<th>' . $this->getLang('statsRequired') . '</th>'; 67*21913a6dSAnna Dabrowska echo '<th>' . $this->getLang('statsPages') . '</th>'; 68*21913a6dSAnna Dabrowska echo '<th>' . $this->getLang('statsRatio') . '</th>'; 69*21913a6dSAnna Dabrowska echo '</tr>'; 70*21913a6dSAnna Dabrowska 71*21913a6dSAnna Dabrowska foreach ($stats['namespaces'] as $key => $data) { 72*21913a6dSAnna Dabrowska $this->htmlRow($this->nsLabel($key, $ns, $data['haschildren']), $data); 73*21913a6dSAnna Dabrowska } 74*21913a6dSAnna Dabrowska 75*21913a6dSAnna Dabrowska echo '</table>'; 76*21913a6dSAnna Dabrowska echo '</div>'; 77*21913a6dSAnna Dabrowska } 78*21913a6dSAnna Dabrowska 79*21913a6dSAnna Dabrowska /** 80*21913a6dSAnna Dabrowska * Whole-wiki summary 81*21913a6dSAnna Dabrowska * 82*21913a6dSAnna Dabrowska * @param array $total {required:int, acked:int, pages:int} 83*21913a6dSAnna Dabrowska * @return void 84*21913a6dSAnna Dabrowska */ 85*21913a6dSAnna Dabrowska protected function htmlSummary(array $total): void 86*21913a6dSAnna Dabrowska { 87*21913a6dSAnna Dabrowska $ratio = $total['required'] ? round($total['acked'] * 100 / $total['required']) : 0; 88*21913a6dSAnna Dabrowska 89*21913a6dSAnna Dabrowska echo '<div class="stats-summary">'; 90*21913a6dSAnna Dabrowska echo '<h2>' . $this->getLang('statsTotal') . '</h2>'; 91*21913a6dSAnna Dabrowska echo '<ul>'; 92*21913a6dSAnna Dabrowska echo '<li><strong>' . $this->getLang('statsAcked') . ':</strong> ' . $total['acked'] . '</li>'; 93*21913a6dSAnna Dabrowska echo '<li><strong>' . $this->getLang('statsRequired') . ':</strong> ' . $total['required'] . '</li>'; 94*21913a6dSAnna Dabrowska echo '<li><strong>' . $this->getLang('statsPages') . ':</strong> ' . $total['pages'] . '</li>'; 95*21913a6dSAnna Dabrowska echo '<li><strong>' . $this->getLang('statsRatio') . ':</strong> ' . $ratio . '%' . '</li>'; 96*21913a6dSAnna Dabrowska echo '</ul>'; 97*21913a6dSAnna Dabrowska echo '</div>'; 98*21913a6dSAnna Dabrowska } 99*21913a6dSAnna Dabrowska 100*21913a6dSAnna Dabrowska /** 101*21913a6dSAnna Dabrowska * Namespace label, linked if it has children 102*21913a6dSAnna Dabrowska * 103*21913a6dSAnna Dabrowska * @param string $key Sub-namespace key (relative to the current namespace) 104*21913a6dSAnna Dabrowska * @param string $ns Currently explored namespace 105*21913a6dSAnna Dabrowska * @param bool $haschildren 106*21913a6dSAnna Dabrowska * @return string HTML 107*21913a6dSAnna Dabrowska */ 108*21913a6dSAnna Dabrowska protected function nsLabel(string $key, string $ns, bool $haschildren): string 109*21913a6dSAnna Dabrowska { 110*21913a6dSAnna Dabrowska if ($key === '') { 111*21913a6dSAnna Dabrowska return $this->getLang('statsRoot'); 112*21913a6dSAnna Dabrowska } 113*21913a6dSAnna Dabrowska if ($key === $ns) { 114*21913a6dSAnna Dabrowska return $this->getLang('statsHere'); 115*21913a6dSAnna Dabrowska } 116*21913a6dSAnna Dabrowska 117*21913a6dSAnna Dabrowska // show the part relative to the current namespace 118*21913a6dSAnna Dabrowska $relative = $ns === '' ? $key : substr($key, strlen($ns) + 1); 119*21913a6dSAnna Dabrowska $label = $relative . ':'; 120*21913a6dSAnna Dabrowska 121*21913a6dSAnna Dabrowska return $haschildren ? $this->nsLink($key, $label) : $label; 122*21913a6dSAnna Dabrowska } 123*21913a6dSAnna Dabrowska 124*21913a6dSAnna Dabrowska /** 125*21913a6dSAnna Dabrowska * Link to a namespace drill-down view 126*21913a6dSAnna Dabrowska * 127*21913a6dSAnna Dabrowska * @param string $ns 128*21913a6dSAnna Dabrowska * @param string $label 129*21913a6dSAnna Dabrowska * @return string 130*21913a6dSAnna Dabrowska */ 131*21913a6dSAnna Dabrowska protected function nsLink(string $ns, string $label): string 132*21913a6dSAnna Dabrowska { 133*21913a6dSAnna Dabrowska global $ID; 134*21913a6dSAnna Dabrowska 135*21913a6dSAnna Dabrowska $params = ['do' => 'admin', 'page' => 'acknowledge_stats']; 136*21913a6dSAnna Dabrowska if ($ns !== '') $params['ns'] = $ns; 137*21913a6dSAnna Dabrowska 138*21913a6dSAnna Dabrowska return '<a href="' . wl($ID, $params) . '">' . $label . '</a>'; 139*21913a6dSAnna Dabrowska } 140*21913a6dSAnna Dabrowska 141*21913a6dSAnna Dabrowska /** 142*21913a6dSAnna Dabrowska * Render a single statistics row 143*21913a6dSAnna Dabrowska * 144*21913a6dSAnna Dabrowska * @param string $label 145*21913a6dSAnna Dabrowska * @param array $data {required:int, acked:int, pages:int} 146*21913a6dSAnna Dabrowska * @return void 147*21913a6dSAnna Dabrowska */ 148*21913a6dSAnna Dabrowska protected function htmlRow(string $label, array $data): void 149*21913a6dSAnna Dabrowska { 150*21913a6dSAnna Dabrowska $ratio = $data['required'] ? round($data['acked'] * 100 / $data['required']) : 0; 151*21913a6dSAnna Dabrowska 152*21913a6dSAnna Dabrowska echo '<tr>'; 153*21913a6dSAnna Dabrowska echo '<td>' . $label . '</td>'; 154*21913a6dSAnna Dabrowska echo '<td class="stats-num">' . $data['acked'] . '</td>'; 155*21913a6dSAnna Dabrowska echo '<td class="stats-num">' . $data['required'] . '</td>'; 156*21913a6dSAnna Dabrowska echo '<td class="stats-num">' . $data['pages'] . '</td>'; 157*21913a6dSAnna Dabrowska echo '<td class="stats-num">' . $ratio . '%</td>'; 158*21913a6dSAnna Dabrowska echo '</tr>'; 159*21913a6dSAnna Dabrowska } 160*21913a6dSAnna Dabrowska 161*21913a6dSAnna Dabrowska /** @inheritDoc */ 162*21913a6dSAnna Dabrowska public function getTOC() 163*21913a6dSAnna Dabrowska { 164*21913a6dSAnna Dabrowska return (new admin_plugin_acknowledge_report())->getTOC(); 165*21913a6dSAnna Dabrowska } 166*21913a6dSAnna Dabrowska} 167