xref: /plugin/approve/syntax/table.php (revision c7d53eaba29e207f5d28ea550cd66a04c154a49d)
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