3 require_once('db.php');
4 require_once('manifest.php');
9 <title>WebKit Perf Monitor</title>
10 <link rel="stylesheet" href="/common.css">
11 <link rel="stylesheet" href="/admin/admin.css">
15 <h1><a href="/">WebKit Perf Monitor</a></h1>
17 <li><a href="/admin/platforms">Platforms</a></li>
18 <li><a href="/admin/tests">Tests</a></li>
19 <li><a href="/admin/aggregators">Aggregators</a></li>
20 <li><a href="/admin/builders">Builders</a></li>
21 <li><a href="/admin/build-slaves">Slaves</a></li>
22 <li><a href="/admin/repositories">Repositories</a></li>
23 <li><a href="/admin/bug-trackers">Bug Trackers</a></li>
27 <div id="mainContents">
30 function notice($message) {
31 echo "<p class='notice'>$message</p>";
35 if (!$db->connect()) {
36 notice('Failed to connect to the database');
39 $action = array_key_exists('action', $_POST) ? $_POST['action'] : NULL;
41 function execute_query_and_expect_one_row_to_be_affected($query, $params, $success_message, $failure_message) {
44 foreach ($params as &$param) {
49 $affected_rows = $db->query_and_get_affected_rows($query, $params);
51 assert('$affected_rows == 1');
52 notice($success_message);
56 notice($failure_message);
60 function update_field($table, $prefix, $field_name, $new_value = NULL) {
63 if (!array_key_exists('id', $_POST))
66 $id = intval($_POST['id']);
67 $prefixed_field_name = $prefix . '_' . $field_name;
68 $id_field_name = $prefix . '_id';
70 if ($new_value == NULL) {
71 if (array_get($_POST, 'updated-column') != $field_name && !array_key_exists($field_name, $_POST))
73 $new_value = array_get($_POST, $field_name);
76 execute_query_and_expect_one_row_to_be_affected("UPDATE $table SET $prefixed_field_name = \$2 WHERE $id_field_name = \$1",
77 array($id, $new_value),
78 "Updated the $prefix $id",
79 "Could not update $prefix $id");
84 function regenerate_manifest() {
87 $generator = new ManifestGenerator($db);
88 if (!$generator->generate()) {
89 notice("Failed to generate the manifest (before trying to write into the filesystem).");
93 if (!$generator->store()) {
94 notice("Failed to save the generated manifest into the filesystem");
101 class AdministrativePage {
104 private $column_to_be_ordered_by;
105 private $column_info;
107 function __construct($db, $table, $prefix, $column_info) {
109 $this->table = $table;
110 $this->prefix = $prefix;
111 $this->column_info = $column_info;
114 private function name_to_titlecase($name) {
115 return ucwords(str_replace('_', ' ', $name));
118 private function column_label($name) {
119 return array_get($this->column_info[$name], 'label', $this->name_to_titlecase($name));
122 private function render_form_control_for_column($editing_mode, $name, $value = '', $show_update_button_if_needed = FALSE) {
123 $show_update_button = FALSE;
124 switch ($editing_mode) {
127 <textarea name="$name" rows="7" cols="50">$value</textarea><br>
129 $show_update_button = $show_update_button_if_needed;
132 $checkedness = $this->db->is_true($value) ? ' checked' : '';
134 <input type="checkbox" name="$name"$checkedness>
136 $show_update_button = $show_update_button_if_needed;
140 <input type="text" name="$name" value="$value" size="70">
144 assert($editing_mode == 'string');
146 <input type="text" name="$name" value="$value">
150 if ($show_update_button) {
153 <button type="submit" name="action" value="update">Update</button>
158 function render_table($column_to_be_ordered_by) {
159 $column_names = array_keys($this->column_info);
160 $column_to_subcolumn_names = array();
161 foreach ($column_names as $name) {
162 if (array_get($this->column_info[$name], 'pre_insertion'))
164 $subcolumns = array_get($this->column_info[$name], 'subcolumns', array());
165 if (!$subcolumns || !array_get($this->column_info[$name], 'custom'))
167 $column_to_subcolumn_names[$name] = $subcolumns;
170 $rowspan_if_needed = $column_to_subcolumn_names ? ' rowspan="2"' : '';
172 $headers = "<tr><td$rowspan_if_needed>ID</td>";
173 foreach ($column_names as $name) {
174 if (array_get($this->column_info[$name], 'pre_insertion'))
176 $label = htmlspecialchars($this->column_label($name));
177 if (array_get($column_to_subcolumn_names, $name)) {
178 $count = count($column_to_subcolumn_names[$name]);
179 $headers .= "<td colspan=\"$count\">$label</td>";
181 $headers .= "<td$rowspan_if_needed>$label</td>";
183 $headers .= "</tr>\n";
185 if ($column_to_subcolumn_names) {
187 foreach ($column_names as $name) {
188 $subcolumn_names = array_get($column_to_subcolumn_names, $name);
189 if (!$subcolumn_names)
191 foreach ($subcolumn_names as $label)
192 $headers .= '<td>' . htmlspecialchars($label) . '</td>';
194 $headers .= "</tr>\n";
206 assert(ctype_alnum_underscore($column_to_be_ordered_by));
207 $rows = $this->db->fetch_table($this->table, $this->prefix . '_' . $column_to_be_ordered_by);
209 foreach ($rows as $row) {
210 $id = intval($row[$this->prefix . '_id']);
212 $custom_cells_list = array();
214 foreach ($column_names as $name) {
215 if (array_get($this->column_info[$name], 'pre_insertion'))
218 if ($custom = array_get($this->column_info[$name], 'custom')) {
219 $custom_cells_list[$name] = $custom($row);
220 $maximum_rows = max($maximum_rows, count($custom_cells_list[$name]));
224 $rowspan_if_needed = $maximum_rows > 1 ? ' rowspan="' . $maximum_rows . '"' : '';
226 echo "<tr>\n<td$rowspan_if_needed>$id</td>\n";
227 foreach ($column_names as $name) {
228 if (array_get($this->column_info[$name], 'pre_insertion'))
231 if (array_key_exists($name, $custom_cells_list)) {
232 $this->render_custom_cells(array_get($column_to_subcolumn_names, $name), $custom_cells_list[$name], 0);
236 $value = htmlspecialchars(array_get($row, $this->prefix . '_' . $name), ENT_QUOTES);
237 $editing_mode = array_get($this->column_info[$name], 'editing_mode');
238 if (!$editing_mode) {
239 echo "<td$rowspan_if_needed>$value</td>\n";
244 <td$rowspan_if_needed>
246 <input type="hidden" name="id" value="$id">
247 <input type="hidden" name="action" value="update">
248 <input type="hidden" name="updated-column" value="$name">
251 $this->render_form_control_for_column($editing_mode, $name, $value, TRUE);
252 echo "</form></td>\n";
257 for ($row = 1; $row < $maximum_rows; $row++) {
259 foreach ($column_names as $name) {
260 if (array_key_exists($name, $custom_cells_list))
261 $this->render_custom_cells(array_get($column_to_subcolumn_names, $name), $custom_cells_list[$name], $row);
273 function render_custom_cells($subcolum_names, $rows, $row_index) {
274 $cells = array_get($rows, $row_index, array());
275 if (!is_array($cells))
276 $cells = array($cells);
278 if ($subcolum_names && count($cells) <= 1) {
279 $colspan = count($subcolum_names);
280 $content = $cells ? $cells[0] : '';
281 echo "<td colspan=\"$colspan\">$content</td>\n";
285 for ($i = 0; $i < ($subcolum_names ? count($subcolum_names) : 1); $i++)
286 echo '<td>' . array_get($cells, $i, '') . '</td>';
290 function render_form_to_add($title = NULL) {
292 if (!$title) # Can't use the table name since it needs to be singular.
293 $title = 'New ' . $this->name_to_titlecase($this->prefix);
296 <section class="action-field">
301 foreach (array_keys($this->column_info) as $name) {
302 $editing_mode = array_get($this->column_info[$name], 'editing_mode');
303 if (array_get($this->column_info[$name], 'custom') || !$editing_mode)
305 if (array_get($this->column_info[$name], 'post_insertion'))
308 $label = htmlspecialchars($this->column_label($name));
309 echo "<label>$label<br>\n";
310 $this->render_form_control_for_column($editing_mode, $name);
311 echo "</label><br>\n";
316 <button type="submit" name="action" value="add">Add</button>