1<?php 2/** 3 * @package tikiwiki 4 */ 5// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project 6// 7// All Rights Reserved. See copyright.txt for details and a complete list of authors. 8// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details. 9// $Id$ 10 11require_once 'tiki-setup.php'; 12$categlib = TikiLib::lib('categ'); 13require_once 'lib/transitionlib.php'; 14 15$auto_query_args = []; 16 17$access->check_permission('tiki_p_admin'); 18 19// Init 20if (isset($_SESSION['transition'])) { 21 $transition_mode = $_SESSION['transition']['mode']; 22 $available_states = $_SESSION['transition']['states']; 23} else { 24 $transition_mode = 'category'; 25 $available_states = []; 26} 27 28$selected_transition = null; 29$to_add = []; 30 31// Action handling 32 33switch ($jitRequest->action->alpha()) { 34 case 'subset': 35 $transition_mode = $_REQUEST['transition_mode']; 36 37 if ($transition_mode == 'category') { 38 $jitPost->replaceFilter('cat_categories', 'int'); 39 if ($selection = $jitPost->asArray('cat_categories')) { 40 $available_states = array_combine( 41 $selection, 42 array_map([ $categlib, 'get_category_name' ], $selection) 43 ); 44 } else { 45 $available_states = []; 46 } 47 } else { 48 $jitPost->replaceFilter('groups', 'groupname'); 49 if ($selection = $jitPost->asArray('groups')) { 50 $available_states = array_combine($selection, $selection); 51 } else { 52 $available_states = []; 53 } 54 } 55 break; 56 case 'new': 57 $transitionlib = new TransitionLib($transition_mode); 58 $transitionlib->addTransition( 59 $_REQUEST['from'], 60 $_REQUEST['to'], 61 $_REQUEST['label'], 62 isset($_REQUEST['preserve']) 63 ); 64 break; 65 case 'edit': 66 $transitionlib = new TransitionLib($transition_mode); 67 68 if ($_SERVER['REQUEST_METHOD'] == 'POST') { 69 $transitionlib->updateTransition( 70 $_REQUEST['transitionId'], 71 $_REQUEST['from'], 72 $_REQUEST['to'], 73 $_REQUEST['label'], 74 isset($_REQUEST['preserve']) 75 ); 76 } else { 77 $selected_transition = $transitionlib->getTransition((int) $_REQUEST['transitionId']); 78 } 79 break; 80 case 'addguard': 81 $transitionlib = new TransitionLib($transition_mode); 82 $selected_transition = $transitionlib->getTransition((int) $_REQUEST['transitionId']); 83 84 if ($selection = $jitPost->asArray('states')) { 85 $selected_transition['guards'][] = [ 86 $_REQUEST['type'], 87 (int) $_REQUEST['count'], 88 $selection, 89 ]; 90 $transitionlib->updateGuards((int) $selected_transition['transitionId'], $selected_transition['guards']); 91 } 92 break; 93 case 'removeguard': 94 $transitionlib = new TransitionLib($transition_mode); 95 $selected_transition = $transitionlib->getTransition((int) $_REQUEST['transitionId']); 96 97 unset($selected_transition['guards'][ (int) $_REQUEST['guard'] ]); 98 $selected_transition['guards'] = array_values($selected_transition['guards']); 99 $transitionlib->updateGuards((int) $selected_transition['transitionId'], $selected_transition['guards']); 100 break; 101 case 'remove': 102 $transitionlib = new TransitionLib($transition_mode); 103 check_ticket('remove_transition'); 104 105 $transitionlib->removeTransition($_REQUEST['transitionId']); 106 break; 107} 108 109// Obtain data 110$categories = $categlib->getCategories(); 111$cat_tree = $categlib->generate_cat_tree($categories, true, array_keys($available_states)); 112 113$transitionlib = new TransitionLib($transition_mode); 114$transitions = $transitionlib->listTransitions(array_keys($available_states)); 115 116if ($selected_transition) { 117 // When a transition is selected, make sure all of its endpoints are listed in the edit panel 118 $to_add = [ $selected_transition['from'], $selected_transition['to'] ]; 119 120 foreach ($selected_transition['guards'] as $guard) { 121 $to_add = array_merge($to_add, $guard[2]); 122 } 123} 124 125foreach ($transitions as & $trans) { 126 $trans['from_label'] = transition_label_finder($trans['from']); 127 $trans['to_label'] = transition_label_finder($trans['to']); 128} 129 130// Setup Smarty & Session 131$_SESSION['transition'] = [ 132 'mode' => $transition_mode, 133 'states' => $available_states, 134]; 135 136foreach ($to_add as $v) { 137 $available_states[ $v ] = transition_label_finder($v); 138} 139 140$guards = []; 141if ($selected_transition) { 142 foreach ($selected_transition['guards'] as $guard) { 143 $guards[] = [ 144 'type' => $guard[0], 145 'count' => $guard[1], 146 'members' => array_map('transition_label_finder', $guard[2]), 147 ]; 148 } 149} 150 151$smarty->assign('transition_mode', $transition_mode); 152$smarty->assign('available_states', $available_states); 153$smarty->assign('transitions', $transitions); 154$smarty->assign('guards', $guards); 155$smarty->assign('selected_transition', $selected_transition); 156 157$smarty->assign('cat_tree', $cat_tree); 158 159// Graph setup 160if (count($available_states) > 0) { 161 $edges = []; 162 foreach ($transitions as $tr) { 163 $edges[] = [ 164 'from' => $tr['from_label'], 165 'to' => $tr['to_label'], 166 'label' => $tr['name'], 167 'preserve' => (bool) $tr['preserve'] 168 ]; 169 } 170 171 $smarty->assign('graph_nodes', json_encode(array_values($available_states))); 172 $smarty->assign('graph_edges', json_encode($edges)); 173} 174 175$smarty->assign('mid', 'tiki-admin_transitions.tpl'); 176$smarty->display('tiki.tpl'); 177 178/** 179 * @param $state 180 * @return mixed|string 181 */ 182function transition_label_finder($state) 183{ 184 global $available_states, $transition_mode; 185 $categlib = TikiLib::lib('categ'); 186 187 if (isset($available_states[$state])) { 188 return $available_states[$state]; 189 } elseif ($transition_mode == 'category') { 190 return $categlib->get_category_name($state); 191 } else { 192 return $state; 193 } 194} 195