1 <?php # vim:ts=2:sw=2:et:
2 /* For licensing and copyright terms, see the file named LICENSE */
3 include '../../inc/common.php';
5 MTrackACL::requireAnyRights('Projects', 'modify');
7 if ($_SERVER['REQUEST_METHOD'] == 'POST') {
8 if (isset($_POST['cancel'])) {
9 header("Location: ${ABSWEB}admin/");
15 MTrackACL::requireAnyRights('Projects', 'create');
16 $P = new MTrackProject;
18 $P = MTrackProject::loadById($pid);
20 throw new Exception("invalid project " . htmlentities($pid));
22 MTrackACL::requireAnyRights("project:$pid", 'modify');
25 $P->name = $_POST["name"];
26 $P->shortname = $_POST["shortname"];
27 $P->ordinal = $_POST["ordinal"];
28 $P->notifyemail = $_POST["email"];
29 $CS = MTrackChangeset::begin("project:X",
31 "added project $P->name" :
32 "edit project $P->name");
35 if (MTrackACL::hasAnyRights('Components', 'modify')) {
36 MTrackDB::q('delete from components_by_project where projid = ?', $P->projid);
37 if (isset($_POST['components'])) {
38 $comps = $_POST['components'];
39 foreach ($comps as $cid) {
41 'insert into components_by_project (compid, projid) values (?, ?)',
47 $CS->setObject("project:$P->projid");
48 if (isset($_POST['perms'])) {
49 MTrackACL::setACL("project:$P->projid", 0, json_decode($_POST['perms']));
53 header("Location: ${ABSWEB}admin/project.php");
57 mtrack_head("Administration - Projects");
62 Projects can be created to track development on a per-project or per-product
63 basis. Components may be associated with a project, as well as a default
64 email distribution address.
68 if (isset($_GET['edit'])) {
71 $q = MTrackDB::q('select * from projects where projid = ?', $pid);
73 foreach ($q as $row) {
77 throw new Exception("no such project " . htmlentities($pid));
82 'name' => 'My New Project',
83 'shortname' => 'newproject',
88 echo "<form method='post' action=\"{$ABSWEB}admin/project.php?edit=$pid\">";
91 $name = htmlentities($p['name'], ENT_QUOTES, 'utf-8');
92 $sname = htmlentities($p['shortname'], ENT_QUOTES, 'utf-8');
93 $ord = htmlentities($p['ordinal'], ENT_QUOTES, 'utf-8');
94 $email = htmlentities($p['notifyemail'], ENT_QUOTES, 'utf-8');
95 echo "<tr><th>Name</th>",
96 "<td><input type='text' name='name' value='$name'></td></tr>";
97 echo "<tr><th>Short Name</th>",
98 "<td><input type='text' name='shortname' value='$sname'></td></tr>";
99 echo "<tr><th>Sorting</th>",
100 "<td><input type='text' name='ordinal' value='$ord'></td></tr>";
101 echo "<tr><th>Group Email Address</th>",
102 "<td><input type='text' name='email' value='$email'></td></tr>";
105 if (MTrackACL::hasAnyRights('Components', 'modify')) {
106 $components = array();
107 foreach (MTrackDB::q(
108 'select compid, name, deleted from components order by name')
109 ->fetchAll() as $row) {
111 $row[1] .= " (deleted)";
113 $components[$row[0]] = $row[1];
117 foreach (MTrackDB::q(
118 'select compid from components_by_project where projid = ?', $pid)
119 ->fetchAll() as $row) {
120 $p_by_c[$row[0]] = $row[0];
123 echo "<h2>Components</h2>";
124 echo "<p>Associate component(s) with this project</p>";
125 echo mtrack_multi_select_box('components', "(select to add)",
126 $components, $p_by_c);
130 foreach (MTrackDB::q('select distinct r.repoid, shortname from project_repo_link p left join repos r on p.repoid = r.repoid where projid = ?', (int)$pid) as $row) {
131 $repos[$row[0]] = $row[1];
133 foreach (MTrackDB::q("select repoid, shortname from repos where parent = 'project:' || ?", $p['shortname']) as $row) {
134 $repos[$row[0]] = $row[1];
138 echo "<h2>Groups</h2>";
139 echo "<p>The following groups are associated with this project. You may assign permissions to groups to make it easier to manage groups of users.</p>";
141 foreach (MTrackDB::q('select name from groups where project = ?', $pid)
143 echo "<a href='{$ABSWEB}admin/group.php?pid=$pid&group=$row[0]'>"
144 . htmlentities($row[0], ENT_QUOTES, 'utf-8') . '</a><br>';
147 echo "<a class='button' href=\"{$ABSWEB}admin/group.php?pid=$pid\">New Group</a>";
150 echo "<h2>Linked Repositories</h2>";
153 foreach ($repos as $rid => $name) {
154 echo "<li><a href=\"{$ABSWEB}admin/repo.php/$rid\">" .
155 htmlentities($name, ENT_QUOTES, 'utf-8') . "</a></li>\n";
159 echo "<i>No linked repositories</i>\n";
163 if (MTrackACL::hasAnyRights("project:$pid", 'modify')) {
166 'modify' => 'Administer via web UI',
170 MTrackACL::renderACLForm('perms', "project:$pid", $action_map);
173 echo "<button type='submit'>Save</button>";
174 echo "<button type='submit' name='cancel'>Cancel</button>";
180 Select a project below to edit it, or click the "Add" button to create
186 foreach (MTrackDB::q(
187 'select projid, name, shortname, ordinal, notifyemail
188 from projects order by ordinal') as $row) {
191 $name = htmlentities($row[1], ENT_QUOTES, 'utf-8');
192 $sname = htmlentities($row[2], ENT_QUOTES, 'utf-8');
193 if ($sname != $name) {
194 $sname = " ($sname)";
198 $email = htmlentities($row[4], ENT_QUOTES, 'utf-8');
201 "<td><a href=\"{$ABSWEB}admin/project.php?edit=$pid\">$name$sname</a></td>",
208 echo "<form method='get' action=\"{$ABSWEB}admin/project.php\">";
209 echo "<input type='hidden' name='edit' value='new'>";
210 echo "<button type='submit'>Add Project</button></form>";