xref: /plugin/approve/action/revisions.php (revision 1989ee26e4c10d9fe322c2a0aa4ae990f031b47b)
1<?php
2
3use dokuwiki\Extension\ActionPlugin;
4use dokuwiki\Extension\EventHandler;
5use dokuwiki\Extension\Event;
6use dokuwiki\Form\TagOpenElement;
7use dokuwiki\Form\CheckableElement;
8
9class action_plugin_approve_revisions extends ActionPlugin {
10
11    function register(EventHandler $controller) {
12		$controller->register_hook('FORM_REVISIONS_OUTPUT', 'BEFORE', $this, 'handle_revisions', array());
13	}
14
15	function handle_revisions(Event $event, $param) {
16		global $INFO;
17
18        /** @var helper_plugin_approve_data $db */
19        $db = $this->loadHelper('approve_data');
20        /** @var helper_plugin_approve_acl $acl */
21        $acl = $this->loadHelper('approve_acl');
22
23        if (!$acl->useApproveHere($INFO['id'])) return;
24
25        $approve_revisions = $db->getPageRevisions($INFO['id']);
26
27        $last_approved_rev = null;
28        if (count($approve_revisions) > 1) {
29            $last_approved_rev = max(array_column(array_filter($approve_revisions, function ($v) {
30                return $v['approved'] != null;
31            }), 'rev'));
32        }
33
34        $approve_revisions = array_combine(array_column($approve_revisions, 'rev'), $approve_revisions);
35
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_draft';
51                } elseif ($approve_revisions[$revision]['approved'] && $revision == $last_approved_rev) {
52                    $class =  'plugin__approve_approved';
53                } elseif ($approve_revisions[$revision]['approved']) {
54                    $class =  'plugin__approve_old_approved';
55                } elseif ($this->getConf('ready_for_approval') && $approve_revisions[$revision]['ready_for_approval']) {
56                    $class =  'plugin__approve_ready';
57                } else {
58                    $class =  'plugin__approve_draft';
59                }
60
61                $parent_div = $event->data->getElementAt($parent_div_position);
62                $parent_div->addClass($class);
63                $parent_div_position = -1;
64            }
65		}
66	}
67
68}
69