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