xref: /plugin/approve/action/revisions.php (revision c708a86f173ded59efaa534cd399f83e819daa4e)
1<?php
2
3use dokuwiki\Form\TagOpenElement;
4use dokuwiki\Form\CheckableElement;
5
6if(!defined('DOKU_INC')) die();
7
8
9class action_plugin_approve_revisions extends DokuWiki_Action_Plugin {
10
11    function register(Doku_Event_Handler $controller) {
12		$controller->register_hook('FORM_REVISIONS_OUTPUT', 'BEFORE', $this, 'handle_revisions', array());
13	}
14
15	function handle_revisions(Doku_Event $event, $param) {
16		global $INFO;
17
18        try {
19            /** @var \helper_plugin_approve_db $db_helper */
20            $db_helper = plugin_load('helper', 'approve_db');
21            $sqlite = $db_helper->getDB();
22        } catch (Exception $e) {
23            msg($e->getMessage(), -1);
24            return;
25        }
26        /** @var helper_plugin_approve $helper */
27        $helper = plugin_load('helper', 'approve');
28
29        if (!$helper->use_approve_here($sqlite, $INFO['id'])) return;
30
31        $res = $sqlite->query('SELECT rev, approved, ready_for_approval
32                                FROM revision
33                                WHERE page=?', $INFO['id']);
34        $approve_revisions = $sqlite->res2arr($res);
35        $approve_revisions = array_combine(array_column($approve_revisions, 'rev'), $approve_revisions);
36
37		$parent_div_position = -1;
38		for ($i = 0; $i < $event->data->elementCount(); $i++) {
39            $element = $event->data->getElementAt($i);
40            if ($element instanceof TagOpenElement && $element->val() == 'div'
41                && $element->attr('class') == 'li') {
42                $parent_div_position = $i;
43            } elseif ($parent_div_position > 0 && $element instanceof CheckableElement &&
44                $element->attr('name') == 'rev2[]') {
45                $revision = $element->attr('value');
46                if ($revision == 'current') {
47                    $revision = $INFO['meta']['date']['modified'];
48                }
49                if (!isset($approve_revisions[$revision])) {
50                    $class =  'plugin__approve_red';
51                } elseif ($approve_revisions[$revision]['approved']) {
52                    $class =  'plugin__approve_green';
53                } elseif ($this->getConf('ready_for_approval') && $approve_revisions[$revision]['ready_for_approval']) {
54                    $class =  'plugin__approve_ready';
55                } else {
56                    $class =  'plugin__approve_red';
57                }
58
59                $parent_div = $event->data->getElementAt($parent_div_position);
60                $parent_div->addClass($class);
61                $parent_div_position = -1;
62            }
63		}
64	}
65
66}
67