xref: /plugin/approve/action/revisions.php (revision ed32c61413d60bba87df4196fc358589d1cc3959)
11aeb2b4dSghi<?php
21aeb2b4dSghi
3234375e2SSzymon Olewniczakuse dokuwiki\Form\TagOpenElement;
4234375e2SSzymon Olewniczakuse dokuwiki\Form\CheckableElement;
5234375e2SSzymon Olewniczak
61aeb2b4dSghiif(!defined('DOKU_INC')) die();
71aeb2b4dSghi
8234375e2SSzymon Olewniczak
91aeb2b4dSghiclass action_plugin_approve_revisions extends DokuWiki_Action_Plugin {
101aeb2b4dSghi
1150481663SSzymon Olewniczak    function register(Doku_Event_Handler $controller) {
12234375e2SSzymon Olewniczak		$controller->register_hook('FORM_REVISIONS_OUTPUT', 'BEFORE', $this, 'handle_revisions', array());
131aeb2b4dSghi	}
141aeb2b4dSghi
15d0c5854eSSzymon Olewniczak	function handle_revisions(Doku_Event $event, $param) {
16d8ede060SSzymon Olewniczak		global $INFO;
171aeb2b4dSghi
180c60a293SSzymon Olewniczak        try {
190c60a293SSzymon Olewniczak            /** @var \helper_plugin_approve_db $db_helper */
200c60a293SSzymon Olewniczak            $db_helper = plugin_load('helper', 'approve_db');
210c60a293SSzymon Olewniczak            $sqlite = $db_helper->getDB();
220c60a293SSzymon Olewniczak        } catch (Exception $e) {
230c60a293SSzymon Olewniczak            msg($e->getMessage(), -1);
240c60a293SSzymon Olewniczak            return;
250c60a293SSzymon Olewniczak        }
260c60a293SSzymon Olewniczak        /** @var helper_plugin_approve $helper */
270c60a293SSzymon Olewniczak        $helper = plugin_load('helper', 'approve');
2850481663SSzymon Olewniczak
290c60a293SSzymon Olewniczak        if (!$helper->use_approve_here($sqlite, $INFO['id'])) return;
300c60a293SSzymon Olewniczak
310c60a293SSzymon Olewniczak        $res = $sqlite->query('SELECT rev, approved, ready_for_approval
32d8ede060SSzymon Olewniczak                                FROM revision
33d8ede060SSzymon Olewniczak                                WHERE page=?', $INFO['id']);
34234375e2SSzymon Olewniczak        $approve_revisions = $sqlite->res2arr($res);
35*ed32c614SSzymon Olewniczak        $last_approved_rev = null;
36*ed32c614SSzymon Olewniczak        if (count($approve_revisions) > 1) {
3715e5c2ddSSzymon Olewniczak            $last_approved_rev = max(array_column(array_filter($approve_revisions, function ($v) {
3815e5c2ddSSzymon Olewniczak                return $v['approved'] != null;
3915e5c2ddSSzymon Olewniczak            }), 'rev'));
40*ed32c614SSzymon Olewniczak        }
41*ed32c614SSzymon Olewniczak
42234375e2SSzymon Olewniczak        $approve_revisions = array_combine(array_column($approve_revisions, 'rev'), $approve_revisions);
43d8ede060SSzymon Olewniczak
4415e5c2ddSSzymon Olewniczak
45234375e2SSzymon Olewniczak		$parent_div_position = -1;
46234375e2SSzymon Olewniczak		for ($i = 0; $i < $event->data->elementCount(); $i++) {
47234375e2SSzymon Olewniczak            $element = $event->data->getElementAt($i);
48234375e2SSzymon Olewniczak            if ($element instanceof TagOpenElement && $element->val() == 'div'
49234375e2SSzymon Olewniczak                && $element->attr('class') == 'li') {
50234375e2SSzymon Olewniczak                $parent_div_position = $i;
51234375e2SSzymon Olewniczak            } elseif ($parent_div_position > 0 && $element instanceof CheckableElement &&
52234375e2SSzymon Olewniczak                $element->attr('name') == 'rev2[]') {
53234375e2SSzymon Olewniczak                $revision = $element->attr('value');
54d8ede060SSzymon Olewniczak                if ($revision == 'current') {
55d8ede060SSzymon Olewniczak                    $revision = $INFO['meta']['date']['modified'];
56d8ede060SSzymon Olewniczak                }
57234375e2SSzymon Olewniczak                if (!isset($approve_revisions[$revision])) {
5815e5c2ddSSzymon Olewniczak                    $class =  'plugin__approve_draft';
5915e5c2ddSSzymon Olewniczak                } elseif ($approve_revisions[$revision]['approved'] && $revision == $last_approved_rev) {
6015e5c2ddSSzymon Olewniczak                    $class =  'plugin__approve_approved';
61234375e2SSzymon Olewniczak                } elseif ($approve_revisions[$revision]['approved']) {
6215e5c2ddSSzymon Olewniczak                    $class =  'plugin__approve_old_approved';
63234375e2SSzymon Olewniczak                } elseif ($this->getConf('ready_for_approval') && $approve_revisions[$revision]['ready_for_approval']) {
64d8ede060SSzymon Olewniczak                    $class =  'plugin__approve_ready';
65d8ede060SSzymon Olewniczak                } else {
6615e5c2ddSSzymon Olewniczak                    $class =  'plugin__approve_draft';
67d8ede060SSzymon Olewniczak                }
68d8ede060SSzymon Olewniczak
69234375e2SSzymon Olewniczak                $parent_div = $event->data->getElementAt($parent_div_position);
70234375e2SSzymon Olewniczak                $parent_div->addClass($class);
71234375e2SSzymon Olewniczak                $parent_div_position = -1;
72d8ede060SSzymon Olewniczak            }
731aeb2b4dSghi		}
741aeb2b4dSghi	}
751aeb2b4dSghi
761aeb2b4dSghi}
77