5 * Copyright 2011, Alcatel-Lucent
7 * This file is part of FusionForge. FusionForge is free software;
8 * you can redistribute it and/or modify it under the terms of the
9 * GNU General Public License as published by the Free Software
10 * Foundation; either version 2 of the Licence, or (at your option)
13 * FusionForge is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License along
19 * with FusionForge; if not, write to the Free Software Foundation, Inc.,
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 * Standard Alcatel-Lucent disclaimer for contributing to open source
26 * "The Roadmap ("Contribution") has not been tested and/or
27 * validated for release as or in products, combinations with products or
28 * other commercial use. Any use of the Contribution is entirely made at
29 * the user's own responsibility and the user can not rely on any features,
30 * functionalities or performances Alcatel-Lucent has attributed to the
33 * THE CONTRIBUTION BY ALCATEL-LUCENT IS PROVIDED AS IS, WITHOUT WARRANTY
34 * OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
35 * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, COMPLIANCE,
36 * NON-INTERFERENCE AND/OR INTERWORKING WITH THE SOFTWARE TO WHICH THE
37 * CONTRIBUTION HAS BEEN MADE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL
38 * ALCATEL-LUCENT BE LIABLE FOR ANY DAMAGES OR OTHER LIABLITY, WHETHER IN
39 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
40 * CONTRIBUTION OR THE USE OR OTHER DEALINGS IN THE CONTRIBUTION, WHETHER
41 * TOGETHER WITH THE SOFTWARE TO WHICH THE CONTRIBUTION RELATES OR ON A STAND
45 require_once $gfcommon.'tracker/ArtifactFactory.class.php';
46 require_once $gfcommon.'tracker/Roadmap.class.php';
47 require_once $gfcommon.'tracker/RoadmapFactory.class.php';
49 $perm = $group->getPermission(session_get_user());
50 if (!$perm || !is_object($perm) || !$perm->isArtifactAdmin()) {
51 exit_permission_denied();
54 $atfh = new ArtifactTypeFactoryHtml($group);
55 if (!$atfh || !is_object($atfh) || $atfh->isError()) {
56 exit_error(_('Error'), _('Could Not Get ArtifactTypeFactoryHtml'));
59 $set_roadmap_failed = false;
61 if (getStringFromRequest('set_roadmap')) {
62 $set_roadmap_failed = false;
64 $roadmap_name = getStringFromRequest('roadmap_name');
65 $roadmap_id = getIntFromRequest('roadmap_id', 0);
66 $roadmap_list = getArrayFromRequest('roadmap_list');
68 if (! $roadmap_name) {
69 $error_msg .= _("Can't create or rename roadmap: name is empty");
72 $roadmap = new Roadmap($group, $roadmap_id);
74 $result = $roadmap->create($roadmap_name);
76 $feedback .= sprintf(_('Roadmap %s created'), $roadmap_name);
79 $error_msg .= _("Can't create roadmap: ").$roadmap->getErrorMessage();
83 $old_roadmap_name = $roadmap->getName();
84 if ($roadmap_name != $old_roadmap_name) {
85 $result = $roadmap->rename($roadmap_name);
87 $feedback .= sprintf(_('Roadmap %s renamed to %s'), $old_roadmap_name, $roadmap_name);
90 $error_msg .= _("Can't rename roadmap: ").$roadmap->getErrorMessage();
94 if (! $error_msg && is_array($roadmap_list) && ! empty($roadmap_list)) {
95 $result = $roadmap->setList($roadmap_list);
97 $error_msg .= _("Can't set roadmap: ").$roadmap->getErrorMessage();
102 $set_roadmap_failed = true;
105 elseif (getStringFromRequest('set_roadmap_state')) {
106 $roadmap_states = getArrayFromRequest('roadmap_states');
107 $default_roadmap = getIntFromRequest('default_roadmap');
109 $roadmap_factory = new RoadmapFactory($group);
110 $roadmaps = $roadmap_factory->getRoadmaps();
113 foreach ($roadmaps as $roadmap) {
114 if (!is_object($roadmap)) {
116 } elseif ($roadmap->isError()) {
117 echo $roadmap->getErrorMessage();
119 $result = $roadmap->setState((array_key_exists($roadmap->getID(), $roadmap_states) ? 1 : 0));
121 $error_msg .= _("Can't set roadmap state: ").$roadmap->getErrorMessage();
123 $result = $roadmap->isDefault(($default_roadmap == $roadmap->getID() ? 1 : 0));
125 $error_msg .= _("Can't set default value: ").$roadmap->getErrorMessage();
127 if (! $error_msg && $updated === false) {
128 $feedback .= _('Roadmap configuration is updated');
134 elseif (getStringFromRequest('delete_roadmap_sure')) {
135 $roadmap_id = getIntFromRequest('roadmap_id', 0);
137 $roadmap = new Roadmap($group, $roadmap_id);
138 $result = $roadmap->delete();
140 $feedback .= sprintf(_('Roadmap %s is deleted'), $roadmap->getName());
143 $error_msg .= _("Can't delete roadmap: ").$roadmap->getErrorMessage();
148 if (getStringFromRequest('delete_roadmap')) {
150 $roadmap_id = getIntFromRequest('roadmap_id', 0);
152 $roadmap = new Roadmap($group, $roadmap_id);
153 $roadmap_name = $roadmap->getName();
155 $atfh->header(array('title' => _('Delete roadmap'), 'modal' => 1));
159 <strong><?php echo sprintf(_('Are you sure you want to delete the %s roadmap?'), $roadmap_name) ?></strong>
161 <form action="<?php echo getStringFromServer('PHP_SELF').'?group_id='.$group_id.'&admin_roadmap=1' ?>" method="post">
162 <input type="hidden" name="admin_roadmap" value="1" />
163 <input type="hidden" name="roadmap_id" value="<?php echo $roadmap_id ?>" />
165 <input type="submit" name="delete_roadmap_sure" value="<?php echo _('Yes') ?>" />
166 <input type="submit" name="cancel" value="<?php echo _('Cancel') ?>" />
173 if ($set_roadmap_failed ||
174 getStringFromRequest('new_roadmap') ||
175 getStringFromRequest('update_roadmap')) {
177 $roadmap_id = getIntFromRequest('roadmap_id', 0);
179 $roadmap = new Roadmap($group, $roadmap_id);
180 $roadmap_list = getArrayFromRequest('roadmap_list', $roadmap->getList());
182 if (getStringFromRequest('new_roadmap')) {
183 $atfh->header(array('title' => _('Create a new roadmap'), 'modal' => 1));
186 $atfh->header(array('title' => _('Update roadmap'), 'modal' => 1));
190 <form action="<?php echo getStringFromServer('PHP_SELF').'?group_id='.$group_id.'&admin_roadmap=1' ?>" method="post">
192 echo '<p>'._('Name: ') . '<input type="text" name="roadmap_name" value="'.$roadmap->getName().'" size="40" /></p>';
195 echo '<input type="hidden" name="roadmap_id" value="'.$roadmap_id.'" />';
198 $at_arr = $atfh->getArtifactTypes();
200 if (!$at_arr || count($at_arr) < 1) {
201 echo '<p class="information">'._('No trackers have been set up.').'</p>'."\n";
204 foreach ($at_arr as $artifact_type) {
205 if (!is_object($artifact_type)) {
207 } elseif ($artifact_type->isError()) {
208 echo $artifact_type->getErrorMessage();
210 $ath = new ArtifactTypeHtml($group, $artifact_type->getID());
213 if (array_key_exists($artifact_type->getID(), $roadmap_list)) {
214 $field_id = $roadmap_list[$artifact_type->getID()];
218 echo '<td>' . $artifact_type->getName() . '</td>'."\n";
219 echo '<td><select name="roadmap_list['.$artifact_type->getID().']">'."\n";
220 echo '<option value="0"'.(! $field_id ? ' selected="selected"' : '').' >'._('Not used').'</option>'."\n";
221 $extra_fields = $ath->getExtraFields( array(ARTIFACT_EXTRAFIELD_FILTER_INT));
222 foreach ($extra_fields as $extra_field) {
223 if ($extra_field['field_type'] != ARTIFACT_EXTRAFIELDTYPE_CHECKBOX && $extra_field['field_type'] != ARTIFACT_EXTRAFIELDTYPE_MULTISELECT) {
224 echo '<option value="'.$extra_field['extra_field_id'].'"'.($extra_field['extra_field_id'] == $field_id ? ' selected="selected"' : '').' >'.$extra_field['field_name'].'</option>'."\n";
227 echo '</select></td>'."\n";
231 echo '</table>'."\n";
233 <input type="submit" name="set_roadmap" value="'._('Submit').'" />
234 <input type="submit" name="cancel" value="'._('Cancel').'" />
241 if (getIntFromRequest('manage_release') ||
242 getIntFromRequest('updownorder_release') ||
243 getStringFromRequest('release_auto_order') ||
244 getStringFromRequest('release_changes_order')) {
246 $roadmap_id = getIntFromRequest('roadmap_id', 0);
248 $roadmap_factory = new RoadmapFactory($group);
249 $selected_roadmap = $roadmap_factory->getRoadmapByID($roadmap_id);
250 if (! is_object($selected_roadmap)) {
251 $error_msg .= sprintf(_('roadmap %s is not available'), 'ID='.$roadmap_id);
254 $artifact_type_list = $selected_roadmap->getList();
257 if (getIntFromRequest('updownorder_release') ||
258 getStringFromRequest('release_auto_order') ||
259 getStringFromRequest('release_changes_order')) {
263 $release_order = $selected_roadmap->getReleases();
264 if (! is_array($release_order)) {
265 $release_order = array();
269 if (getIntFromRequest('updownorder_release')) {
270 $old_pos = getIntFromRequest('old_pos');
271 $new_pos = getIntFromRequest('new_pos');
273 $tmp = $release_order[$new_pos];
274 $release_order[$new_pos] = $release_order[$old_pos];
275 $release_order[$old_pos] = $tmp;
277 $result = $selected_roadmap->setReleaseOrder($release_order);
279 $feedback .= _('Release(s) order updated');
282 $error_msg .= _("Can't modify release order: ").$selected_roadmap->getErrorMessage();
285 elseif (getStringFromRequest('release_auto_order')) {
286 usort($release_order, 'version_compare');
288 elseif (getStringFromRequest('release_changes_order')) {
289 $order = array_reverse(getArrayFromRequest('order'));
291 // Items with not modified positions
292 $not_changed = array_keys($order, '');
295 $list_size = count($order);
296 $not_changed = array();
298 $out_before = array();
299 $out_after = array();
300 foreach ($order as $field => $new_pos) {
301 if (!is_numeric($new_pos)) {
302 $not_changed[] = $field;
305 $new_pos = intval($new_pos);
307 if (!isset($out_before[$new_pos]))
308 $out_before[$new_pos] = array();
309 $out_before[$new_pos][] = $field;
311 elseif ($new_pos > $list_size) {
312 if (!isset($out_after[$new_pos]))
313 $out_after[$new_pos] = array();
314 $out_after[$new_pos][] = $field;
317 if (!isset($changed[$new_pos - 1]))
318 $changed[$new_pos - 1] = array();
319 $changed[$new_pos - 1][] = $field;
322 ksort($changed, SORT_NUMERIC);
325 $start_list = array();
327 if (!empty($out_before)) {
328 ksort($out_before, SORT_NUMERIC);
329 foreach (array_values($out_before) as $list) {
330 foreach ($list as $field) {
331 $start_list[] = $field;
337 // Middle of the list
338 $index = $index_start;
339 foreach ($changed as $pos => $list) {
340 for (; $index < $pos; $index++) {
341 $start_list[] = array_shift($not_changed);
343 foreach ($list as $field) {
344 $start_list[] = $field;
351 if (!empty($out_after)) {
352 ksort($out_after, SORT_NUMERIC);
353 foreach (array_values($out_after) as $list) {
354 foreach ($list as $field) {
355 $end_list[] = $field;
360 // And we complete the list
361 $release_order = array_merge($start_list, $not_changed, $end_list);
364 $result = $selected_roadmap->setReleaseOrder($release_order);
366 $feedback .= _('Release(s) order updated');
369 $error_msg .= _("Can't modify release order: ").$selected_roadmap->getErrorMessage();
374 for ($pos = count($release_order) - 1; $pos >= 0; $pos--) {
375 $rows[$pos] = '<tr '. $GLOBALS['HTML']->boxGetAltRowStyle($pos) .'>'.'<td>'.'   '.$release_order[$pos].'</td>'."\n".
376 '<td class="align-right">'.
377 ($pos + 1).' --> <input type="text" name="order['.$release_order[$pos].']" value="" size="3" maxlength="3" />'.
379 '<td class="align-center">'.'   '.
380 '<a href="index.php?group_id='.$group_id.'&roadmap_id='.$roadmap_id.
381 '&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>'.
383 '<a href="index.php?group_id='.$group_id.'&roadmap_id='.$roadmap_id.
384 '&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>'.
389 $atfh->header(array('title' => _('Manage releases'), 'modal' => 1));
391 if (! empty($rows)) {
394 <strong><?php echo sprintf(_('Set order of releases for %s roadmap:'), $selected_roadmap->getName()) ?></strong>
396 <form action="<?php echo getStringFromServer('PHP_SELF').'?group_id='.$group_id.'&admin_roadmap=1' ?>" method="post">
397 <input type="hidden" name="roadmap_id" value="<?php echo $roadmap_id ?>" />
399 $title_arr = array();
400 $title_arr[] = _('Releases');
401 $title_arr[] = _('Current / New positions');
402 $title_arr[] = _('Up/Down positions');
404 echo $GLOBALS['HTML']->listTableTop($title_arr, false, ' ');
405 echo implode('', $rows);
406 echo '<tr class="noborder">
408 <input type="submit" name="release_auto_order" value="'._('Auto order').'" />
410 <td class="align-right">
411 <input type="submit" name="release_changes_order" value="'._('Reorder').'" />
416 echo $GLOBALS['HTML']->listTableBottom();
420 echo '<p>'._('No tracker is selected for this roadmap').'.</p>';
421 echo '<p>'.sprintf(_('You can <a href="%s">select tracker(s) for this roadmap</a>.'),
422 'index.php?group_id='.$group_id.'&roadmap_id='.$roadmap_id.
423 '&admin_roadmap=1&update_roadmap=1').'</p>';
426 <a href="'.getStringFromServer('PHP_SELF').'?group_id='.$group_id.'&admin_roadmap=1'.'">'.
427 _('Return to list of roadmaps').'</a>'.
434 if (! isset($ihm) || $ihm !== true) {
435 $atfh->header(array('title' => _('Manage roadmaps'), 'modal' => 1));
437 echo '<p><strong>'._('You can define a new roadmap or edit an existing one here.').'</strong></p>';
439 $roadmap_factory = new RoadmapFactory($group);
440 $roadmaps = $roadmap_factory->getRoadmaps();
442 <form action="<?php echo getStringFromServer('PHP_SELF').'?group_id='.$group_id; ?>" method="post">
443 <input type="hidden" name="admin_roadmap" value="1" />
446 foreach ($roadmaps as $roadmap) {
447 if (!is_object($roadmap)) {
449 } elseif ($roadmap->isError()) {
450 echo $roadmap->getErrorMessage();
452 $rows[$pos] = '<tr '. $GLOBALS['HTML']->boxGetAltRowStyle($pos) .'>'.
453 '<td><input type="checkbox" name="roadmap_states['.$roadmap->getID().']" value="1"'.($roadmap->getState() ? ' checked="checked"' : '').' /></td>'.
454 '<td>'.$roadmap->getName().'</td>'."\n".
455 '<td class="align-center"><input type="radio" name="default_roadmap" value="'.$roadmap->getID().'"'.($roadmap->isDefault() ? ' checked="checked"' : '').' /></td>'.
457 '<td class="align-right">'.
458 ($pos + 1).' --> <input type="text" name="order['.$roadmap->getID().']" value="" size="3" maxlength="3" />'.
460 '<td class="align-center">'.'   '.
461 '<a href="index.php?group_id='.$group_id.'&roadmap_id='.$roadmap->getID().
462 '&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>'.
464 '<a href="index.php?group_id='.$group_id.'&roadmap_id='.$roadmap->getID().
465 '&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>'.
468 '<td class="align-center">'.
469 '<a href="index.php?group_id='.$group_id.'&roadmap_id='.$roadmap->getID().
470 '&admin_roadmap=1&update_roadmap=1">'.
471 html_image('ic/forum_edit.gif','','',array('alt' => _('Modify roadmap'), 'title' => _('Modify roadmap'))).'</a>'."\n".
472 '<a href="index.php?group_id='.$group_id.'&roadmap_id='.$roadmap->getID().
473 '&admin_roadmap=1&manage_release=1">'.
474 html_image('ic/survey-question-add.png','','',array('alt' => _('Manage releases'), 'title' => _('Manage releases'))).'</a>'."\n".
475 '<a href="index.php?group_id='.$group_id.'&roadmap_id='.$roadmap->getID().
476 '&admin_roadmap=1&delete_roadmap=1">'.
477 html_image('ic/trash.png','','',array('alt' => _('Delete roadmap'), 'title' => _('Delete roadmap'))).'</a>'.
484 if (! empty($rows)) {
485 $title_arr = array();
486 $title_arr[] = _('Enable');
487 $title_arr[] = _('Roadmap name');
488 $title_arr[] = _('Default');
489 //$title_arr[] = _('Current / New positions');
490 //$title_arr[] = _('Up/Down positions');
491 $title_arr[] = _('Actions');
493 echo $GLOBALS['HTML']->listTableTop($title_arr, false, ' ');
494 echo implode('', $rows);
495 echo $GLOBALS['HTML']->listTableBottom();
499 if (! empty($rows)) {
500 echo '<input type="submit" name="set_roadmap_state" value="'._('Update').'" />'."\n";
502 echo '<input type="submit" name="new_roadmap" value="'._('New Roadmap').'" />'."\n";
503 echo '</p></form>'."\n";