5 * Copyright 2010 (c) FusionForge Team
6 * Copyright 2010 (c) Franck Villaume - Capgemini
7 * Copyright 2012, Franck Villaume - TrivialDev
8 * http://fusionforge.org
10 * This file is part of FusionForge. FusionForge is free software;
11 * you can redistribute it and/or modify it under the terms of the
12 * GNU General Public License as published by the Free Software
13 * Foundation; either version 2 of the Licence, or (at your option)
16 * FusionForge is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License along
22 * with FusionForge; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
33 // Create an extra field
35 if (getStringFromRequest('add_extrafield')) {
36 $name = getStringFromRequest('name');
37 $field_type = getStringFromRequest('field_type');
38 $attribute1 = getStringFromRequest('attribute1');
39 $attribute2 = getStringFromRequest('attribute2');
40 $is_required = getStringFromRequest('is_required');
41 $alias = getStringFromRequest('alias');
43 $ab = new ArtifactExtraField($ath);
45 if (!$ab || !is_object($ab)) {
46 $error_msg .= _('Unable to create ArtifactExtraField Object');
47 // } elseif ($ab->isError())
48 // $error_msg .= $ab->getErrorMessage();
50 if (!$ab->create($name,$field_type,$attribute1,$attribute2,$is_required,$alias)) {
51 $error_msg .= _('Error inserting a custom field')._(': ').$ab->getErrorMessage();
54 $feedback .= _('Extra field inserted');
58 // Delete an extra field and its contents
60 } elseif (getStringFromRequest('deleteextrafield')) {
61 $id = getStringFromRequest('id');
62 $ab = new ArtifactExtraField($ath,$id);
64 if (!$ab || !is_object($ab)) {
65 $error_msg .= _('Unable to create ArtifactExtraField Object');
66 } elseif ($ab->isError()) {
67 $error_msg .= $ab->getErrorMessage();
69 $sure = getStringFromRequest('sure');
70 $really_sure = getStringFromRequest('really_sure');
71 if (!$ab->delete($sure,$really_sure)) {
72 $error_msg .= $ab->getErrorMessage();
74 $browse_list = $ath->getBrowseList();
75 $arr = explode(',', $browse_list);
76 $idx = array_search($id, $arr);
78 array_splice($arr, $idx, 1);
80 $ath->setBrowseList(join(',', $arr));
81 $feedback .= _('Custom Field Deleted');
82 $deleteextrafield=false;
83 session_redirect('/tracker/admin/?group_id='.$group_id.'&atid='.$atid.'&add_extrafield=1&feedback='.urlencode($feedback));
88 // Add an element to an extra field
90 } elseif (getStringFromRequest('add_opt')) {
91 $boxid = getStringFromRequest('boxid');
92 $ab = new ArtifactExtraField($ath,$boxid);
93 if (!$ab || !is_object($ab)) {
94 $error_msg .= _('Unable to create ArtifactExtraField Object');
95 } elseif ($ab->isError()) {
96 $error_msg .= $ab->getErrorMessage();
98 $ao = new ArtifactExtraFieldElement($ab);
99 if (!$ao || !is_object($ao)) {
100 $error_msg .= 'Unable to create ArtifactExtraFieldElement Object';
101 // } elseif ($ao->isError())
102 // $error_msg .= $ao->getErrorMessage();
104 $name = getStringFromRequest('name');
105 $status_id = getIntFromRequest('status_id');
106 if (!$ao->create($name,$status_id)) {
107 $error_msg .= _('Insert Error')._(': ').$ao->getErrorMessage();
110 $feedback .= _('Element inserted');
116 // Add a canned response
118 } elseif (getStringFromRequest('add_canned')) {
119 $title = getStringFromRequest('title');
120 $body = getStringFromRequest('body');
122 $acr = new ArtifactCanned($ath);
123 if (!$acr || !is_object($acr)) {
124 $error_msg .= _('Unable to create ArtifactCanned Object');
125 // } elseif ($acr->isError()) {
126 // $error_msg .= $acr->getErrorMessage();
128 if (!$acr->create($title,$body)) {
129 $error_msg .= _('Insert Error')._(': ').$acr->getErrorMessage();
132 $feedback .= _('Canned Response Inserted');
137 // Update a canned response
139 } elseif (getStringFromRequest('update_canned')) {
140 $id = getStringFromRequest('id');
141 $title = getStringFromRequest('title');
142 $body = getStringFromRequest('body');
144 $acr = new ArtifactCanned($ath,$id);
145 if (!$acr || !is_object($acr)) {
146 $error_msg .= _('Unable to create ArtifactCanned Object');
147 } elseif ($acr->isError()) {
148 $error_msg .= $acr->getErrorMessage();
150 if (!$acr->update($title,$body)) {
151 $error_msg .= _('Update failed')._(': ').$acr->getErrorMessage();
154 $feedback .= _('Canned Response Updated');
155 $next = 'add_canned';
162 } elseif (getStringFromRequest('copy_opt')) {
163 $copyid = getStringFromRequest('copyid');
164 $selectid = getStringFromRequest('selectid');
166 $copy_rows=count($copyid);
167 if ($copy_rows > 0) {
169 // create an object for each selected type
171 $result = db_query_params ('SELECT * FROM artifact_extra_field_list
172 WHERE extra_field_id=$1',
174 $typeid = db_result($result,0,'group_artifact_id');
175 $dest_tracker =& artifactType_get_object($typeid);
176 if (!$dest_tracker || !is_object($dest_tracker)) {
177 exit_error(_('ArtifactType could not be created'),'tracker');
178 } elseif ($dest_tracker->isError()) {
179 exit_error($dest_tracker->getErrorMessage(),'tracker');
182 // Copy elements into a field (box) for each tracker selected
184 $feedback .= _('Copy into Tracker: ');
185 $feedback .= $dest_tracker->getName();
186 $aef =new ArtifactExtraField($dest_tracker,$selectid);
187 if (!$aef || !is_object($aef)) {
188 $error_msg .= _('Unable to create ArtifactExtraField Object');
189 } elseif ($aef->isError()) {
190 $error_msg .= $aef->getErrorMessage();
192 $feedback .= ', Box: ';
193 $feedback .= $aef->getName();
194 $feedback .= '<br />';
196 for ($k=0; $k < $copy_rows; $k++) {
197 $aefe = new ArtifactExtraFieldElement($aef);
198 if (!$aefe || !is_object($aefe)) {
199 $error_msg .= 'Unable to create ArtifactExtraFieldElement Object';
200 } elseif ($aefe->isError()) {
201 $error_msg .= $aefe->getErrorMessage();
203 $name=$ath->getElementName($copyid[$k]);
204 $status=$ath->getElementStatusID($copyid[$k]);
205 if (!$aefe->create($name,$status)) {
206 $error_msg .= _('Insert Error')._(': ').$aefe->getErrorMessage();
209 $feedback .= '- Copied choice:'. $name;
215 $feedback .= '<br />';
218 // Update an extra field
220 } elseif (getStringFromRequest('update_box')) {
221 $id = getStringFromRequest('id');
222 $name = getStringFromRequest('name');
223 $attribute1 = getStringFromRequest('attribute1');
224 $attribute2 = getStringFromRequest('attribute2');
225 $is_required = getStringFromRequest('is_required');
226 $alias = getStringFromRequest('alias');
228 $ac = new ArtifactExtraField($ath,$id);
229 if (!$ac || !is_object($ac)) {
230 $error_msg .= _('Unable to create ArtifactExtraField Object');
231 } elseif ($ac->isError()) {
232 $error_msg .= $ac->getErrorMessage();
234 if (!$ac->update($name,$attribute1,$attribute2,$is_required,$alias)) {
235 $error_msg .= _('Update failed')._(': ').$ac->getErrorMessage();
238 $feedback .= _('Custom Field updated');
239 $next = 'add_extrafield';
246 } elseif (getStringFromRequest('update_opt')) {
247 $id = getStringFromRequest('id');
248 $name = getStringFromRequest('name');
249 $boxid = getStringFromRequest('boxid');
251 $ac = new ArtifactExtraField($ath,$boxid);
252 if (!$ac || !is_object($ac)) {
253 $error_msg .= _('Unable to create ArtifactExtraField Object');
254 } elseif ($ac->isError()) {
255 $error_msg .= $ac->getErrorMessage();
257 $ao = new ArtifactExtraFieldElement($ac,$id);
258 if (!$ao || !is_object($ao)) {
259 $error_msg .= _('Unable to create ArtifactExtraFieldElement Object');
260 } elseif ($ao->isError()) {
261 $error_msg .= $ao->getErrorMessage();
263 $name = getStringFromRequest('name');
264 $status_id = getIntFromRequest('status_id');
265 if (!$ao->update($name,$status_id)) {
266 $error_msg .= _('Update failed')._(': ').$ao->getErrorMessage();
269 $feedback .= _('Element updated');
270 $next = 'add_extrafield';
276 // Clone a tracker's elements to this tracker
278 } elseif (getStringFromRequest('clone_tracker')) {
279 $clone_id = getIntFromRequest('clone_id');
282 exit_missing_param('',array(_('Clone ID')),'tracker');
284 if (!$ath->cloneFieldsFrom($clone_id)) {
285 exit_error(_('Error cloning fields: ').$ath->getErrorMessage(),'tracker');
287 $feedback .= _('Successfully Cloned Tracker Fields ');
294 } elseif (getStringFromRequest('update_type')) {
295 $name = getStringFromRequest('name');
296 $description = getStringFromRequest('description');
297 $email_all = getStringFromRequest('email_all');
298 $email_address = getStringFromRequest('email_address');
299 $due_period = getStringFromRequest('due_period');
300 $status_timeout = getStringFromRequest('status_timeout');
301 $use_resolution = getStringFromRequest('use_resolution');
302 $submit_instructions = getStringFromRequest('submit_instructions');
303 $browse_instructions = getStringFromRequest('browse_instructions');
305 if (!$ath->update($name,$description,$email_all,$email_address,
306 $due_period,$status_timeout,$use_resolution,$submit_instructions,$browse_instructions)) {
307 $error_msg .= _('Update failed')._(': ').$ath->getErrorMessage();
310 $feedback .= _('Tracker Updated');
314 // Update the browse list of a tracker
316 } elseif (getStringFromRequest('customize_list')) {
317 if (getStringFromRequest('add_field')) {
318 $field_to_add = getStringFromRequest('field_to_add');
320 $browse_fields = $ath->getBrowseList();
321 $result = $ath->setBrowseList(($browse_fields ? $browse_fields.',' : '').$field_to_add);
327 elseif (getStringFromRequest('updownorder_field')) {
328 $id = getStringFromRequest('id');
329 $new_pos = getIntFromRequest('new_pos');
331 $browse_fields = explode(',',$ath->getBrowseList());
332 $pos_of_id = array_search($id, $browse_fields);
333 $val_at_new_pos = $browse_fields[$new_pos - 1];
334 $browse_fields[$new_pos - 1] = $id;
335 $browse_fields[$pos_of_id] = $val_at_new_pos;
336 $result = $ath->setBrowseList(implode(',', $browse_fields));
342 elseif (getStringFromRequest('field_changes_order')) {
343 $order = getArrayFromRequest('order');
345 // Fields with not modified positions
346 $not_changed = array_keys($order, '');
349 $list_size = count(explode(',',$ath->getBrowseList()));
350 $not_changed = array();
352 $out_before = array();
353 $out_after = array();
354 foreach ($order as $field => $new_pos) {
355 if (! $new_pos || ! is_numeric($new_pos)) {
356 $not_changed[] = $field;
359 $new_pos = intval($new_pos);
361 if (! isset($out_before[$new_pos]))
362 $out_before[$new_pos] = array();
363 $out_before[$new_pos][] = $field;
365 elseif ($new_pos > $list_size) {
366 if (! isset($out_after[$new_pos]))
367 $out_after[$new_pos] = array();
368 $out_after[$new_pos][] = $field;
371 if (! isset($changed[$new_pos - 1]))
372 $changed[$new_pos - 1] = array();
373 $changed[$new_pos - 1][] = $field;
376 ksort($changed, SORT_NUMERIC);
378 // Start of the browse list
379 $start_browse_fields = array();
381 if (! empty($out_before)) {
382 ksort($out_before, SORT_NUMERIC);
383 foreach (array_values($out_before) as $list) {
384 foreach ($list as $field) {
385 $start_browse_fields[] = $field;
391 // Middle of the browse list
392 $index = $index_start;
393 foreach ($changed as $pos => $list) {
394 for (; $index < $pos; $index++) {
395 $start_browse_fields[] = array_shift($not_changed);
397 foreach ($list as $field) {
398 $start_browse_fields[] = $field;
403 // End of the browse list
404 $end_browse_fields = array();
405 if (! empty($out_after)) {
406 ksort($out_after, SORT_NUMERIC);
407 foreach (array_values($out_after) as $list) {
408 foreach ($list as $field) {
409 $end_browse_fields[] = $field;
414 // And we complete the browse list
415 $new_browse_fields = array_merge($start_browse_fields, $not_changed, $end_browse_fields);
417 $result = $ath->setBrowseList(implode(',', $new_browse_fields));
419 elseif (getStringFromRequest('delete_field')) {
420 $id = getStringFromRequest('id');
421 $browse_fields = explode(',',$ath->getBrowseList());
422 $pos = array_search($id, $browse_fields);
423 if ($pos !== false) {
424 array_splice($browse_fields, $pos, 1);
425 $result = $ath->setBrowseList(implode(',', $browse_fields));
431 if ($result !== false) {
432 $feedback .= _('Tracker Updated');
435 $error_msg .= _('Update failed')._(': ').$ath->getErrorMessage();
442 } elseif (getStringFromRequest('delete')) {
443 $sure = getStringFromRequest('sure');
444 $really_sure = getStringFromRequest('really_sure');
446 if (!$ath->delete($sure,$really_sure)) {
447 $error_msg .= _('Update failed')._(': ').$ath->getErrorMessage();
449 session_redirect('/tracker/admin/?group_id='.$group_id.'&tracker_deleted=1');
455 } elseif (getStringFromRequest('update_template')) {
457 $body = getStringFromRequest('body');
458 $body = preg_replace('/^\s*<table>(.*)<\/table>\s*$/s', '\\1', $body);
460 db_query_params('UPDATE artifact_group_list SET custom_renderer=$1 WHERE group_artifact_id=$2',
461 array($body, $ath->getID()));
462 $feedback .= _('Renderer Updated');
465 // Up or down elements
467 } elseif (getStringFromRequest('updownorder_opt')) {
468 $boxid = getStringFromRequest('boxid');
469 $id = getIntFromRequest('id');
470 $new_pos = getStringFromRequest('new_pos');
471 $ac = new ArtifactExtraField($ath,$boxid);
472 if (!$ac || !is_object($ac)) {
473 $error_msg .= _('Unable to create ArtifactExtraField Object');
474 } elseif ($ac->isError()) {
475 $error_msg .= $ac->getErrorMessage();
477 if (!$ac->reorderValues($id, $new_pos)) {
478 $error_msg .= _('Update failed')._(': ').$ac->getErrorMessage();
481 $feedback .= _('Tracker Updated');
486 // Change order of elements
488 } elseif (getStringFromRequest('post_changes_order')) {
489 $boxid = getStringFromRequest('boxid');
490 $order = getArrayFromRequest('order');
491 $ac = new ArtifactExtraField($ath,$boxid);
492 if (!$ac || !is_object($ac)) {
493 $error_msg .= _('Unable to create ArtifactExtraField Object');
494 } elseif ($ac->isError()) {
495 $error_msg .= $ac->getErrorMessage();
498 foreach ($order as $id => $new_pos) {
499 if ($new_pos == '') continue;
500 if (!$ac->reorderValues($id, $new_pos)) {
501 $error_msg .= _('Update failed')._(': ').$ac->getErrorMessage();
510 $feedback .= _('Tracker Updated');
513 } elseif (getStringFromRequest('post_changes_alphaorder')) {
514 $boxid = getStringFromRequest('boxid');
515 $ac = new ArtifactExtraField($ath,$boxid);
516 if (!$ac || !is_object($ac)) {
517 $error_msg .= _('Unable to create ArtifactExtraField Object');
518 } elseif ($ac->isError()) {
519 $error_msg .= $ac->getErrorMessage();
521 if (!$ac->alphaorderValues()) {
522 $error_msg .= _('Update failed')._(': ').$ac->getErrorMessage();
525 $feedback .= _('Tracker Updated');
530 // Configure workflow
532 } elseif (getStringFromRequest('workflow')) {
533 require_once $gfcommon.'tracker/ArtifactWorkflow.class.php';
534 $field_id = getIntFromRequest('field_id');
535 $wk = getArrayFromRequest('wk');
536 $atw = new ArtifactWorkflow($ath, $field_id);
538 if (!isset($wk[100])) {
539 $error_msg .= _('Error: Initial values not saved, no initial state given.').'<br />';
541 // Save values for the submit form (from=100).
542 $atw->saveNextNodes('100', array_keys($wk[100]));
543 $feedback .= _('Initial values saved.').'<br />';
546 $elearray = $ath->getExtraFieldElements($field_id);
547 foreach ($elearray as $e) {
548 $from = $e['element_id'];
549 $next = isset($wk[$from]) ? array_keys($wk[$from]) : array();
550 $atw->saveNextNodes($from, $next);
552 $feedback .= _('Workflow saved');
554 } elseif (getStringFromRequest('workflow_roles')) {
555 require_once $gfcommon.'tracker/ArtifactWorkflow.class.php';
556 $field_id = getIntFromRequest('field_id');
557 $from = getIntFromRequest('from');
558 $next = getIntFromRequest('next');
559 $role = array_keys(getArrayFromRequest('role'));
560 $atw = new ArtifactWorkflow($ath, $field_id);
561 $atw->saveAllowedRoles($from, $next, $role);
562 $feedback .= _('Workflow saved');
564 } elseif (getStringFromRequest('delete_opt')) {
565 $sure = getStringFromRequest('sure');
566 $really_sure = getStringFromRequest('really_sure');
568 $id = getStringFromRequest('id');
569 $boxid = getStringFromRequest('boxid');
570 $ab = new ArtifactExtraField($ath,$boxid);
571 if (!$ab || !is_object($ab)) {
572 $error_msg .= _('Unable to create ArtifactExtraField Object');
573 } elseif ($ab->isError()) {
574 $error_msg .= $ab->getErrorMessage();
576 $ao = new ArtifactExtraFieldElement($ab,$id);
577 if (!$ao || !is_object($ao)) {
578 $error_msg .= _('Unable to create ArtifactExtraFieldElement Object');
580 if (!$sure || !$really_sure || !$ao->delete()) {
581 $error_msg .= _('Error deleting an element')._(': ').$ao->getErrorMessage();
584 $feedback .= _('Element deleted');
585 $next = 'add_extrafield';