5 * Copyright 2011, Alcatel-Lucent
6 * Copyright (C) 2012 Alain Peyrat - Alcatel-Lucent
8 * This file is part of FusionForge. FusionForge is free software;
9 * you can redistribute it and/or modify it under the terms of the
10 * GNU General Public License as published by the Free Software
11 * Foundation; either version 2 of the Licence, or (at your option)
14 * FusionForge is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License along
20 * with FusionForge; if not, write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
25 * Standard Alcatel-Lucent disclaimer for contributing to open source
27 * "The Roadmap ("Contribution") has not been tested and/or
28 * validated for release as or in products, combinations with products or
29 * other commercial use. Any use of the Contribution is entirely made at
30 * the user's own responsibility and the user can not rely on any features,
31 * functionalities or performances Alcatel-Lucent has attributed to the
34 * THE CONTRIBUTION BY ALCATEL-LUCENT IS PROVIDED AS IS, WITHOUT WARRANTY
35 * OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
36 * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, COMPLIANCE,
37 * NON-INTERFERENCE AND/OR INTERWORKING WITH THE SOFTWARE TO WHICH THE
38 * CONTRIBUTION HAS BEEN MADE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL
39 * ALCATEL-LUCENT BE LIABLE FOR ANY DAMAGES OR OTHER LIABLITY, WHETHER IN
40 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
41 * CONTRIBUTION OR THE USE OR OTHER DEALINGS IN THE CONTRIBUTION, WHETHER
42 * TOGETHER WITH THE SOFTWARE TO WHICH THE CONTRIBUTION RELATES OR ON A STAND
46 require_once $gfcommon.'tracker/ArtifactFactory.class.php';
47 require_once $gfcommon.'tracker/Roadmap.class.php';
48 require_once $gfcommon.'tracker/RoadmapFactory.class.php';
50 $perm = $group->getPermission();
51 if (!$perm || !is_object($perm) || !$perm->isArtifactAdmin()) {
52 exit_permission_denied();
55 $atfh = new ArtifactTypeFactoryHtml($group);
56 if (!$atfh || !is_object($atfh) || $atfh->isError()) {
57 exit_error(_('Error'), _('Could Not Get ArtifactTypeFactoryHtml'));
60 $set_roadmap_failed = false;
62 if (getStringFromRequest('set_roadmap')) {
63 $set_roadmap_failed = false;
65 $roadmap_name = getStringFromRequest('roadmap_name');
66 $roadmap_id = getIntFromRequest('roadmap_id', 0);
67 $roadmap_list = getArrayFromRequest('roadmap_list');
69 if (! $roadmap_name) {
70 $error_msg .= _("Can't create or rename roadmap")._(': ')._('name is empty');
73 $roadmap = new Roadmap($group, $roadmap_id);
75 $result = $roadmap->create($roadmap_name);
77 $feedback .= sprintf(_('Roadmap %s created'), $roadmap_name);
80 $error_msg .= _("Can't create roadmap: ").$roadmap->getErrorMessage();
84 $old_roadmap_name = $roadmap->getName();
85 if ($roadmap_name != $old_roadmap_name) {
86 $result = $roadmap->rename($roadmap_name);
88 $feedback .= sprintf(_('Roadmap %s renamed to %s'), $old_roadmap_name, $roadmap_name);
91 $error_msg .= _("Can't rename roadmap: ").$roadmap->getErrorMessage();
95 if (! $error_msg && is_array($roadmap_list) && ! empty($roadmap_list)) {
96 $result = $roadmap->setList($roadmap_list);
98 $error_msg .= _("Can't set roadmap: ").$roadmap->getErrorMessage();
103 $set_roadmap_failed = true;
106 elseif (getStringFromRequest('set_roadmap_state')) {
107 $roadmap_states = getArrayFromRequest('roadmap_states');
108 $default_roadmap = getIntFromRequest('default_roadmap');
110 $roadmap_factory = new RoadmapFactory($group);
111 $roadmaps = $roadmap_factory->getRoadmaps();
114 foreach ($roadmaps as $roadmap) {
115 if (!is_object($roadmap)) {
117 } elseif ($roadmap->isError()) {
118 echo $roadmap->getErrorMessage();
120 $result = $roadmap->setState((array_key_exists($roadmap->getID(), $roadmap_states) ? 1 : 0));
122 $error_msg .= _("Can't set roadmap state: ").$roadmap->getErrorMessage();
124 $result = $roadmap->isDefault(($default_roadmap == $roadmap->getID() ? 1 : 0));
126 $error_msg .= _("Can't set default value: ").$roadmap->getErrorMessage();
128 if (! $error_msg && $updated === false) {
129 $feedback .= _('Roadmap configuration is updated');
135 elseif (getStringFromRequest('delete_roadmap_sure')) {
136 $roadmap_id = getIntFromRequest('roadmap_id', 0);
138 $roadmap = new Roadmap($group, $roadmap_id);
139 $result = $roadmap->delete();
141 $feedback .= sprintf(_('Roadmap %s is deleted'), $roadmap->getName());
144 $error_msg .= _("Can't delete roadmap: ").$roadmap->getErrorMessage();
149 if (getStringFromRequest('delete_roadmap')) {
151 $roadmap_id = getIntFromRequest('roadmap_id', 0);
153 $roadmap = new Roadmap($group, $roadmap_id);
154 $roadmap_name = $roadmap->getName();
156 $atfh->header(array('title' => _('Delete roadmap'), 'modal' => 1));
160 <strong><?php echo sprintf(_('Are you sure you want to delete the %s roadmap?'), $roadmap_name) ?></strong>
162 <form action="<?php echo getStringFromServer('PHP_SELF').'?group_id='.$group_id.'&admin_roadmap=1' ?>" method="post">
163 <input type="hidden" name="admin_roadmap" value="1" />
164 <input type="hidden" name="roadmap_id" value="<?php echo $roadmap_id ?>" />
166 <input type="submit" name="delete_roadmap_sure" value="<?php echo _('Yes') ?>" />
167 <input type="submit" name="cancel" value="<?php echo _('Cancel') ?>" />
174 if ($set_roadmap_failed ||
175 getStringFromRequest('new_roadmap') ||
176 getStringFromRequest('update_roadmap')) {
178 $roadmap_id = getIntFromRequest('roadmap_id', 0);
180 $roadmap = new Roadmap($group, $roadmap_id);
181 $roadmap_list = getArrayFromRequest('roadmap_list', $roadmap->getList());
183 if (getStringFromRequest('new_roadmap')) {
184 $atfh->header(array('title' => _('Create a new roadmap'), 'modal' => 1));
187 $atfh->header(array('title' => _('Update roadmap'), 'modal' => 1));
191 <form action="<?php echo getStringFromServer('PHP_SELF').'?group_id='.$group_id.'&admin_roadmap=1' ?>" method="post">
193 echo '<p>'._('Name'). _(': ') . '<input type="text" name="roadmap_name" value="'.$roadmap->getName().'" size="40" /></p>';
196 echo '<input type="hidden" name="roadmap_id" value="'.$roadmap_id.'" />';
199 $at_arr = $atfh->getArtifactTypes();
201 if (!$at_arr || count($at_arr) < 1) {
202 echo '<p class="information">'._('No trackers have been set up.').'</p>'."\n";
205 foreach ($at_arr as $artifact_type) {
206 if (!is_object($artifact_type)) {
208 } elseif ($artifact_type->isError()) {
209 echo $artifact_type->getErrorMessage();
211 $ath = new ArtifactTypeHtml($group, $artifact_type->getID());
214 if (array_key_exists($artifact_type->getID(), $roadmap_list)) {
215 $field_id = $roadmap_list[$artifact_type->getID()];
219 echo '<td>' . $artifact_type->getName() . '</td>'."\n";
220 echo '<td><select name="roadmap_list['.$artifact_type->getID().']">'."\n";
221 echo '<option value="0"'.(! $field_id ? ' selected="selected"' : '').' >'._('Not used').'</option>'."\n";
222 $extra_fields = $ath->getExtraFields( array(ARTIFACT_EXTRAFIELD_FILTER_INT));
223 foreach ($extra_fields as $extra_field) {
224 if ($extra_field['field_type'] != ARTIFACT_EXTRAFIELDTYPE_CHECKBOX && $extra_field['field_type'] != ARTIFACT_EXTRAFIELDTYPE_MULTISELECT) {
225 echo '<option value="'.$extra_field['extra_field_id'].'"'.($extra_field['extra_field_id'] == $field_id ? ' selected="selected"' : '').' >'.$extra_field['field_name'].'</option>'."\n";
228 echo '</select></td>'."\n";
232 echo '</table>'."\n";
234 <input type="submit" name="set_roadmap" value="'._('Submit').'" />
235 <input type="submit" name="cancel" value="'._('Cancel').'" />
242 if (getIntFromRequest('manage_release') ||
243 getIntFromRequest('updownorder_release') ||
244 getStringFromRequest('release_auto_order') ||
245 getStringFromRequest('release_changes_order')) {
247 $roadmap_id = getIntFromRequest('roadmap_id', 0);
249 $roadmap_factory = new RoadmapFactory($group);
250 $selected_roadmap = $roadmap_factory->getRoadmapByID($roadmap_id);
251 if (! is_object($selected_roadmap)) {
252 $error_msg .= sprintf(_('roadmap %s is not available'), 'ID='.$roadmap_id);
255 $artifact_type_list = $selected_roadmap->getList();
258 if (getIntFromRequest('updownorder_release') ||
259 getStringFromRequest('release_auto_order') ||
260 getStringFromRequest('release_changes_order')) {
264 $release_order = $selected_roadmap->getReleases();
265 if (! is_array($release_order)) {
266 $release_order = array();
270 if (getIntFromRequest('updownorder_release')) {
271 $old_pos = getIntFromRequest('old_pos');
272 $new_pos = getIntFromRequest('new_pos');
274 $tmp = $release_order[$new_pos];
275 $release_order[$new_pos] = $release_order[$old_pos];
276 $release_order[$old_pos] = $tmp;
278 $result = $selected_roadmap->setReleaseOrder($release_order);
280 $feedback .= _('Release(s) order updated');
283 $error_msg .= _("Can't modify release order: ").$selected_roadmap->getErrorMessage();
286 elseif (getStringFromRequest('release_auto_order')) {
287 usort($release_order, 'version_compare');
289 elseif (getStringFromRequest('release_changes_order')) {
290 $order = array_reverse(getArrayFromRequest('order'));
292 // Items with not modified positions
293 $not_changed = array_keys($order, '');
296 $list_size = count($order);
297 $not_changed = array();
299 $out_before = array();
300 $out_after = array();
301 foreach ($order as $field => $new_pos) {
302 if (!is_numeric($new_pos)) {
303 $not_changed[] = $field;
306 $new_pos = intval($new_pos);
308 if (!isset($out_before[$new_pos]))
309 $out_before[$new_pos] = array();
310 $out_before[$new_pos][] = $field;
312 elseif ($new_pos > $list_size) {
313 if (!isset($out_after[$new_pos]))
314 $out_after[$new_pos] = array();
315 $out_after[$new_pos][] = $field;
318 if (!isset($changed[$new_pos - 1]))
319 $changed[$new_pos - 1] = array();
320 $changed[$new_pos - 1][] = $field;
323 ksort($changed, SORT_NUMERIC);
326 $start_list = array();
328 if (!empty($out_before)) {
329 ksort($out_before, SORT_NUMERIC);
330 foreach (array_values($out_before) as $list) {
331 foreach ($list as $field) {
332 $start_list[] = $field;
338 // Middle of the list
339 $index = $index_start;
340 foreach ($changed as $pos => $list) {
341 for (; $index < $pos; $index++) {
342 $start_list[] = array_shift($not_changed);
344 foreach ($list as $field) {
345 $start_list[] = $field;
352 if (!empty($out_after)) {
353 ksort($out_after, SORT_NUMERIC);
354 foreach (array_values($out_after) as $list) {
355 foreach ($list as $field) {
356 $end_list[] = $field;
361 // And we complete the list
362 $release_order = array_merge($start_list, $not_changed, $end_list);
365 $result = $selected_roadmap->setReleaseOrder($release_order);
367 $feedback .= _('Release(s) order updated');
370 $error_msg .= _("Can't modify release order: ").$selected_roadmap->getErrorMessage();
375 for ($pos = count($release_order) - 1; $pos >= 0; $pos--) {
376 $rows[$pos] = '<tr '. $GLOBALS['HTML']->boxGetAltRowStyle($pos) .'>'.'<td>'.'   '.$release_order[$pos].'</td>'."\n".
377 '<td class="align-right">'.
378 ($pos + 1).' --> <input type="text" name="order['.$release_order[$pos].']" value="" size="3" maxlength="3" />'.
380 '<td class="align-center">'.'   '.
381 '<a href="index.php?group_id='.$group_id.'&roadmap_id='.$roadmap_id.
382 '&admin_roadmap=1&updownorder_release=1&old_pos='.$pos.'&new_pos='.(($pos == count($release_order) - 1) ? $pos : $pos + 1).'">'.html_image('ic/btn_up.png','19','18',array('alt'=>"Up")).'</a>'.
384 '<a href="index.php?group_id='.$group_id.'&roadmap_id='.$roadmap_id.
385 '&admin_roadmap=1&updownorder_release=1&old_pos='.$pos.'&new_pos='.(($pos == 0) ? $pos : $pos - 1).'">'.html_image('ic/btn_down.png','19','18',array('alt'=>"Down")).'</a>'.
390 $atfh->header(array('title' => _('Manage releases'), 'modal' => 1));
392 if (! empty($rows)) {
395 <strong><?php echo sprintf(_('Set order of releases for %s roadmap:'), $selected_roadmap->getName()) ?></strong>
397 <form action="<?php echo getStringFromServer('PHP_SELF').'?group_id='.$group_id.'&admin_roadmap=1' ?>" method="post">
398 <input type="hidden" name="roadmap_id" value="<?php echo $roadmap_id ?>" />
400 $title_arr = array();
401 $title_arr[] = _('Releases');
402 $title_arr[] = _('Current / New positions');
403 $title_arr[] = _('Up/Down positions');
405 echo $GLOBALS['HTML']->listTableTop($title_arr, false, ' ');
406 echo implode('', $rows);
407 echo '<tr class="noborder">
409 <input type="submit" name="release_auto_order" value="'._('Auto order').'" />
411 <td class="align-right">
412 <input type="submit" name="release_changes_order" value="'._('Reorder').'" />
417 echo $GLOBALS['HTML']->listTableBottom();
421 echo '<p>'._('No tracker is selected for this roadmap').'.</p>';
422 echo '<p>'.sprintf(_('You can <a href="%s">select tracker(s) for this roadmap</a>.'),
423 'index.php?group_id='.$group_id.'&roadmap_id='.$roadmap_id.
424 '&admin_roadmap=1&update_roadmap=1').'</p>';
427 <a href="'.getStringFromServer('PHP_SELF').'?group_id='.$group_id.'&admin_roadmap=1'.'">'.
428 _('Return to list of roadmaps').'</a>'.
435 if (! isset($ihm) || $ihm !== true) {
436 $atfh->header(array('title' => _('Manage roadmaps'), 'modal' => 1));
438 echo '<p><strong>'._('You can define a new roadmap or edit an existing one here.').'</strong></p>';
440 $roadmap_factory = new RoadmapFactory($group);
441 $roadmaps = $roadmap_factory->getRoadmaps();
443 <form action="<?php echo getStringFromServer('PHP_SELF').'?group_id='.$group_id; ?>" method="post">
444 <input type="hidden" name="admin_roadmap" value="1" />
447 foreach ($roadmaps as $roadmap) {
448 if (!is_object($roadmap)) {
450 } elseif ($roadmap->isError()) {
451 echo $roadmap->getErrorMessage();
453 $rows[$pos] = '<tr '. $GLOBALS['HTML']->boxGetAltRowStyle($pos) .'>'.
454 '<td><input type="checkbox" name="roadmap_states['.$roadmap->getID().']" value="1"'.($roadmap->getState() ? ' checked="checked"' : '').' /></td>'.
455 '<td>'.$roadmap->getName().'</td>'."\n".
456 '<td class="align-center"><input type="radio" name="default_roadmap" value="'.$roadmap->getID().'"'.($roadmap->isDefault() ? ' checked="checked"' : '').' /></td>'.
458 '<td class="align-right">'.
459 ($pos + 1).' --> <input type="text" name="order['.$roadmap->getID().']" value="" size="3" maxlength="3" />'.
461 '<td class="align-center">'.'   '.
462 '<a href="index.php?group_id='.$group_id.'&roadmap_id='.$roadmap->getID().
463 '&customize_list=1&post_changes=1&updownorder_release=1&new_pos='.(($pos == 0)? $pos + 1 : $pos).'">'.html_image('ic/btn_up.png','19','18',array('alt'=>"Up")).'</a>'.
465 '<a href="index.php?group_id='.$group_id.'&roadmap_id='.$roadmap->getID().
466 '&customize_list=1&post_changes=1&updownorder_release=1&new_pos='.(($pos == count($browse_fields) - 1)? $pos + 1 : $pos + 2).'">'.html_image('ic/btn_down.png','19','18',array('alt'=>"Down")).'</a>'.
469 '<td class="align-center">'.
470 '<a href="index.php?group_id='.$group_id.'&roadmap_id='.$roadmap->getID().
471 '&admin_roadmap=1&update_roadmap=1">'.
472 html_image('ic/forum_edit.gif','','',array('alt' => _('Modify roadmap'), 'title' => _('Modify roadmap'))).'</a>'."\n".
473 '<a href="index.php?group_id='.$group_id.'&roadmap_id='.$roadmap->getID().
474 '&admin_roadmap=1&manage_release=1">'.
475 html_image('ic/survey-question-add.png','','',array('alt' => _('Manage releases'), 'title' => _('Manage releases'))).'</a>'."\n".
476 '<a href="index.php?group_id='.$group_id.'&roadmap_id='.$roadmap->getID().
477 '&admin_roadmap=1&delete_roadmap=1">'.
478 html_image('ic/trash.png','','',array('alt' => _('Delete roadmap'), 'title' => _('Delete roadmap'))).'</a>'.
485 if (! empty($rows)) {
486 $title_arr = array();
487 $title_arr[] = _('Enable');
488 $title_arr[] = _('Roadmap name');
489 $title_arr[] = _('Default');
490 //$title_arr[] = _('Current / New positions');
491 //$title_arr[] = _('Up/Down positions');
492 $title_arr[] = _('Actions');
494 echo $GLOBALS['HTML']->listTableTop($title_arr, false, ' ');
495 echo implode('', $rows);
496 echo $GLOBALS['HTML']->listTableBottom();
500 if (! empty($rows)) {
501 echo '<input type="submit" name="set_roadmap_state" value="'._('Update').'" />'."\n";
503 echo '<input type="submit" name="new_roadmap" value="'._('New Roadmap').'" />'."\n";
504 echo '</p></form>'."\n";