xref: /plugin/acknowledge/admin/stats.php (revision 21913a6d9b851a00667f66bc614ba0dda97d3508)
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