xref: /plugin/approve/syntax/table.php (revision b1ff32a17baf1beabefd296a982a636d4e4d64b5)
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
9c7d53eabSSzymon Olewniczak    protected $states = ['approved', 'draft', 'ready for approval'];
10c7d53eabSSzymon Olewniczak//
11c7d53eabSSzymon Olewniczak//    public function __construct() {
12c7d53eabSSzymon Olewniczak//        $this->states = [$this->getConf('sum approved'),
13c7d53eabSSzymon Olewniczak//                         $this->getConf('sum ready for approval'),
14c7d53eabSSzymon Olewniczak//                         $this->getConf('sum draft')];
15c7d53eabSSzymon 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
38*b1ff32a1SSzymon Olewniczak        $params = [
39*b1ff32a1SSzymon Olewniczak            'namespace' => '',
40*b1ff32a1SSzymon Olewniczak            'filter' => false,
41*b1ff32a1SSzymon Olewniczak            'states' => $this->states,
42*b1ff32a1SSzymon Olewniczak            'summarize' => true,
43*b1ff32a1SSzymon Olewniczak            'maintainer' => '%'
44*b1ff32a1SSzymon Olewniczak        ];
45*b1ff32a1SSzymon Olewniczak
46b81b1128SSzymon Olewniczak        foreach ($lines as $line) {
47b81b1128SSzymon Olewniczak            $pair = explode(':', $line, 2);
48b81b1128SSzymon Olewniczak            if (count($pair) < 2) {
49b81b1128SSzymon Olewniczak                continue;
50b81b1128SSzymon Olewniczak            }
51b81b1128SSzymon Olewniczak            $key = trim($pair[0]);
52b81b1128SSzymon Olewniczak            $value = trim($pair[1]);
53b81b1128SSzymon Olewniczak            if ($key == 'states') {
54b81b1128SSzymon Olewniczak                $value = array_map('trim', explode(',', $value));
55b81b1128SSzymon Olewniczak                //normalize
56b81b1128SSzymon Olewniczak                $value = array_map('strtolower', $value);
57b81b1128SSzymon Olewniczak                $value = array_map('ucfirst', $value);
58b81b1128SSzymon Olewniczak                foreach ($value as $state) {
5999eaf3e2SSzymon Olewniczak                    if (!in_array($state, $this->states)) {
60b81b1128SSzymon Olewniczak                        msg('approve plugin: unknown state "'.$state.'" should be: ' .
6199eaf3e2SSzymon Olewniczak                            implode(', ', $this->states), -1);
62b81b1128SSzymon Olewniczak                        return false;
63b81b1128SSzymon Olewniczak                    }
64b81b1128SSzymon Olewniczak                }
65b81b1128SSzymon Olewniczak            } elseif($key == 'filter' && preg_match($value, null) === false) {
66b81b1128SSzymon Olewniczak                msg('approve plugin: invalid filter regex', -1);
67b81b1128SSzymon Olewniczak                return false;
685f33cda2SSzymon Olewniczak            } elseif ($key == 'summarize') {
695f33cda2SSzymon Olewniczak                $value = $value == '0' ? false : true;
70c7d53eabSSzymon Olewniczak            } elseif ($key == 'namespace') {
71c7d53eabSSzymon Olewniczak                $value = trim(cleanID($value), ':');
72b81b1128SSzymon Olewniczak            }
73b81b1128SSzymon Olewniczak            $params[$key] = $value;
74b81b1128SSzymon Olewniczak        }
75b81b1128SSzymon Olewniczak        return $params;
76b81b1128SSzymon Olewniczak    }
77b81b1128SSzymon Olewniczak
78*b1ff32a1SSzymon Olewniczak    /**
79*b1ff32a1SSzymon Olewniczak     * Render xhtml output or metadata
80*b1ff32a1SSzymon Olewniczak     *
81*b1ff32a1SSzymon Olewniczak     * @param string        $mode     Renderer mode (supported modes: xhtml)
82*b1ff32a1SSzymon Olewniczak     * @param Doku_Renderer $renderer The renderer
83*b1ff32a1SSzymon Olewniczak     * @param array         $data     The data from the handler() function
84*b1ff32a1SSzymon Olewniczak     *
85*b1ff32a1SSzymon Olewniczak     * @return bool If rendering was successful.
86*b1ff32a1SSzymon Olewniczak     */
87*b1ff32a1SSzymon Olewniczak
88*b1ff32a1SSzymon Olewniczak    public function render($mode, Doku_Renderer $renderer, $data)
89*b1ff32a1SSzymon Olewniczak    {
90*b1ff32a1SSzymon Olewniczak        $method = 'render' . ucfirst($mode);
91*b1ff32a1SSzymon Olewniczak        if (method_exists($this, $method)) {
92*b1ff32a1SSzymon Olewniczak            call_user_func([$this, $method], $renderer, $data);
93*b1ff32a1SSzymon Olewniczak            return true;
94*b1ff32a1SSzymon Olewniczak        }
95*b1ff32a1SSzymon Olewniczak        return false;
96*b1ff32a1SSzymon Olewniczak    }
97*b1ff32a1SSzymon Olewniczak
98*b1ff32a1SSzymon Olewniczak    /**
99*b1ff32a1SSzymon Olewniczak     * Render metadata
100*b1ff32a1SSzymon Olewniczak     *
101*b1ff32a1SSzymon Olewniczak     * @param Doku_Renderer $renderer The renderer
102*b1ff32a1SSzymon Olewniczak     * @param array         $data     The data from the handler() function
103*b1ff32a1SSzymon Olewniczak     */
104*b1ff32a1SSzymon Olewniczak    public function renderMetadata(Doku_Renderer $renderer, $params)
105*b1ff32a1SSzymon Olewniczak    {
106*b1ff32a1SSzymon Olewniczak        $plugin_name = $this->getPluginName();
107*b1ff32a1SSzymon Olewniczak        $renderer->meta['plugin'][$plugin_name] = [];
108*b1ff32a1SSzymon Olewniczak
109*b1ff32a1SSzymon Olewniczak        if ($params['maintainer'] == '$USER$') {
110*b1ff32a1SSzymon Olewniczak            $renderer->meta['plugin'][$plugin_name]['dynamic_maintainer'] = true;
111*b1ff32a1SSzymon Olewniczak        }
112*b1ff32a1SSzymon Olewniczak
113*b1ff32a1SSzymon Olewniczak        $renderer->meta['plugin'][$plugin_name]['approve_table'] = true;
114*b1ff32a1SSzymon Olewniczak    }
115*b1ff32a1SSzymon Olewniczak
116*b1ff32a1SSzymon Olewniczak    public function renderXhtml(Doku_Renderer $renderer, $params)
117*b1ff32a1SSzymon Olewniczak    {
118*b1ff32a1SSzymon Olewniczak        global $INFO;
119*b1ff32a1SSzymon Olewniczak
120b81b1128SSzymon Olewniczak        global $conf;
121c7d53eabSSzymon Olewniczak        /** @var DokuWiki_Auth_Plugin $auth */
122c7d53eabSSzymon Olewniczak        global $auth;
123b81b1128SSzymon Olewniczak
124c7d53eabSSzymon Olewniczak        /** @var \helper_plugin_ireadit_db $db_helper */
125c7d53eabSSzymon Olewniczak        $db_helper = plugin_load('helper', 'approve_db');
126c7d53eabSSzymon Olewniczak        $sqlite = $db_helper->getDB();
1274474ed8aSSzymon Olewniczak
128*b1ff32a1SSzymon Olewniczak        if ($params['maintainer'] == '$USER$') {
129*b1ff32a1SSzymon Olewniczak            $params['maintainer'] = $INFO['client'];
130*b1ff32a1SSzymon Olewniczak        }
131b81b1128SSzymon Olewniczak
132c7d53eabSSzymon Olewniczak        $q = "SELECT page.page, page.maintainer, revision.rev, revision.approved, revision.approved_by,
133c7d53eabSSzymon Olewniczak                    revision.ready_for_approval, revision.ready_for_approval_by,
134c7d53eabSSzymon Olewniczak                    LENGTH(page.page) - LENGTH(REPLACE(page.page, ':', '')) AS colons
135c7d53eabSSzymon Olewniczak                    FROM page INNER JOIN revision ON page.page = revision.page
136c7d53eabSSzymon Olewniczak                    WHERE page.hidden = 0 AND revision.current=1 AND page.page LIKE ? ESCAPE '_'
137*b1ff32a1SSzymon Olewniczak                            AND page.maintainer LIKE ?
138c7d53eabSSzymon Olewniczak                    ORDER BY colons, page.page";
139*b1ff32a1SSzymon Olewniczak        $res = $sqlite->query($q, $params['namespace'].'%', $params['maintainer']);
140c7d53eabSSzymon Olewniczak        $pages = $sqlite->res2arr($res);
141b81b1128SSzymon Olewniczak
142b81b1128SSzymon Olewniczak        // Output Table
143b81b1128SSzymon Olewniczak        $renderer->doc .= '<table><tr>';
144b81b1128SSzymon Olewniczak        $renderer->doc .= '<th>' . $this->getLang('hdr_page') . '</th>';
145b81b1128SSzymon Olewniczak        $renderer->doc .= '<th>' . $this->getLang('hdr_state') . '</th>';
146b81b1128SSzymon Olewniczak        $renderer->doc .= '<th>' . $this->getLang('hdr_updated') . '</th>';
147c7d53eabSSzymon Olewniczak        $renderer->doc .= '<th>' . $this->getLang('hdr_maintainer') . '</th>';
148b81b1128SSzymon Olewniczak        $renderer->doc .= '</tr>';
149b81b1128SSzymon Olewniczak
150b81b1128SSzymon Olewniczak
151b81b1128SSzymon Olewniczak        $all_approved = 0;
152b81b1128SSzymon Olewniczak        $all_approved_ready = 0;
153b81b1128SSzymon Olewniczak        $all = 0;
154b81b1128SSzymon Olewniczak
155c7d53eabSSzymon Olewniczak        $curNS = '';
156b81b1128SSzymon Olewniczak        foreach($pages as $page) {
157c7d53eabSSzymon Olewniczak            $id = $page['page'];
158c7d53eabSSzymon Olewniczak            $maintainer = $page['maintainer'];
159c7d53eabSSzymon Olewniczak            $rev = $page['rev'];
160c7d53eabSSzymon Olewniczak            $approved = strtotime($page['approved']);
161c7d53eabSSzymon Olewniczak            $approved_by = $page['approved_by'];
162c7d53eabSSzymon Olewniczak            $ready_for_approval = strtotime($page['ready_for_approval']);
163c7d53eabSSzymon Olewniczak            $ready_for_approval_by = $page['ready_for_approval_by'];
164b81b1128SSzymon Olewniczak
165c7d53eabSSzymon Olewniczak            $pageNS = getNS($id);
166c7d53eabSSzymon Olewniczak
167c7d53eabSSzymon Olewniczak            if($pageNS != '' && $pageNS != $curNS) {
168c7d53eabSSzymon Olewniczak                $curNS = $pageNS;
169c7d53eabSSzymon Olewniczak
170c7d53eabSSzymon Olewniczak                $renderer->doc .= '<tr><td colspan="4"><a href="';
171c7d53eabSSzymon Olewniczak                $renderer->doc .= wl($curNS);
172b81b1128SSzymon Olewniczak                $renderer->doc .= '">';
173c7d53eabSSzymon Olewniczak                $renderer->doc .= $curNS;
174b81b1128SSzymon Olewniczak                $renderer->doc .= '</a> ';
175b81b1128SSzymon Olewniczak                $renderer->doc .= '</td></tr>';
176b81b1128SSzymon Olewniczak            }
177b81b1128SSzymon Olewniczak
178b81b1128SSzymon Olewniczak            $all += 1;
179c7d53eabSSzymon Olewniczak            if ($approved) {
180b81b1128SSzymon Olewniczak                $class = 'plugin__approve_green';
181b81b1128SSzymon Olewniczak                $state = $this->getLang('approved');
182c7d53eabSSzymon Olewniczak                $date = $approved;
183c7d53eabSSzymon Olewniczak                $by = $approved_by;
184c7d53eabSSzymon Olewniczak
185b81b1128SSzymon Olewniczak                $all_approved += 1;
186c7d53eabSSzymon Olewniczak            } elseif ($this->getConf('ready_for_approval') && $ready_for_approval) {
187b81b1128SSzymon Olewniczak                $class = 'plugin__approve_ready';
188b81b1128SSzymon Olewniczak                $state = $this->getLang('marked_approve_ready');
189c7d53eabSSzymon Olewniczak                $date = $ready_for_approval;
190c7d53eabSSzymon Olewniczak                $by = $ready_for_approval_by;
191c7d53eabSSzymon Olewniczak
192b81b1128SSzymon Olewniczak                $all_approved_ready += 1;
193c7d53eabSSzymon Olewniczak            } else {
194c7d53eabSSzymon Olewniczak                $class = 'plugin__approve_red';
195c7d53eabSSzymon Olewniczak                $state = $this->getLang('draft');
196c7d53eabSSzymon Olewniczak                $date = $rev;
197c7d53eabSSzymon Olewniczak                $by = p_get_metadata($id, 'last_change user');
198b81b1128SSzymon Olewniczak            }
199b81b1128SSzymon Olewniczak
200b81b1128SSzymon Olewniczak            $renderer->doc .= '<tr class="'.$class.'">';
201b81b1128SSzymon Olewniczak            $renderer->doc .= '<td><a href="';
202c7d53eabSSzymon Olewniczak            $renderer->doc .= wl($id);
203b81b1128SSzymon Olewniczak            $renderer->doc .= '">';
204c7d53eabSSzymon Olewniczak            if ($conf['useheading'] == '1') {
205c7d53eabSSzymon Olewniczak                $heading = p_get_first_heading($id);
206b81b1128SSzymon Olewniczak                if ($heading != '') {
207b81b1128SSzymon Olewniczak                    $renderer->doc .= $heading;
208b81b1128SSzymon Olewniczak                } else {
209c7d53eabSSzymon Olewniczak                    $renderer->doc .= $id;
210b81b1128SSzymon Olewniczak                }
211b81b1128SSzymon Olewniczak            } else {
212c7d53eabSSzymon Olewniczak                $renderer->doc .= $id;
213b81b1128SSzymon Olewniczak            }
214b81b1128SSzymon Olewniczak
215b81b1128SSzymon Olewniczak            $renderer->doc .= '</a></td><td>';
216c7d53eabSSzymon Olewniczak            $renderer->doc .= '<strong>'.$state. '</strong> ';
217c7d53eabSSzymon Olewniczak
218c7d53eabSSzymon Olewniczak            $user = $auth->getUserData($by);
219c7d53eabSSzymon Olewniczak            if ($user) {
220c7d53eabSSzymon Olewniczak                $renderer->doc .= $this->getLang('by'). ' ' . $user['name'];
221c7d53eabSSzymon Olewniczak            }
222b81b1128SSzymon Olewniczak            $renderer->doc .= '</td><td>';
223c7d53eabSSzymon Olewniczak            $renderer->doc .= '<a href="' . wl($id) . '">' . dformat($date) . '</a>';;
224c7d53eabSSzymon Olewniczak            $renderer->doc .= '</td><td>';
225c7d53eabSSzymon Olewniczak            if ($maintainer) {
226c7d53eabSSzymon Olewniczak                $user = $auth->getUserData($maintainer);
227c7d53eabSSzymon Olewniczak                if ($user) {
228c7d53eabSSzymon Olewniczak                    $renderer->doc .= $user['name'];
229c7d53eabSSzymon Olewniczak                } else {
230c7d53eabSSzymon Olewniczak                    $renderer->doc .= $maintainer;
231c7d53eabSSzymon Olewniczak                }
232c7d53eabSSzymon Olewniczak            } else {
233c7d53eabSSzymon Olewniczak                $renderer->doc .= '---';
234c7d53eabSSzymon Olewniczak            }
235b81b1128SSzymon Olewniczak            $renderer->doc .= '</td></tr>';
236b81b1128SSzymon Olewniczak        }
237b81b1128SSzymon Olewniczak
2385f33cda2SSzymon Olewniczak        if ($params['summarize']) {
239c7d53eabSSzymon Olewniczak            if($this->getConf('ready_for_approval')) {
240b81b1128SSzymon Olewniczak                $renderer->doc .= '<tr><td><strong>';
241b81b1128SSzymon Olewniczak                $renderer->doc .= $this->getLang('all_approved_ready');
242b81b1128SSzymon Olewniczak                $renderer->doc .= '</strong></td>';
243b81b1128SSzymon Olewniczak
244c7d53eabSSzymon Olewniczak                $renderer->doc .= '<td colspan="3">';
245b81b1128SSzymon Olewniczak                $percent       = 0;
246b81b1128SSzymon Olewniczak                if($all > 0) {
247b81b1128SSzymon Olewniczak                    $percent = $all_approved_ready * 100 / $all;
248b81b1128SSzymon Olewniczak                }
249b81b1128SSzymon Olewniczak                $renderer->doc .= $all_approved_ready . ' / ' . $all . sprintf(" (%.0f%%)", $percent);
250b81b1128SSzymon Olewniczak                $renderer->doc .= '</td></tr>';
251b81b1128SSzymon Olewniczak            }
252b81b1128SSzymon Olewniczak
253b81b1128SSzymon Olewniczak            $renderer->doc .= '<tr><td><strong>';
254b81b1128SSzymon Olewniczak            $renderer->doc .= $this->getLang('all_approved');
255b81b1128SSzymon Olewniczak            $renderer->doc .= '</strong></td>';
256b81b1128SSzymon Olewniczak
257c7d53eabSSzymon Olewniczak            $renderer->doc .= '<td colspan="3">';
258b81b1128SSzymon Olewniczak            $percent       = 0;
259b81b1128SSzymon Olewniczak            if($all > 0) {
260b81b1128SSzymon Olewniczak                $percent = $all_approved * 100 / $all;
261b81b1128SSzymon Olewniczak            }
262b81b1128SSzymon Olewniczak            $renderer->doc .= $all_approved . ' / ' . $all . sprintf(" (%.0f%%)", $percent);
263b81b1128SSzymon Olewniczak            $renderer->doc .= '</td></tr>';
2645f33cda2SSzymon Olewniczak        }
265b81b1128SSzymon Olewniczak
266b81b1128SSzymon Olewniczak        $renderer->doc .= '</table>';
267b81b1128SSzymon Olewniczak    }
268b81b1128SSzymon Olewniczak}
269