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 $last_approved_rev = null; 36 if (count($approve_revisions) > 1) { 37 $last_approved_rev = max(array_column(array_filter($approve_revisions, function ($v) { 38 return $v['approved'] != null; 39 }), 'rev')); 40 } 41 42 $approve_revisions = array_combine(array_column($approve_revisions, 'rev'), $approve_revisions); 43 44 45 $parent_div_position = -1; 46 for ($i = 0; $i < $event->data->elementCount(); $i++) { 47 $element = $event->data->getElementAt($i); 48 if ($element instanceof TagOpenElement && $element->val() == 'div' 49 && $element->attr('class') == 'li') { 50 $parent_div_position = $i; 51 } elseif ($parent_div_position > 0 && $element instanceof CheckableElement && 52 $element->attr('name') == 'rev2[]') { 53 $revision = $element->attr('value'); 54 if ($revision == 'current') { 55 $revision = $INFO['meta']['date']['modified']; 56 } 57 if (!isset($approve_revisions[$revision])) { 58 $class = 'plugin__approve_draft'; 59 } elseif ($approve_revisions[$revision]['approved'] && $revision == $last_approved_rev) { 60 $class = 'plugin__approve_approved'; 61 } elseif ($approve_revisions[$revision]['approved']) { 62 $class = 'plugin__approve_old_approved'; 63 } elseif ($this->getConf('ready_for_approval') && $approve_revisions[$revision]['ready_for_approval']) { 64 $class = 'plugin__approve_ready'; 65 } else { 66 $class = 'plugin__approve_draft'; 67 } 68 69 $parent_div = $event->data->getElementAt($parent_div_position); 70 $parent_div->addClass($class); 71 $parent_div_position = -1; 72 } 73 } 74 } 75 76} 77