3 * Project Management Facility : Admin
5 * Copyright 1999/2000, Sourceforge.net Tim Perdue
6 * Copyright 2002 GForge, LLC, Tim Perdue
7 * Copyright 2010, FusionForge Team
8 * Copyright (C) 2011-2012 Alain Peyrat - Alcatel-Lucent
9 * Copyright 2013-2014,2016, Franck Villaume - TrivialDev
10 * http://fusionforge.org
12 * This file is part of FusionForge. FusionForge is free software;
13 * you can redistribute it and/or modify it under the terms of the
14 * GNU General Public License as published by the Free Software
15 * Foundation; either version 2 of the Licence, or (at your option)
18 * FusionForge is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
23 * You should have received a copy of the GNU General Public License along
24 * with FusionForge; if not, write to the Free Software Foundation, Inc.,
25 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
28 require_once '../../env.inc.php';
29 require_once $gfcommon.'include/pre.php';
30 require_once $gfwww.'pm/include/ProjectGroupHTML.class.php';
31 require_once $gfcommon.'pm/ProjectGroupFactory.class.php';
32 require_once $gfcommon.'pm/ProjectCategory.class.php';
34 if (!session_loggedin()) {
38 $group_id = getIntFromRequest('group_id');
39 $group_project_id = getIntFromRequest('group_project_id');
45 $g = group_get_object($group_id);
46 if (!$g || !is_object($g)) {
48 } elseif ($g->isError()) {
49 exit_error($g->getErrorMessage(),'pm');
52 $update_cat = getStringFromRequest('update_cat');
53 $add_cat = getStringFromRequest('add_cat');
54 $delete = getStringFromRequest('delete');
55 $id = getIntFromRequest('id');
57 if (getStringFromRequest('post_changes')) {
61 $pg = new ProjectGroup($g,$group_project_id);
62 if (!$pg || !is_object($pg)) {
63 exit_error(_('Unable to create ProjectCategory Object'),'pm');
64 } elseif ($pg->isError()) {
65 exit_error($pg->getErrorMessage(),'pm');
68 if (getStringFromRequest('addproject')) {
69 /* Add new subproject */
70 $project_name = getStringFromRequest('project_name');
71 $description = getStringFromRequest('description');
72 $send_all_posts_to = getStringFromRequest('send_all_posts_to');
73 session_require_perm ('pm_admin', $group_id) ;
74 if (!$pg->create($project_name,$description,$send_all_posts_to)) {
75 exit_error($pg->getErrorMessage(),'pm');
77 $feedback .= _('Subproject Inserted');
78 $feedback .= '<br />';
79 $feedback .= _("Please configure also the roles (by default, it's “No Access”)");
83 /* Add a project_category */
84 $name = getStringFromRequest('name');
85 session_require_perm ('pm', $pg->getID(), 'manager') ;
87 if (trim($name) == '') {
88 $error_msg .= _('Name is required');
90 $pc = new ProjectCategory($pg);
91 if (!$pc || !is_object($pc)) {
92 exit_error(_('Unable to create ProjectCategory Object'),'pm');
94 if (!$pc->create($name)) {
95 $error_msg .= _('Insert Error')._(': ').$pc->getErrorMessage();
97 $feedback .= _('Category Inserted');
102 } elseif ($update_cat) {
103 /* Update a project_category */
104 $name = getStringFromRequest('name');
105 if (trim($name) == '') {
106 $error_msg .= _('Name is required');
108 $id = getIntFromRequest('id');
109 session_require_perm ('pm', $pg->getID(), 'manager') ;
111 $pc = new ProjectCategory($pg,$id);
112 if (!$pc || !is_object($pc)) {
113 exit_error(_('Unable to create ProjectCategory Object'),'pm');
114 } elseif ($pc->isError()) {
115 exit_error($pc->getErrorMessage(),'pm');
117 if (!$pc->update($name)) {
118 exit_error(_('Update failed')._(': ').$pc->getErrorMessage(),'pm');
120 $feedback .= _('Category Updated');
127 } elseif (getStringFromRequest('update_pg')) {
128 /* Update a subproject */
129 $project_name = getStringFromRequest('project_name');
130 $description = getStringFromRequest('description');
131 $send_all_posts_to = getStringFromRequest('send_all_posts_to');
133 session_require_perm ('pm', $pg->getID(), 'manager') ;
135 if (!$pg->update($project_name,$description,$send_all_posts_to)) {
136 exit_error($pg->getErrorMessage(),'pm');
138 $feedback .= _('Subproject Updated successfully');
142 /* Delete a subproject */
143 $sure = getStringFromRequest('sure');
144 $really_sure = getStringFromRequest('really_sure');
146 session_require_perm ('pm', $pg->getID(), 'manager') ;
148 if (!$pg->delete(getStringFromRequest('sure'),getStringFromRequest('really_sure'))) {
149 exit_error($pg->getErrorMessage(),'pm');
151 $feedback .= _('Subproject successfully deleted.');
160 if ($add_cat && $group_project_id) {
162 // FORM TO ADD CATEGORIES
165 $pg = new ProjectGroup($g,$group_project_id);
166 if (!$pg || !is_object($pg)) {
167 exit_error(_('Unable to create ProjectCategory Object'),'pm');
168 } elseif ($pg->isError()) {
169 exit_error($pg->getErrorMessage(),'pm');
172 session_require_perm ('pm', $pg->getID(), 'manager') ;
174 $title = sprintf(_('Add Categories to: %s'), $pg->getName());
175 pm_header(array('title'=>$title, 'modal'=>1));
178 List of possible categories for this ArtifactType
180 $result=$pg->getCategories();
181 $rows=db_numrows($result);
182 if ($result && $rows > 0) {
184 $title_arr[]=_('Id');
185 $title_arr[]=_('Title');
186 echo $HTML->listTableTop($title_arr);
187 for ($i=0; $i < $rows; $i++) {
189 $cells[][] = db_result($result, $i, 'category_id');
190 $cells[][] = util_make_link('/pm/admin/?update_cat=1&id='.db_result($result, $i, 'category_id').'&group_id='.$group_id.'&group_project_id='. $pg->getID(),
191 db_result($result, $i, 'category_name'));
192 echo $HTML->multiTableRow(array(), $cells);
194 echo $HTML->listTableBottom();
196 echo $HTML->information(_('No categories defined'));
199 <p class="important"><?php echo _('Once you add a category, it cannot be deleted') ?></p>
201 echo $HTML->openForm(array('action' => '/pm/admin/?group_id='.$group_id, 'method' => 'post'));
204 <input type="hidden" name="add_cat" value="y" />
205 <input type="hidden" name="group_project_id" value="<?php echo $pg->getID(); ?>" />
207 <strong><?php echo _('Category Name') . _(':'); ?></strong>
209 <input id="name" required="required" type="text" name="name" value="" />
211 <p><input type="submit" name="post_changes" value="<?php echo _('Submit') ?>" /></p>
213 echo $HTML->closeForm();
216 } elseif ($update_cat && $group_project_id && $id) {
219 // FORM TO UPDATE CATEGORIES
222 Allow modification of a category
225 $pg = new ProjectGroup($g,$group_project_id);
226 if (!$pg || !is_object($pg)) {
227 exit_error(_('Unable to create ProjectCategory Object'),'pm');
228 } elseif ($pg->isError()) {
229 exit_error($pg->getErrorMessage(),'pm');
232 session_require_perm ('pm', $pg->getID(), 'manager') ;
234 $title = sprintf(_('Modify a Category in: %s'), $pg->getName());
235 pm_header(array('title'=>$title, 'modal'=>1));
237 $ac = new ProjectCategory($pg,$id);
238 if (!$ac || !is_object($ac)) {
239 exit_error(_('Unable to create ProjectCategory Object'),'pm');
240 } elseif ($ac->isError()) {
241 exit_error($ac->getErrorMessage(),'pm');
243 echo $HTML->information(_('It is not recommended that you change the category name because other things are dependent upon it. When you change the category name, all related items will be changed to the new name.'));
244 echo $HTML->openForm(array('action' => '/pm/admin/?group_id='.$group_id, 'method' => 'post'));
247 <input type="hidden" name="update_cat" value="y" />
248 <input type="hidden" name="id" value="<?php echo $ac->getID(); ?>" />
249 <input type="hidden" name="group_project_id" value="<?php echo $pg->getID(); ?>" />
251 <strong><?php echo _('Category Name') . _(': '); ?></strong>
253 <input id="name" required="required" type="text" name="name" value="<?php echo $ac->getName(); ?>" />
255 <p><input type="submit" name="post_changes" value="<?php echo _('Submit') ?>" /></p>
257 echo $HTML->closeForm();
262 } elseif (getStringFromRequest('addproject')) {
264 Create a new subproject
266 session_require_perm ('pm_admin', $group_id) ;
268 pm_header(array('title'=>_('Add a new subproject'), 'modal'=>1));
271 <p><?php echo _('Add a new subproject to the Tasks. <strong>This is different than adding a task to a subproject.</strong>') ?></p>
273 echo $HTML->openForm(array('action' => '/pm/admin/?group_id='.$group_id, 'method' => 'post'));
276 <input type="hidden" name="addproject" value="y" />
277 <input type="hidden" name="post_changes" value="y" />
278 <strong><?php echo _('New Subproject Name').utils_requiredField()?></strong><br />
279 <input type="text" name="project_name" value="" size="15" maxlength="30" required="required" pattern=".{5,}" title="<?php echo _('At least 5 characters') ?>" /><br />
280 <strong><?php echo _('Description').utils_requiredField() ?></strong><br />
281 <input type="text" name="description" value="" size="40" maxlength="80" required="required" pattern=".{10,}" title="<?php echo _('At least 10 characters') ?>" /><br />
282 <label for="send_all_posts_to" ><strong><?php echo _('Send All Updates To')._(':'); ?></strong></label><br />
283 <input id="send_all_posts_to" type="email" name="send_all_posts_to" value="" size="40" maxlength="80" /><br />
284 <input type="submit" name="submit" value="<?php echo _('Submit') ?>" />
286 echo $HTML->closeForm();
289 } elseif (getStringFromRequest('update_pg') && $group_project_id) {
291 $pg = new ProjectGroup($g,$group_project_id);
292 if (!$pg || !is_object($pg)) {
293 exit_error(_('Could Not Get ProjectGroup'),'pm');
294 } elseif ($pg->isError()) {
295 exit_error($pg->getErrorMessage(),'pm');
297 session_require_perm ('pm', $pg->getID(), 'manager') ;
299 pm_header(array('title'=>_('Change Tasks Status')));
302 <p><?php echo _('You can modify an existing subproject using this form. Please note that private subprojects can still be viewed by members of your project, but not the general public.') ?></p>
304 echo $HTML->openForm(array('action' => '/pm/admin/?group_id='.$group_id, 'method' => 'post'));
306 <input type="hidden" name="post_changes" value="y" />
307 <input type="hidden" name="update_pg" value="y" />
308 <input type="hidden" name="group_project_id" value="<?php echo $pg->getID(); ?>" />
309 <table class="infotable">
312 <label for="project_name">
313 <?php echo _('Subproject Name')._(':'); ?>
317 <input id="project_name" type="text" name="project_name" value="<?php echo $pg->getName() ?>" required="required" pattern=".{5,}" title="<?php echo _('At least 5 characters') ?>" />
322 <label for="description">
323 <?php echo _('Description')._(':'); ?>
327 <input id="description" type="text" name="description" value="<?php echo $pg->getDescription(); ?>" size="40" maxlength="80" required="required" pattern=".{10,}" title="<?php echo _('At least 10 characters') ?>" />
332 <label for="send_all_posts_to">
333 <?php echo _('Send All Updates To')._(':'); ?>
337 <input id="send_all_posts_to" type="email" name="send_all_posts_to" value="<?php echo $pg->getSendAllPostsTo(); ?>" size="40" maxlength="80" />
342 <input type="submit" name="submit" value="<?php echo _('Update') ?>" />
347 echo $HTML->closeForm();
348 echo '<p>'.util_make_link('/pm/admin/?group_id='.$group_id.'&add_cat=1&group_project_id='.$group_project_id,_('Category Administration')).'</p>';
351 } elseif ($delete && $group_project_id) {
353 $pg = new ProjectGroup($g,$group_project_id);
354 if (!$pg || !is_object($pg)) {
355 exit_error(_('Could Not Get ProjectGroup'),'pm');
356 } elseif ($pg->isError()) {
357 exit_error($pg->getErrorMessage(),'pm');
360 session_require_perm ('pm', $pg->getID(), 'manager') ;
362 pm_header(array('title'=>_('Permanently delete this subproject and all its data'),
364 echo $HTML->openForm(array('action' => '/pm/admin/?group_id='.$group_id.'&group_project_id='.$group_project_id, 'method' => 'post'));
367 <input type="hidden" name="post_changes" value="y" />
368 <input type="hidden" name="delete" value="y" />
369 <?php echo _('You are about to permanently and irretrievably delete this subproject and all its related data!'); ?>
372 <input id="sure" type="checkbox" name="sure" value="1" />
374 <?php echo _('I am Sure') ?>
378 <input id="really_sure" type="checkbox" name="really_sure" value="1" />
379 <label for="really_sure">
380 <?php echo _('I am Really Sure'); ?>
384 <input type="submit" name="post_changes" value="<?php echo _('Permanently delete this subproject and all its data') ?>" />
387 echo $HTML->closeForm();
392 $pgf = new ProjectGroupFactory($g);
393 if (!$pgf || !is_object($pgf)) {
394 exit_error(_('Could Not Get Factory'),'pm');
395 } elseif ($pgf->isError()) {
396 exit_error($pgf->getErrorMessage(),'pm');
402 pm_header(array('title'=>_('Tasks Administration')));
405 // Show link to create new subproject
407 if (forge_check_perm ('pm_admin', $group_id)) {
409 <?php echo util_make_link('/pm/admin/?group_id='.$group_id.'&addproject=1', _('Add a Subproject')) ?><br />
410 <?php echo _('Add a subproject, which can contain a set of tasks. This is different than creating a new task.');
413 $pg_arr = $pgf->getProjectGroups();
415 if ($pg_arr == false || empty($pg_arr)) {
416 echo $HTML->information(_('No Subprojects Found in this Project'));
417 echo '<p>' . _('You may add new Subprojects using the “Add a Subproject” link above.') . '</p>';
420 for ($i=0; $i<count($pg_arr); $i++) {
421 echo '<p>'.util_make_link('/pm/admin/?group_id='.$group_id.'&group_project_id='.$pg_arr[$i]->getID().'&update_pg=1', _('Edit/Update Subproject').': <strong>'.$pg_arr[$i]->getName().'</strong>').'</p>';